Sync to unbound 1.21.0; heavy lifting by sthen
authorflorian <florian@openbsd.org>
Thu, 5 Sep 2024 08:22:46 +0000 (08:22 +0000)
committerflorian <florian@openbsd.org>
Thu, 5 Sep 2024 08:22:46 +0000 (08:22 +0000)
parse_edns_from_query_pkt() grew a parameter to handle cookies, which
we don't use.

61 files changed:
sbin/unwind/frontend.c
sbin/unwind/libunbound/config.h
sbin/unwind/libunbound/dns64/dns64.c
sbin/unwind/libunbound/dnstap/dnstap.h
sbin/unwind/libunbound/iterator/iter_scrub.c
sbin/unwind/libunbound/iterator/iter_utils.c
sbin/unwind/libunbound/iterator/iterator.c
sbin/unwind/libunbound/iterator/iterator.h
sbin/unwind/libunbound/libunbound/context.c
sbin/unwind/libunbound/libunbound/libunbound.c
sbin/unwind/libunbound/libunbound/libworker.c
sbin/unwind/libunbound/respip/respip.c
sbin/unwind/libunbound/services/authzone.c
sbin/unwind/libunbound/services/cache/dns.c
sbin/unwind/libunbound/services/cache/infra.c
sbin/unwind/libunbound/services/cache/infra.h
sbin/unwind/libunbound/services/listen_dnsport.c
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/modstack.h
sbin/unwind/libunbound/services/outside_network.c
sbin/unwind/libunbound/services/rpz.c
sbin/unwind/libunbound/sldns/parse.h
sbin/unwind/libunbound/sldns/parseutil.c
sbin/unwind/libunbound/sldns/rrdef.h
sbin/unwind/libunbound/sldns/wire2str.c
sbin/unwind/libunbound/util/alloc.c
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/msgparse.c
sbin/unwind/libunbound/util/data/msgparse.h
sbin/unwind/libunbound/util/edns.c
sbin/unwind/libunbound/util/edns.h
sbin/unwind/libunbound/util/fptr_wlist.c
sbin/unwind/libunbound/util/fptr_wlist.h
sbin/unwind/libunbound/util/module.h
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/proxy_protocol.c
sbin/unwind/libunbound/util/siphash.c
sbin/unwind/libunbound/util/storage/lookup3.c
sbin/unwind/libunbound/validator/autotrust.c
sbin/unwind/libunbound/validator/val_nsec.c
sbin/unwind/libunbound/validator/val_nsec.h
sbin/unwind/libunbound/validator/val_nsec3.c
sbin/unwind/libunbound/validator/val_nsec3.h
sbin/unwind/libunbound/validator/val_secalgo.c
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/val_utils.h
sbin/unwind/libunbound/validator/validator.c

index b10f9e3..3d5d739 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: frontend.c,v 1.82 2024/08/09 19:43:26 florian Exp $   */
+/*     $OpenBSD: frontend.c,v 1.83 2024/09/05 08:22:46 florian Exp $   */
 
 /*
  * Copyright (c) 2018 Florian Obser <florian@openbsd.org>
@@ -773,7 +773,7 @@ handle_query(struct pending_query *pq)
        }
 
        rcode = parse_edns_from_query_pkt(pq->qbuf, &pq->edns, NULL, NULL,
-           NULL, 0, pq->region);
+           NULL, 0, pq->region, NULL);
        if (rcode != LDNS_RCODE_NOERROR) {
                error_answer(pq, rcode);
                goto send_answer;
@@ -1059,7 +1059,7 @@ resend_dns64_query(struct pending_query *opq)
        }
 
        rcode = parse_edns_from_query_pkt(pq->qbuf, &pq->edns, NULL, NULL,
-           NULL, 0, pq->region);
+           NULL, 0, pq->region, NULL);
        if (rcode != LDNS_RCODE_NOERROR) {
                error_answer(pq, rcode);
                goto send_answer;
index 807d3a1..bfa7d8c 100644 (file)
@@ -1,6 +1,9 @@
 /* config.h.  Generated from config.h.in by configure.  */
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
+/* apply the fallthrough attribute. */
+#define ATTR_FALLTHROUGH __attribute__((fallthrough));
+
 /* apply the noreturn attribute to a function that exits the program */
 #define ATTR_NORETURN __attribute__((__noreturn__))
 
@@ -58,6 +61,9 @@
 /* Define to 1 if you have the <arpa/inet.h> header file. */
 #define HAVE_ARPA_INET_H 1
 
+/* Whether the C compiler accepts the "fallthrough" attribute */
+#define HAVE_ATTR_FALLTHROUGH 1
+
 /* Whether the C compiler accepts the "format" attribute */
 #define HAVE_ATTR_FORMAT 1
 
 /* Define to 1 if you have the <net/if.h> header file. */
 #define HAVE_NET_IF_H 1
 
+/* Define to 1 if you have the <net/pfvar.h> header file. */
+/* #undef HAVE_NET_PFVAR_H */
+
 /* Define this to use nghttp2 client. */
 /* #undef HAVE_NGHTTP2 */
 
    function. */
 /* #undef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB */
 
+/* Define to 1 if you have the `SSL_CTX_set_tmp_ecdh' function. */
+/* #undef HAVE_SSL_CTX_SET_TMP_ECDH */
+
 /* Define to 1 if you have the `SSL_get0_alpn_selected' function. */
 #define HAVE_SSL_GET0_ALPN_SELECTED 1
 
 #define PACKAGE_NAME "unbound"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "unbound 1.20.0"
+#define PACKAGE_STRING "unbound 1.21.0"
 
 /* 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.20.0"
+#define PACKAGE_VERSION "1.21.0"
 
 /* default pidfile location */
 #define PIDFILE ""
 #define ROOT_CERT_FILE "/var/unbound/etc/icannbundle.pem"
 
 /* version number for resource files */
-#define RSRC_PACKAGE_VERSION 1,20,0,0
+#define RSRC_PACKAGE_VERSION 1,21,0,0
 
 /* Directory to chdir to */
 #define RUN_DIR "/var/unbound/etc"
@@ -1485,6 +1497,7 @@ struct sockaddr_storage;
 #  define calloc(n,s) unbound_stat_calloc_log(n, s, __FILE__, __LINE__, __func__)
 #  define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
 #  define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
+#  define strdup(s) unbound_stat_strdup_log(s, __FILE__, __LINE__, __func__)
 void *unbound_stat_malloc(size_t size);
 void *unbound_stat_calloc(size_t nmemb, size_t size);
 void unbound_stat_free(void *ptr);
@@ -1497,6 +1510,8 @@ void unbound_stat_free_log(void *ptr, const char* file, int line,
        const char* func);
 void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
        int line, const char* func);
+char *unbound_stat_strdup_log(const char *s, const char* file, int line,
+       const char* func);
 #elif defined(UNBOUND_ALLOC_LITE)
 #  include "util/alloc.h"
 #endif /* UNBOUND_ALLOC_LITE and UNBOUND_ALLOC_STATS */
index 83fb027..cfb6ce6 100644 (file)
@@ -701,6 +701,7 @@ dns64_operate(struct module_qstate* qstate, enum module_ev event, int id,
                        iq->state = DNS64_NEW_QUERY;
                        iq->started_no_cache_store = qstate->no_cache_store;
                        qstate->no_cache_store = 1;
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
                case module_event_pass:
                        qstate->ext_state[id] = handle_event_pass(qstate, id);
@@ -1044,8 +1045,8 @@ dns64_get_mem(struct module_env* env, int id)
  */
 static struct module_func_block dns64_block = {
        "dns64",
-       &dns64_init, &dns64_deinit, &dns64_operate, &dns64_inform_super,
-       &dns64_clear, &dns64_get_mem
+       NULL, NULL, &dns64_init, &dns64_deinit, &dns64_operate,
+       &dns64_inform_super, &dns64_clear, &dns64_get_mem
 };
 
 /**
index 77914c2..21c0336 100644 (file)
@@ -39,6 +39,7 @@
 
 #ifdef USE_DNSTAP
 
+#include "util/locks.h"
 struct config_file;
 struct sldns_buffer;
 struct dt_msg_queue;
@@ -75,6 +76,13 @@ struct dt_env {
        unsigned log_forwarder_query_messages : 1;
        /** whether to log Message/FORWARDER_RESPONSE */
        unsigned log_forwarder_response_messages : 1;
+
+       /** lock on sample count */
+       lock_basic_type sample_lock;
+       /** rate limit value from config, samples 1/N messages */
+       unsigned int sample_rate;
+       /** rate limit counter */
+       unsigned int sample_rate_count;
 };
 
 /**
index 48867e5..f038ad6 100644 (file)
@@ -367,6 +367,47 @@ type_allowed_in_additional_section(uint16_t tp)
        return 0;
 }
 
+/** Shorten RRset */
+static void
+shorten_rrset(sldns_buffer* pkt, struct rrset_parse* rrset, int count)
+{
+       /* The too large NS RRset is shortened. This is so that too large
+        * content does not overwhelm the cache. It may make the rrset
+        * bogus if it was signed, and then the domain is not resolved any
+        * more, that is okay, the NS RRset was too large. During a referral
+        * it can be shortened and then the first part of the list could
+        * be used to resolve. The scrub continues to disallow glue for the
+        * removed nameserver RRs and removes that too. Because the glue
+        * is not marked as okay, since the RRs have been removed here. */
+       int i;
+       struct rr_parse* rr = rrset->rr_first, *prev = NULL;
+       if(!rr)
+               return;
+       for(i=0; i<count; i++) {
+               prev = rr;
+               rr = rr->next;
+               if(!rr)
+                       return; /* The RRset is already short. */
+       }
+       if(verbosity >= VERB_QUERY
+               && rrset->dname_len <= LDNS_MAX_DOMAINLEN) {
+               uint8_t buf[LDNS_MAX_DOMAINLEN+1];
+               dname_pkt_copy(pkt, buf, rrset->dname);
+               log_nametypeclass(VERB_QUERY, "normalize: shorten RRset:", buf,
+                       rrset->type, ntohs(rrset->rrset_class));
+       }
+       /* remove further rrs */
+       rrset->rr_last = prev;
+       rrset->rr_count = count;
+       while(rr) {
+               rrset->size -= rr->size;
+               rr = rr->next;
+       }
+       if(rrset->rr_last)
+               rrset->rr_last->next = NULL;
+       else    rrset->rr_first = NULL;
+}
+
 /**
  * This routine normalizes a response. This includes removing "irrelevant"
  * records from the answer and additional sections and (re)synthesizing
@@ -387,6 +428,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
        uint8_t* sname = qinfo->qname;
        size_t snamelen = qinfo->qname_len;
        struct rrset_parse* rrset, *prev, *nsset=NULL;
+       int cname_length = 0; /* number of CNAMEs, or DNAMEs */
 
        if(FLAGS_GET_RCODE(msg->flags) != LDNS_RCODE_NOERROR &&
                FLAGS_GET_RCODE(msg->flags) != LDNS_RCODE_NXDOMAIN)
@@ -401,6 +443,16 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
        prev = NULL;
        rrset = msg->rrset_first;
        while(rrset && rrset->section == LDNS_SECTION_ANSWER) {
+               if(cname_length > 11 /* env->cfg.iter_scrub_cname */) {
+                       /* Too many CNAMEs, or DNAMEs, from the authority
+                        * server, scrub down the length to something
+                        * shorter. This deletes everything after the limit
+                        * is reached. The iterator is going to look up
+                        * the content one by one anyway. */
+                       remove_rrset("normalize: removing because too many cnames:",
+                               pkt, msg, prev, &rrset);
+                       continue;
+               }
                if(rrset->type == LDNS_RR_TYPE_DNAME && 
                        pkt_strict_sub(pkt, sname, rrset->dname)) {
                        /* check if next rrset is correct CNAME. else,
@@ -420,6 +472,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
                                        "too long");
                                return 0;
                        }
+                       cname_length++;
                        if(nx && nx->type == LDNS_RR_TYPE_CNAME && 
                           dname_pkt_compare(pkt, sname, nx->dname) == 0) {
                                /* check next cname */
@@ -460,6 +513,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
                if(rrset->type == LDNS_RR_TYPE_CNAME) {
                        struct rrset_parse* nx = rrset->rrset_all_next;
                        uint8_t* oldsname = sname;
+                       cname_length++;
                        /* see if the next one is a DNAME, if so, swap them */
                        if(nx && nx->section == LDNS_SECTION_ANSWER &&
                                nx->type == LDNS_RR_TYPE_DNAME &&
@@ -507,6 +561,10 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
                                        LDNS_SECTION_ANSWER &&
                                        dname_pkt_compare(pkt, oldsname,
                                        rrset->dname) == 0) {
+                                       if(rrset->type == LDNS_RR_TYPE_NS &&
+                                               rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
+                                               shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+                                       }
                                        prev = rrset;
                                        rrset = rrset->rrset_all_next;
                                }
@@ -522,6 +580,11 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
                        continue;
                }
 
+               if(rrset->type == LDNS_RR_TYPE_NS &&
+                       rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
+                       shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+               }
+
                /* Mark the additional names from relevant rrset as OK. */
                /* only for RRsets that match the query name, other ones
                 * will be removed by sanitize, so no additional for them */
@@ -578,6 +641,25 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
                                        "RRset:", pkt, msg, prev, &rrset);
                                continue;
                        }
+                       if(rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
+                               /* If this is not a referral, and the NS RRset
+                                * is signed, then remove it entirely, so
+                                * that when it becomes bogus it does not
+                                * make the message that is otherwise fine
+                                * into a bogus message. */
+                               if(!(msg->an_rrsets == 0 &&
+                                       FLAGS_GET_RCODE(msg->flags) ==
+                                       LDNS_RCODE_NOERROR &&
+                                       !soa_in_auth(msg) &&
+                                       !(msg->flags & BIT_AA)) &&
+                                       rrset->rrsig_count != 0) {
+                                       remove_rrset("normalize: removing too large NS "
+                                               "RRset:", pkt, msg, prev, &rrset);
+                                       continue;
+                               } else {
+                                       shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+                               }
+                       }
                }
                /* if this is type DS and we query for type DS we just got
                 * a referral answer for our type DS query, fix packet */
index f291178..1b4f5f6 100644 (file)
@@ -279,9 +279,10 @@ iter_filter_unsuitable(struct iter_env* iter_env, struct module_env* env,
                name, namelen, qtype, &lame, &dnsseclame, &reclame,
                &rtt, now)) {
                log_addr(VERB_ALGO, "servselect", &a->addr, a->addrlen);
-               verbose(VERB_ALGO, "   rtt=%d%s%s%s%s", rtt,
+               verbose(VERB_ALGO, "   rtt=%d%s%s%s%s%s", rtt,
                        lame?" LAME":"",
                        dnsseclame?" DNSSEC_LAME":"",
+                       a->dnsseclame?" ADDR_DNSSEC_LAME":"",
                        reclame?" REC_LAME":"",
                        a->lame?" ADDR_LAME":"");
                if(lame)
index 5732a41..5a8a20f 100644 (file)
@@ -760,6 +760,14 @@ target_count_increase_nx(struct iter_qstate* iq, int num)
                iq->target_count[TARGET_COUNT_NX] += num;
 }
 
+static void
+target_count_increase_global_quota(struct iter_qstate* iq, int num)
+{
+       target_count_create(iq);
+       if(iq->target_count)
+               iq->target_count[TARGET_COUNT_GLOBAL_QUOTA] += num;
+}
+
 /**
  * Generate a subrequest.
  * Generate a local request event. Local events are tied to this module, and
@@ -1378,7 +1386,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                        "restarts (eg. indirections)");
                if(iq->qchase.qname)
                        errinf_dname(qstate, "stop at", iq->qchase.qname);
-               return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+               return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
        }
 
        /* We enforce a maximum recursion/dependency depth -- in general, 
@@ -1560,6 +1568,11 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                        errinf(qstate, "malloc failure for forward zone");
                        return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
                }
+               if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
+                       qstate->region, iq->dp)) {
+                       errinf(qstate, "malloc failure, copy extra info into delegation point");
+                       return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+               }
                if((qstate->query_flags&BIT_RD)==0) {
                        /* If the server accepts RD=0 queries and forwards
                         * with RD=1, then if the server is listed as an NS
@@ -1654,7 +1667,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                                if(!iq->dp) {
                                        log_err("internal error: no hints dp");
                                        errinf(qstate, "no hints for this class");
-                                       return error_response(qstate, id, 
+                                       return error_response_cache(qstate, id,
                                                LDNS_RCODE_SERVFAIL);
                                }
                                iq->dp = delegpt_copy(iq->dp, qstate->region);
@@ -1974,7 +1987,8 @@ generate_target_query(struct module_qstate* qstate, struct iter_qstate* iq,
  *     if it is negative, there is no maximum number of targets.
  * @param num: returns the number of queries generated and processed, 
  *     which may be zero if there were no missing targets.
- * @return false on error.
+ * @return 0 on success, nonzero on error. 1 means temporary failure and
+ *     2 means the failure can be cached.
  */
 static int
 query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
@@ -1997,13 +2011,13 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
        else    toget = maxtargets;
        if(toget == 0) {
                *num = 0;
-               return 1;
+               return 0;
        }
 
        /* now that we are sure that a target query is going to be made,
         * check the limits. */
        if(iq->depth == ie->max_dependency_depth)
-               return 0;
+               return 1;
        if(iq->depth > 0 && iq->target_count &&
                iq->target_count[TARGET_COUNT_QUERIES] > MAX_TARGET_COUNT) {
                char s[LDNS_MAX_DOMAINLEN+1];
@@ -2011,7 +2025,7 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_QUERY, "request %s has exceeded the maximum "
                        "number of glue fetches %d", s,
                        iq->target_count[TARGET_COUNT_QUERIES]);
-               return 0;
+               return 2;
        }
        if(iq->dp_target_count > MAX_DP_TARGET_COUNT) {
                char s[LDNS_MAX_DOMAINLEN+1];
@@ -2019,7 +2033,7 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_QUERY, "request %s has exceeded the maximum "
                        "number of glue fetches %d to a single delegation point",
                        s, iq->dp_target_count);
-               return 0;
+               return 2;
        }
 
        /* select 'toget' items from the total of 'missing' items */
@@ -2048,7 +2062,7 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                                *num = query_count;
                                if(query_count > 0)
                                        qstate->ext_state[id] = module_wait_subquery;
-                               return 0;
+                               return 1;
                        }
                        query_count++;
                        /* If the mesh query list is full, exit the loop here.
@@ -2057,9 +2071,17 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                         * increase, because the spawned state uses cpu and a
                         * socket while this state waits for that spawned
                         * state. Next time we can look up further targets */
-                       if(mesh_jostle_exceeded(qstate->env->mesh))
+                       if(mesh_jostle_exceeded(qstate->env->mesh)) {
+                               /* If no ip4 query is possible, that makes
+                                * this ns resolved. */
+                               if(!((ie->supports_ipv4 || ie->use_nat64) &&
+                                       ((ns->lame && !ns->done_pside4) ||
+                                       (!ns->lame && !ns->got4)))) {
+                                       ns->resolved = 1;
+                               }
                                break;
                }
+               }
                /* Send the A request. */
                if((ie->supports_ipv4 || ie->use_nat64) &&
                        ((ns->lame && !ns->done_pside4) ||
@@ -2070,13 +2092,18 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                                *num = query_count;
                                if(query_count > 0)
                                        qstate->ext_state[id] = module_wait_subquery;
-                               return 0;
+                               return 1;
                        }
                        query_count++;
                        /* If the mesh query list is full, exit the loop. */
-                       if(mesh_jostle_exceeded(qstate->env->mesh))
+                       if(mesh_jostle_exceeded(qstate->env->mesh)) {
+                               /* With the ip6 query already checked for,
+                                * this makes the ns resolved. It is no longer
+                                * a missing target. */
+                               ns->resolved = 1;
                                break;
                }
+               }
 
                /* mark this target as in progress. */
                ns->resolved = 1;
@@ -2089,7 +2116,7 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
        if(query_count > 0)
                qstate->ext_state[id] = module_wait_subquery;
 
-       return 1;
+       return 0;
 }
 
 /**
@@ -2180,12 +2207,14 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
        }
        /* query for an extra name added by the parent-NS record */
        if(delegpt_count_missing_targets(iq->dp, NULL) > 0) {
-               int qs = 0;
+               int qs = 0, ret;
                verbose(VERB_ALGO, "try parent-side target name");
-               if(!query_for_targets(qstate, iq, ie, id, 1, &qs)) {
+               if((ret=query_for_targets(qstate, iq, ie, id, 1, &qs))!=0) {
                        errinf(qstate, "could not fetch nameserver");
                        errinf_dname(qstate, "at zone", iq->dp->name);
+                       if(ret == 1)
                        return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
                iq->num_target_queries += qs;
                target_count_increase(iq, qs);
@@ -2414,13 +2443,13 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_QUERY, "request has exceeded the maximum "
                        "number of referrrals with %d", iq->referral_count);
                errinf(qstate, "exceeded the maximum of referrals");
-               return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+               return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
        }
        if(iq->sent_count > ie->max_sent_count) {
                verbose(VERB_QUERY, "request has exceeded the maximum "
                        "number of sends with %d", iq->sent_count);
                errinf(qstate, "exceeded the maximum number of sends");
-               return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+               return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
        }
 
        /* Check if we reached MAX_TARGET_NX limit without a fallback activation. */
@@ -2450,7 +2479,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                "already present for the delegation point, no "
                                "fallback possible");
                        errinf(qstate, "exceeded the maximum nameserver nxdomains");
-                       return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
                verbose(VERB_ALGO, "initiating parent-side fallback for "
                        "nxdomain nameserver lookups");
@@ -2493,7 +2522,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                "lookups (%d) with %d", MAX_TARGET_NX_FALLBACK,
                                iq->target_count[TARGET_COUNT_NX]);
                        errinf(qstate, "exceeded the maximum nameserver nxdomains");
-                       return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
 
                if(!iq->dp->has_parent_side_NS) {
@@ -2707,7 +2736,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                verbose(VERB_ALGO, "auth zone lookup failed, no fallback,"
                        " servfail");
                errinf(qstate, "auth zone lookup failed, fallback is off");
-               return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+               return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
        }
        if(iq->dp->auth_dp) {
                /* we wanted to fallback, but had no delegpt, only the
@@ -2736,11 +2765,13 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
 
        /* if in 0x20 fallback get as many targets as possible */
        if(iq->caps_fallback) {
-               int extra = 0;
+               int extra = 0, ret;
                size_t naddr, nres, navail;
-               if(!query_for_targets(qstate, iq, ie, id, -1, &extra)) {
+               if((ret=query_for_targets(qstate, iq, ie, id, -1, &extra))!=0) {
                        errinf(qstate, "could not fetch nameservers for 0x20 fallback");
+                       if(ret == 1)
                        return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
                iq->num_target_queries += extra;
                target_count_increase(iq, extra);
@@ -2883,15 +2914,18 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                         * to distinguish between generating (a) new target 
                         * query, or failing. */
                        if(delegpt_count_missing_targets(iq->dp, NULL) > 0) {
-                               int qs = 0;
+                               int qs = 0, ret;
                                verbose(VERB_ALGO, "querying for next "
                                        "missing target");
-                               if(!query_for_targets(qstate, iq, ie, id, 
-                                       1, &qs)) {
+                               if((ret=query_for_targets(qstate, iq, ie, id, 
+                                       1, &qs))!=0) {
                                        errinf(qstate, "could not fetch nameserver");
                                        errinf_dname(qstate, "at zone", iq->dp->name);
+                                       if(ret == 1)
                                        return error_response(qstate, id,
                                                LDNS_RCODE_SERVFAIL);
+                                       return error_response_cache(qstate, id,
+                                               LDNS_RCODE_SERVFAIL);
                                }
                                if(qs == 0 && 
                                   delegpt_count_missing_targets(iq->dp, NULL) == 0){
@@ -2902,6 +2936,17 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                         * so this is not a loop. */
                                        return 1;
                                }
+                               if(qs == 0) {
+                                       /* There should be targets now, and
+                                        * if there are not, it should not
+                                        * wait for no targets. Stop it from
+                                        * waiting forever, or looping to
+                                        * here, as a safeguard. */
+                                       errinf(qstate, "could not generate nameserver lookups");
+                                       errinf_dname(qstate, "at zone", iq->dp->name);
+                                       return error_response(qstate, id,
+                                               LDNS_RCODE_SERVFAIL);
+                               }
                                iq->num_target_queries += qs;
                                target_count_increase(iq, qs);
                        }
@@ -2976,6 +3021,17 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                }
        }
 
+       target_count_increase_global_quota(iq, 1);
+       if(iq->target_count && iq->target_count[TARGET_COUNT_GLOBAL_QUOTA]
+               > MAX_GLOBAL_QUOTA) {
+               char s[LDNS_MAX_DOMAINLEN+1];
+               dname_str(qstate->qinfo.qname, s);
+               verbose(VERB_QUERY, "request %s has exceeded the maximum "
+                       "global quota on number of upstream queries %d", s,
+                       iq->target_count[TARGET_COUNT_GLOBAL_QUOTA]);
+               return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
+       }
+
        /* Do not check ratelimit for forwarding queries or if we already got a
         * pass. */
        sq_check_ratelimit = (!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok);
@@ -3025,7 +3081,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                        qstate->was_ratelimited = 1;
                        errinf_dname(qstate, "exceeded ratelimit for zone",
                                iq->dp->name);
-                       return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
                log_addr(VERB_QUERY, "error sending query to auth server",
                        &real_addr, real_addrlen);
@@ -3247,7 +3303,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
                                                iter_scrub_nxdomain(iq->response);
                                                return final_state(iq);
                                        }
-                                       return error_response(qstate, id,
+                                       return error_response_cache(qstate, id,
                                                LDNS_RCODE_SERVFAIL);
                                }
                                /* Best effort qname-minimisation. 
@@ -3582,7 +3638,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
                                " fallback possible, servfail");
                        errinf_dname(qstate, "response is bad, no fallback, "
                                "for auth zone", iq->dp->name);
-                       return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+                       return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
                }
                verbose(VERB_ALGO, "auth zone response was bad, "
                        "fallback enabled");
@@ -3990,7 +4046,7 @@ processCollectClass(struct module_qstate* qstate, int id)
                if(iq->num_current_queries == 0) {
                        verbose(VERB_ALGO, "No root hints or fwds, giving up "
                                "on qclass ANY");
-                       return error_response(qstate, id, LDNS_RCODE_REFUSED);
+                       return error_response_cache(qstate, id, LDNS_RCODE_REFUSED);
                }
                /* return false, wait for queries to return */
        }
@@ -4357,7 +4413,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
                                        "getting different replies, failed");
                                outbound_list_remove(&iq->outlist, outbound);
                                errinf(qstate, "0x20 failed, then got different replies in fallback");
-                               (void)error_response(qstate, id, 
+                               (void)error_response_cache(qstate, id,
                                        LDNS_RCODE_SERVFAIL);
                                return;
                        }
@@ -4457,8 +4513,8 @@ iter_get_mem(struct module_env* env, int id)
  */
 static struct module_func_block iter_block = {
        "iterator",
-       &iter_init, &iter_deinit, &iter_operate, &iter_inform_super, 
-       &iter_clear, &iter_get_mem
+       NULL, NULL, &iter_init, &iter_deinit, &iter_operate,
+       &iter_inform_super, &iter_clear, &iter_get_mem
 };
 
 struct module_func_block* 
index e253f3f..70b11df 100644 (file)
@@ -55,6 +55,9 @@ struct rbtree_type;
 
 /** max number of targets spawned for a query and its subqueries */
 #define MAX_TARGET_COUNT       64
+/** max number of upstream queries for a query and its subqueries, it is
+ * never reset. */
+#define MAX_GLOBAL_QUOTA       128
 /** max number of target lookups per qstate, per delegation point */
 #define MAX_DP_TARGET_COUNT    16
 /** max number of nxdomains allowed for target lookups for a query and
@@ -248,6 +251,9 @@ enum target_count_variables {
        TARGET_COUNT_QUERIES,
        /** Number of nxdomain responses encountered. */
        TARGET_COUNT_NX,
+       /** Global quota on number of queries to upstream servers per
+        * client request, that is never reset. */
+       TARGET_COUNT_GLOBAL_QUOTA,
 
        /** This should stay last here, it is used for the allocation */
        TARGET_COUNT_MAX,
index a319f59..05f5798 100644 (file)
@@ -75,7 +75,9 @@ context_finalize(struct ub_ctx* ctx)
        ctx->pipe_pid = getpid();
        cfg_apply_local_port_policy(cfg, 65536);
        config_apply(cfg);
-       if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env))
+       if(!modstack_call_startup(&ctx->mods, cfg->module_conf, ctx->env))
+               return UB_INITFAIL;
+       if(!modstack_call_init(&ctx->mods, cfg->module_conf, ctx->env))
                return UB_INITFAIL;
        listen_setup_locks();
        log_edns_known_options(VERB_ALGO, ctx->env);
index 17057ec..9c6a3e3 100644 (file)
@@ -188,7 +188,9 @@ ub_ctx_create(void)
                int e = errno;
                ub_randfree(ctx->seed_rnd);
                config_delete(ctx->env->cfg);
-               modstack_desetup(&ctx->mods, ctx->env);
+               modstack_call_deinit(&ctx->mods, ctx->env);
+               modstack_call_destartup(&ctx->mods, ctx->env);
+               modstack_free(&ctx->mods);
                listen_desetup_locks();
                edns_known_options_delete(ctx->env);
                edns_strings_delete(ctx->env->edns_strings);
@@ -202,7 +204,9 @@ ub_ctx_create(void)
                tube_delete(ctx->qq_pipe);
                ub_randfree(ctx->seed_rnd);
                config_delete(ctx->env->cfg);
-               modstack_desetup(&ctx->mods, ctx->env);
+               modstack_call_deinit(&ctx->mods, ctx->env);
+               modstack_call_destartup(&ctx->mods, ctx->env);
+               modstack_free(&ctx->mods);
                listen_desetup_locks();
                edns_known_options_delete(ctx->env);
                edns_strings_delete(ctx->env->edns_strings);
@@ -360,7 +364,9 @@ ub_ctx_delete(struct ub_ctx* ctx)
        }
        libworker_delete_event(ctx->event_worker);
 
-       modstack_desetup(&ctx->mods, ctx->env);
+       modstack_call_deinit(&ctx->mods, ctx->env);
+       modstack_call_destartup(&ctx->mods, ctx->env);
+       modstack_free(&ctx->mods);
        a = ctx->alloc_list;
        while(a) {
                na = a->super;
@@ -981,7 +987,8 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr)
        if(!addr) {
                /* disable fwd mode - the root stub should be first. */
                if(ctx->env->cfg->forwards &&
-                       strcmp(ctx->env->cfg->forwards->name, ".") == 0) {
+                       (ctx->env->cfg->forwards->name &&
+                       strcmp(ctx->env->cfg->forwards->name, ".") == 0)) {
                        s = ctx->env->cfg->forwards;
                        ctx->env->cfg->forwards = s->next;
                        s->next = NULL;
@@ -1001,7 +1008,8 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr)
        /* it parses, add root stub in front of list */
        lock_basic_lock(&ctx->cfglock);
        if(!ctx->env->cfg->forwards ||
-               strcmp(ctx->env->cfg->forwards->name, ".") != 0) {
+               (ctx->env->cfg->forwards->name &&
+               strcmp(ctx->env->cfg->forwards->name, ".") != 0)) {
                s = calloc(1, sizeof(*s));
                if(!s) {
                        lock_basic_unlock(&ctx->cfglock);
@@ -1019,6 +1027,7 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr)
                ctx->env->cfg->forwards = s;
        } else {
                log_assert(ctx->env->cfg->forwards);
+               log_assert(ctx->env->cfg->forwards->name);
                s = ctx->env->cfg->forwards;
        }
        dupl = strdup(addr);
index 5c75f61..94b644a 100644 (file)
@@ -292,6 +292,7 @@ libworker_do_cmd(struct libworker* w, uint8_t* msg, uint32_t len)
                        log_err("unknown command for bg worker %d", 
                                (int)context_serial_getcmd(msg, len));
                        /* and fall through to quit */
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
                case UB_LIBCMD_QUIT:
                        free(msg);
index 942e082..db48f17 100644 (file)
@@ -1259,8 +1259,8 @@ respip_get_mem(struct module_env* env, int id)
  */
 static struct module_func_block respip_block = {
        "respip",
-       &respip_init, &respip_deinit, &respip_operate, &respip_inform_super,
-       &respip_clear, &respip_get_mem
+       NULL, NULL, &respip_init, &respip_deinit, &respip_operate,
+       &respip_inform_super, &respip_clear, &respip_get_mem
 };
 
 struct module_func_block*
index f01a6d9..580a681 100644 (file)
@@ -7778,7 +7778,8 @@ static void auth_zone_log(uint8_t* name, enum verbosity_value level,
 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, uint8_t* sigalg)
+       struct auth_rrset* rrset, char** why_bogus, uint8_t* sigalg,
+       char* reasonbuf, size_t reasonlen)
 {
        struct ub_packed_rrset_key pk;
        enum sec_status sec;
@@ -7808,7 +7809,7 @@ static int zonemd_dnssec_verify_rrset(struct auth_zone* z,
                        "zonemd: verify %s RRset with DNSKEY", typestr);
        }
        sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, sigalg, why_bogus, NULL,
-               LDNS_SECTION_ANSWER, NULL, &verified);
+               LDNS_SECTION_ANSWER, NULL, &verified, reasonbuf, reasonlen);
        if(sec == sec_status_secure) {
                return 1;
        }
@@ -7851,7 +7852,8 @@ static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo,
 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, uint8_t* sigalg)
+       char** reason, char** why_bogus, uint8_t* sigalg, char* reasonbuf,
+       size_t reasonlen)
 {
        struct auth_rrset* nsec = NULL;
        if(!apex) {
@@ -7863,7 +7865,7 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z,
                struct ub_packed_rrset_key pk;
                /* dnssec verify the NSEC */
                if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
-                       nsec, why_bogus, sigalg)) {
+                       nsec, why_bogus, sigalg, reasonbuf, reasonlen)) {
                        *reason = "DNSSEC verify failed for NSEC RRset";
                        return 0;
                }
@@ -7906,7 +7908,7 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z,
                }
                /* dnssec verify the NSEC3 */
                if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, match,
-                       nsec3, why_bogus, sigalg)) {
+                       nsec3, why_bogus, sigalg, reasonbuf, reasonlen)) {
                        *reason = "DNSSEC verify failed for NSEC3 RRset";
                        return 0;
                }
@@ -7928,7 +7930,7 @@ 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,
-       uint8_t* sigalg)
+       uint8_t* sigalg, char* reasonbuf, size_t reasonlen)
 {
        struct auth_rrset* soa;
        if(!apex) {
@@ -7941,12 +7943,12 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z,
                return 0;
        }
        if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, soa,
-               why_bogus, sigalg)) {
+               why_bogus, sigalg, reasonbuf, reasonlen)) {
                *reason = "DNSSEC verify failed for SOA RRset";
                return 0;
        }
        if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
-               zonemd_rrset, why_bogus, sigalg)) {
+               zonemd_rrset, why_bogus, sigalg, reasonbuf, reasonlen)) {
                *reason = "DNSSEC verify failed for ZONEMD RRset";
                return 0;
        }
@@ -8014,6 +8016,7 @@ 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, uint8_t* sigalg)
 {
+       char reasonbuf[256];
        char* reason = NULL, *why_bogus = NULL;
        struct auth_data* apex = NULL;
        struct auth_rrset* zonemd_rrset = NULL;
@@ -8042,7 +8045,8 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env,
        } 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, sigalg)) {
+                       &reason, &why_bogus, sigalg, reasonbuf,
+                       sizeof(reasonbuf))) {
                        auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
                        return;
                }
@@ -8050,7 +8054,8 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env,
        } 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, sigalg)) {
+                       zonemd_rrset, &reason, &why_bogus, sigalg, reasonbuf,
+                       sizeof(reasonbuf))) {
                        auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
                        return;
                }
@@ -8107,6 +8112,8 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env,
  * @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.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return the dnskey RRset, reference to zone data and keystorage, or
  *     NULL on failure.
  */
@@ -8114,7 +8121,8 @@ 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 ub_packed_rrset_key* keystorage, char* reasonbuf,
+       size_t reasonlen)
 {
        struct auth_data* apex;
        struct auth_rrset* dnskey_rrset;
@@ -8150,7 +8158,8 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env,
        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, NULL);
+               anchor->dnskey_rrset, NULL, why_bogus, NULL, NULL, reasonbuf,
+               reasonlen);
        regional_free_all(env->scratch);
        if(sec == sec_status_secure) {
                /* success */
@@ -8173,7 +8182,8 @@ static struct ub_packed_rrset_key*
 auth_zone_verify_zonemd_key_with_ds(struct auth_zone* z,
        struct module_env* env, struct module_stack* mods,
        struct ub_packed_rrset_key* ds, int* is_insecure, char** why_bogus,
-       struct ub_packed_rrset_key* keystorage, uint8_t* sigalg)
+       struct ub_packed_rrset_key* keystorage, uint8_t* sigalg,
+       char* reasonbuf, size_t reasonlen)
 {
        struct auth_data* apex;
        struct auth_rrset* dnskey_rrset;
@@ -8209,7 +8219,7 @@ auth_zone_verify_zonemd_key_with_ds(struct auth_zone* z,
        keystorage->rk.rrset_class = htons(z->dclass);
        auth_zone_log(z->name, VERB_QUERY, "zonemd: verify zone DNSKEY with DS");
        sec = val_verify_DNSKEY_with_DS(env, ve, keystorage, ds, sigalg,
-               why_bogus, NULL, NULL);
+               why_bogus, NULL, NULL, reasonbuf, reasonlen);
        regional_free_all(env->scratch);
        if(sec == sec_status_secure) {
                /* success */
@@ -8235,6 +8245,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
 {
        struct auth_zone* z = (struct auth_zone*)arg;
        struct module_env* env;
+       char reasonbuf[256];
        char* reason = NULL, *ds_bogus = NULL, *typestr="DNSKEY";
        struct ub_packed_rrset_key* dnskey = NULL, *ds = NULL;
        int is_insecure = 0, downprot;
@@ -8346,7 +8357,8 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
        if(!reason && !is_insecure && !dnskey && ds) {
                dnskey = auth_zone_verify_zonemd_key_with_ds(z, env,
                        &env->mesh->mods, ds, &is_insecure, &ds_bogus,
-                       &keystorage, downprot?sigalg:NULL);
+                       &keystorage, downprot?sigalg:NULL, reasonbuf,
+                       sizeof(reasonbuf));
                if(!dnskey && !is_insecure && !reason)
                        reason = "DNSKEY verify with DS failed";
        }
@@ -8354,6 +8366,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
        if(reason) {
                auth_zone_zonemd_fail(z, env, reason, ds_bogus, NULL);
                lock_rw_unlock(&z->lock);
+               regional_free_all(env->scratch);
                return;
        }
 
@@ -8438,6 +8451,7 @@ zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env)
 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 reasonbuf[256];
        char* reason = NULL, *why_bogus = NULL;
        struct trust_anchor* anchor = NULL;
        struct ub_packed_rrset_key* dnskey = NULL;
@@ -8472,7 +8486,8 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env,
                }
                /* equal to trustanchor, no need for online lookups */
                dnskey = zonemd_get_dnskey_from_anchor(z, env, mods, anchor,
-                       &is_insecure, &why_bogus, &keystorage);
+                       &is_insecure, &why_bogus, &keystorage, reasonbuf,
+                       sizeof(reasonbuf));
                lock_basic_unlock(&anchor->lock);
                if(!dnskey && !reason && !is_insecure) {
                        reason = "verify DNSKEY RRset with trust anchor failed";
@@ -8498,6 +8513,7 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env,
 
        if(reason) {
                auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
+               regional_free_all(env->scratch);
                return;
        }
 
index 632ed79..9c65836 100644 (file)
@@ -96,7 +96,8 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
                                struct ub_packed_rrset_key* ck;
                                lock_rw_rdlock(&rep->ref[i].key->entry.lock);
                                /* if deleted rrset, do not copy it */
-                               if(rep->ref[i].key->id == 0)
+                               if(rep->ref[i].key->id == 0 ||
+                                       rep->ref[i].id != rep->ref[i].key->id)
                                        ck = NULL;
                                else    ck = packed_rrset_copy_region(
                                        rep->ref[i].key, region, now);
@@ -109,14 +110,22 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
                        /* no break: also copy key item */
                        /* the line below is matched by gcc regex and silences
                         * the fallthrough warning */
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
                case 1: /* ref updated, item inserted */
                        rep->rrsets[i] = rep->ref[i].key;
-               }
-               /* if ref was updated make sure the message ttl is updated to
-                * the minimum of the current rrsets. */
-               ttl = ((struct packed_rrset_data*)rep->rrsets[i]->entry.data)->ttl;
+                       /* ref was updated; make sure the message ttl is
+                        * updated to the minimum of the current rrsets. */
+                       lock_rw_rdlock(&rep->ref[i].key->entry.lock);
+                       /* if deleted, skip ttl update. */
+                       if(rep->ref[i].key->id != 0 &&
+                               rep->ref[i].id == rep->ref[i].key->id) {
+                               ttl = ((struct packed_rrset_data*)
+                                   rep->rrsets[i]->entry.data)->ttl;
                if(ttl < min_ttl) min_ttl = ttl;
+       }
+                       lock_rw_unlock(&rep->ref[i].key->entry.lock);
+               }
        }
        if(min_ttl < rep->ttl) {
                rep->ttl = min_ttl;
@@ -337,6 +346,13 @@ find_add_addrs(struct module_env* env, uint16_t qclass,
                         * not use dns64 translation */
                        neg = msg_cache_lookup(env, ns->name, ns->namelen,
                                LDNS_RR_TYPE_AAAA, qclass, 0, now, 0);
+                       /* Because recursion for lookup uses BIT_CD, check
+                        * for that so it stops the recursion lookup, if a
+                        * negative answer is cached. Because the cache uses
+                        * the CD flag for type AAAA. */
+                       if(!neg)
+                               neg = msg_cache_lookup(env, ns->name, ns->namelen,
+                                       LDNS_RR_TYPE_AAAA, qclass, BIT_CD, now, 0);
                        if(neg) {
                                delegpt_add_neg_msg(dp, neg);
                                lock_rw_unlock(&neg->entry.lock);
@@ -396,6 +412,13 @@ cache_fill_missing(struct module_env* env, uint16_t qclass,
                         * not use dns64 translation */
                        neg = msg_cache_lookup(env, ns->name, ns->namelen,
                                LDNS_RR_TYPE_AAAA, qclass, 0, now, 0);
+                       /* Because recursion for lookup uses BIT_CD, check
+                        * for that so it stops the recursion lookup, if a
+                        * negative answer is cached. Because the cache uses
+                        * the CD flag for type AAAA. */
+                       if(!neg)
+                               neg = msg_cache_lookup(env, ns->name, ns->namelen,
+                                       LDNS_RR_TYPE_AAAA, qclass, BIT_CD, now, 0);
                        if(neg) {
                                delegpt_add_neg_msg(dp, neg);
                                lock_rw_unlock(&neg->entry.lock);
index 457685a..66b17c1 100644 (file)
  * can do this number of packets (until those all timeout too) */
 #define TIMEOUT_COUNT_MAX 3
 
+/** Minus 1000 because that is outside of the RTTBAND, so
+ * blacklisted servers stay blacklisted if this is chosen.
+ * If USEFUL_SERVER_TOP_TIMEOUT is below 1000 (configured via RTT_MAX_TIMEOUT,
+ * infra-cache-max-rtt) change it to just above the RTT_BAND. */
+#define STILL_USEFUL_TIMEOUT (                         \
+       USEFUL_SERVER_TOP_TIMEOUT < 1000 ||             \
+       USEFUL_SERVER_TOP_TIMEOUT - 1000 <= RTT_BAND    \
+               ?RTT_BAND + 1                           \
+               :USEFUL_SERVER_TOP_TIMEOUT - 1000)
+
 /** ratelimit value for delegation point */
 int infra_dp_ratelimit = 0;
 
@@ -347,6 +357,7 @@ infra_create(struct config_file* cfg)
                return NULL;
        }
        infra_ip_ratelimit = cfg->ip_ratelimit;
+       infra_ip_ratelimit_cookie = cfg->ip_ratelimit_cookie;
        infra->client_ip_rates = slabhash_create(cfg->ip_ratelimit_slabs,
            INFRA_HOST_STARTSIZE, cfg->ip_ratelimit_size, &ip_rate_sizefunc,
            &ip_rate_compfunc, &ip_rate_delkeyfunc, &ip_rate_deldatafunc, NULL);
@@ -398,6 +409,7 @@ infra_adjust(struct infra_cache* infra, struct config_file* cfg)
        infra->infra_keep_probing = cfg->infra_keep_probing;
        infra_dp_ratelimit = cfg->ratelimit;
        infra_ip_ratelimit = cfg->ip_ratelimit;
+       infra_ip_ratelimit_cookie = cfg->ip_ratelimit_cookie;
        maxmem = cfg->infra_cache_numhosts * (sizeof(struct infra_key)+
                sizeof(struct infra_data)+INFRA_BYTES_NAME);
        /* divide cachesize by slabs and multiply by slabs, because if the
@@ -656,7 +668,7 @@ infra_update_tcp_works(struct infra_cache* infra,
        if(data->rtt.rto >= RTT_MAX_TIMEOUT)
                /* do not disqualify this server altogether, it is better
                 * than nothing */
-               data->rtt.rto = RTT_MAX_TIMEOUT-1000;
+               data->rtt.rto = STILL_USEFUL_TIMEOUT;
        lock_rw_unlock(&e->lock);
 }
 
@@ -796,7 +808,7 @@ infra_get_lame_rtt(struct infra_cache* infra,
                && infra->infra_keep_probing) {
                /* single probe, keep probing */
                if(*rtt >= USEFUL_SERVER_TOP_TIMEOUT)
-                       *rtt = USEFUL_SERVER_TOP_TIMEOUT-1000;
+                       *rtt = STILL_USEFUL_TIMEOUT;
        } else if(host->rtt.rto >= PROBE_MAXRTO && timenow < host->probedelay
                && rtt_notimeout(&host->rtt)*4 <= host->rtt.rto) {
                /* single probe for this domain, and we are not probing */
@@ -804,26 +816,23 @@ infra_get_lame_rtt(struct infra_cache* infra,
                if(qtype == LDNS_RR_TYPE_A) {
                        if(host->timeout_A >= TIMEOUT_COUNT_MAX)
                                *rtt = USEFUL_SERVER_TOP_TIMEOUT;
-                       else    *rtt = USEFUL_SERVER_TOP_TIMEOUT-1000;
+                       else    *rtt = STILL_USEFUL_TIMEOUT;
                } else if(qtype == LDNS_RR_TYPE_AAAA) {
                        if(host->timeout_AAAA >= TIMEOUT_COUNT_MAX)
                                *rtt = USEFUL_SERVER_TOP_TIMEOUT;
-                       else    *rtt = USEFUL_SERVER_TOP_TIMEOUT-1000;
+                       else    *rtt = STILL_USEFUL_TIMEOUT;
                } else {
                        if(host->timeout_other >= TIMEOUT_COUNT_MAX)
                                *rtt = USEFUL_SERVER_TOP_TIMEOUT;
-                       else    *rtt = USEFUL_SERVER_TOP_TIMEOUT-1000;
+                       else    *rtt = STILL_USEFUL_TIMEOUT;
                }
        }
        /* expired entry */
        if(timenow > host->ttl) {
-
                /* see if this can be a re-probe of an unresponsive server */
-               /* minus 1000 because that is outside of the RTTBAND, so
-                * blacklisted servers stay blacklisted if this is chosen */
                if(host->rtt.rto >= USEFUL_SERVER_TOP_TIMEOUT) {
                        lock_rw_unlock(&e->lock);
-                       *rtt = USEFUL_SERVER_TOP_TIMEOUT-1000;
+                       *rtt = STILL_USEFUL_TIMEOUT;
                        *lame = 0;
                        *dnsseclame = 0;
                        *reclame = 0;
index ee6f384..1a88bbb 100644 (file)
@@ -234,7 +234,7 @@ struct infra_cache* infra_adjust(struct infra_cache* infra,
        struct config_file* cfg);
 
 /**
- * Plain find infra data function (used by the the other functions)
+ * Plain find infra data function (used by the other functions)
  * @param infra: infrastructure cache.
  * @param addr: host address.
  * @param addrlen: length of addr.
index 7eb59a1..6c0691f 100644 (file)
@@ -675,7 +675,7 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
        int* reuseport, int transparent, int mss, int nodelay, int freebind,
        int use_systemd, int dscp)
 {
-       int s;
+       int s = -1;
        char* err;
 #if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND) || defined(SO_BINDANY)
        int on = 1;
index 51056c8..f2aacaf 100644 (file)
@@ -242,7 +242,7 @@ lz_enter_zone_dname(struct local_zones* zones, uint8_t* nm, size_t len,
 }
 
 /** enter a new zone */
-static struct local_zone*
+struct local_zone*
 lz_enter_zone(struct local_zones* zones, const char* name, const char* type,
        uint16_t dclass)
 {
@@ -983,36 +983,39 @@ lz_enter_overrides(struct local_zones* zones, struct config_file* cfg)
        return 1;
 }
 
-/** setup parent pointers, so that a lookup can be done for closest match */
-static void
-init_parents(struct local_zones* zones)
+/* return closest parent in the tree, NULL if none */
+static struct local_zone* find_closest_parent(struct local_zone* curr,
+       struct local_zone* prev)
 {
-        struct local_zone* node, *prev = NULL, *p;
+       struct local_zone* p;
         int m;
-       lock_rw_wrlock(&zones->lock);
-        RBTREE_FOR(node, struct local_zone*, &zones->ztree) {
-               lock_rw_wrlock(&node->lock);
-                node->parent = NULL;
-                if(!prev || prev->dclass != node->dclass) {
-                        prev = node;
-                       lock_rw_unlock(&node->lock);
-                        continue;
-                }
-                (void)dname_lab_cmp(prev->name, prev->namelabs, node->name,
-                        node->namelabs, &m); /* we know prev is smaller */
+       if(!prev || prev->dclass != curr->dclass) return NULL;
+       (void)dname_lab_cmp(prev->name, prev->namelabs, curr->name,
+               curr->namelabs, &m); /* we know prev is smaller */
                 /* sort order like: . com. bla.com. zwb.com. net. */
                 /* find the previous, or parent-parent-parent */
-                for(p = prev; p; p = p->parent)
+       for(p = prev; p; p = p->parent) {
                         /* looking for name with few labels, a parent */
                         if(p->namelabs <= m) {
                                 /* ==: since prev matched m, this is closest*/
                                 /* <: prev matches more, but is not a parent,
                                  * this one is a (grand)parent */
-                                node->parent = p;
-                                break;
+                       return p;
+               }
+       }
+       return NULL;
                         }
-                prev = node;
 
+/** setup parent pointers, so that a lookup can be done for closest match */
+void
+lz_init_parents(struct local_zones* zones)
+{
+       struct local_zone* node, *prev = NULL;
+       lock_rw_wrlock(&zones->lock);
+       RBTREE_FOR(node, struct local_zone*, &zones->ztree) {
+               lock_rw_wrlock(&node->lock);
+               node->parent = find_closest_parent(node, prev);
+               prev = node;
                if(node->override_tree)
                        addr_tree_init_parents(node->override_tree);
                lock_rw_unlock(&node->lock);
@@ -1036,7 +1039,7 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg)
        int nmlabs = 0;
        int match = 0; /* number of labels match count */
 
-       init_parents(zones); /* to enable local_zones_lookup() */
+       lz_init_parents(zones); /* to enable local_zones_lookup() */
        for(p = cfg->local_data; p; p = p->next) {
                uint8_t* rr_name;
                uint16_t rr_class, rr_type;
@@ -1202,7 +1205,7 @@ local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
        }
 
        /* setup parent ptrs for lookup during data entry */
-       init_parents(zones);
+       lz_init_parents(zones);
        /* insert local zone tags */
        if(!lz_enter_zone_tags(zones, cfg)) {
                return 0;
@@ -2028,7 +2031,9 @@ struct local_zone* local_zones_add_zone(struct local_zones* zones,
        uint8_t* name, size_t len, int labs, uint16_t dclass,
        enum localzone_type tp)
 {
+       int exact;
        /* create */
+       struct local_zone *prev;
        struct local_zone* z = local_zone_create(name, len, labs, tp, dclass);
        if(!z) {
                free(name);
@@ -2037,10 +2042,12 @@ struct local_zone* local_zones_add_zone(struct local_zones* zones,
        lock_rw_wrlock(&z->lock);
 
        /* find the closest parent */
-       z->parent = local_zones_find(zones, name, len, labs, dclass);
+       prev = local_zones_find_le(zones, name, len, labs, dclass, &exact);
+       if(!exact)
+               z->parent = find_closest_parent(z, prev);
 
        /* insert into the tree */
-       if(!rbtree_insert(&zones->ztree, &z->node)) {
+       if(exact||!rbtree_insert(&zones->ztree, &z->node)) {
                /* duplicate entry! */
                lock_rw_unlock(&z->lock);
                local_zone_delete(z);
index 4456893..6f0f28b 100644 (file)
@@ -641,4 +641,23 @@ local_zone_enter_rr(struct local_zone* z, uint8_t* nm, size_t nmlen,
  */
 struct local_data* 
 local_zone_find_data(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs);
+
+/** Enter a new zone; returns with WRlock
+ *  Made public for unit testing
+ *  @param zones: the local zones tree
+ *  @param name: name of the zone
+ *  @param type: type of the zone
+ *  @param dclass: class of the zone
+ *  @return local_zone (or duplicate), NULL on parse and malloc failures
+ */
+struct local_zone*
+lz_enter_zone(struct local_zones* zones, const char* name, const char* type,
+       uint16_t dclass);
+
+/** Setup parent pointers, so that a lookup can be done for closest match
+ *  Made public for unit testing
+ *  @param zones: the local zones tree
+ */
+void
+lz_init_parents(struct local_zones* zones);
 #endif /* SERVICES_LOCALZONE_H */
index e886c4b..5221188 100644 (file)
@@ -413,6 +413,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
        int timeout = mesh->env->cfg->serve_expired?
                mesh->env->cfg->serve_expired_client_timeout:0;
        struct sldns_buffer* r_buffer = rep->c->buffer;
+       uint16_t mesh_flags = qflags&(BIT_RD|BIT_CD);
        if(rep->c->tcp_req_info) {
                r_buffer = rep->c->tcp_req_info->spool_buffer;
        }
@@ -425,7 +426,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                return;
        }
        if(!unique)
-               s = mesh_area_find(mesh, cinfo, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
+               s = mesh_area_find(mesh, cinfo, qinfo, mesh_flags, 0, 0);
        /* does this create a new reply state? */
        if(!s || s->list_select == mesh_no_list) {
                if(!mesh_make_new_space(mesh, rep->c->buffer)) {
@@ -453,7 +454,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                struct rbnode_type* n;
 #endif
                s = mesh_state_create(mesh->env, qinfo, cinfo,
-                       qflags&(BIT_RD|BIT_CD), 0, 0);
+                       mesh_flags, 0, 0);
                if(!s) {
                        log_err("mesh_state_create: out of memory; SERVFAIL");
                        if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL, NULL,
@@ -565,6 +566,8 @@ servfail_mem:
                        edns->opt_list_inplace_cb_out = NULL;
        error_encode(r_buffer, LDNS_RCODE_SERVFAIL,
                qinfo, qid, qflags, edns);
+       if(rep->c->use_h2)
+               http2_stream_remove_mesh_state(rep->c->h2_stream);
        comm_point_send_reply(rep);
        if(added)
                mesh_state_delete(&s->s);
@@ -583,8 +586,9 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
        int was_detached = 0;
        int was_noreply = 0;
        int added = 0;
+       uint16_t mesh_flags = qflags&(BIT_RD|BIT_CD);
        if(!unique)
-               s = mesh_area_find(mesh, NULL, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
+               s = mesh_area_find(mesh, NULL, qinfo, mesh_flags, 0, 0);
 
        /* there are no limits on the number of callbacks */
 
@@ -594,7 +598,7 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
                struct rbnode_type* n;
 #endif
                s = mesh_state_create(mesh->env, qinfo, NULL,
-                       qflags&(BIT_RD|BIT_CD), 0, 0);
+                       mesh_flags, 0, 0);
                if(!s) {
                        return 0;
                }
@@ -673,8 +677,12 @@ static void mesh_schedule_prefetch(struct mesh_area* mesh,
        struct query_info* qinfo, uint16_t qflags, time_t leeway, int run,
        int rpz_passthru)
 {
+       /* Explicitly set the BIT_RD regardless of the client's flags. This is
+        * for a prefetch query (no client attached) but it needs to be treated
+        * as a recursion query. */
+       uint16_t mesh_flags = BIT_RD|(qflags&BIT_CD);
        struct mesh_state* s = mesh_area_find(mesh, NULL, qinfo,
-               qflags&(BIT_RD|BIT_CD), 0, 0);
+               mesh_flags, 0, 0);
 #ifdef UNBOUND_DEBUG
        struct rbnode_type* n;
 #endif
@@ -694,8 +702,7 @@ static void mesh_schedule_prefetch(struct mesh_area* mesh,
                return;
        }
 
-       s = mesh_state_create(mesh->env, qinfo, NULL,
-               qflags&(BIT_RD|BIT_CD), 0, 0);
+       s = mesh_state_create(mesh->env, qinfo, NULL, mesh_flags, 0, 0);
        if(!s) {
                log_err("prefetch mesh_state_create: out of memory");
                return;
@@ -756,14 +763,17 @@ static void mesh_schedule_prefetch_subnet(struct mesh_area* mesh,
 #ifdef UNBOUND_DEBUG
        struct rbnode_type* n;
 #endif
+       /* Explicitly set the BIT_RD regardless of the client's flags. This is
+        * for a prefetch query (no client attached) but it needs to be treated
+        * as a recursion query. */
+       uint16_t mesh_flags = BIT_RD|(qflags&BIT_CD);
        if(!mesh_make_new_space(mesh, NULL)) {
                verbose(VERB_ALGO, "Too many queries. dropped prefetch.");
                mesh->stats_dropped ++;
                return;
        }
 
-       s = mesh_state_create(mesh->env, qinfo, NULL,
-               qflags&(BIT_RD|BIT_CD), 0, 0);
+       s = mesh_state_create(mesh->env, qinfo, NULL, mesh_flags, 0, 0);
        if(!s) {
                log_err("prefetch_subnet mesh_state_create: out of memory");
                return;
@@ -966,6 +976,8 @@ mesh_state_cleanup(struct mesh_state* mstate)
                for(; rep; rep=rep->next) {
                        infra_wait_limit_dec(mesh->env->infra_cache,
                                &rep->query_reply, mesh->env->cfg);
+                       if(rep->query_reply.c->use_h2)
+                               http2_stream_remove_mesh_state(rep->h2_stream);
                        comm_point_drop_reply(&rep->query_reply);
                        log_assert(mesh->num_reply_addrs > 0);
                        mesh->num_reply_addrs--;
@@ -1522,6 +1534,8 @@ void mesh_query_done(struct mesh_state* mstate)
                        infra_wait_limit_dec(mstate->s.env->infra_cache,
                                &r->query_reply, mstate->s.env->cfg);
                        mstate->reply_list = NULL;
+                       if(r->query_reply.c->use_h2)
+                               http2_stream_remove_mesh_state(r->h2_stream);
                        comm_point_drop_reply(&r->query_reply);
                        mstate->reply_list = reply_list;
                        mstate->s.env->mesh->stats_dropped++;
@@ -1554,6 +1568,9 @@ void mesh_query_done(struct mesh_state* mstate)
                        infra_wait_limit_dec(mstate->s.env->infra_cache,
                                &r->query_reply, mstate->s.env->cfg);
                        mstate->reply_list = NULL;
+                       if(r->query_reply.c->use_h2) {
+                               http2_stream_remove_mesh_state(r->h2_stream);
+                       }
                        comm_point_drop_reply(&r->query_reply);
                        mstate->reply_list = reply_list;
                } else {
@@ -1568,6 +1585,8 @@ void mesh_query_done(struct mesh_state* mstate)
                                tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
                                r_buffer = NULL;
                        }
+                       /* mesh_send_reply removed mesh state from
+                        * http2_stream. */
                        prev = r;
                        prev_buffer = r_buffer;
                }
@@ -1720,6 +1739,7 @@ int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
                return 0;
        if(rep->c->use_h2)
                r->h2_stream = rep->c->h2_stream;
+       else    r->h2_stream = NULL;
 
        /* Data related to local alias stored in 'qinfo' (if any) is ephemeral
         * and can be different for different original queries (even if the
@@ -2243,6 +2263,8 @@ mesh_serve_expired_callback(void* arg)
                        infra_wait_limit_dec(mstate->s.env->infra_cache,
                                &r->query_reply, mstate->s.env->cfg);
                        mstate->reply_list = NULL;
+                       if(r->query_reply.c->use_h2)
+                               http2_stream_remove_mesh_state(r->h2_stream);
                        comm_point_drop_reply(&r->query_reply);
                        mstate->reply_list = reply_list;
                        mstate->s.env->mesh->stats_dropped++;
@@ -2276,6 +2298,7 @@ mesh_serve_expired_callback(void* arg)
                        r, r_buffer, prev, prev_buffer);
                if(r->query_reply.c->tcp_req_info)
                        tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
+               /* mesh_send_reply removed mesh state from http2_stream. */
                infra_wait_limit_dec(mstate->s.env->infra_cache,
                        &r->query_reply, mstate->s.env->cfg);
                prev = r;
index a90d717..c2542e7 100644 (file)
@@ -95,6 +95,16 @@ modstack_init(struct module_stack* stack)
        stack->mod = NULL;
 }
 
+void
+modstack_free(struct module_stack* stack)
+{
+       if(!stack)
+               return;
+        stack->num = 0;
+        free(stack->mod);
+        stack->mod = NULL;
+}
+
 int
 modstack_config(struct module_stack* stack, const char* module_conf)
 {
@@ -223,17 +233,58 @@ module_func_block* module_factory(const char** str)
 }
 
 int 
-modstack_setup(struct module_stack* stack, const char* module_conf,
+modstack_call_startup(struct module_stack* stack, const char* module_conf,
        struct module_env* env)
 {
         int i;
         if(stack->num != 0)
-                modstack_desetup(stack, env);
+               fatal_exit("unexpected already initialised modules");
         /* fixed setup of the modules */
         if(!modstack_config(stack, module_conf)) {
                return 0;
         }
+        for(i=0; i<stack->num; i++) {
+               if(stack->mod[i]->startup == NULL)
+                       continue;
+                verbose(VERB_OPS, "startup module %d: %s",
+                        i, stack->mod[i]->name);
+                fptr_ok(fptr_whitelist_mod_startup(stack->mod[i]->startup));
+                if(!(*stack->mod[i]->startup)(env, i)) {
+                        log_err("module startup for module %s failed",
+                                stack->mod[i]->name);
+                       return 0;
+                }
+        }
+       return 1;
+}
+
+int
+modstack_call_init(struct module_stack* stack, const char* module_conf,
+       struct module_env* env)
+{
+        int i, changed = 0;
         env->need_to_validate = 0; /* set by module init below */
+        for(i=0; i<stack->num; i++) {
+               while(*module_conf && isspace(*module_conf))
+                       module_conf++;
+                if(strncmp(stack->mod[i]->name, module_conf,
+                       strlen(stack->mod[i]->name))) {
+                       if(stack->mod[i]->startup || stack->mod[i]->destartup) {
+                               log_err("changed module ordering during reload not supported, for module that needs startup");
+                               return 0;
+                       } else {
+                               changed = 1;
+                       }
+               }
+               module_conf += strlen(stack->mod[i]->name);
+       }
+       if(changed) {
+               modstack_free(stack);
+               if(!modstack_config(stack, module_conf)) {
+                       return 0;
+               }
+       }
+
         for(i=0; i<stack->num; i++) {
                 verbose(VERB_OPS, "init module %d: %s",
                         i, stack->mod[i]->name);
@@ -248,16 +299,25 @@ modstack_setup(struct module_stack* stack, const char* module_conf,
 }
 
 void 
-modstack_desetup(struct module_stack* stack, struct module_env* env)
+modstack_call_deinit(struct module_stack* stack, struct module_env* env)
 {
         int i;
         for(i=0; i<stack->num; i++) {
                 fptr_ok(fptr_whitelist_mod_deinit(stack->mod[i]->deinit));
                 (*stack->mod[i]->deinit)(env, i);
         }
-        stack->num = 0;
-        free(stack->mod);
-        stack->mod = NULL;
+}
+
+void
+modstack_call_destartup(struct module_stack* stack, struct module_env* env)
+{
+        int i;
+        for(i=0; i<stack->num; i++) {
+               if(stack->mod[i]->destartup == NULL)
+                       continue;
+                fptr_ok(fptr_whitelist_mod_destartup(stack->mod[i]->destartup));
+                (*stack->mod[i]->destartup)(env, i);
+        }
 }
 
 int 
index 3ff01b5..5674aef 100644 (file)
@@ -60,6 +60,23 @@ struct module_stack {
  */
 void modstack_init(struct module_stack* stack);
 
+/**
+ * Free the stack of modules
+ * @param stack: stack that frees up memory.
+ */
+void modstack_free(struct module_stack* stack);
+
+/**
+ * Initialises modules and assignes ids. Calls module_startup().
+ * @param stack: Expected empty, filled according to module_conf
+ * @param module_conf: string what modules to initialize
+ * @param env: module environment which is inited by the modules.
+ *     environment should have a superalloc, cfg,
+ * @return on false a module init failed.
+ */
+int modstack_call_startup(struct module_stack* stack, const char* module_conf,
+       struct module_env* env);
+
 /**
  * Read config file module settings and set up the modfunc block
  * @param stack: the stack of modules (empty before call). 
@@ -83,24 +100,31 @@ struct module_func_block* module_factory(const char** str);
 const char** module_list_avail(void);
 
 /**
- * Setup modules. Assigns ids and calls module_init.
- * @param stack: if not empty beforehand, it will be desetup()ed.
- *     It is then modstack_configged().
- * @param module_conf: string what modules to insert.
+ * Init modules. Calls module_init().
+ * @param stack: It is modstack_setupped().
+ * @param module_conf: module ordering to check against the ordering in stack.
+ *     fails on changed ordering.
  * @param env: module environment which is inited by the modules.
  *     environment should have a superalloc, cfg,
  *     env.need_to_validate is set by the modules.
  * @return on false a module init failed.
  */
-int modstack_setup(struct module_stack* stack, const char* module_conf,
+int modstack_call_init(struct module_stack* stack, const char* module_conf,
        struct module_env* env);
 
 /**
- * Desetup the modules, deinit, delete.
+ * Deinit the modules.
  * @param stack: made empty.
  * @param env: module env for module deinit() calls.
  */
-void modstack_desetup(struct module_stack* stack, struct module_env* env);
+void modstack_call_deinit(struct module_stack* stack, struct module_env* env);
+
+/**
+ * Destartup the modules, close, delete.
+ * @param stack: made empty.
+ * @param env: module env for module destartup() calls.
+ */
+void modstack_call_destartup(struct module_stack* stack, struct module_env* env);
 
 /**
  * Find index of module by name.
index 1f89740..58f1e6d 100644 (file)
@@ -2051,7 +2051,8 @@ select_id(struct outside_network* outnet, struct pending* pend,
 }
 
 /** return true is UDP connect error needs to be logged */
-static int udp_connect_needs_log(int err)
+static int udp_connect_needs_log(int err, struct sockaddr_storage* addr,
+       socklen_t addrlen)
 {
        switch(err) {
        case ECONNREFUSED:
@@ -2075,6 +2076,15 @@ static int udp_connect_needs_log(int err)
                if(verbosity >= VERB_ALGO)
                        return 1;
                return 0;
+       case EINVAL:
+               /* Stop 'Invalid argument for fe80::/10' addresses appearing
+                * in the logs, at low verbosity. They cannot be sent to. */
+               if(addr_is_ip6linklocal(addr, addrlen)) {
+                       if(verbosity >= VERB_ALGO)
+                               return 1;
+                       return 0;
+               }
+               break;
        default:
                break;
        }
@@ -2141,7 +2151,8 @@ select_ifport(struct outside_network* outnet, struct pending* pend,
                                /* connect() to the destination */
                                if(connect(fd, (struct sockaddr*)&pend->addr,
                                        pend->addrlen) < 0) {
-                                       if(udp_connect_needs_log(errno)) {
+                                       if(udp_connect_needs_log(errno,
+                                               &pend->addr, pend->addrlen)) {
                                                log_err_addr("udp connect failed",
                                                        strerror(errno), &pend->addr,
                                                        pend->addrlen);
@@ -3455,7 +3466,10 @@ outnet_serviced_query(struct outside_network* outnet,
                        timenow = *env->now;
                        if(!infra_ratelimit_inc(env->infra_cache, zone,
                                zonelen, timenow, env->cfg->ratelimit_backoff,
-                               &qstate->qinfo, qstate->reply)) {
+                               &qstate->qinfo,
+                               qstate->mesh_info->reply_list
+                                       ?&qstate->mesh_info->reply_list->query_reply
+                                       :NULL)) {
                                /* Can we pass through with slip factor? */
                                if(env->cfg->ratelimit_factor == 0 ||
                                        ub_random_max(env->rnd,
index f036cc5..d8999a8 100644 (file)
@@ -242,10 +242,14 @@ rpz_action_to_localzone_type(enum rpz_action a)
        case RPZ_NODATA_ACTION: return local_zone_always_nodata;
        case RPZ_DROP_ACTION: return local_zone_always_deny;
        case RPZ_PASSTHRU_ACTION: return local_zone_always_transparent;
-       case RPZ_LOCAL_DATA_ACTION:     /* fallthrough */
+       case RPZ_LOCAL_DATA_ACTION:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        case RPZ_CNAME_OVERRIDE_ACTION: return local_zone_redirect;
        case RPZ_TCP_ONLY_ACTION: return local_zone_truncate;
-       case RPZ_INVALID_ACTION: /* fallthrough */
+       case RPZ_INVALID_ACTION:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        default: return local_zone_invalid;
        }
 }
@@ -258,10 +262,14 @@ rpz_action_to_respip_action(enum rpz_action a)
        case RPZ_NODATA_ACTION: return respip_always_nodata;
        case RPZ_DROP_ACTION: return respip_always_deny;
        case RPZ_PASSTHRU_ACTION: return respip_always_transparent;
-       case RPZ_LOCAL_DATA_ACTION: /* fallthrough */
+       case RPZ_LOCAL_DATA_ACTION:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        case RPZ_CNAME_OVERRIDE_ACTION: return respip_redirect;
        case RPZ_TCP_ONLY_ACTION: return respip_truncate;
-       case RPZ_INVALID_ACTION: /* fallthrough */
+       case RPZ_INVALID_ACTION:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        default: return respip_invalid;
        }
 }
@@ -276,7 +284,9 @@ localzone_type_to_rpz_action(enum localzone_type lzt)
        case local_zone_always_transparent: return RPZ_PASSTHRU_ACTION;
        case local_zone_redirect: return RPZ_LOCAL_DATA_ACTION;
        case local_zone_truncate: return RPZ_TCP_ONLY_ACTION;
-       case local_zone_invalid: /* fallthrough */
+       case local_zone_invalid:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        default: return RPZ_INVALID_ACTION;
        }
 }
@@ -291,7 +301,9 @@ respip_action_to_rpz_action(enum respip_action a)
        case respip_always_transparent: return RPZ_PASSTHRU_ACTION;
        case respip_redirect: return RPZ_LOCAL_DATA_ACTION;
        case respip_truncate: return RPZ_TCP_ONLY_ACTION;
-       case respip_invalid: /* fallthrough */
+       case respip_invalid:
+               ATTR_FALLTHROUGH
+               /* fallthrough */
        default: return RPZ_INVALID_ACTION;
        }
 }
@@ -2435,11 +2447,10 @@ rpz_callback_from_iterator_module(struct module_qstate* ms, struct iter_qstate*
        if(ms->env == NULL || ms->env->auth_zones == NULL) { return 0; }
 
        az = ms->env->auth_zones;
+       lock_rw_rdlock(&az->rpz_lock);
 
        verbose(VERB_ALGO, "rpz: iterator module callback: have_rpz=%d", az->rpz_first != NULL);
 
-       lock_rw_rdlock(&az->rpz_lock);
-
        /* precedence of RPZ works, loosely, like this:
         * CNAMEs in order of the CNAME chain. rpzs in the order they are
         * configured. In an RPZ: first client-IP addr, then QNAME, then
@@ -2454,6 +2465,13 @@ rpz_callback_from_iterator_module(struct module_qstate* ms, struct iter_qstate*
                        lock_rw_unlock(&a->lock);
                        continue;
                }
+               if(r->taglist && (!ms->client_info ||
+                       !taglist_intersect(r->taglist, r->taglistlen,
+                               ms->client_info->taglist,
+                               ms->client_info->taglen))) {
+                       lock_rw_unlock(&a->lock);
+                       continue;
+               }
 
                /* the nsdname has precedence over the nsip triggers */
                z = rpz_delegation_point_zone_lookup(is->dp, r->nsdname_zones,
@@ -2512,6 +2530,13 @@ struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms,
                        lock_rw_unlock(&a->lock);
                        continue;
                }
+               if(r->taglist && (!ms->client_info ||
+                       !taglist_intersect(r->taglist, r->taglistlen,
+                               ms->client_info->taglist,
+                               ms->client_info->taglen))) {
+                       lock_rw_unlock(&a->lock);
+                       continue;
+               }
                z = rpz_find_zone(r->local_zones, is->qchase.qname,
                        is->qchase.qname_len, is->qchase.qclass, 0, 0, 0);
                if(z && r->action_override == RPZ_DISABLED_ACTION) {
index fa8f51a..504a78b 100644 (file)
@@ -106,7 +106,7 @@ ssize_t sldns_bget_token(struct sldns_buffer *b, char *token, const char *delim,
  * \param[in] k_del keyword delimiter 
  * \param[out] data the data found 
  * \param[in] d_del the data delimiter
- * \param[in] data_limit maximum size the the data buffer
+ * \param[in] data_limit maximum size the data buffer
  * \return the number of character read
  */
 ssize_t sldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit);
@@ -119,7 +119,7 @@ ssize_t sldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del,
  * \param[in] k_del keyword delimiter 
  * \param[out] data the data found 
  * \param[in] d_del the data delimiter
- * \param[in] data_limit maximum size the the data buffer
+ * \param[in] data_limit maximum size the data buffer
  * \param[in] line_nr pointer to an integer containing the current line number (for
 debugging purposes)
  * \return the number of character read
@@ -134,7 +134,7 @@ ssize_t sldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_de
  * \param[in] k_del keyword delimiter 
  * \param[out] data the data found 
  * \param[in] d_del the data delimiter
- * \param[in] data_limit maximum size the the data buffer
+ * \param[in] data_limit maximum size the data buffer
  * \return the number of character read
  */
 ssize_t sldns_bget_keyword_data(struct sldns_buffer *b, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit);
index dd1f334..f696c6a 100644 (file)
@@ -436,11 +436,13 @@ sldns_b32_ntop_base(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz,
 
                /* ........ ........ ....4444 4....... ........ */
                         c =  src[3]         >> 7 ;
+               ATTR_FALLTHROUGH
                /* fallthrough */
        case 3: dst[4] = b32[(src[2] & 0x0f) << 1 | c];
 
                /* ........ .......3 3333.... ........ ........ */
                         c =  src[2]         >> 4 ;
+               ATTR_FALLTHROUGH
                /* fallthrough */
        case 2: dst[3] = b32[(src[1] & 0x01) << 4 | c];
 
@@ -449,6 +451,7 @@ sldns_b32_ntop_base(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz,
 
                /* .....111 11...... ........ ........ ........ */
                         c =  src[1]         >> 6 ;
+               ATTR_FALLTHROUGH
                /* fallthrough */
        case 1: dst[1] = b32[(src[0] & 0x07) << 2 | c];
 
@@ -460,11 +463,14 @@ sldns_b32_ntop_base(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz,
                switch (src_sz) {
                        case 1: dst[2] = '=';
                                dst[3] = '=';
+                               ATTR_FALLTHROUGH
                                /* fallthrough */
                        case 2: dst[4] = '=';
+                               ATTR_FALLTHROUGH
                                /* fallthrough */
                        case 3: dst[5] = '=';
                                dst[6] = '=';
+                               ATTR_FALLTHROUGH
                                /* fallthrough */
                        case 4: dst[7] = '=';
                }
@@ -577,17 +583,20 @@ sldns_b32_pton_base(const char* src, size_t src_sz, uint8_t* dst, size_t dst_sz,
                        /* ........ ........ ........ .55555.. ........ */
                        /* ........ ........ ....4444 4....... ........ */
                        dst[3] = buf[4] << 7 | buf[5] << 2 | buf[6] >> 3;
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
 
                case 5: /* ........ ........ ....4444 4....... ........ */
                        /* ........ .......3 3333.... ........ ........ */
                        dst[2] = buf[3] << 4 | buf[4] >> 1;
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
 
                case 4: /* ........ .......3 3333.... ........ ........ */
                        /* ........ ..22222. ........ ........ ........ */
                        /* .....111 11...... ........ ........ ........ */
                        dst[1] = buf[1] << 6 | buf[2] << 1 | buf[3] >> 4;
+                       ATTR_FALLTHROUGH
                        /* fallthrough */
 
                case 2: /* .....111 11...... ........ ........ ........ */
index f277fd6..7cadf7b 100644 (file)
@@ -470,6 +470,11 @@ enum sldns_enum_ede_code
        LDNS_EDE_NO_REACHABLE_AUTHORITY = 22,
        LDNS_EDE_NETWORK_ERROR = 23,
        LDNS_EDE_INVALID_DATA = 24,
+       LDNS_EDE_SIGNATURE_EXPIRED_BEFORE_VALID = 25,
+       LDNS_EDE_TOO_EARLY = 26,
+       LDNS_EDE_UNSUPPORTED_NSEC3_ITERATIONS = 27,
+       LDNS_EDE_BADPROXYPOLICY = 28,
+       LDNS_EDE_SYNTHESIZED = 29
 };
 typedef enum sldns_enum_ede_code sldns_ede_code;
 
index 2b5dc05..ff83999 100644 (file)
@@ -228,6 +228,11 @@ static sldns_lookup_table sldns_edns_ede_codes_data[] = {
        { LDNS_EDE_NO_REACHABLE_AUTHORITY, "No Reachable Authority" },
        { LDNS_EDE_NETWORK_ERROR, "Network Error" },
        { LDNS_EDE_INVALID_DATA, "Invalid Data" },
+       { LDNS_EDE_SIGNATURE_EXPIRED_BEFORE_VALID, "Signature Expired Before Valid" },
+       { LDNS_EDE_TOO_EARLY, "Non-Replayable Transactions Received in 0-RTT Data" },
+       { LDNS_EDE_UNSUPPORTED_NSEC3_ITERATIONS, "Unsupported NSEC3 Iterations Value" },
+       { LDNS_EDE_BADPROXYPOLICY, "Unable to Conform to Policy" },
+       { LDNS_EDE_SYNTHESIZED, "Synthesized Answer" },
        { 0, NULL}
 };
 sldns_lookup_table* sldns_edns_ede_codes = sldns_edns_ede_codes_data;
@@ -1236,6 +1241,7 @@ int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s, size_t* sl
                r = sldns_wire2str_svcparam_ech2str(s, slen, data_len, *d);
                break;
        case SVCB_KEY_DOHPATH:
+               ATTR_FALLTHROUGH
                /* fallthrough */
        default:
                r = sldns_str_print(s, slen, "=\"");
index e9613b1..0cd6c32 100644 (file)
@@ -466,6 +466,18 @@ void *unbound_stat_realloc(void *ptr, size_t size)
        memcpy(res+8, &mem_special, sizeof(mem_special));
        return res+16;
 }
+/** strdup with stats */
+char *unbound_stat_strdup(const char* s)
+{
+       size_t len;
+       char* res;
+       if(!s) return NULL;
+       len = strlen(s);
+       res = unbound_stat_malloc(len+1);
+       if(!res) return NULL;
+       memmove(res, s, len+1);
+       return res;
+}
 
 /** log to file where alloc was done */
 void *unbound_stat_malloc_log(size_t size, const char* file, int line,
@@ -507,6 +519,15 @@ void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
        return unbound_stat_realloc(ptr, size);
 }
 
+/** log to file where strdup was done */
+char *unbound_stat_strdup_log(const char *s, const char* file, int line,
+       const char* func)
+{
+       log_info("%s:%d %s strdup size %u", file, line, func,
+               (s?(unsigned)strlen(s)+1:0));
+       return unbound_stat_strdup(s);
+}
+
 #endif /* UNBOUND_ALLOC_STATS */
 #ifdef UNBOUND_ALLOC_LITE
 #undef malloc
index 62d1eed..3f51353 100644 (file)
@@ -42,6 +42,7 @@
 #include "config.h"
 #include <ctype.h>
 #include <stdarg.h>
+#include <errno.h>
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
@@ -386,6 +387,7 @@ config_create(void)
        memset(cfg->cookie_secret, 0, sizeof(cfg->cookie_secret));
        cfg->cookie_secret_len = 16;
        init_cookie_secret(cfg->cookie_secret, cfg->cookie_secret_len);
+       cfg->cookie_secret_file = NULL;
 #ifdef USE_CACHEDB
        if(!(cfg->cachedb_backend = strdup("testframe"))) goto error_exit;
        if(!(cfg->cachedb_secret = strdup("default"))) goto error_exit;
@@ -769,6 +771,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
        else S_YNO("dnstap-send-version:", dnstap_send_version)
        else S_STR("dnstap-identity:", dnstap_identity)
        else S_STR("dnstap-version:", dnstap_version)
+       else S_NUMBER_OR_ZERO("dnstap-sample-rate:", dnstap_sample_rate)
        else S_YNO("dnstap-log-resolver-query-messages:",
                dnstap_log_resolver_query_messages)
        else S_YNO("dnstap-log-resolver-response-messages:",
@@ -837,6 +840,8 @@ int config_set_option(struct config_file* cfg, const char* opt,
        { IS_NUMBER_OR_ZERO; cfg->ipsecmod_max_ttl = atoi(val); }
        else S_YNO("ipsecmod-strict:", ipsecmod_strict)
 #endif
+       else S_YNO("answer-cookie:", do_answer_cookie)
+       else S_STR("cookie-secret-file:", cookie_secret_file)
 #ifdef USE_CACHEDB
        else S_YNO("cachedb-no-store:", cachedb_no_store)
        else S_YNO("cachedb-check-when-serve-expired:", cachedb_check_when_serve_expired)
@@ -1248,6 +1253,7 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_YNO(opt, "dnstap-send-version", dnstap_send_version)
        else O_STR(opt, "dnstap-identity", dnstap_identity)
        else O_STR(opt, "dnstap-version", dnstap_version)
+       else O_UNS(opt, "dnstap-sample-rate", dnstap_sample_rate)
        else O_YNO(opt, "dnstap-log-resolver-query-messages",
                dnstap_log_resolver_query_messages)
        else O_YNO(opt, "dnstap-log-resolver-response-messages",
@@ -1333,6 +1339,8 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_LST(opt, "ipsecmod-whitelist", ipsecmod_whitelist)
        else O_YNO(opt, "ipsecmod-strict", ipsecmod_strict)
 #endif
+       else O_YNO(opt, "answer-cookie", do_answer_cookie)
+       else O_STR(opt, "cookie-secret-file", cookie_secret_file)
 #ifdef USE_CACHEDB
        else O_STR(opt, "backend", cachedb_backend)
        else O_STR(opt, "secret-seed", cachedb_secret)
@@ -1718,6 +1726,7 @@ config_delete(struct config_file* cfg)
        free(cfg->ipsecmod_hook);
        config_delstrlist(cfg->ipsecmod_whitelist);
 #endif
+       free(cfg->cookie_secret_file);
 #ifdef USE_CACHEDB
        free(cfg->cachedb_backend);
        free(cfg->cachedb_secret);
@@ -1772,6 +1781,39 @@ init_outgoing_availports(int* a, int num)
        }
 }
 
+static int
+extract_port_from_str(const char* str, int max_port) {
+       char* endptr;
+       long int value;
+       if (str == NULL || *str == '\0') {
+               log_err("str: '%s' is invalid", (str?str:"NULL"));
+               return -1;
+       }
+
+       value = strtol(str, &endptr, 10);
+       if ((endptr == str) || (*endptr != '\0'))  {
+               log_err("cannot parse port number '%s'", str);
+               return -1;
+       }
+
+       if (errno == ERANGE) {
+                log_err("overflow occurred when parsing '%s'", str);
+               return -1;
+       }
+
+       if (value == 0 && strcmp(str, "0") != 0) {
+               log_err("cannot parse port number '%s'", str);
+               return -1;
+       }
+
+       if (value < 0 || value >= max_port) {
+               log_err(" '%s' is out of bounds [0, %d)", str, max_port);
+               return -1;
+       }
+
+       return (int)value;
+}
+
 int
 cfg_mark_ports(const char* str, int allow, int* avail, int num)
 {
@@ -1782,53 +1824,45 @@ cfg_mark_ports(const char* str, int allow, int* avail, int num)
                "options");
 #endif
        if(!mid) {
-               int port = atoi(str);
+               int port = extract_port_from_str(str, num);
                if(port < 0) {
-                       log_err("port number is negative: %d", port);
-                       return 0;
-               }
-               if(port == 0 && strcmp(str, "0") != 0) {
-                       log_err("cannot parse port number '%s'", str);
+                       log_err("Failed to parse the port number");
                        return 0;
                }
                if(port < num)
                        avail[port] = (allow?port:0);
        } else {
-               int i, low, high = atoi(mid+1);
                char buf[16];
+               int i, low;
+               int high = extract_port_from_str(mid+1, num);
                if(high < 0) {
-                       log_err("port number is negative: %d", high);
-                       return 0;
-               }
-               if(high == 0 && strcmp(mid+1, "0") != 0) {
-                       log_err("cannot parse port number '%s'", mid+1);
+                       log_err("Failed to parse the port number");
                        return 0;
                }
+
                if( (int)(mid-str)+1 >= (int)sizeof(buf) ) {
                        log_err("cannot parse port number '%s'", str);
                        return 0;
                }
+
                if(mid > str)
                        memcpy(buf, str, (size_t)(mid-str));
                buf[mid-str] = 0;
-               low = atoi(buf);
+               low = extract_port_from_str(buf, num);
                if(low < 0) {
-                       log_err("port number is negative: %d", low);
+                       log_err("Failed to parse the port number");
                        return 0;
                }
-               if(low == 0 && strcmp(buf, "0") != 0) {
-                       log_err("cannot parse port number '%s'", buf);
+
+               if (low > high) {
+                       log_err("Low value is greater than high value");
                        return 0;
                }
-               if(high > num) {
-                       /* Stop very high values from taking a long time. */
-                       high = num;
-               }
+
                for(i=low; i<=high; i++) {
                        if(i < num)
                                avail[i] = (allow?i:0);
                }
-               return 1;
        }
        return 1;
 }
index d3a2e26..23aacc6 100644 (file)
@@ -592,6 +592,8 @@ struct config_file {
        char* dnstap_identity;
        /** dnstap "version", package version is used if "". */
        char* dnstap_version;
+       /** dnstap sample rate */
+       int dnstap_sample_rate;
 
        /** true to log dnstap RESOLVER_QUERY message events */
        int dnstap_log_resolver_query_messages;
@@ -748,6 +750,8 @@ struct config_file {
        uint8_t cookie_secret[40];
        /** cookie secret length */
        size_t  cookie_secret_len;
+       /** path to cookie secret store */
+       char* cookie_secret_file;
 
        /* ipset module */
 #ifdef USE_IPSET
index 42e9df8..212638a 100644 (file)
@@ -5,7 +5,7 @@
 
 #define  YY_INT_ALIGNED short int
 
-/*     $OpenBSD: configlexer.c,v 1.19 2024/06/14 07:45:44 florian Exp $        */
+/*     $OpenBSD: configlexer.c,v 1.20 2024/09/05 08:22:47 florian Exp $        */
 
 /* A lexical scanner generated by flex */
 
@@ -27,7 +27,7 @@
 
 /* end standard C headers. */
 
-/* $OpenBSD: configlexer.c,v 1.19 2024/06/14 07:45:44 florian Exp $ */
+/* $OpenBSD: configlexer.c,v 1.20 2024/09/05 08:22:47 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 392
-#define YY_END_OF_BUFFER 393
+#define YY_NUM_RULES 394
+#define YY_END_OF_BUFFER 395
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -377,438 +377,439 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3905] =
+static yyconst flex_int16_t yy_accept[3921] =
     {   0,
-        1,    1,  366,  366,  370,  370,  374,  374,  378,  378,
-        1,    1,  382,  382,  386,  386,  393,  390,    1,  364,
-      364,  391,    2,  391,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  366,  367,  367,
-      368,  391,  370,  371,  371,  372,  391,  377,  374,  375,
-      375,  376,  391,  378,  379,  379,  380,  391,  389,  365,
-        2,  369,  391,  389,  385,  382,  383,  383,  384,  391,
-      386,  387,  387,  388,  391,  390,    0,    1,    2,    2,
-        2,    2,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  366,    0,  370,    0,  377,    0,  374,  378,
-        0,  389,    0,    2,    2,  389,  385,    0,  382,  386,
-        0,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  389,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  362,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  137,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  147,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  389,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  119,  390,  390,  361,  390,
-
-      390,  390,  390,  390,  390,  390,  390,    8,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      138,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  152,  390,  390,  390,  389,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  352,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  389,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,   71,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  273,  390,   14,   15,  390,  390,
-       20,   19,  390,  390,  247,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      145,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      245,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,    3,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  389,  390,  390,  390,  390,
-      390,  390,  390,  390,  341,  390,  390,  390,  340,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  373,  390,  390,  390,  390,  390,  390,
-      390,  390,   70,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-       74,  390,  310,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  353,  354,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,   75,  390,  390,  146,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  141,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  234,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-       22,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  173,  390,  390,  390,  390,  390,  390,
-      389,  373,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  117,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  318,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,   16,  390,
-      390,  390,  390,  390,  390,  390,  390,  201,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      172,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  116,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,   37,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,   38,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,   72,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  144,  390,  390,  390,
-      389,  390,  390,  390,  390,  390,  390,  136,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,   73,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  277,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  202,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,   60,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  296,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-       65,  390,   66,  390,  390,  390,  390,  390,  390,  120,
-      390,  121,  390,  390,  390,  390,  390,  118,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,    7,  390,  390,  390,  390,  390,  389,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  262,  390,  390,  390,  390,  390,  390,  176,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  278,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,   51,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,   61,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  225,  390,  224,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,   17,   18,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,   76,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  233,  390,  390,  390,  390,  390,  390,  390,
-      123,  390,  122,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  215,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  153,
-      390,  253,  390,  390,  390,  389,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      111,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,   98,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  246,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      103,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,   69,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  218,  219,
-      390,  390,  390,  312,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-        6,  390,  390,  390,  390,  390,  390,  390,  331,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  316,
-      390,  390,  390,  390,  390,  390,  390,  342,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,   48,  390,  390,  390,  390,  390,   50,
-      390,  390,  390,   99,  390,  390,  390,  390,  390,   58,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  389,  390,  211,  390,  390,  390,  148,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  238,  390,  390,  212,  390,  390,
-      390,  390,  390,  258,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,   59,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  150,  129,  390,  130,
-      390,  390,  390,  390,  128,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  169,  390,  390,   56,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  294,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  213,
-      390,  390,  390,  390,  390,  223,  216,  390,  222,  390,
-      390,  390,  390,  390,  390,  390,  390,  257,  390,  390,
-      390,  390,  390,  390,  261,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  115,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  142,  390,
-      390,  390,  390,  390,  390,  390,  390,   67,  390,  390,
-      390,  390,   31,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,   21,  390,  390,  390,  390,
-      390,  390,  390,   32,   41,  390,  181,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  209,  390,  390,  389,  390,  390,  390,
-      390,  357,  390,  390,   84,  390,   87,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  358,  390,  390,  390,
-      390,  390,  390,  390,  390,  320,  390,  390,  390,  390,
-      274,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  131,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  168,  390,   52,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      268,  390,  390,  390,  390,  390,  390,  390,  390,  335,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  175,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  329,  390,  390,  390,  390,
-      244,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  349,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  194,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  124,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  188,  390,  203,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  389,  390,  156,  390,  390,  390,  390,
-      390,  390,  390,  390,  110,  390,  390,  390,  390,  236,
-      390,  390,  390,  390,  390,  390,  390,  390,  259,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  286,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  149,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  192,  390,  390,  390,
-      390,  390,  390,  390,   88,  390,   89,  390,  390,  390,
-      390,  390,  271,  390,  390,  390,  390,  390,   68,  338,
-
-      390,  390,  390,  390,  390,   97,  204,  390,  226,  390,
-      263,  390,  390,  217,  313,  390,  390,  390,  390,  308,
-      390,  390,  390,   80,  390,  206,  390,  390,  390,  390,
-      390,  390,    9,  390,  390,  390,  390,  390,  114,  390,
-      390,  390,  390,  390,  390,  300,  390,  390,  390,  390,
-      390,  390,  235,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  389,  390,  390,  390,  390,  191,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      193,  252,  177,  390,  319,  390,  390,  390,  390,  390,
-      285,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  248,  390,  390,  390,  390,  390,  390,  311,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  174,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      339,  390,  205,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,   79,   81,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  113,  390,  390,  390,  390,  390,
-      390,  298,  390,  390,  390,  390,  390,  390,  390,  315,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  240,  390,   39,   33,   35,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,   40,  390,   34,   36,  390,   42,  390,  390,  390,
-      390,  390,  390,  390,  109,  390,  187,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  389,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  343,  390,  390,  390,  390,
-      390,  242,  239,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,   78,  390,  390,  390,  151,  390,  132,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      170,   53,  390,  390,  390,  381,   13,  390,  390,  390,
-      390,  390,  390,  390,  157,  390,  390,  390,  390,  390,
-      390,  390,  390,  333,  390,  336,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,   12,
-      390,  390,   23,  390,  390,  390,  390,  390,  390,  390,
-
-      304,  390,  390,  351,  390,  390,  390,  390,  317,  390,
-      390,  390,  390,   82,  390,  250,  390,  390,  390,  390,
-      390,  241,  390,  390,  390,  390,   77,  390,  390,  390,
-      390,  390,  390,   24,  390,  390,   49,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  186,
-      185,  390,  390,  390,  390,  381,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  243,  237,  390,
-      260,  390,  390,  321,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  199,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,   90,  390,  390,  390,  390,  390,  390,  390,  390,
-      299,  390,  390,  390,  390,  221,  390,  390,  390,  390,
-      390,  390,  249,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  306,  390,  390,  390,  345,  390,  347,
-      346,  183,  390,  390,  390,   83,  390,  390,  390,  390,
-      195,  390,  390,  390,  390,  390,  125,  127,  126,  390,
-      390,  390,   26,  390,  390,  178,  390,  180,  390,  227,
-      390,  390,  390,  390,  184,  390,  390,  254,  390,  390,
-      390,  390,  264,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  159,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  276,  390,  390,  390,  390,
-      390,  390,  390,  359,  390,   28,  390,  314,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,   95,  228,  390,  390,
-      270,  390,  390,  390,  297,  390,  337,  390,  220,  390,
-      390,  309,  390,  390,  390,  307,   62,  390,  390,  390,
-      390,  390,  390,  390,    4,  390,  390,  390,  390,  390,
-      140,  390,  158,  390,  390,  390,  200,   30,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  267,
-       43,   44,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  322,  390,  390,  390,  390,  390,  390,  390,  284,
-      390,  390,  390,  390,  390,  390,  390,  390,  231,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,   94,   93,  390,  390,   63,  390,
-      390,  295,  303,  390,  272,  390,  390,  390,  390,  390,
-       11,  390,  390,  390,  390,  363,  390,  390,  390,  390,
-      390,  139,  390,  390,  390,  390,  390,  390,  229,  100,
-      390,  390,   46,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  190,  390,  255,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  161,  390,  390,  390,  390,  275,  390,
-      390,  390,  390,  390,  283,  390,  390,  390,  390,  154,
-      390,  390,  390,  133,  135,  134,  390,  390,  390,  102,
-      106,  101,  390,  171,  390,  390,  390,  390,   91,  390,
-      269,  305,  390,  390,  390,  390,  390,  390,   10,  390,
-      390,  390,  390,  390,  301,  350,  390,  390,  390,  390,
-      390,  390,  390,  390,  356,   45,  390,  390,  390,  390,
-      390,  189,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      107,  105,  390,  390,   57,  390,  390,   92,  390,  334,
-      390,  390,  390,  390,   25,  390,  390,  390,  390,  390,
-      214,  390,  390,  348,  390,  390,  390,  390,  230,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  210,
-      390,  390,  179,   85,   86,  390,  390,  390,  390,  390,
-      390,  323,  390,  390,  390,  390,  390,  390,  390,  280,
-      390,  390,  279,  155,  390,  390,  104,  390,   54,  390,
-      390,  162,  163,  166,  167,  164,  165,   96,  332,  390,
-      390,  302,  143,  390,  390,  390,  390,   27,  390,  182,
-
-      390,  390,  390,  390,  390,  208,  390,  266,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  197,  196,  232,   47,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  330,  390,  390,  390,  390,  112,  390,  390,  265,
-      390,  390,  293,  327,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  360,  390,  108,   55,   64,
-        5,  390,  390,  251,  390,  390,  390,  390,  328,  390,
-
-      390,  390,  390,  390,  390,  390,  390,  390,  281,   29,
-      390,  390,  390,  256,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  282,  390,  390,  390,  390,  160,
-      390,  390,  390,  390,  390,  390,  390,  390,  198,  390,
-      207,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  324,  390,  390,  390,  390,  390,  390,  390,
-      390,  390,  390,  390,  390,  390,  390,  390,  390,  390,
-      390,  355,  344,  390,  390,  289,  390,  390,  390,  390,
-      390,  325,  390,  390,  390,  390,  390,  390,  326,  390,
-      390,  390,  287,  390,  290,  291,  390,  390,  390,  390,
-
-      390,  288,  292,    0
+        1,    1,  368,  368,  372,  372,  376,  376,  380,  380,
+        1,    1,  384,  384,  388,  388,  395,  392,    1,  366,
+      366,  393,    2,  393,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  368,  369,  369,
+      370,  393,  372,  373,  373,  374,  393,  379,  376,  377,
+      377,  378,  393,  380,  381,  381,  382,  393,  391,  367,
+        2,  371,  393,  391,  387,  384,  385,  385,  386,  393,
+      388,  389,  389,  390,  393,  392,    0,    1,    2,    2,
+        2,    2,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  368,    0,  372,    0,  379,    0,  376,  380,
+        0,  391,    0,    2,    2,  391,  387,    0,  384,  388,
+        0,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  391,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  364,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  137,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  147,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  391,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  119,  392,  392,  363,  392,
+
+      392,  392,  392,  392,  392,  392,  392,    8,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      138,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  152,  392,  392,  392,  391,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  353,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  391,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,   71,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  273,  392,   14,   15,  392,  392,
+       20,   19,  392,  392,  247,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      145,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      245,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,    3,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  391,  392,  392,  392,  392,
+      392,  392,  392,  392,  342,  392,  392,  392,  341,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  375,  392,  392,  392,  392,  392,  392,
+      392,  392,   70,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       74,  392,  311,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  354,  355,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,   75,  392,  392,  146,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  141,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  234,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       22,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  173,  392,  392,  392,  392,  392,  392,
+      391,  375,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  117,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  319,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,   16,
+      392,  392,  392,  392,  392,  392,  392,  392,  201,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  172,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  116,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,   37,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,   38,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,   72,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  144,  392,  392,
+      392,  391,  392,  392,  392,  392,  392,  392,  136,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,   73,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  277,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  202,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       60,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      297,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,   65,  392,   66,  392,  392,  392,  392,  392,
+      392,  120,  392,  121,  392,  392,  392,  392,  392,  118,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,    7,  392,  392,  392,  392,  392,  391,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  262,  392,  392,  392,  392,  392,  392,
+      176,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  278,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       51,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,   61,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  225,  392,  224,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,   17,   18,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,   76,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  233,  392,  392,  392,  392,
+      392,  392,  392,  123,  392,  122,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  215,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  153,  392,  253,  392,  392,  392,  391,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  111,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,   98,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  246,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  103,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,   69,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  218,  219,  392,  392,  392,  313,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,    6,  392,  392,  392,  392,  392,
+      392,  392,  332,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  317,  392,  392,  392,  392,  392,  392,
+
+      392,  343,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,   48,  392,  392,
+      392,  392,  392,   50,  392,  392,  392,   99,  392,  392,
+      392,  392,  392,   58,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  391,  392,  211,
+      392,  392,  392,  148,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  238,  392,
+      392,  212,  392,  392,  392,  392,  392,  258,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,   59,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  150,  129,  392,  130,  392,  392,  392,  392,  128,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      169,  392,  392,   56,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  295,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  213,  392,  392,  392,  392,  392,
+      223,  216,  392,  222,  392,  392,  392,  392,  392,  392,
+      392,  392,  257,  392,  392,  392,  392,  392,  392,  261,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  115,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  142,  392,  392,  392,  392,  392,  392,
+      392,  392,   67,  392,  392,  392,  392,   31,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       21,  392,  392,  392,  392,  392,  392,  392,   32,   41,
+      392,  181,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  209,  392,
+      392,  391,  392,  392,  392,  392,  358,  392,  392,   84,
+
+      392,   87,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  359,  392,  392,  392,  392,  392,  392,  392,
+      392,  321,  392,  392,  392,  392,  274,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  131,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  168,  392,   52,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  268,  392,  392,
+      392,  392,  392,  392,  392,  392,  336,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  175,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  330,  392,  392,  392,  392,  244,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  350,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  194,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  124,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  188,  392,
+
+      203,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      391,  392,  156,  392,  392,  392,  392,  392,  392,  392,
+      392,  110,  392,  392,  392,  392,  236,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  259,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  286,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  149,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  192,  392,  392,  392,  392,
+      392,  392,  392,   88,  392,   89,  392,  392,  392,  392,
+
+      392,  271,  392,  392,  392,  392,  392,   68,  339,  392,
+      392,  392,  392,  392,   97,  204,  392,  226,  392,  263,
+      392,  392,  217,  314,  392,  392,  392,  392,  309,  392,
+      392,  392,   80,  392,  206,  392,  392,  392,  392,  392,
+      392,    9,  392,  392,  392,  392,  392,  114,  392,  392,
+      392,  392,  392,  392,  301,  392,  392,  392,  392,  392,
+      392,  235,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      391,  392,  392,  392,  392,  191,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      193,  252,  177,  392,  320,  392,  392,  392,  392,  392,
+      285,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  248,  392,  392,  392,  392,  392,  392,
+      312,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  174,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  340,  392,  205,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,   79,   81,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  113,  392,  392,  392,  392,
+      392,  392,  299,  392,  392,  392,  392,  392,  392,  392,
+      316,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  240,  392,   39,   33,   35,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,   40,  392,   34,   36,  392,   42,  392,  392,
+      392,  392,  392,  392,  392,  109,  392,  187,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  391,  392,  392,
+      392,  392,  392,  392,  392,  392,  344,  392,  392,  392,
+      392,  392,  242,  239,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,   78,  392,  392,  392,  151,
+      392,  132,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  170,   53,  392,  392,  392,  383,   13,
+      392,  392,  392,  392,  392,  392,  392,  157,  392,  392,
+      392,  392,  392,  392,  392,  392,  334,  392,  337,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  392,   12,  392,  392,   23,  392,  392,  392,  392,
+      392,  392,  392,  305,  392,  392,  352,  392,  392,  392,
+      392,  318,  392,  392,  392,  392,   82,  392,  250,  392,
+      392,  392,  392,  392,  241,  392,  392,  392,  392,   77,
+      392,  392,  392,  392,  392,  392,   24,  392,  392,   49,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  186,  185,  392,  392,  392,  392,  383,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      243,  237,  392,  392,  260,  392,  392,  322,  392,  392,
+      392,  392,  392,  392,  293,  392,  392,  392,  392,  392,
+
+      392,  392,  392,  199,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,   90,  392,  392,  392,
+      392,  392,  392,  392,  392,  300,  392,  392,  392,  392,
+      221,  392,  392,  392,  392,  392,  392,  249,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  307,  392,
+      392,  392,  346,  392,  348,  347,  183,  392,  392,  392,
+       83,  392,  392,  392,  392,  195,  392,  392,  392,  392,
+      392,  125,  127,  126,  392,  392,  392,   26,  392,  392,
+      178,  392,  180,  392,  227,  392,  392,  392,  392,  184,
+
+      392,  392,  254,  392,  392,  392,  392,  264,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  159,  360,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  276,  392,  392,  392,  392,  392,  392,  392,  361,
+      392,   28,  392,  315,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,   95,  228,  392,  392,  270,  392,  392,  392,
+      298,  392,  338,  392,  220,  392,  392,  310,  392,  392,
+      392,  308,   62,  392,  392,  392,  392,  392,  392,  392,
+        4,  392,  392,  392,  392,  392,  140,  392,  158,  392,
+
+      392,  392,  200,   30,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  267,   43,   44,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  323,  392,  392,
+      392,  392,  392,  392,  392,  284,  392,  392,  392,  392,
+      392,  392,  392,  392,  231,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+       94,   93,  392,  392,   63,  392,  392,  296,  304,  392,
+      272,  392,  392,  392,  392,  392,   11,  392,  392,  392,
+      392,  365,  392,  392,  392,  392,  392,  139,  392,  392,
+
+      392,  392,  392,  392,  229,  100,  392,  392,   46,  392,
+      392,  392,  392,  392,  392,  392,  392,  190,  392,  255,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  161,
+      392,  392,  392,  392,  275,  392,  392,  392,  392,  392,
+      283,  392,  392,  392,  392,  154,  392,  392,  392,  133,
+      135,  134,  392,  392,  392,  102,  106,  101,  392,  171,
+      392,  392,  392,  392,   91,  392,  269,  306,  392,  392,
+      392,  392,  392,  392,   10,  392,  392,  392,  392,  392,
+      302,  351,  392,  392,  392,  392,  392,  392,  392,  392,
+      357,   45,  392,  392,  392,  392,  392,  189,  392,  392,
+
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  107,  105,  392,  392,
+       57,  392,  392,   92,  392,  335,  392,  392,  392,  392,
+       25,  392,  392,  392,  392,  392,  214,  392,  392,  349,
+      392,  392,  392,  392,  230,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  210,  392,  392,  179,   85,
+       86,  392,  392,  392,  392,  392,  392,  324,  392,  392,
+      392,  392,  392,  392,  392,  280,  392,  392,  279,  155,
+      392,  392,  104,  392,   54,  392,  392,  162,  163,  166,
+
+      167,  164,  165,   96,  333,  392,  392,  303,  143,  392,
+      392,  392,  392,   27,  392,  182,  392,  392,  392,  392,
+      392,  208,  392,  266,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  197,  196,  232,
+       47,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  331,  392,  392,
+      392,  392,  112,  392,  392,  265,  392,  392,  294,  328,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+
+      392,  362,  392,  108,   55,   64,    5,  392,  392,  251,
+      392,  392,  392,  392,  329,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  281,   29,  392,  392,  392,  256,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      282,  392,  392,  392,  392,  160,  392,  392,  392,  392,
+      392,  392,  392,  392,  198,  392,  207,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  325,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  356,  345,  392,
+      392,  289,  392,  392,  392,  392,  392,  326,  392,  392,
+
+      392,  392,  392,  392,  327,  392,  392,  392,  287,  392,
+      290,  291,  392,  392,  392,  392,  392,  288,  292,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -851,17 +852,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[3923] =
+static yyconst flex_int16_t yy_base[3939] =
     {   0,
         0,    0,   38,   41,   44,   46,   59,   65,   71,   77,
-       90,  112,   96,  118,  124,  136, 3268, 3142,   81, 7612,
-     7612, 7612,  129,   52,  137,   63,  130,  159,   70,  132,
+       90,  112,   96,  118,  124,  136, 4305, 4135,   81, 7635,
+     7635, 7635,  129,   52,  137,   63,  130,  159,   70,  132,
       134,  146,   57,   88,   76,  166,  177,   95,  199,  155,
-      187,  201,  210,  172,  156,   97,  148, 2842, 7612, 7612,
-     7612,  189, 2313, 7612, 7612, 7612,  204, 2257, 2137, 7612,
-     7612, 7612,  239, 1886, 7612, 7612, 7612,  228, 1806, 7612,
-      243, 7612,  247,  193, 1718, 1695, 7612, 7612, 7612,  251,
-     1535, 7612, 7612, 7612,  235, 1388,  257,  261,    0,  264,
+      187,  201,  210,  172,  156,   97,  148, 3302, 7635, 7635,
+     7635,  189, 3258, 7635, 7635, 7635,  204, 2724, 2475, 7635,
+     7635, 7635,  239, 2125, 7635, 7635, 7635,  228, 1886, 7635,
+      243, 7635,  247,  193, 1806, 1730, 7635, 7635, 7635,  251,
+     1683, 7635, 7635, 7635,  235, 1535,  257,  261,    0,  264,
         0,    0,  212,  258,  259,  183,  170,  251,  265,  267,
 
        92,  260,  261,  272,  273,  274,  279,  287,  280,  285,
@@ -870,8 +871,8 @@ static yyconst flex_int16_t yy_base[3923] =
       139,  334,  342,  349,  351,  350,  356,  352,  357,  353,
       362,  359,  360,  363,  376,  364,  384,  380,  388,  393,
       369,  383,  370,  396,  397,  395,  398,  401,  404,  405,
-      414,  415, 1269,  426, 1184,  428, 1103,  437,  996,  899,
-      441,  707,  445,  449,    0,  441,  523,  455,  491,  426,
+      414,  415, 1388,  426, 1269,  428, 1184,  437, 1115,  984,
+      441,  899,  445,  449,    0,  441,  707,  455,  535,  479,
       460,  419,  453,  434,  454,  223,  455,  456,  457,  458,
       459,  461,  460,  464,  472,  482,  468,  473,  484,  492,
 
@@ -887,15 +888,15 @@ static yyconst flex_int16_t yy_base[3923] =
       688,  690,  697,  687,  696,  699,  700,  701,  703,  704,
 
       712,  705,  714,  718,  720,  725,  713,  723,  726,  728,
-      732,  734,  735,  736,  740,  738, 7612,  748,  741,  752,
+      732,  734,  735,  736,  740,  738, 7635,  748,  741,  752,
       751,  756,  754,  759,  761,  768,  769,  764,  765,  770,
       730,  771,  773,  767,  774,  777,  779,  780,  782,  786,
       787,  798,  790,  795,  808,  794,  801,  804,  829,  802,
       810,  818,  811,  822,  836,  835,  840,  824,  837,  842,
       843,  845,  849,  856,  859,  862,  865,  851,  853,  867,
-      869,  870,  871,  873,  880,  882, 7612,  875,  879,  892,
+      869,  870,  871,  873,  880,  882, 7635,  875,  879,  892,
       893,  897,  900,  890,  912,  907,  878,  913,  915,  917,
-      919,  929,  951,  911,  918,  920,  922,  927, 7612,  940,
+      919,  929,  951,  911,  918,  920,  922,  927, 7635,  940,
 
       934,  975,  945,  944,  962,  955,  958,  925,  877,  965,
       957,  963,  979,  968,  969,  976,  983,  998,  999,  981,
@@ -906,16 +907,16 @@ static yyconst flex_int16_t yy_base[3923] =
      1066, 1089, 1096,  933, 1097, 1084, 1108, 1029, 1113, 1115,
      1086, 1116, 1124, 1121, 1101, 1119, 1122, 1123, 1125, 1131,
      1127, 1129, 1133, 1135, 1068, 1136, 1137, 1141, 1144, 1138,
-     1152, 1154, 1145, 1155, 1158, 7612, 1167, 1162, 7612, 1160,
+     1152, 1154, 1145, 1155, 1158, 7635, 1167, 1162, 7635, 1160,
 
-     1164, 1165, 1168, 1169, 1170, 1171, 1173, 7612, 1174, 1178,
+     1164, 1165, 1168, 1169, 1170, 1171, 1173, 7635, 1174, 1178,
      1179, 1182, 1183, 1193, 1189, 1201, 1200, 1188, 1203, 1204,
      1206, 1208, 1209, 1216, 1212, 1219, 1221, 1213, 1224, 1225,
      1217, 1226, 1228, 1231, 1233, 1235, 1234, 1237, 1241, 1257,
-     7612, 1242, 1243, 1244, 1249, 1251, 1255, 1252, 1274, 1275,
+     7635, 1242, 1243, 1244, 1249, 1251, 1255, 1252, 1274, 1275,
      1246, 1267, 1266, 1279, 1293, 1281, 1286, 1291, 1289, 1290,
      1299, 1295, 1303, 1301, 1297, 1306, 1307, 1305, 1311, 1313,
-     1314, 1315, 1317, 1319, 7612, 1326, 1322, 1335, 1336, 1343,
+     1314, 1315, 1317, 1319, 7635, 1326, 1322, 1335, 1336, 1343,
      1329, 1327, 1328, 1330, 1351, 1346, 1348, 1349, 1350, 1352,
      1355, 1356, 1358, 1365, 1360, 1368, 1373, 1369, 1371, 1370,
 
@@ -924,7 +925,7 @@ static yyconst flex_int16_t yy_base[3923] =
      1416, 1415, 1424, 1425, 1430, 1427, 1429, 1436, 1437, 1438,
      1439, 1441, 1442, 1446, 1444, 1449, 1451, 1452, 1454, 1453,
      1455, 1462, 1461, 1463, 1468, 1465, 1481, 1467, 1470, 1484,
-     1487, 1474, 1478, 7612, 1496, 1491, 1494, 1495, 1498, 1501,
+     1487, 1474, 1478, 7635, 1496, 1491, 1494, 1495, 1498, 1501,
      1502, 1503, 1504, 1507, 1509, 1510, 1513, 1511, 1515, 1519,
      1522, 1524, 1512, 1526, 1527, 1530, 1532, 1542, 1545, 1534,
      1549, 1538, 1550, 1552, 1548, 1555, 1556, 1558, 1559, 1567,
@@ -938,792 +939,794 @@ static yyconst flex_int16_t yy_base[3923] =
      1698, 1699, 1684, 1700, 1701, 1704, 1705, 1706, 1707, 1710,
      1714, 1716, 1708, 1722, 1724, 1712, 1726, 1728, 1731, 1734,
      1735, 1736, 1746, 1742, 1738, 1749, 1750, 1751, 1739, 1752,
-     1756, 1757, 1759, 1762, 1767, 1768, 1765, 7612, 1769, 1781,
+     1756, 1757, 1759, 1762, 1767, 1768, 1765, 7635, 1769, 1781,
      1772, 1776, 1779, 1777, 1780, 1782, 1790, 1792, 1785, 1787,
 
-     1795, 1797, 1798, 1823, 7612, 1799, 7612, 7612, 1804, 1802,
-     7612, 7612, 1803, 1809, 7612, 1807, 1810, 1808, 1811, 1820,
+     1795, 1797, 1798, 1823, 7635, 1799, 7635, 7635, 1804, 1802,
+     7635, 7635, 1803, 1809, 7635, 1807, 1810, 1808, 1811, 1820,
      1830, 1833, 1826, 1821, 1836, 1838, 1846, 1859, 1844, 1847,
      1841, 1849, 1851, 1848, 1853, 1865, 1856, 1869, 1868, 1854,
      1881, 1888, 1885, 1889, 1876, 1893, 1894, 1896, 1897, 1899,
      1903, 1905, 1906, 1908, 1909, 1910, 1912, 1911, 1914, 1917,
      1916, 1920, 1921, 1923, 1925, 1924, 1935, 1928, 1939, 1948,
-     7612, 1940, 1949, 1926, 1950, 1951, 1958, 1954, 1961, 1953,
+     7635, 1940, 1949, 1926, 1950, 1951, 1958, 1954, 1961, 1953,
      1957, 1960, 1965, 1967, 1962, 1970, 1972, 1974, 1973, 1975,
      1976, 1981, 1983, 1985, 1986, 1988, 1992, 1993, 1989, 1998,
 
-     7612, 1999, 2000, 2001, 2003, 2005, 2004, 2011, 2015, 2012,
+     7635, 1999, 2000, 2001, 2003, 2005, 2004, 2011, 2015, 2012,
      2006, 2019, 2016, 2033, 2021, 2022, 2024, 2030, 2034, 2036,
-     2037, 2041, 7612, 2038, 2046, 2042, 2048, 2047, 2051, 2050,
+     2037, 2041, 7635, 2038, 2046, 2042, 2048, 2047, 2051, 2050,
      2054, 2057, 2058, 2062, 2059, 2061, 2066, 2064, 2073, 2072,
      2075, 2069, 2076, 2077, 2080, 2088, 2089, 2092, 2094, 2090,
      2098, 2099, 2100, 2102, 2101, 2104, 2105, 2107, 2111, 2112,
      2119, 2114, 2122, 2115, 2117, 2136, 2138, 2135, 2123, 2133,
      2141, 2134, 2143, 2154, 2156, 2149, 2140, 2147, 2157, 2159,
      2162, 2163, 2164, 2165, 2166, 2173, 2168, 2171, 2185, 2174,
-     2178, 2176, 2187, 2180, 7612, 2188, 2189, 2190, 7612, 2194,
+     2178, 2176, 2187, 2180, 7635, 2188, 2189, 2190, 7635, 2194,
 
      2195, 2197, 2219, 2200, 2201, 2206, 2208, 2214, 2209, 2216,
      2211, 2217, 2225, 2233, 2227, 2243, 2236, 2244, 2246, 2248,
-     2249, 2247, 2251, 2252, 2261, 2253, 2255, 2267, 2265, 2271,
-     2268, 2278, 2281, 2280, 2287, 2289, 2284, 2285, 2290, 2309,
-     2286, 2288, 2291, 2295, 2296, 2294, 2292, 2302, 2303, 2311,
-     2301, 2312, 2314, 2324, 2321, 2322, 2327, 2332, 2333, 2336,
-     2338, 2339, 2340, 7612, 2347, 2226, 2342, 2344, 2346, 2356,
-     2352, 2353, 7612, 2355, 2358, 2362, 2369, 2365, 2366, 2368,
-     2370, 2375, 2376, 2371, 2380, 2379, 2384, 2381, 2382, 2400,
-     7612, 2386, 7612, 2383, 2395, 2396, 2398, 2407, 2404, 2405,
-
-     2406, 2410, 2408, 2409, 7612, 7612, 2411, 2412, 2418, 2428,
-     2426, 2436, 2422, 2432, 2433, 7612, 2434, 2441, 7612, 2438,
-     2437, 2445, 2443, 2444, 2449, 2451, 2453, 2454, 2455, 2462,
-     2459, 2466, 2461, 2463, 2469, 7612, 2472, 2474, 2475, 2480,
-     2481, 2478, 2482, 2484, 2487, 2488, 7612, 2493, 2490, 2495,
-     2497, 2504, 2503, 2505, 2507, 2508, 2509, 2512, 2513, 2515,
-     2516, 2520, 2523, 2527, 2528, 2524, 2526, 2540, 2536, 2543,
-     7612, 2539, 2538, 2542, 2551, 2547, 2549, 2546, 2550, 2553,
-     2554, 2557, 2560, 2561, 2566, 2565, 2567, 2568, 2569, 2579,
-     2581, 2571, 2578, 2590, 2574, 2582, 2587, 2584, 2595, 2592,
-
-     2594, 2597, 2598, 7612, 2600, 2604, 2606, 2601, 2607, 2615,
-     2608,  295, 2611, 2614, 2618, 2617, 2624, 2621, 2627, 2631,
-     2638, 2640, 2635, 2637, 2639, 2641, 2642, 2645, 2647, 2648,
-     2649, 2653, 2656, 2657, 2658, 2659, 2663, 7612, 2667, 2664,
-     2669, 2670, 2671, 2672, 2677, 2676, 2681, 7612, 2680, 2690,
-     2688, 2699, 2685, 2694, 2701, 2702, 2705, 2703, 7612, 2706,
-     2707, 2710, 2715, 2713, 2714, 2716, 2717, 7612, 2720, 2724,
-     2725, 2731, 2732, 2734, 2733, 2735, 2739, 2740, 2741, 2743,
-     2745, 2748, 2746, 2747, 2749, 2755, 2756, 2762, 2763, 2764,
-     2766, 2769, 2770, 2772, 2775, 2774, 2776, 2777, 2788, 2779,
-
-     7612, 2789, 2780, 2790, 2794, 2796, 2781, 2798, 2800, 2811,
-     2806, 2807, 2809, 2813, 2826, 2815, 2808, 2824, 2819, 2832,
-     2829, 2838, 2836, 2841, 2843, 2850, 2823, 2852, 2854, 2840,
-     2855, 2862, 2864, 2863, 2861, 2865, 2867, 2868, 2869, 2877,
-     2874, 2881, 2878, 2884, 2876, 2886, 2891, 2879, 2897, 2910,
-     2890, 7612, 2899, 2894, 2892, 2905, 2911, 2919, 2915, 2916,
-     2914, 2917, 2921, 2928, 2926, 2927, 2929, 2938, 2930, 2939,
-     2933, 2934, 2942, 2940, 2944, 2949, 2950, 2952, 2955, 2958,
-     2959, 2962, 2964, 2963, 7612, 2967, 2966, 2972, 2973, 2976,
-     2978, 2980, 2983, 2981, 2985, 2987, 2988, 2990, 2992, 2993,
-
-     2994, 2995, 3002, 2999, 3005, 3001, 3000, 7612, 3013, 3007,
-     3011, 3020, 3017, 3021, 3019, 3023, 3029, 3030, 3033, 3036,
-     3037, 3038, 3039, 3040, 7612, 3048, 3049, 3045, 3047, 3057,
-     3054, 3056, 3058, 3060, 3061, 3062, 7612, 3065, 3066, 3064,
-     3068, 3067, 3071, 3078, 3079, 3080, 3077, 7612, 3091, 3076,
-     3089, 3092, 3099, 3095, 3098, 3100, 3101, 3104, 3102, 3106,
-     3107, 3108, 3111, 3117, 3112, 3118, 7612, 3120, 3124, 3121,
-     3133, 3126, 3128, 3140, 3136, 3130, 3141, 3146, 3143, 3147,
-     3153, 7612, 3161, 3158, 3157, 3166, 3163, 3164, 3169, 3170,
-     3171, 3172, 3173, 3174, 3178, 3179, 7612, 3181, 3180, 3184,
-
-     3185, 3188, 3189, 3193, 3203, 3196, 3200, 3201, 3204, 3206,
-     3209, 3210, 3214, 3215, 3223, 3213, 3211, 3205, 3227, 3232,
-     3230, 3234, 3217, 3238, 3241, 3246, 3242, 3247, 3250, 3251,
-     3244, 3252, 3253, 3261, 3265, 3268, 3263, 3266, 7612, 3270,
-     3271, 3272, 3274, 3277, 3276, 3278, 3280, 3282, 3279, 3294,
-     3291, 3284, 3285, 3301, 3309, 3306, 3297, 3311, 3305, 3307,
-     3313, 3314, 3315, 3316, 3320, 3327, 3318, 3325, 3328, 3329,
-     3330, 3337, 3332, 3333, 3341, 3340, 3345, 3342, 3346, 3347,
-     3349, 3350, 3352, 3355, 3357, 3360, 3353, 3362, 3367, 3375,
-     3377, 3378, 3380, 3369, 3371, 3385, 3387, 3389, 7612, 3388,
-
-     3390, 3392, 3396, 3398, 3399, 3402, 3404, 3413, 3405, 3403,
-     3423, 3414, 3421, 3422, 3410, 3424, 3427, 3412, 3434, 3438,
-     7612, 3429, 7612, 3439, 3431, 3435, 3443, 3451, 3441, 7612,
-     3449, 7612, 3450, 3455, 3446, 3456, 3457, 7612, 3460, 3458,
-     3464, 3459, 3465, 3466, 3471, 3469, 3470, 3475, 3474, 3482,
-     3477, 3483, 3481, 3487, 3491, 3493, 3494, 3496, 3497, 3498,
-     3504, 3501, 3505, 3506, 3507, 3511, 3512, 3514, 3517, 3518,
-     3522, 7612, 3524, 3535, 3536, 3528, 3538, 3530, 3532, 3540,
-     3542, 3544, 3520, 3547, 3548, 3552, 3551, 3555, 3553, 3563,
-     3559, 3565, 3567, 3569, 3568, 3570, 3575, 3583, 3579, 3587,
-
-     3584, 7612, 3582, 3586, 3590, 3591, 3592, 3594, 7612, 3593,
-     3595, 3601, 3603, 3606, 3605, 3607, 3608, 3612, 3614, 3615,
-     3616, 3625, 3624, 3621, 3630, 7612, 3629, 3634, 3617, 3637,
-     3645, 3635, 3647, 3652, 3648, 3650, 3654, 3662, 3658, 3657,
-     3660, 3661, 3664, 3665, 3672, 3673, 3675, 3671, 3683, 3674,
-     3681, 3688, 3685, 3682, 3679, 3689, 3691, 3692, 3693, 3694,
-     3695, 3696, 3698, 3701, 3711, 3702, 3715, 7612, 3706, 3716,
-     3717, 3725, 3720, 3726, 3724, 3727, 3729, 3733, 3736, 7612,
-     3738, 3731, 3743, 3735, 3752, 3739, 3746, 3749, 3756, 3755,
-     3757, 3758, 3759, 3761, 7612, 3763, 7612, 3762, 3766, 3767,
-
-     3776, 3782, 3784, 3769, 3785, 3790, 3779, 3786, 3793, 3794,
-     3797, 3795, 3801, 3802, 3803, 3804, 3807, 3808, 3809, 3814,
-     3818, 3811, 3815, 3824, 3825, 3827, 3828, 3830, 3835, 3831,
-     3837, 7612, 7612, 3832, 3840, 3847, 3850, 3839, 3843, 3859,
-     3861, 3854, 3851, 3867, 3865, 3869, 3870, 3878, 7612, 3871,
-     3874, 3873, 3875, 3879, 3887, 3882, 3892, 3902, 3894, 3884,
-     3903, 3901, 7612, 3886, 3904, 3905, 3914, 3909, 3912, 3916,
-     7612, 3917, 7612, 3911, 3913, 3918, 3920, 3926, 3927, 3929,
-     3934, 3933, 3935, 3938, 3940, 3947, 3950, 3945, 3951, 3954,
-     3955, 3956, 3957, 3959, 3960, 3968, 3963, 3965, 3966, 7612,
-
-     3970, 3967, 3978, 3972, 3971, 3983, 3989, 3986, 3979, 7612,
-     3990, 7612, 3992, 3996, 3997, 3998, 3999, 4007, 4001, 4009,
-     4008, 4012, 4013, 4015, 4016, 4019, 4017, 4022, 4025, 4026,
-     7612, 4028, 4030, 4038, 4033, 4035, 4037, 4040, 4041, 4042,
-     4049, 7612, 4051, 4058, 4054, 4055, 4063, 4060, 4061, 4065,
-     4068, 4066, 4070, 4072, 4075, 4074, 4076, 4078, 4077, 4080,
-     4083, 4082, 4085, 4094, 4096, 4097, 4103, 4113, 4098, 7612,
-     4084, 4108, 4109, 4110, 4111, 4114, 4118, 4120, 4123, 4125,
-     4115, 4130, 4136, 4117, 4133, 4139, 4141, 4142, 4149, 4144,
-     7612, 4151, 4148, 4156, 4152, 4153, 4155, 4159, 4164, 4157,
-
-     4165, 4168, 4161, 4169, 4173, 4174, 4171, 4181, 4188, 4183,
-     4184, 4185, 4187, 4198, 4189, 4191, 4193, 4194, 7612, 4214,
-     4201, 4205, 4210, 4206, 4216, 4224, 4219, 4221, 4222, 4226,
-     4223, 4229, 4227, 4232, 4233, 4236, 4238, 4239, 7612, 7612,
-     4245, 4240, 4242, 7612, 4246, 4248, 4256, 4252, 4257, 4253,
-     4261, 4258, 4262, 4263, 4266, 4264, 4280, 4283, 4268, 4272,
-     7612, 4284, 4286, 4293, 4276, 4285, 4295, 4297, 7612, 4298,
-     4306, 4302, 4303, 4304, 4305, 4307, 4309, 4311, 4310, 4312,
-     4316, 4318, 4323, 4325, 4321, 4332, 4329, 4330, 4331, 7612,
-     4336, 4337, 4338, 4340, 4341, 4342, 4347, 7612, 4348, 4346,
-
-     4352, 4354, 4355, 4358, 4363, 4366, 4368, 4374, 4369, 4371,
-     4375, 4376, 4377, 4378, 4380, 4388, 4383, 4387, 4386, 4392,
-     4396, 4403, 4389, 7612, 4399, 4406, 4407, 4409, 4411, 7612,
-     4413, 4421, 4424, 7612, 4425, 4416, 4423, 4426, 4435, 7612,
-     4431, 4430, 4432, 4436, 4433, 4445, 4440, 4447, 4446, 4448,
-     4450, 4451, 4452, 4454, 4455, 7612, 4456, 4457, 4460, 7612,
-     4464, 4466, 4473, 4478, 4479, 4482, 4489, 4471, 4475, 4490,
-     4485, 4487, 4488, 4493, 7612, 4496, 4498, 7612, 4500, 4504,
-     4499, 4505, 4506, 7612, 4509, 4510, 4511, 4513, 4514, 4519,
-     4525, 4515, 4527, 4528, 4529, 4531, 4532, 4533, 4534, 4541,
-
-     4536, 4543, 4540, 4542, 7612, 4545, 4544, 4550, 4555, 4547,
-     4560, 4563, 4553, 4566, 4568, 4569, 7612, 7612, 4571, 7612,
-     4574, 4575, 4576, 4578, 7612, 4580, 4579, 4589, 4581, 4584,
-     4586, 4590, 4596, 4600, 4597, 7612, 4602, 4606, 7612, 4603,
-     4609, 4616, 4608, 4611, 4612, 4613, 4619, 4623, 4617, 4625,
-     4627, 4621, 4628, 4629, 4635, 4630, 4647, 4631, 4650, 7612,
-     4642, 4643, 4648, 4658, 4649, 4651, 4661, 4663, 4659, 7612,
-     4665, 4672, 4673, 4675, 4676, 7612, 7612, 4677, 7612, 4678,
-     4681, 4682, 4685, 4684, 4688, 4695, 4692, 7612, 4697, 4693,
-     4701, 4698, 4704, 4711, 7612, 4705, 4714, 4702, 4715, 4706,
-
-     4722, 4718, 4717, 4725, 4735, 4728, 7612, 4721, 4727, 4731,
-     4739, 4744, 4742, 4732, 4746, 4754, 4750, 4749, 4752, 4762,
-     4757, 4759, 4760, 4763, 4767, 4769, 4771, 4761, 7612, 4777,
-     4774, 4780, 4775, 4790, 4785, 4791, 4787, 7612, 4788, 4792,
-     4793, 4802, 7612, 4795, 4803, 4805, 4810, 4794, 4806, 4813,
-     4816, 4815, 4819, 4820, 4817, 7612, 4818, 4825, 4821, 4829,
-     4838, 4827, 4826, 7612, 7612, 4839, 7612, 4842, 4828, 4846,
-     4847, 4849, 4850, 4853, 4854, 4856, 4857, 4860, 4862, 4864,
-     4867, 4868, 4870, 7612, 4872, 4877, 4873, 4882, 4884, 4892,
-     4885, 7612, 4889, 4887, 7612, 4893, 7612, 4894, 4896, 4899,
-
-     4900, 4902, 4904, 4905, 4908, 4909, 7612, 4916, 4918, 4912,
-     4919, 4921, 4929, 4925, 4937, 7612, 4934, 4923, 4935, 4936,
-     7612, 4940, 4941, 4944, 4942, 4945, 4948, 4947, 4949, 4953,
-     4951, 4955, 4960, 4959, 4970, 4961, 4952, 4962, 4971, 4968,
-     4972, 4976, 4981, 4985, 7612, 4982, 4986, 4988, 4991, 4992,
-     4993, 4994, 4995, 4996, 4997, 5004, 5006, 7612, 5009, 7612,
-     5001, 5011, 5020, 5019, 5002, 5028, 5029, 5030, 5023, 5031,
-     5032, 5035, 5037, 5040, 5041, 5045, 5042, 5047, 5050, 5052,
-     7612, 5059, 5060, 5049, 5065, 5067, 5069, 5071, 5072, 7612,
-     5073, 5054, 5075, 5080, 5082, 5084, 5085, 5087, 5088, 5090,
-
-     5093, 5091, 5098, 5100, 5101, 5003, 5102, 5094, 5110, 5105,
-     5107, 7612, 5112, 5114, 5116, 5121, 5118, 5122, 5123, 5125,
-     5130, 5133, 5124, 5134, 5137, 7612, 5138, 5140, 5142, 5150,
-     7612, 5145, 5147, 5148, 5151, 5152, 5155, 5157, 5158, 5160,
-     5167, 5168, 7612, 5173, 5161, 5170, 5174, 5175, 5178, 5179,
-     5180, 5184, 5186, 5187, 5197, 7612, 5198, 5190, 5199, 5203,
-     5205, 5191, 5201, 5207, 5209, 5219, 5211, 7612, 5220, 5221,
-     5222, 5223, 5235, 5236, 5212, 5231, 5240, 5239, 5242, 5232,
-     5241, 5245, 5243, 5249, 5250, 5251, 5252, 5253, 5262, 5270,
-     5265, 7612, 5255, 7612, 5266, 5268, 5271, 5279, 5280, 5274,
-
-     5276, 5282, 5283, 5287, 5288, 7612, 5290, 5293, 5295, 5296,
-     5298, 5303, 5297, 5299, 7612, 5301, 5300, 5302, 5314, 7612,
-     5315, 5319, 5320, 5321, 5323, 5328, 5330, 5331, 7612, 5335,
-     5336, 5337, 5344, 5347, 5343, 5346, 5348, 5349, 5351, 5353,
-     5354, 5355, 5364, 5357, 5360, 7612, 5366, 5369, 5375, 5376,
-     5377, 5359, 5378, 5379, 5380, 5386, 5383, 7612, 5388, 5389,
-     5390, 5391, 5392, 5394, 5395, 5397, 5407, 5408, 5403, 5412,
-     5400, 5405, 5416, 5417, 5419, 5421, 7612, 5425, 5423, 5426,
-     5433, 5434, 5430, 5441, 7612, 5436, 7612, 5432, 5442, 5447,
-     5449, 5450, 7612, 5454, 5429, 5455, 5453, 5459, 7612, 7612,
-
-     5461, 5468, 5463, 5467, 5464, 7612, 7612, 5470, 7612, 5471,
-     7612, 5472, 5474, 7612, 7612, 5476, 5477, 5478, 5480, 7612,
-     5482, 5483, 5485, 7612, 5492, 7612, 5499, 5494, 5497, 5495,
-     5500, 5502, 7612, 5504, 5505, 5506, 5509, 5513, 7612, 5510,
-     5515, 5519, 5533, 5516, 5517, 7612, 5529, 5535, 5537, 5530,
-     5531, 5536, 7612, 5540, 5543, 5547, 5544, 5546, 5545, 5548,
-     5557, 5556, 5560, 5561, 5563, 5564, 5565, 5566, 5576, 5567,
-     5578, 5580, 5587, 5569, 5588, 5583, 5589, 5591, 5595, 5597,
-     5593, 5599, 5600, 5602, 5603, 5604, 5607, 5608, 5610, 5614,
-     5615, 5617, 5611, 5618, 5621, 5628, 5629, 5630, 5631, 5636,
-
-     5632, 5638, 5639, 5640, 5642, 5643, 5644, 5645, 5647, 5646,
-     5661, 5652, 5656, 5653, 5666, 5669, 7612, 5670, 5649, 5672,
-     5673, 5675, 5676, 5677, 5679, 5682, 5685, 5692, 5696, 5697,
-     7612, 7612, 7612, 5700, 7612, 5702, 5686, 5705, 5689, 5706,
-     7612, 5707, 5710, 5709, 5712, 5711, 5713, 5715, 5714, 5718,
-     5719, 5722, 7612, 5725, 5739, 5726, 5724, 5735, 5742, 7612,
-     5743, 5748, 5745, 5749, 5750, 5751, 5754, 5753, 5755, 5756,
-     5757, 5760, 5759, 5762, 5775, 5765, 5770, 5777, 7612, 5779,
-     5781, 5790, 5782, 5786, 5787, 5789, 5791, 5792, 5794, 5795,
-     5796, 5798, 5799, 5801, 5803, 5806, 5807, 5814, 5817, 5821,
-
-     7612, 5822, 7612, 5824, 5825, 5826, 5827, 5829, 5828, 5830,
-     5831, 5836, 7612, 7612, 5832, 5839, 5837, 5843, 5845, 5846,
-     5850, 5854, 5853, 5858, 7612, 5856, 5859, 5861, 5866, 5873,
-     5863, 7612, 5869, 5878, 5875, 5879, 5880, 5881, 5883, 7612,
-     5885, 5887, 5886, 5891, 5894, 5889, 5900, 5902, 5903, 5904,
-     5905, 5906, 5910, 7612, 5911, 7612, 7612, 7612, 5913, 5915,
-     5916, 5919, 5921, 5922, 5923, 5928, 5930, 5931, 5942, 5925,
-     5929, 7612, 5947, 7612, 7612, 5943, 7612, 5949, 5950, 5951,
-     5952, 5953, 5957, 5955, 7612, 5958, 7612, 5962, 5965, 5959,
-     5969, 5976, 5977, 5971, 5978, 5961, 5985, 5981, 5987, 5979,
-
-     5989, 5933, 5990, 5991, 5994, 7612, 5998, 6000, 6001, 6003,
-     6005, 7612, 7612, 6009, 6011, 6013, 6018, 6014, 6020, 6021,
-     6029, 6024, 6026, 6027, 6030, 6032, 6033, 6043, 6044, 6034,
-     6041, 6047, 7612, 6042, 6050, 6048, 7612, 6052, 7612, 6056,
-     6057, 6058, 6059, 6060, 6065, 6066, 6067, 6069, 6072, 6079,
-     7612, 7612, 6070, 6086, 6081, 7612, 7612, 6071, 6082, 6083,
-     6085, 6092, 6089, 6093, 7612, 6097, 6098, 6094, 6099, 6100,
-     6101, 6111, 6105, 7612, 6108, 7612, 6113, 6115, 6118, 6120,
-     6127, 6128, 6125, 6129, 6132, 6131, 6134, 6135, 6136, 7612,
-     6137, 6138, 7612, 6149, 6150, 6148, 6139, 6140, 6156, 6158,
-
-     7612, 6161, 6159, 7612, 6164, 6165, 6167, 6169, 7612, 6171,
-     6172, 6174, 6175, 7612, 6181, 7612, 6178, 6182, 6183, 6191,
-     6189, 7612, 6186, 6192, 6193, 6196, 7612, 6200, 6203, 6205,
-     6207, 6208, 6209, 7612, 6215, 6211, 7612, 6216, 6218, 6219,
-     6224, 6225, 6227, 6228, 6230, 6231, 6238, 6234, 6235, 7612,
-     7612, 6243, 6244, 6252, 6249,  123, 6256, 6251, 6253, 6257,
-     6258, 6265, 6266, 6267, 6262, 6268, 6270, 7612, 7612, 6271,
-     7612, 6275, 6278, 7612, 6263, 6279, 6284, 6280, 6286, 6289,
-     6290, 6292, 6294, 6295, 6300, 6299, 6296, 6304, 7612, 6320,
-     6322, 6305, 6302, 6317, 6325, 6327, 6329, 6331, 6323, 6333,
-
-     6334, 6335, 6336, 6337, 6341, 6340, 6342, 6343, 6344, 6348,
-     6349, 7612, 6356, 6358, 6350, 6360, 6363, 6365, 6367, 6366,
-     7612, 6374, 6370, 6379, 6376, 7612, 6383, 6380, 6385, 6387,
-     6388, 6390, 7612, 6391, 6393, 6396, 6398, 6401, 6400, 6403,
-     6405, 6404, 6412, 7612, 6408, 6407, 6413, 7612, 6415, 7612,
-     7612, 7612, 6418, 6426, 6422, 7612, 6428, 6429, 6431, 6432,
-     7612, 6434, 6438, 6435, 6445, 6440, 7612, 7612, 7612, 6441,
-     6442, 6446, 7612, 6448, 6457, 7612, 6449, 7612, 6453, 7612,
-     6454, 6458, 6464, 6460, 7612, 6462, 6470, 7612, 6471, 6472,
-     6473, 6475, 7612, 6478, 6481, 6489, 6483, 6486, 6490, 6493,
-
-     6494, 6491, 7612, 6501, 6497, 6498, 6500, 6504, 6505, 6507,
-     6509, 6508, 6521, 6511, 6519, 7612, 6516, 6524, 6525, 6531,
-     6523, 6533, 6534, 7612, 6527, 7612, 6538, 7612, 6539, 6540,
-     6541, 6546, 6535, 6543, 6545, 6555, 6551, 6557, 6558, 6560,
-     6562, 6565, 6566, 6568, 6570, 6572, 7612, 7612, 6580, 6573,
-     7612, 6575, 6585, 6589, 7612, 6576, 7612, 6594, 7612, 6582,
-     6586, 7612, 6590, 6596, 6599, 7612, 7612, 6601, 6603, 6605,
-     6613, 6606, 6609, 6611, 7612, 6615, 6610, 6617, 6619, 6621,
-     7612, 6628, 7612, 6618, 6631, 6627, 7612, 7612, 6626, 6633,
-     6635, 6640, 6641, 6642, 6644, 6646, 6645, 6647, 6655, 6650,
-
-     6652, 6651, 6661, 6653, 6666, 6668, 6670, 6672, 6676, 7612,
-     7612, 7612, 6674, 6678, 6679, 6680, 6687, 6689, 6690, 6697,
-     6682, 7612, 6696, 6695, 6702, 6684, 6710, 6705, 6709, 7612,
-     6706, 6711, 6692, 6712, 6714, 6715, 6716, 6719, 7612, 6721,
-     6727, 6731, 6733, 6735, 6736, 6740, 6743, 6745, 6737, 6748,
-     6750, 6751, 6758, 6754, 7612, 7612, 6756, 6753, 7612, 6761,
-     6765, 7612, 7612, 6757, 7612, 6762, 6766, 6767, 6768, 6770,
-     7612, 6773, 6774, 6775, 6778, 7612, 6779, 6780, 6782, 6796,
-     6783, 7612, 6785, 6797, 6793, 6798, 6801, 6802, 7612, 7612,
-     6804, 6809, 7612, 6811, 6814, 6812, 6821, 6816, 6822, 6824,
-
-     6827, 7612, 6818, 7612, 6829, 6831, 6820, 6834, 6837, 6835,
-     6839, 6841, 6843, 7612, 6844, 6845, 6846, 6848, 7612, 6853,
-     6856, 6857, 6855, 6858, 7612, 6860, 6850, 6867, 6873, 7612,
-     6862, 6877, 6879, 7612, 7612, 7612, 6884, 6886, 6887, 7612,
-     7612, 7612, 6881, 7612, 6889, 6890, 6893, 6898, 7612, 6894,
-     7612, 7612, 6900, 6904, 6908, 6911, 6916, 6903, 7612, 6915,
-     6917, 6919, 6921, 6922, 7612, 7612, 6924, 6927, 6925, 6929,
-     6930, 6932, 6933, 6934, 7612, 7612, 6937, 6940, 6938, 6941,
-     6943, 7612, 6946, 6953, 6952, 6960, 6956, 6966, 6969, 6971,
-     6973, 6961, 6948, 6974, 6975, 6982, 6986, 6977, 6978, 6985,
-
-     6989, 6990, 6988, 6992, 7003, 6998, 7000, 7009, 6996, 7005,
-     7612, 7612, 7013, 7001, 7612, 7017, 7014, 7612, 7018, 7612,
-     7020, 7022, 7025, 7027, 7612, 7029, 7031, 7033, 7035, 7037,
-     7612, 7038, 7040, 7612, 7042, 7043, 7044, 7045, 7612, 7046,
-     7049, 7050, 7054, 7051, 7055, 7058, 7059, 7062, 7072, 7612,
-     7064, 7076, 7612, 7612, 7612, 7073, 7067, 7077, 7057, 7081,
-     7084, 7612, 7086, 7093, 7090, 7091, 7088, 7092, 7095, 7612,
-     7094, 7097, 7612, 7612, 7099, 7098, 7612, 7108, 7612, 7101,
-     7105, 7612, 7612, 7612, 7612, 7612, 7612, 7612, 7612, 7112,
-     7115, 7612, 7612, 7116, 7120, 7122, 7124, 7612, 7131, 7612,
-
-     7114, 7126, 7128, 7133, 7134, 7612, 7136, 7612, 7144, 7139,
-     7140, 7141, 7143, 7142, 7147, 7152, 7154, 7156, 7155, 7158,
-     7160, 7159, 7164, 7161, 7163, 7167, 7172, 7169, 7181, 7170,
-     7182, 7612, 7612, 7612, 7612, 7178, 7185, 7194, 7186, 7196,
-     7198, 7201, 7202, 7208, 7210, 7200, 7191, 7212, 7213, 7216,
-     7189, 7217, 7226, 7222, 7223, 7224, 7228, 7225, 7231, 7234,
-     7238, 7612, 7240, 7241, 7242, 7244, 7612, 7247, 7246, 7612,
-     7248, 7249, 7612, 7612, 7251, 7252, 7255, 7254, 7264, 7265,
-     7260, 7266, 7268, 7270, 7277, 7612, 7281, 7612, 7612, 7612,
-     7612, 7269, 7271, 7612, 7278, 7283, 7284, 7285, 7612, 7286,
-
-     7288, 7294, 7295, 7296, 7297, 7298, 7299, 7302, 7612, 7612,
-     7305, 7310, 7307, 7612, 7311, 7315, 7312, 7324, 7321, 7327,
-     7329, 7330, 7319, 7337, 7612, 7340, 7336, 7343, 7333, 7612,
-     7344, 7345, 7346, 7347, 7349, 7356, 7352, 7354, 7612, 7357,
-     7612, 7355, 7362, 7363, 7365, 7359, 7369, 7373, 7376, 7374,
-     7380, 7381, 7612, 7382, 7383, 7387, 7389, 7391, 7394, 7395,
-     7396, 7398, 7401, 7404, 7403, 7411, 7407, 7412, 7413, 7416,
-     7417, 7612, 7612, 7423, 7418, 7612, 7420, 7424, 7426, 7427,
-     7430, 7612, 7434, 7428, 7435, 7438, 7441, 7442, 7612, 7444,
-     7451, 7448, 7612, 7452, 7612, 7612, 7453, 7456, 7459, 7461,
-
-     7463, 7612, 7612, 7612, 7492, 7499, 7506, 7513, 7520, 7527,
-     7534,   88, 7541, 7548, 7555, 7562, 7569, 7576, 7583, 7590,
-     7597, 7604
+     2251, 2247, 2249, 2253, 2261, 2255, 2257, 2264, 2265, 2268,
+     2272, 2275, 2284, 2280, 2286, 2288, 2283, 2285, 2289, 2308,
+     2287, 2290, 2292, 2291, 2293, 2296, 2302, 2297, 2313, 2298,
+     2300, 2317, 2315, 2324, 2320, 2321, 2323, 2326, 2330, 2332,
+     2338, 2335, 2340, 7635, 2349, 2226, 2344, 2346, 2345, 2353,
+     2352, 2354, 7635, 2355, 2356, 2359, 2367, 2362, 2366, 2369,
+     2368, 2370, 2376, 2372, 2378, 2380, 2382, 2381, 2379, 2399,
+     7635, 2386, 7635, 2383, 2394, 2395, 2398, 2406, 2404, 2401,
+
+     2407, 2409, 2405, 2408, 7635, 7635, 2411, 2412, 2418, 2421,
+     2432, 2434, 2429, 2430, 2431, 7635, 2419, 2442, 7635, 2439,
+     2433, 2446, 2437, 2447, 2450, 2452, 2453, 2455, 2454, 2462,
+     2457, 2464, 2460, 2465, 2472, 7635, 2473, 2476, 2461, 2478,
+     2480, 2481, 2484, 2487, 2489, 2488, 7635, 2490, 2491, 2495,
+     2498, 2505, 2503, 2504, 2506, 2508, 2509, 2512, 2514, 2515,
+     2517, 2516, 2527, 2528, 2531, 2518, 2532, 2540, 2536, 2544,
+     7635, 2542, 2539, 2526, 2549, 2545, 2552, 2553, 2554, 2555,
+     2548, 2556, 2558, 2564, 2559, 2568, 2565, 2569, 2571, 2578,
+     2580, 2576, 2577, 2585, 2579, 2586, 2587, 2588, 2593, 2592,
+
+     2594, 2595, 2596, 7635, 2597, 2602, 2605, 2601, 2607, 2608,
+     2615,  426, 2617, 2618, 2620, 2619, 2625, 2622, 2627, 2623,
+     2636, 2644, 2639, 2640, 2629, 2641, 2648, 2649, 2628, 2651,
+     2652, 2653, 2656, 2658, 2659, 2662, 2660, 7635, 2664, 2667,
+     2669, 2671, 2670, 2672, 2676, 2674, 2684, 7635, 2686, 2691,
+     2678, 2696, 2697, 2693, 2685, 2702, 2701, 2707, 2708, 7635,
+     2709, 2710, 2711, 2718, 2716, 2713, 2715, 2719, 7635, 2731,
+     2728, 2732, 2722, 2734, 2736, 2735, 2741, 2743, 2745, 2747,
+     2746, 2748, 2751, 2749, 2752, 2753, 2754, 2757, 2765, 2775,
+     2762, 2766, 2770, 2774, 2777, 2778, 2780, 2767, 2783, 2787,
+
+     2784, 7635, 2791, 2788, 2793, 2794, 2795, 2797, 2800, 2806,
+     2817, 2801, 2808, 2810, 2824, 2826, 2819, 2812, 2836, 2828,
+     2809, 2833, 2838, 2846, 2843, 2850, 2841, 2844, 2851, 2853,
+     2854, 2857, 2866, 2867, 2859, 2863, 2864, 2868, 2869, 2870,
+     2877, 2876, 2885, 2881, 2887, 2880, 2889, 2890, 2878, 2896,
+     2902, 2901, 7635, 2904, 2906, 2894, 2910, 2911, 2919, 2915,
+     2916, 2917, 2922, 2923, 2926, 2929, 2930, 2931, 2938, 2933,
+     2940, 2936, 2941, 2942, 2943, 2950, 2946, 2951, 2954, 2956,
+     2963, 2958, 2965, 2966, 2968, 7635, 2972, 2976, 2967, 2974,
+     2978, 2960, 2985, 2987, 2989, 2982, 2990, 2991, 2993, 2995,
+
+     2996, 2997, 2998, 3005, 3001, 3007, 3002, 3008, 7635, 3014,
+     3009, 3010, 3020, 3019, 3022, 3021, 3030, 3028, 3032, 3038,
+     3036, 3034, 3040, 3042, 3043, 7635, 3050, 3051, 3048, 3054,
+     3061, 3057, 3058, 3060, 3063, 3047, 3064, 7635, 3065, 3068,
+     3069, 3072, 3073, 3074, 3081, 3082, 3083, 3080, 7635, 3094,
+     3078, 3085, 3090, 3102, 3100, 3101, 3103, 3104, 3106, 3108,
+     3109, 3111, 3110, 3112, 3119, 3114, 3116, 7635, 3123, 3124,
+     3126, 3133, 3125, 3131, 3136, 3135, 3141, 3145, 3146, 3148,
+     3150, 3147, 7635, 3159, 3155, 3158, 3164, 3173, 3165, 3166,
+     3168, 3169, 3176, 3177, 3170, 3178, 3180, 3179, 7635, 3183,
+
+     3187, 3189, 3190, 3196, 3193, 3194, 3201, 3202, 3203, 3204,
+     3206, 3209, 3210, 3208, 3212, 3215, 3216, 3218, 3226, 3228,
+     3229, 3230, 3232, 3233, 3234, 3243, 3241, 3245, 3237, 3252,
+     3256, 3257, 3246, 3248, 3259, 3266, 3267, 3271, 3272, 3274,
+     7635, 3277, 3278, 3270, 3250, 3280, 3281, 3283, 3284, 3285,
+     3287, 3289, 3288, 3290, 3299, 3306, 3309, 3310, 3301, 3311,
+     3313, 3315, 3316, 3317, 3319, 3320, 3323, 3330, 3326, 3327,
+     3328, 3329, 3333, 3342, 3335, 3337, 3352, 3339, 3347, 3349,
+     3350, 3351, 3353, 3357, 3355, 3360, 3361, 3363, 3364, 3365,
+     3367, 3374, 3378, 3380, 3382, 3381, 3387, 3388, 3390, 3389,
+
+     7635, 3392, 3393, 3399, 3398, 3400, 3401, 3406, 3407, 3415,
+     3411, 3414, 3422, 3418, 3421, 3424, 3419, 3429, 3431, 3430,
+     3438, 3434, 7635, 3435, 7635, 3442, 3437, 3441, 3443, 3451,
+     3448, 7635, 3455, 7635, 3449, 3457, 3459, 3460, 3461, 7635,
+     3462, 3463, 3466, 3464, 3467, 3469, 3474, 3471, 3472, 3478,
+     3479, 3488, 3480, 3485, 3490, 3495, 3496, 3497, 3498, 3500,
+     3501, 3502, 3503, 3505, 3509, 3506, 3511, 3515, 3516, 3520,
+     3523, 3522, 3524, 7635, 3533, 3540, 3525, 3530, 3542, 3536,
+     3538, 3544, 3545, 3546, 3548, 3550, 3553, 3557, 3549, 3561,
+     3551, 3567, 3555, 3576, 3563, 3577, 3568, 3578, 3579, 3587,
+
+     3583, 3591, 3589, 7635, 3586, 3593, 3590, 3595, 3596, 3598,
+     7635, 3597, 3599, 3605, 3607, 3610, 3611, 3612, 3613, 3617,
+     3615, 3619, 3620, 3632, 3622, 3636, 3621, 3625, 7635, 3637,
+     3642, 3639, 3645, 3652, 3641, 3649, 3659, 3655, 3656, 3661,
+     3669, 3666, 3654, 3658, 3668, 3670, 3672, 3679, 3680, 3683,
+     3681, 3684, 3682, 3688, 3692, 3689, 3685, 3695, 3696, 3697,
+     3698, 3699, 3700, 3706, 3701, 3702, 3704, 3707, 3710, 3717,
+     7635, 3721, 3722, 3712, 3732, 3723, 3728, 3730, 3731, 3735,
+     3736, 3739, 7635, 3741, 3742, 3746, 3747, 3752, 3749, 3754,
+     3755, 3757, 3758, 3761, 3763, 3760, 3765, 7635, 3771, 7635,
+
+     3766, 3773, 3774, 3783, 3788, 3778, 3785, 3789, 3794, 3795,
+     3780, 3796, 3797, 3804, 3800, 3805, 3806, 3811, 3809, 3812,
+     3814, 3813, 3815, 3822, 3820, 3828, 3829, 3817, 3832, 3833,
+     3836, 3840, 3838, 3841, 7635, 7635, 3842, 3844, 3845, 3848,
+     3854, 3855, 3856, 3858, 3860, 3863, 3865, 3871, 3874, 3875,
+     3882, 7635, 3877, 3879, 3878, 3880, 3883, 3890, 3886, 3888,
+     3898, 3896, 3899, 3908, 3903, 7635, 3905, 3906, 3907, 3916,
+     3911, 3914, 3918, 7635, 3919, 7635, 3915, 3920, 3922, 3928,
+     3930, 3929, 3931, 3933, 3932, 3937, 3940, 3947, 3949, 3956,
+     3952, 3948, 3958, 3953, 3959, 3960, 3963, 3965, 3970, 3966,
+
+     3967, 3969, 7635, 3972, 3974, 3976, 3981, 3975, 3984, 3985,
+     3982, 3992, 7635, 3993, 7635, 3997, 4000, 3998, 3999, 4002,
+     4004, 4005, 4006, 4010, 4013, 4014, 4016, 4020, 4021, 4025,
+     4022, 4026, 4023, 7635, 4028, 4031, 4041, 4036, 4038, 4039,
+     4050, 4052, 4040, 4054, 7635, 4057, 4064, 4044, 4061, 4069,
+     4066, 4067, 4071, 4072, 4068, 4074, 4076, 4077, 4078, 4080,
+     4081, 4086, 4082, 4084, 4087, 4091, 4099, 4102, 4101, 4093,
+     4104, 4111, 4109, 7635, 4110, 4112, 4115, 4116, 4117, 4118,
+     4122, 4123, 4128, 4140, 4121, 4143, 4144, 4125, 4129, 4133,
+     4148, 4042, 4155, 4153, 7635, 4157, 4152, 4164, 4159, 4160,
+
+     4161, 4163, 4168, 4169, 4171, 4173, 4162, 4174, 4175, 4178,
+     4184, 4187, 4194, 4190, 4179, 4193, 4181, 4197, 4196, 4198,
+     4200, 4205, 7635, 4214, 4206, 4212, 4215, 4219, 4221, 4228,
+     4223, 4224, 4225, 4234, 4226, 4237, 4229, 4231, 4239, 4242,
+     4248, 4235, 7635, 7635, 4251, 4243, 4245, 7635, 4256, 4257,
+     4264, 4260, 4259, 4262, 4267, 4261, 4269, 4263, 4271, 4272,
+     4273, 4286, 4277, 4281, 7635, 4289, 4287, 4294, 4290, 4293,
+     4301, 4302, 7635, 4296, 4305, 4307, 4308, 4309, 4311, 4312,
+     4314, 4316, 4317, 4320, 4321, 4322, 4324, 4334, 4330, 4337,
+     4327, 4335, 4336, 7635, 4338, 4341, 4344, 4346, 4343, 4351,
+
+     4353, 7635, 4352, 4355, 4360, 4366, 4364, 4375, 4369, 4376,
+     4377, 4382, 4362, 4365, 4384, 4385, 4386, 4387, 4389, 4397,
+     4392, 4396, 4394, 4395, 4401, 4404, 4398, 7635, 4412, 4413,
+     4414, 4415, 4417, 7635, 4419, 4428, 4431, 7635, 4432, 4423,
+     4430, 4433, 4442, 7635, 4438, 4437, 4439, 4443, 4440, 4452,
+     4447, 4454, 4453, 4455, 4457, 4458, 4459, 4461, 4462, 7635,
+     4463, 4464, 4467, 7635, 4471, 4354, 4480, 4485, 4486, 4489,
+     4482, 4478, 4490, 4497, 4492, 4494, 4495, 4496, 7635, 4502,
+     4509, 7635, 4511, 4500, 4506, 4512, 4515, 7635, 4513, 4517,
+     4518, 4520, 4521, 4526, 4528, 4532, 4537, 4522, 4534, 4538,
+
+     4539, 4546, 4541, 4544, 4553, 4548, 4550, 4551, 4554, 7635,
+     4560, 4552, 4555, 4562, 4557, 4573, 4567, 4563, 4565, 4578,
+     4579, 7635, 7635, 4581, 7635, 4582, 4584, 4587, 4588, 7635,
+     4590, 4593, 4595, 4591, 4596, 4599, 4598, 4602, 4610, 4606,
+     7635, 4616, 4617, 7635, 4611, 4613, 4627, 4622, 4623, 4624,
+     4625, 4628, 4631, 4626, 4637, 4638, 4633, 4639, 4635, 4643,
+     4641, 4659, 4642, 4660, 7635, 4644, 4654, 4655, 4669, 4657,
+     4670, 4671, 4673, 4672, 7635, 4676, 4680, 4683, 4684, 4686,
+     7635, 7635, 4685, 7635, 4687, 4688, 4691, 4696, 4695, 4699,
+     4706, 4702, 7635, 4707, 4704, 4711, 4708, 4712, 4713, 7635,
+
+     4716, 4720, 4723, 4724, 4726, 4733, 4730, 4731, 4728, 4738,
+     4739, 7635, 4729, 4736, 4743, 4752, 4753, 4745, 4749, 4757,
+     4765, 4758, 4760, 4761, 4772, 4767, 4769, 4770, 4773, 4780,
+     4776, 4784, 4778, 7635, 4786, 4788, 4791, 4771, 4804, 4787,
+     4801, 4794, 7635, 4795, 4802, 4807, 4811, 7635, 4805, 4809,
+     4813, 4820, 4815, 4821, 4823, 4824, 4825, 4828, 4830, 4826,
+     7635, 4832, 4834, 4827, 4838, 4848, 4849, 4836, 7635, 7635,
+     4851, 7635, 4855, 4837, 4852, 4856, 4859, 4862, 4864, 4866,
+     4869, 4865, 4872, 4873, 4876, 4879, 4878, 4880, 7635, 4882,
+     4894, 4885, 4896, 4903, 4904, 4886, 7635, 4902, 4899, 7635,
+
+     4905, 7635, 4906, 4908, 4912, 4913, 4909, 4916, 4920, 4922,
+     4917, 4924, 7635, 4933, 4923, 4931, 4932, 4940, 4943, 4944,
+     4952, 7635, 4950, 4936, 4953, 4945, 7635, 4947, 4955, 4948,
+     4958, 4959, 4961, 4962, 4963, 4964, 4969, 4967, 4976, 4978,
+     4968, 4981, 4970, 4985, 4987, 4990, 4991, 4992, 4993, 4994,
+     4996, 7635, 4999, 4998, 5000, 5001, 5003, 5004, 5008, 5009,
+     5013, 5014, 5021, 5022, 7635, 5018, 7635, 5023, 5024, 5031,
+     5032, 5029, 5040, 5041, 5042, 5043, 5044, 5047, 5050, 5051,
+     5054, 5055, 5059, 5060, 5062, 5065, 5066, 7635, 5072, 5073,
+     5064, 5080, 5076, 5083, 5087, 5084, 7635, 5090, 5091, 5092,
+
+     5093, 5097, 5099, 5094, 5101, 5102, 5104, 5106, 5109, 5108,
+     5116, 5110, 5117, 5118, 5122, 5128, 5123, 5125, 7635, 5129,
+     5131, 5132, 5136, 5138, 5140, 5141, 5143, 5148, 5153, 5142,
+     5150, 5155, 7635, 5154, 5158, 5160, 5168, 7635, 5163, 5166,
+     5167, 5170, 5171, 5173, 5174, 5179, 5176, 5182, 5186, 7635,
+     5189, 5178, 5192, 5191, 5194, 5195, 5196, 5200, 5202, 5206,
+     5207, 5214, 7635, 5210, 5208, 5216, 5218, 5219, 5222, 5225,
+     5048, 5227, 5228, 5229, 7635, 5230, 5237, 5239, 5231, 5249,
+     5251, 5240, 5241, 5254, 5252, 5253, 5250, 5259, 5260, 5262,
+     5264, 5265, 5267, 5268, 5266, 5284, 5285, 5283, 7635, 5269,
+
+     7635, 5270, 5286, 5291, 5294, 5296, 5293, 5298, 5299, 5301,
+     5306, 5303, 7635, 5310, 5312, 5314, 5307, 5309, 5315, 5319,
+     5316, 7635, 5317, 5320, 5330, 5331, 7635, 5332, 5333, 5334,
+     5337, 5339, 5341, 5348, 5350, 5352, 7635, 5356, 5357, 5358,
+     5365, 5367, 5362, 5369, 5364, 5372, 5370, 5374, 5366, 5376,
+     5383, 5385, 5377, 5381, 7635, 5388, 5387, 5394, 5396, 5397,
+     5389, 5399, 5400, 5403, 5405, 5406, 7635, 5409, 5410, 5411,
+     5412, 5413, 5417, 5415, 5418, 5422, 5428, 5424, 5436, 5426,
+     5429, 5433, 5438, 5439, 5441, 7635, 5442, 5445, 5446, 5453,
+     5455, 5450, 5342, 7635, 5456, 7635, 5457, 5459, 5462, 5464,
+
+     5468, 7635, 5472, 5466, 5474, 5470, 5478, 7635, 7635, 5476,
+     5488, 5483, 5485, 5489, 7635, 7635, 5487, 7635, 5490, 7635,
+     5491, 5493, 7635, 7635, 5492, 5494, 5499, 5500, 7635, 5501,
+     5502, 5504, 7635, 5511, 7635, 5518, 5513, 5514, 5516, 5519,
+     5522, 7635, 5523, 5525, 5524, 5526, 5530, 7635, 5531, 5534,
+     5539, 5546, 5535, 5537, 7635, 5549, 5551, 5555, 5544, 5550,
+     5556, 7635, 5558, 5561, 5562, 5564, 5566, 5565, 5568, 5577,
+     5571, 5572, 5576, 5584, 5580, 5581, 5587, 5591, 5583, 5594,
+     5596, 5603, 5597, 5604, 5599, 5605, 5607, 5611, 5613, 5615,
+     5616, 5618, 5619, 5620, 5621, 5623, 5624, 5626, 5629, 5631,
+
+     5633, 5634, 5638, 5635, 5640, 5644, 5648, 5650, 5652, 5653,
+     5655, 5656, 5657, 5658, 5659, 5661, 5663, 5664, 5665, 5667,
+     5666, 5673, 5679, 5680, 5681, 7635, 5684, 5685, 5686, 5689,
+     5691, 5692, 5697, 5698, 5699, 5701, 5710, 5714, 5693, 5716,
+     7635, 7635, 7635, 5718, 7635, 5720, 5711, 5722, 5723, 5724,
+     7635, 5725, 5726, 5727, 5728, 5730, 5731, 5732, 5734, 5735,
+     5738, 5741, 5746, 7635, 5753, 5761, 5737, 5743, 5754, 5767,
+     7635, 5762, 5769, 5758, 5764, 5770, 5772, 5774, 5773, 5775,
+     5778, 5777, 5780, 5783, 5786, 5798, 5781, 5787, 5800, 7635,
+     5803, 5808, 5810, 5795, 5799, 5809, 5792, 5812, 5814, 5816,
+
+     5818, 5820, 5821, 5822, 5823, 5825, 5827, 5828, 5836, 5829,
+     5843, 7635, 5837, 7635, 5839, 5844, 5846, 5847, 5849, 5850,
+     5852, 5851, 5853, 7635, 7635, 5855, 5859, 5861, 5866, 5868,
+     5860, 5874, 5869, 5876, 5881, 7635, 5879, 5882, 5884, 5888,
+     5887, 5889, 7635, 5893, 5896, 5898, 5900, 5899, 5901, 5904,
+     7635, 5905, 5906, 5909, 5910, 5923, 5912, 5925, 5927, 5920,
+     5914, 5916, 5926, 5934, 7635, 5935, 7635, 7635, 7635, 5936,
+     5938, 5939, 5941, 5942, 5944, 5945, 5943, 5950, 5951, 5949,
+     5953, 5954, 7635, 5963, 7635, 7635, 5965, 7635, 5966, 5964,
+     5967, 5968, 5974, 5975, 5977, 7635, 5979, 7635, 5981, 5982,
+
+     5980, 5989, 5991, 5992, 5983, 5996, 5999, 6003, 6000, 6004,
+     6005, 6006, 6014, 6010, 6011, 6012, 7635, 6019, 6013, 6017,
+     6030, 6032, 7635, 7635, 6033, 6021, 6036, 6037, 6045, 6041,
+     6042, 6043, 6054, 6049, 6050, 6051, 6052, 6058, 6059, 6060,
+     6068, 6069, 6065, 6064, 6072, 7635, 6075, 6074, 6077, 7635,
+     6066, 7635, 6083, 6084, 6085, 6086, 6087, 6092, 6093, 6094,
+     6096, 6099, 6106, 7635, 7635, 6091, 6113, 6108, 7635, 7635,
+     6097, 6098, 6110, 6112, 6120, 6115, 6117, 7635, 6123, 6124,
+     6125, 6127, 6128, 6129, 6135, 6121, 7635, 6138, 7635, 6139,
+     6141, 6147, 6143, 6154, 6155, 6150, 6152, 6157, 6161, 6156,
+
+     6158, 6162, 7635, 6163, 6165, 7635, 6177, 6173, 6175, 6166,
+     6174, 6181, 6182, 7635, 6185, 6187, 7635, 6190, 6191, 6193,
+     6195, 7635, 6199, 6196, 6201, 6202, 7635, 6204, 7635, 6207,
+     6208, 6209, 6216, 6212, 7635, 6217, 6218, 6219, 6222, 7635,
+     6226, 6229, 6231, 6232, 6220, 6234, 7635, 6241, 6236, 7635,
+     6242, 6244, 6245, 6249, 6250, 6252, 6253, 6255, 6256, 6263,
+     6259, 6260, 7635, 7635, 6275, 6268, 6267, 6272,  295, 6282,
+     6278, 6279, 6280, 6283, 6290, 6291, 6292, 6287, 6293, 6295,
+     7635, 7635, 6303, 6304, 7635, 6288, 6305, 7635, 6298, 6307,
+     6313, 6311, 6315, 6306,  123, 6316, 6317, 6319, 6321, 6322,
+
+     6326, 6327, 6330, 7635, 6343, 6345, 6332, 6348, 6349, 6352,
+     6354, 6356, 6358, 6360, 6361, 6362, 6341, 6363, 6364, 6365,
+     6368, 6369, 6371, 6373, 6375, 6377, 7635, 6384, 6386, 6388,
+     6379, 6390, 6392, 6396, 6381, 7635, 6403, 6400, 6405, 6406,
+     7635, 6409, 6410, 6412, 6414, 6415, 6416, 7635, 6417, 6423,
+     6427, 6428, 6420, 6418, 6430, 6431, 6433, 6440, 7635, 6436,
+     6438, 6444, 7635, 6442, 7635, 7635, 7635, 6445, 6452, 6454,
+     7635, 6456, 6458, 6459, 6443, 7635, 6463, 6465, 6460, 6473,
+     6466, 7635, 7635, 7635, 6470, 6471, 6474, 7635, 6477, 6481,
+     7635, 6479, 7635, 6480, 7635, 6482, 6485, 6488, 6493, 7635,
+
+     6494, 6486, 7635, 6492, 6496, 6498, 6504, 7635, 6507, 6511,
+     6514, 6515, 6516, 6517, 6519, 6520, 6518, 7635, 7635, 6527,
+     6525, 6526, 6529, 6522, 6532, 6533, 6541, 6534, 6548, 6535,
+     6550, 7635, 6543, 6551, 6553, 6561, 6545, 6555, 6557, 7635,
+     6559, 7635, 6566, 7635, 6563, 6567, 6568, 6569, 6574, 6571,
+     6575, 6577, 6584, 6578, 6582, 6590, 6586, 6588, 6592, 6597,
+     6600, 6593, 7635, 7635, 6609, 6601, 7635, 6604, 6614, 6617,
+     7635, 6605, 7635, 6620, 7635, 6607, 6611, 7635, 6624, 6621,
+     6625, 7635, 7635, 6632, 6622, 6634, 6639, 6628, 6636, 6638,
+     7635, 6640, 6644, 6645, 6647, 6649, 7635, 6652, 7635, 6650,
+
+     6659, 6655, 7635, 7635, 6654, 6656, 6662, 6667, 6663, 6668,
+     6672, 6669, 6674, 6673, 6681, 6677, 6685, 6679, 6687, 6684,
+     6695, 6690, 6698, 6700, 6706, 7635, 7635, 7635, 6692, 6702,
+     6708, 6709, 6716, 6712, 6715, 6719, 6717, 7635, 6720, 6724,
+     6721, 6727, 6736, 6731, 6733, 7635, 6729, 6734, 6737, 6738,
+     6740, 6742, 6743, 6744, 7635, 6755, 6757, 6764, 6745, 6758,
+     6760, 6767, 6769, 6771, 6773, 6775, 6776, 6777, 6784, 6780,
+     7635, 7635, 6787, 6779, 7635, 6791, 6793, 7635, 7635, 6781,
+     7635, 6783, 6788, 6794, 6796, 6797, 7635, 6802, 6799, 6804,
+     6806, 7635, 6807, 6808, 6812, 6815, 6822, 7635, 6816, 6830,
+
+     6809, 6819, 6828, 6831, 7635, 7635, 6821, 6840, 7635, 6844,
+     6832, 6835, 6847, 6845, 6846, 6851, 6848, 7635, 6852, 7635,
+     6855, 6856, 6858, 6860, 6862, 6863, 6864, 6865, 6868, 7635,
+     6869, 6866, 6870, 6871, 7635, 6879, 6873, 6881, 6882, 6887,
+     7635, 6888, 6884, 6900, 6896, 7635, 6886, 6902, 6895, 7635,
+     7635, 7635, 6910, 6912, 6913, 7635, 7635, 7635, 6907, 7635,
+     6915, 6916, 6918, 6920, 7635, 6923, 7635, 7635, 6925, 6929,
+     6933, 6935, 6942, 6928, 7635, 6936, 6943, 6945, 6946, 6947,
+     7635, 7635, 6949, 6950, 6953, 6954, 6955, 6957, 6958, 6959,
+     7635, 7635, 6962, 6963, 6965, 6966, 6967, 7635, 6968, 6025,
+
+     6972, 6981, 6983, 6984, 6989, 6991, 6994, 6978, 6995, 6996,
+     6997, 7004, 7005, 7002, 7007, 7008, 7011, 7012, 7013, 7015,
+     7024, 7019, 7021, 7031, 7023, 7028, 7635, 7635, 7035, 7026,
+     7635, 7037, 7039, 7635, 7041, 7635, 7043, 7045, 7047, 7050,
+     7635, 7052, 7054, 7056, 7058, 7060, 7635, 7061, 7063, 7635,
+     7065, 7066, 7067, 7068, 7635, 7069, 7072, 7073, 7077, 7074,
+     7078, 7081, 7082, 7085, 7095, 7635, 7087, 7099, 7635, 7635,
+     7635, 7096, 7090, 7100, 7080, 7104, 7107, 7635, 7109, 7116,
+     7113, 7114, 7111, 7115, 7118, 7635, 7117, 7120, 7635, 7635,
+     7122, 7121, 7635, 7131, 7635, 7124, 7128, 7635, 7635, 7635,
+
+     7635, 7635, 7635, 7635, 7635, 7135, 7138, 7635, 7635, 7139,
+     7143, 7145, 7147, 7635, 7154, 7635, 7137, 7149, 7151, 7156,
+     7157, 7635, 7159, 7635, 7167, 7162, 7163, 7164, 7166, 7165,
+     7170, 7175, 7177, 7179, 7178, 7181, 7183, 7182, 7187, 7184,
+     7186, 7190, 7195, 7192, 7204, 7193, 7205, 7635, 7635, 7635,
+     7635, 7201, 7208, 7217, 7209, 7219, 7221, 7224, 7225, 7231,
+     7233, 7223, 7214, 7235, 7236, 7239, 7212, 7240, 7249, 7245,
+     7246, 7247, 7251, 7248, 7254, 7257, 7261, 7635, 7263, 7264,
+     7265, 7267, 7635, 7270, 7269, 7635, 7271, 7272, 7635, 7635,
+     7274, 7275, 7278, 7277, 7287, 7288, 7283, 7289, 7291, 7293,
+
+     7300, 7635, 7304, 7635, 7635, 7635, 7635, 7292, 7294, 7635,
+     7301, 7306, 7307, 7308, 7635, 7309, 7311, 7317, 7318, 7319,
+     7320, 7321, 7322, 7325, 7635, 7635, 7328, 7333, 7330, 7635,
+     7334, 7338, 7335, 7347, 7344, 7350, 7352, 7353, 7342, 7360,
+     7635, 7363, 7359, 7366, 7356, 7635, 7367, 7368, 7369, 7370,
+     7372, 7379, 7375, 7377, 7635, 7380, 7635, 7378, 7385, 7386,
+     7388, 7382, 7392, 7396, 7399, 7397, 7403, 7404, 7635, 7405,
+     7406, 7410, 7412, 7414, 7417, 7418, 7419, 7421, 7424, 7427,
+     7426, 7434, 7430, 7435, 7436, 7439, 7440, 7635, 7635, 7446,
+     7441, 7635, 7443, 7447, 7449, 7450, 7453, 7635, 7457, 7451,
+
+     7458, 7461, 7464, 7465, 7635, 7467, 7474, 7471, 7635, 7475,
+     7635, 7635, 7476, 7479, 7482, 7484, 7486, 7635, 7635, 7635,
+     7515, 7522, 7529, 7536, 7543, 7550, 7557,   88, 7564, 7571,
+     7578, 7585, 7592, 7599, 7606, 7613, 7620, 7627
     } ;
 
-static yyconst flex_int16_t yy_def[3923] =
+static yyconst flex_int16_t yy_def[3939] =
     {   0,
-     3904,    1, 3905, 3905, 3906, 3906, 3907, 3907, 3908, 3908,
-     3909, 3909, 3910, 3910, 3911, 3911, 3904, 3912, 3904, 3904,
-     3904, 3904, 3913, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3914, 3904, 3904,
-     3904, 3914, 3915, 3904, 3904, 3904, 3915, 3916, 3904, 3904,
-     3904, 3904, 3916, 3917, 3904, 3904, 3904, 3917, 3918, 3904,
-     3919, 3904, 3918, 3918, 3920, 3904, 3904, 3904, 3904, 3920,
-     3921, 3904, 3904, 3904, 3921, 3912, 3912, 3904, 3922, 3913,
-     3922, 3913, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3914, 3914, 3915, 3915, 3916, 3916, 3904, 3917,
-     3917, 3918, 3918, 3919, 3919, 3918, 3920, 3920, 3904, 3921,
-     3921, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3918, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3918, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3918, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3918, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3904, 3912, 3904, 3904, 3912, 3912,
-     3904, 3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3918, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3904, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3918, 3918, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3918, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3918, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3904, 3912, 3912, 3912, 3918, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3918, 3912, 3904, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904, 3912, 3904,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3904, 3904, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3904, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3918, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3918, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3904, 3904,
-
-     3912, 3912, 3912, 3912, 3912, 3904, 3904, 3912, 3904, 3912,
-     3904, 3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3918, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3904, 3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3904, 3904, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3904, 3904, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3918, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3904, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3904, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3904, 3912, 3912, 3912, 3912, 3918, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904, 3912,
-     3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3904, 3912, 3904,
-     3904, 3904, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3904, 3904, 3904, 3912,
-     3912, 3912, 3904, 3912, 3912, 3904, 3912, 3904, 3912, 3904,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3904, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904, 3912, 3912,
-     3904, 3912, 3912, 3912, 3904, 3912, 3904, 3912, 3904, 3912,
-     3912, 3904, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3904, 3912, 3912, 3912, 3904, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3904, 3912,
-     3912, 3904, 3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3904, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3904, 3904, 3904, 3912, 3912, 3912, 3904,
-     3904, 3904, 3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912,
-     3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3904, 3904, 3912, 3912, 3904, 3912, 3912, 3904, 3912, 3904,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912,
-     3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3904, 3904, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3904, 3904, 3912, 3912, 3904, 3912, 3904, 3912,
-     3912, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3912,
-     3912, 3904, 3904, 3912, 3912, 3912, 3912, 3904, 3912, 3904,
-
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3904, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3904, 3904, 3904, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912, 3912, 3904,
-     3912, 3912, 3904, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3904, 3912, 3904, 3904, 3904,
-     3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904, 3912,
-
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3904,
-     3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3904, 3912, 3912, 3912, 3912, 3904,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
-     3912, 3904, 3904, 3912, 3912, 3904, 3912, 3912, 3912, 3912,
-     3912, 3904, 3912, 3912, 3912, 3912, 3912, 3912, 3904, 3912,
-     3912, 3912, 3904, 3912, 3904, 3904, 3912, 3912, 3912, 3912,
-
-     3912, 3904, 3904,    0, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904
+     3920,    1, 3921, 3921, 3922, 3922, 3923, 3923, 3924, 3924,
+     3925, 3925, 3926, 3926, 3927, 3927, 3920, 3928, 3920, 3920,
+     3920, 3920, 3929, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3930, 3920, 3920,
+     3920, 3930, 3931, 3920, 3920, 3920, 3931, 3932, 3920, 3920,
+     3920, 3920, 3932, 3933, 3920, 3920, 3920, 3933, 3934, 3920,
+     3935, 3920, 3934, 3934, 3936, 3920, 3920, 3920, 3920, 3936,
+     3937, 3920, 3920, 3920, 3937, 3928, 3928, 3920, 3938, 3929,
+     3938, 3929, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3930, 3930, 3931, 3931, 3932, 3932, 3920, 3933,
+     3933, 3934, 3934, 3935, 3935, 3934, 3936, 3936, 3920, 3937,
+     3937, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3934, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3928, 3928,
+     3920, 3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3934, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3934,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3934, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3920,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3934, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
+
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3934, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
+
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
+     3928, 3928, 3928, 3928, 3920, 3920, 3928, 3920, 3928, 3920,
+     3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3934, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3928, 3920, 3920, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3934, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3920, 3928, 3920, 3920, 3920, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3920, 3920, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
+     3920, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
+
+     3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3920, 3920, 3928, 3928, 3920, 3928, 3928, 3928,
+     3920, 3928, 3920, 3928, 3920, 3928, 3928, 3920, 3928, 3928,
+     3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
+
+     3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3920, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3920, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920,
+     3920, 3920, 3928, 3928, 3928, 3920, 3920, 3920, 3928, 3920,
+     3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928,
+     3920, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
+     3928, 3928, 3920, 3928, 3920, 3928, 3928, 3920, 3920, 3920,
+
+     3920, 3920, 3920, 3920, 3920, 3928, 3928, 3920, 3920, 3928,
+     3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3920,
+     3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+     3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+
+     3928, 3920, 3928, 3920, 3920, 3920, 3920, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
+     3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
+
+     3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928,
+     3920, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3920,    0,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920
     } ;
 
-static yyconst flex_int16_t yy_nxt[7653] =
+static yyconst flex_int16_t yy_nxt[7676] =
     {   0,
        18,   19,   20,   21,   22,   23,   22,   18,   18,   18,
        18,   18,   22,   24,   25,   26,   27,   28,   29,   30,
@@ -1739,7 +1742,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
        79,   87,   22,   73,  123,   87,  122,  111,   87,   80,
        87,  161,   74,   19,   20,   21,   70,   71,   72,   76,
        77,   78,   79,  191,   22,   73,   82,   83,   84,  132,
-       91,   80,   91,   91,   74,   91,  173,   85,   82,   83,
+       91,   80,   91,   91,   74,   91,   87,   85,   82,   83,
        84,   91,   92,   87,  100,   87,  112,   87,  114,   85,
        87,  101,   87,   93,   94,  102,  115,   95,  103,   87,
       113,   87,   96,  117,   97,  238,  118,  116,   87,   87,
@@ -1772,18 +1775,18 @@ static yyconst flex_int16_t yy_nxt[7653] =
       261,   87,  263,  257,  270,  262,   87,  258,   87,   87,
        87,   87,  272,  266,   87,  269,  276,   87,   87,  264,
       275,  273,  265,  279,  267,  271,  277,   87,   87,  163,
-      163,  165,   87,  274,  165,  278,  280,  283,  167,  181,
+      163,  165,   87,  274,  165,  278,  280,  283,  167,  173,
       167,  167,  281,  167,  170,  170,  172,   87,  172,  172,
        91,  172,   91,   91,  173,   91,  177,  282,  177,  177,
       284,  177,  175,  180,  180,  286,   87,   87,   87,   87,
        87,   87,   87,   87,   87,  285,  289,   87,  292,  295,
       291,   87,  287,  290,   87,   87,   87,  294,  297,  299,
-      293,  302,  179,  296,  298,   87,  300,   87,  303,  305,
+      293,  302,  181,  296,  298,   87,  300,   87,  303,  305,
 
       304,   87,  306,  318,   87,   87,  301,  307,   87,   87,
       314,   87,  309,  315,  316,   87,  319,  310,   87,  317,
        87,   87,  311,  320,  308,  323,   87,  321,  312,  313,
-      325,   87,   87,   87,   87,   87,  178,  326,   87,   87,
+      325,   87,   87,   87,   87,   87,  179,  326,   87,   87,
        87,  322,   87,   87,  333,   87,   87,  334,  328,  327,
       329,  340,  330,   87,  324,  331,  332,   87,  335,  342,
       343,  336,   87,  337,  345,  341,   87,   87,  344,  355,
@@ -1804,7 +1807,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
 
        87,   87,  409,   87,  419,   87,  417,  411,  418,   87,
        87,  413,   87,   87,   87,  420,   87,   87,   87,  427,
-      173,  428,  423,  421,  425,   87,   87,   87,  424,  429,
+      178,  428,  423,  421,  425,   87,   87,   87,  424,  429,
       422,   87,  430,   87,  431,  432,   87,  434,   87,   87,
       435,   87,  426,   87,  433,   87,  437,   87,   87,   87,
       439,   87,  440,   87,   87,  444,  459,  436,  441,  446,
@@ -1825,7 +1828,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
        87,   87,   87,   87,  515,   87,  520,  525,  521,  526,
 
       538,  518,  516,   87,  517,   87,   87,  522,  524,  580,
-       87,  527,  171,   87,  523,  528,  530,  532,  531,  533,
+       87,  527,  173,   87,  523,  528,  530,  532,  531,  533,
        87,  529,  540,  534,   87,   87,   87,  539,   87,  541,
        87,   87,   87,   87,  556,   87,  535,  542,  173,  536,
        87,  537,   87,  543,  555,  544,   87,   87,  558,  649,
@@ -1833,7 +1836,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
       547,  563,  576,  548,   87,  549,  573,  550,   87,  574,
        87,   87,  562,  572,  575,   87,   87,  577,   87,  582,
       551,   87,   87,  552,  578,  553,  584,  554,   87,   87,
-      564,  565,   87,  581,   87,  583,   87,  169,   87,  585,
+      564,  565,   87,  581,   87,  583,   87,  171,   87,  585,
 
       566,  567,  568,  569,  570,  589,   87,  571,  586,  587,
       588,   87,   87,   87,  593,  590,  599,  591,  594,   87,
@@ -1847,7 +1850,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
       629,  630,  631,  628,   87,   87,  641,   87,  643,   87,
 
       646,  645,   87,  632,  644,  633,   87,   87,  647,   87,
-       87,  634,  656,  648,   87,  650,  168,  651,  660,  635,
+       87,  634,  656,  648,   87,  650,  169,  651,  660,  635,
       636,   87,  652,  637,  638,  654,   87,  639,   87,   87,
       657,  658,   87,  655,   87,   87,   87,   87,   87,  659,
        87,  663,   87,  664,   87,  665,   87,  661,   87,   87,
@@ -1855,7 +1858,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
       670,  675,  668,  676,  669,   87,  677,   87,   87,  680,
       672,   87,  678,   87,  682,   87,  683,   87,   87,  679,
        87,   87,   87,   87,   87,  685,   87,   87,  689,  696,
-      687,   87,   87,  681,  684,   87,   87,  166,  691,  686,
+      687,   87,   87,  681,  684,   87,   87,  168,  691,  686,
 
       698,   87,   87,  688,  690,  692,   87,  693,  700,  694,
       697,  699,  695,   87,   87,  702,   87,   87,  701,   87,
@@ -1865,7 +1868,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
        87,  717,  713,  722,   87,   87,   87,   87,  719,   87,
       716,  721,   87,  723,   87,   87,  737,  725,   87,  724,
        87,  726,  736,  739,  744,  734,  727,  735,  728,   87,
-       87,  740,  164,  738,  729,  745,  730,   87,   87,  731,
+       87,  740,  166,  738,  729,  745,  730,   87,   87,  731,
       732,  741,   87,  742,   87,  747,  733,  743,  748,   87,
 
       750,  749,   87,   87,   87,  746,   87,  754,   87,  752,
@@ -1879,7 +1882,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
       792,   87,   87,   87,   87,  790,   87,  794,   87,   87,
        87,   87,  786,  798,  793,  797,   87,  795,   87,  799,
 
-      800,   87,   87,  796,  807,   87,  804,  801,  808,   87,
+      800,  164,   87,  796,  807,   87,  804,  801,  808,   87,
       802,  805,   87,  810,  803,  806,  809,   87,   87,   87,
       811,   87,  812,   87,  813,   87,  814,   87,   87,   87,
        87,  815,   87,   87,  820,  816,  819,   87,   87,  818,
@@ -1894,7 +1897,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
       858,   87,  859,  857,   87,   87,   87,   87,  863,  862,
        87,  864,   87,   87,   87,   87,   87,  871,   87,  867,
       861,  869,   87,  865,  860,   87,  868,   87,  866,   87,
-       87,  872,  874,   87,  870,   87,  875,   87,  181,  880,
+       87,  872,  874,   87,  870,   87,  875,   87,   87,  880,
       882,   87,  878,  876,  873,   87,  877,  879,   87,  883,
       884,   87,   87,   87,  881,   87,  886,  885,   87,   87,
       887,   87,   87,   87,  893,  895,  891,   87,  894,  888,
@@ -1910,12 +1913,12 @@ static yyconst flex_int16_t yy_nxt[7653] =
       929,  933,  930,  931,  932,   87,  938,  934,  942,  945,
       940,  939,   87,  944,   87,   87,  941,  943,   87,   87,
        87,   87,   87,   87,   87,   87,  952,   87,  947,   87,
-      948,   87,  946,   87,   87,  962,  179,   87,  949,  954,
+      948,   87,  946,   87,   87,  962,  181,   87,  949,  954,
 
       951,  950,  953,  955,   87,  956,  957,  961,  958,  960,
       959,   87,   87,   87,   87,  963,  965,   87,   87,   87,
        87,   87,  968,   87,  966,   87,  964,   87,  967,   87,
-      972,  178,  973,  971,  969,   87,  974,   87,  970,   87,
+      972,  179,  973,  971,  969,   87,  974,   87,  970,   87,
       976,   87,  977,  978,   87,  975,  979,   87,   87,   87,
       980,   87,   87,  985,  987,  173,  982,  983,  981,   87,
       986,  984,   87,   87,   87,   87,  988,  991,  992,   87,
@@ -1924,7 +1927,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
        87,  994,   87,   87,   87,   87, 1006, 1010,   87, 1011,
 
        87, 1002, 1007,   87, 1004,   87, 1012, 1013,   87, 1005,
-       87,   87,   87, 1009, 1025,   87,   87,   87, 1008,  173,
+       87,   87,   87, 1009, 1025,   87,   87,   87, 1008,  178,
        87,   87,   87,   87,   87, 1027, 1014, 1024, 1028, 1030,
      1031, 1016, 1026,   87,   87, 1015,   87, 1033, 1017,   87,
      1032, 1018, 1029,   87, 1034, 1019,   87, 1035, 1020,   87,
@@ -1932,7 +1935,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
        87,   87,   87, 1038,   87, 1050,   87,   87, 1053,   87,
      1055, 1039,   87, 1041, 1042, 1051, 1043, 1049,   87, 1044,
      1052,   87,   87, 1057, 1045, 1054, 1056, 1059, 1058,   87,
-     1046, 1047, 1061, 1048,   87, 1063, 1060, 1062,   87,  171,
+     1046, 1047, 1061, 1048,   87, 1063, 1060, 1062,   87,  173,
 
      1064,   87,   87, 1066, 1067, 1065,   87,   87, 1069,   87,
        87, 1068,   87, 1071, 1070, 1073,   87, 1072,   87,   87,
@@ -1959,7 +1962,7 @@ static yyconst flex_int16_t yy_nxt[7653] =
      1163,   87,   87,   87, 1166,   87, 1171,   87, 1165, 1168,
      1170,   87,   87,   87,   87,   87, 1169,   87,   87, 1182,
        87, 1174, 1172, 1176,   87,   87, 1183,   87,   87, 1185,
-       87, 1173,   87, 1175, 1177,   87,   87, 1179,  169, 1178,
+       87, 1173,   87, 1175, 1177,   87,   87, 1179,  171, 1178,
      1180, 1184, 1186, 1188, 1181, 1189,   87,   87,   87,   87,
      1187,   87, 1190,   87,   87, 1191,   87, 1196, 1192, 1194,
        87, 1197,   87, 1198, 1202, 1199, 1193,   87, 1195,   87,
@@ -1971,605 +1974,607 @@ static yyconst flex_int16_t yy_nxt[7653] =
        87, 1217, 1220,   87,   87, 1235, 1222, 1224, 1234,   87,
      1225,   87,   87, 1236,   87, 1221, 1238,   87, 1226,   87,
        87, 1227,   87, 1240, 1241, 1228, 1237, 1229,   87,   87,
-       87, 1230, 1305, 1231, 1242, 1243,   87, 1239, 1232,   87,
+       87, 1230, 1306, 1231, 1242, 1243,   87, 1239, 1232,   87,
      1247, 1245, 1244, 1233, 1246, 1248,   87,   87, 1249,   87,
-       87,   87,   87, 1251,   87,   87,   87, 1254,   87, 1257,
-      168, 1250, 1256, 1259,   87, 1252, 1253, 1255,   87, 1258,
-       87,   87, 1261, 1263,   87, 1266, 1265, 1260, 1267, 1262,
-     1264,   87, 1268,   87,   87, 1269, 1270,   87,   87,   87,
-
-       87,   87,   87,   87,   87,   87, 1282,   87,   87,   87,
-     1285, 1281, 1286, 1287,   87,   87,   87, 1272, 1283, 1271,
-     1284, 1273,   87, 1274,   87,   87,  166,   87, 1275, 1288,
-     1276, 1294, 1289, 1291,   87,   87, 1277,   87, 1290, 1295,
-       87, 1278, 1279, 1293, 1292,   87,   87, 1296, 1280,   87,
-     1301,   87,   87,   87, 1304,   87, 1302,   87, 1297,   87,
-       87, 1298, 1307, 1309, 1299,   87,   87, 1300,   87,   87,
-     1310,   87, 1308, 1303, 1306,   87, 1315, 1312,   87,   87,
-     1313,   87,   87,   87,   87, 1311, 1318, 1316,   87,   87,
-     1321, 1314,   87,   87,   87,   87,   87,   87, 1317,   87,
-
-     1326, 1324, 1320, 1319, 1322, 1323, 1325, 1328,   87,   87,
-     1330,   87, 1327,   87, 1334, 1329, 1333,   87,   87,   87,
-       87,   87,   87,   87,   87,   87, 1339, 1340, 1331, 1341,
-     1342,   87, 1336, 1345, 1332,   87, 1335, 1337, 1338,   87,
-     1343,   87, 1344, 1346, 1347,   87,   87,   87, 1351,   87,
-       87,   87, 1353, 1352,   87, 1354,   87,   87,   87, 1349,
-     1348, 1356,   87, 1350,   87, 1355,   87,   87,   87, 1364,
-     1357, 1360,   87, 1366,   87,   87,   87, 1358, 1359,   87,
-     1362, 1368,   87, 1363, 1361,   87, 1370,   87,   87, 1367,
-     1371,   87, 1365,   87,   87,   87, 1369,   87, 1373, 1374,
-
-       87,   87, 1377,   87, 1376, 1378,   87, 1375,   87, 1372,
-       87, 1384, 1380, 1379, 1382, 1385,   87,   87,   87, 1381,
-       87,   87,   87, 1389, 1388,   87,   87, 1386,   87,   87,
-     1395, 1383, 1393,   87, 1396, 1397,   87,   87, 1387,   87,
-       87,   87, 1398, 1390, 1399, 1391, 1394, 1400, 1392,   87,
-     1402,   87,   87,   87, 1401,   87,   87, 1403, 1406,   87,
-       87, 1408,   87,   87,   87, 1407,   87,   87, 1409, 1404,
-       87, 1411, 1410,   87,   87, 1405, 1414, 1415,   87,   87,
-       87,   87,   87, 1417,   87, 1412, 1421,   87, 1422, 1413,
-     1416,   87,   87, 1419,   87,   87, 1424,   87, 1418, 1423,
-
-       87, 1420, 1425,   87, 1430,   87, 1426,   87,   87, 1427,
-       87,   87, 1428,   87,   87, 1429, 1432,   87, 1437,   87,
-       87,  173, 1438, 1431,   87, 1439, 1436,   87,   87, 1433,
-       87,   87, 1435, 1440,   87, 1445, 1434,   87, 1442, 1448,
-       87, 1441, 1443, 1444,   87, 1450, 1446, 1451,   87, 1447,
-       87,   87,   87,   87,   87,   87, 1452, 1456,   87, 1455,
-       87,   87,   87, 1457, 1449, 1453,   87, 1460, 1454,   87,
-       87,   87,   87, 1463, 1458, 1459,   87,   87, 1464, 1467,
-       87, 1461,   87,   87,   87,   87, 1469, 1465, 1462,   87,
-       87, 1468, 1470,   87,   87, 1466, 1473, 1479,   87, 1475,
-
-     1472,   87, 1471,   87, 1480, 1483, 1481,   87, 1476, 1474,
-     1477, 1482,   87, 1478,   87,   87,   87, 1485,   87,   87,
-       87, 1484, 1492,   87, 1489, 1488,   87,   87,   87,   87,
-       87, 1493, 1497,   87, 1486, 1491, 1487,   87,   87, 1490,
-     1495, 1494, 1498, 1499,   87,   87,   87,   87,   87, 1496,
-     1501, 1502,   87,   87,   87, 1503,   87, 1507,   87,   87,
-       87,   87,   87, 1504, 1500, 1510, 1508, 1505,   87,   87,
-     1518, 1509, 1506, 1511, 1515,   87,   87,   87, 1512,   87,
-     1514, 1513,   87,   87, 1516,   87, 1517,   87,   87,   87,
-       87, 1521,   87,   87,   87, 1528, 1530, 1519, 1522, 1520,
-
-     1524,   87,   87,   87, 1523, 1527, 1525,   87, 1531,   87,
-     1535,   87, 1529,   87, 1526, 1533, 1536, 1532, 1538,   87,
-       87,   87,   87, 1539,   87, 1537,   87, 1543,   87, 1534,
-     1552, 1553,   87, 1554, 1541, 1542,   87,   87, 1540,   87,
-     1544, 1551,   87, 1558, 1545,   87, 1556, 1546, 1547,   87,
-     1555,   87, 1548,   87,   87,  164,   87, 1562, 1549, 1559,
-     1557, 1560, 1550,   87, 1561,   87, 1563,   87,   87, 1568,
-     1564, 1569, 1565, 1566,   87,   87,   87,   87,   87, 1570,
-       87,   87,   87, 1571, 1576, 1573, 1567,   87, 1578,   87,
-       87,   87,   87, 1577,   87, 1574, 1579,   87, 1572,   87,
-
-     1575, 1580, 1581,   87,   87,   87, 1588,   87, 1582, 1587,
-       87, 1589,   87, 1583, 1592, 1584, 1593, 1585,   87, 1586,
-     1590, 1591, 1594,   87,   87, 1595, 1598,   87,   87,   87,
-       87, 1599,   87, 1597,   87, 1603, 1596, 1600, 1601,   87,
-       87,   87,   87,   87, 1610, 1609,   87,   87, 1604, 1602,
-     1605,   87,   87,   87, 1612,   87, 1608,   87, 1606, 1607,
-     1614, 1613,   87,   87, 1611,   87, 1616, 1615,   87, 1617,
-     1621,   87,   87, 1620, 1623,   87,   87,   87, 1625,   87,
-       87, 1618, 1624, 1626, 1627,   87,   87, 1622, 1630,   87,
-     1619,   87, 1632,   87,   87, 1629,   87, 1633,   87, 1634,
-
-       87,   87, 1638,   87, 1628,   87,   87,   87,   87, 1643,
-     1641, 1631,   87,   87,   87,   87, 1646, 1644,   87, 1635,
-       87, 1636, 1637, 1640,   87, 1639,   87, 1645, 1642, 1648,
-       87, 1647,   87,   87,   87, 1649,   87, 1650, 1651, 1653,
-     1654, 1655,   87,   87, 1652, 1656,   87, 1658, 1657,   87,
-       87,   87,   87,   87, 1659, 1664, 1665, 1661,   87, 1662,
-       87,   87,   87, 1666, 1668, 1667, 1663,   87, 1660,   87,
-       87,   87, 1672,   87,   87,   87, 1669,   87,   87,   87,
-       87,  173, 1671, 1675,   87, 1681, 1682, 1677, 1670,   87,
-       87,   87,   87,   87, 1673, 1674, 1678, 1676, 1685, 1683,
-
-     1679, 1684,   87, 1686,   87,   87, 1691, 1680,   87, 1687,
-     1690,   87,   87,   87,   87,   87, 1688,   87, 1696,   87,
-       87,   87, 1689, 1693,   87,   87, 1700, 1694, 1692, 1702,
-       87,   87, 1695,   87,   87, 1697, 1704,   87, 1699,   87,
-     1708,   87, 1701,   87, 1698, 1709,   87, 1707, 1703,   87,
-     1711, 1706, 1705,   87,   87,   87,   87, 1710, 1714,   87,
-       87, 1712, 1720, 1713, 1717, 1719,   87, 1718, 1722, 1715,
-       87,   87, 1716, 1725,   87, 1723,   87,   87, 1726,   87,
-     1721, 1724,   87,   87,   87,   87,   87,   87, 1730, 1731,
-     1732,   87,   87,   87,   87, 1727, 1735,   87,   87, 1740,
-
-     1729,   87,   87, 1728, 1733, 1741,   87, 1734, 1737,   87,
-     1744, 1738, 1736,   87,   87, 1739,   87,   87,   87,   87,
-     1742, 1745,   87,   87,   87, 1743,   87,   87,   87, 1746,
-       87, 1748, 1752, 1747, 1749, 1753,   87, 1750, 1756, 1757,
-       87, 1754, 1751,   87, 1755,   87, 1759,   87, 1764, 1758,
-     1762,   87, 1763, 1765,   87,   87, 1761,   87, 1760,   87,
-       87, 1767, 1768,   87,   87,   87,   87, 3904, 1773, 1766,
-     1769, 1772, 1774, 1770,   87, 1775,   87, 1776,   87,   87,
-     1777,   87, 1780,   87,   87,   87, 1771,   87, 1781,   87,
-       87,   87,   87,   87, 1782,   87, 1788,   87,   87, 1778,
-
-     1787, 1779, 1784, 1785,   87, 1783, 1786,   87, 1794, 1791,
-       87, 1792, 1789, 1795,   87, 1790, 1796, 1793,   87,   87,
-       87, 1797,   87, 1798,   87, 1800,   87,   87,   87,   87,
-     1799,   87, 1804,   87, 1808, 1803, 1809, 1801,   87, 1802,
-       87,   87,   87,   87, 1814,   87,   87, 1805, 1817, 1806,
-       87, 1807, 1816,   87,   87,   87, 1810, 1812,   87,   87,
-       87, 1811,   87,   87, 1815,   87,   87, 1819,   87, 1813,
-       87, 1827, 1818,   87, 1820,   87, 1828, 1824, 1821, 1822,
-       87, 1823,   87, 1826,   87, 1829, 1825, 1832,   87, 1833,
-       87,   87, 1831,   87, 1830, 1836, 1834, 1835,   87, 1837,
-
-       87,   87,   87,   87, 1840,   87, 1844, 1838, 1841,   87,
-     1845,   87,   87, 1839, 1849,   87,   87,   87,   87, 1843,
-     1851, 1842, 1850,   87, 1846,   87,   87,   87, 1848, 1853,
-     1854, 1847, 1855, 1852,   87,   87,   87,   87, 1856, 1857,
-       87, 1862,   87, 1858,   87, 1861, 1865,   87,   87, 1860,
-     1863,   87,   87, 1867,   87, 1859,   87, 1868, 1869,   87,
-     1864, 1871,   87,   87,   87, 1866, 1872, 1873,   87,   87,
-       87,   87,   87,   87, 1870, 1874, 1877,   87,   87,   87,
-     1882, 1880,   87,   87,   87, 1875, 1876,   87,   87, 1888,
-       87, 1889, 1878, 1886,   87,   87,   87, 1879, 1881, 1883,
-
-       87, 1887, 1885, 1884,   87, 1890,   87,   87, 1895,   87,
-       87,   87, 1891, 1900,   87, 1892, 1898,   87,   87,   87,
-       87, 1903, 1901, 1896,   87,   87, 1894,   87, 1897, 1893,
-       87,   87, 1899,   87, 1907,   87, 1910,   87, 1906, 1902,
-     1909,   87, 1911,  173, 1905,   87, 1904, 1912,   87,   87,
-     1908,   87, 1913,   87, 1914,   87, 1915,   87, 1922, 1916,
-       87,   87, 1924, 1917,   87,   87,   87, 1918,   87, 1923,
-     1925, 1921,   87, 1927, 1919, 1920,   87, 1931,   87, 1929,
-       87,   87,   87,   87, 1926, 1935, 1928, 1933,   87, 1932,
-     1937, 1930,   87, 1936, 1939,   87,   87,   87, 1942,   87,
-
-       87, 1934, 1940,   87,   87,   87,   87,   87,   87, 1941,
-     1945, 1947, 1938, 1946,   87, 1949,   87, 1950,   87,   87,
-       87,   87, 1943, 1944, 1954,   87, 1955,   87,   87,   87,
-       87, 1962, 1948, 1951,   87, 1953, 1952,   87,   87, 1963,
-     1957, 1959,   87,   87, 1960, 1956, 1964,   87,   87, 1958,
-       87, 1966, 1967, 1969, 1972, 1968, 1961, 1970,   87, 1973,
-       87,   87, 1965,   87, 1975,   87, 1974,   87, 1976, 1977,
-       87,   87, 1971,   87,   87,   87, 1978,   87,   87, 1984,
-     1985, 1983, 1986, 1979,   87,   87,   87,   87,   87, 1987,
-     1988, 1980,   87, 1981,   87,   87,   87, 1982,   87, 1990,
-
-     1991,   87,   87, 1992,   87,   87,   87,   87,   87,   87,
-     1989,   87, 1994, 1993,   87,   87, 3904, 1995, 2003,   87,
-     1998, 1999, 2000, 1996,   87, 1997, 2004, 2001,   87,   87,
-       87, 2007, 2010,   87, 2005, 2006, 2002,   87,   87,   87,
-       87, 2008,   87, 2009,   87, 2015,   87, 2017,   87,   87,
-     2019,   87,   87, 2011, 2014, 2012,   87, 2013, 2018,   87,
-     2022, 2021,   87, 2016, 2020,   87, 2023, 2024,   87,   87,
-       87,   87,   87, 2025,   87,   87,   87, 2028, 2030,   87,
-       87, 2031,   87, 2038, 2032, 2029, 2026, 2027, 2039,   87,
-     2033, 2034,   87, 2036, 2040,   87, 2035,   87,   87,   87,
-
-     2042, 2043, 2044,   87, 2037, 2045,   87,   87,   87, 2041,
-       87, 2047, 2048, 2049,   87,   87,   87,   87, 2046, 2051,
-       87,   87,   87, 2061,   87, 2060, 2054,   87,   87, 2050,
-     2056,   87, 2053, 2057, 2052, 2062, 2059,   87,   87, 2055,
-       87,   87, 2068,   87,   87,   87, 2058, 2069,   87, 2070,
-       87, 2064,   87,   87, 3904, 2066,   87, 2063, 2065, 2067,
-       87, 2074, 2071,   87,   87, 2077, 2075,   87, 2076, 2084,
-     2072, 2073,   87, 2078,   87, 2080, 2082, 2079,   87, 2083,
-       87, 2085,   87,   87,   87, 2089,   87,   87,   87, 2081,
-     2090,   87,   87, 2094, 2096,   87, 2086,   87, 2091,   87,
-
-       87, 2088, 2092, 2087, 2098,   87, 2095,   87, 2093, 2099,
-     2102, 2101, 2100, 2097,   87,   87,   87,   87,   87, 2104,
-     2103, 2107,   87, 2111,   87,   87,   87,   87, 2109,   87,
-       87,   87, 2106,   87, 2110, 2108, 3904, 2105, 2112,   87,
-       87, 2116,   87, 2113, 2117, 2114,   87,   87,   87, 2118,
-     2115,   87, 2124,   87, 2126, 2119, 2120, 2127,   87, 2121,
-       87, 2128, 2122,   87,   87, 2123, 2130,   87,   87,   87,
-       87, 2134,   87,   87, 2125, 2136,   87, 2129,   87,   87,
-       87,   87, 2140,   87,   87,   87, 2135, 2132, 2131, 2133,
-     2143,   87,   87, 3904, 2138, 2142,   87, 2139, 2137,   87,
-
-     2141, 2145,   87,   87, 2144,   87, 2149, 2146, 2147,   87,
-       87,  173,   87, 2153,   87, 2148, 2151, 2150, 2152, 2156,
-       87,   87,   87, 2154, 2160,   87,   87, 2155,   87,   87,
-       87, 2161,   87, 2157, 2158,   87, 2163, 2165,   87,   87,
-     2159,   87, 2162,   87, 2164, 2171,   87, 2166,   87, 2167,
-       87,   87, 2175,   87,   87,   87, 2174, 2176, 2172, 2168,
-     2169, 2178,   87, 2170,   87, 2180, 2173,   87,   87, 2179,
-     2183,   87, 2184,   87,   87, 2177,   87, 2182,   87,   87,
-     2186,   87, 2181,   87, 2187,   87, 2185,   87,   87,   87,
-       87,   87, 2192,   87, 2193,   87,   87,   87,   87, 2188,
-
-     2194, 2197, 2195, 2190, 2198, 2189, 2191,   87, 2196,   87,
-       87,   87, 2201, 2208, 2203, 2205,   87, 2199, 2200, 2202,
-     2206,   87,   87,   87,   87, 2204,   87,   87,   87, 2213,
-       87,   87, 2207,   87, 2216, 2217,   87, 2218,   87, 2211,
-     2209, 2210, 2220,   87, 2212, 2214,   87, 2215, 2219,   87,
-     2221, 2222,   87, 2225,   87,   87, 2227,   87, 2229, 2226,
-     2228,   87,   87, 2231,   87,   87,   87, 2223,   87,   87,
-       87, 2233,   87, 2224,   87, 2235, 2236,   87,   87, 2230,
-     2239,   87,   87, 2238,   87, 2244,   87,   87, 2232, 2240,
-     2237, 2242, 2243, 2234,   87, 2246,   87,   87,   87, 2245,
-
-       87,   87,   87, 2241,   87, 2254,   87,   87, 2247, 2248,
-     2249,   87, 2258, 2257,   87, 2250, 2252, 2251,   87,   87,
-     2253, 2259, 2255,   87, 2256, 2263, 2260,   87, 2261,   87,
-     2264, 2266,   87, 2262,   87,   87,   87,   87, 2270,   87,
-       87, 2267,   87, 2272, 2265,   87,   87, 2275, 2276,   87,
-     2277,   87,   87,   87, 2268,   87, 2269, 2279,   87,   87,
-     2273,   87, 2271, 2284, 2281,   87,   87, 2274, 2282,   87,
-       87,   87, 2278, 2288,   87,   87,   87,   87, 2280,   87,
-     2287,   87, 2283, 2291, 2285,   87, 2286, 3904, 2292,   87,
-     2290, 2298, 2289,   87, 2294, 2295,   87,   87,   87,   87,
-
-     2300, 2297, 2303, 2293, 2299, 2302,   87, 2296,   87, 2301,
-       87,   87, 2304, 2306, 2307,   87,   87,   87,   87,   87,
-       87, 2308,   87,   87,   87,   87, 2309, 2313, 2315,   87,
-     2305,   87, 2319, 2310,   87, 2314,   87, 2318,   87, 2321,
-     2311, 2312,   87,   87,   87,   87, 2320, 2316, 2324,   87,
-       87,   87, 2329,   87,   87,   87, 2328, 2317, 2323,   87,
-       87,   87, 2322, 2334, 2325,   87, 2335,   87,   87, 2326,
-     2338,   87, 2327, 2336, 2331, 2332,   87, 2337, 2330,   87,
-     2333,   87,   87, 2340,   87, 2339, 2343,   87,   87,   87,
-       87,   87, 2341,   87, 2347, 2351,   87, 2342, 2345,   87,
-
-       87,   87,   87, 2344, 2354,   87, 2358, 2346, 2356,   87,
-     2348, 2349,   87, 2350, 2352, 2353,   87, 2357, 2355,   87,
-       87, 2359,   87, 2364,   87, 2365,   87, 2363, 2366,   87,
-     2360, 2368, 2369, 2367,   87, 2361,   87,   87,   87,   87,
-     2362, 2371, 2373,   87,   87,   87,   87, 2375,   87,   87,
-     2377, 2372, 2379,   87, 2381, 2370, 2374, 2376,   87,   87,
-       87,   87, 2384,   87,   87,   87, 2383,  173,   87,   87,
-       87, 2378, 2387,   87, 2382, 2380, 2392,   87, 2391,   87,
-     2388, 2389, 2393, 2385,   87, 2386,   87, 2394,   87, 2390,
-     2395,   87,   87, 2396, 2397,   87, 2398, 2401,   87, 2399,
-
-       87,   87,   87,   87, 2402, 2403,   87, 2404, 2400,   87,
-     2407,   87,   87,   87, 2406, 2405, 2408,   87,   87,   87,
-     2412, 2409,   87,   87,   87, 2416,   87,   87,   87, 2415,
-     2411, 2420,   87, 2410, 2413, 2414, 2417, 2418,   87, 2421,
-       87,   87,   87, 2419,   87,   87,   87,   87, 2428,   87,
-     2426, 2423, 2427,   87,   87,   87,   87,   87,   87, 2433,
-       87, 2422, 2424,   87, 2425, 2430,   87, 2429,   87, 2432,
-     2434, 2431, 2436,   87, 2439, 2435,   87, 2437, 2441,   87,
-     2438,   87,   87, 2445,   87, 2440, 2443,   87,   87,   87,
-     2446,   87,   87,   87,   87, 2444, 2452,   87, 2454,   87,
-
-     2442, 2455,   87,   87, 2447, 2448, 2451, 2449, 2450,   87,
-       87, 2453, 2458,   87, 2460,   87,   87, 2456, 2459,   87,
-     2461,   87,   87, 2464,   87,   87,   87, 2457, 2463,   87,
-       87, 2466,   87, 2469,   87, 2465,   87, 2470,   87, 2462,
-       87,   87,   87,   87,   87, 2471, 2468, 2467,   87, 2475,
-     2473, 2472, 2474, 2476, 2480,   87,   87, 2478, 2479, 2481,
-       87,   87,   87,   87,   87, 2483, 2484, 2482, 2477, 2485,
-     2490,   87,   87, 2489,   87, 2487,   87, 2493,   87, 2488,
-     2491, 2494, 2486, 2496, 2492,   87,   87, 2497,   87,   87,
-       87,   87, 2495, 2499,   87,   87, 2500,   87,   87, 2501,
-
-     2505,   87, 2508, 2503, 2498,   87,   87, 2504,   87, 2502,
-       87,   87, 2510, 2512,   87,   87, 2506,   87,   87,   87,
-     2511, 2507, 2514, 2516,   87, 2509, 2515,   87,   87, 2521,
-       87,   87, 2517, 2518,   87,   87, 2522, 2513,   87, 2520,
-       87,   87, 2525, 2523,   87,   87, 2519, 2526,   87, 2527,
-     2524, 2531,   87, 2528, 2529,   87, 2530,   87, 2532,   87,
-     2534, 2536,   87,   87, 2538,   87, 2533,   87, 2537, 2540,
-       87, 2543,   87,   87,   87,   87,   87, 2545, 2541, 2535,
-       87, 2546,   87, 2539,   87, 2544, 2542,   87,   87, 2548,
-       87, 2547, 2549,   87, 2550, 2553, 2551, 2555,   87, 2552,
-
-       87,   87, 2556,   87,   87,   87,   87,   87,   87, 2554,
-     2557, 2562, 2559, 2558, 2560,   87,   87, 2561,   87,   87,
-     2563, 2564, 2568,   87, 2565, 2569,   87, 2567,   87,   87,
-       87,   87,   87,   87,   87, 2576, 2566, 2570,   87,   87,
-       87,   87,   87, 2577, 2571, 2572, 2574, 2580, 2575, 2582,
-     2578,   87,   87, 2573, 2579,   87, 2581, 2583, 2584,   87,
-       87, 2586,   87,   87, 2587, 2592,   87,   87, 2594,   87,
-       87, 2585, 2591,   87, 2588,   87, 2593,   87, 2589, 2597,
-       87,   87, 2598,   87, 2603,   87,  173, 2590, 2595, 2605,
-       87, 2607, 2596, 2599, 2606,   87, 2600,   87,   87, 2608,
-
-       87, 2609,   87, 2601, 2602,   87,   87,   87, 2604,   87,
-     2610, 2615,   87,   87, 2616,   87, 2620,   87,   87, 2621,
-     2611,   87,   87, 2624, 2619,   87, 2612, 2614, 2617,   87,
-     2613,   87,   87, 2622,   87, 2628,   87, 2627,   87, 2618,
-     2623, 2629,   87, 2630, 2631, 2626, 2625,   87,   87,   87,
-       87, 2632, 2634,   87,   87,   87, 2633,   87,   87, 2637,
-       87,   87,   87, 2640,   87,   87,   87, 2646,   87, 2635,
-     2639, 2644,   87,   87,   87,   87, 2642, 2647, 2636, 2641,
-     2638,   87, 2643,   87,   87,   87, 2645, 2648, 2649,   87,
-     2655, 2651, 2650, 2652,   87,   87, 2653, 2658,   87,   87,
-
-     2654,   87, 2656, 2659,   87,   87,   87,   87,   87,   87,
-       87, 2669, 2657, 2670,   87,   87,   87,   87, 2660,   87,
-     2661, 2667,   87, 2662,   87, 2717, 2665, 2672, 2663, 2666,
-     2664, 2668,   87,   87, 2675, 2676,   87, 2671, 2673, 2674,
-     2677,   87,   87,   87,   87,   87, 2679, 2678,   87, 2680,
-       87, 2684, 2685,   87,   87,   87, 2686, 2687,   87, 2682,
-       87, 2683,   87,   87, 3904,   87, 2691,   87, 2681, 2692,
-     2688, 2693,   87,   87, 2694, 2689, 2690, 2695,   87, 2696,
-       87, 2699,   87, 2700,   87,   87,   87, 2703,   87, 2697,
-     2701, 2702, 2698,   87, 2706,   87, 2707,   87,   87, 2709,
-
-       87,   87, 2711,   87,   87, 2705,   87,   87, 2704, 2713,
-     2714,   87, 2715,   87,   87,   87, 2718, 2708,   87, 2710,
-       87, 2712, 2720,   87, 2719,   87, 2724,   87, 2716,   87,
-     2723,   87, 2721, 2726,   87,   87,   87,   87,   87, 2722,
-     2728, 2730, 2729,   87, 2731, 2733,   87,   87, 2725, 2727,
-       87,   87, 2736,   87, 2739,   87, 2734, 2740,   87, 2732,
-       87,   87, 2735,   87,   87,   87, 2737, 2746,   87, 2745,
-       87,   87, 2738,   87,   87, 2742, 2748, 2749, 2741, 2744,
-       87,   87, 2751,   87, 2743, 2753,   87,   87,   87, 2747,
-     2755,   87,   87,   87, 2754, 2750, 2752,   87, 2761,   87,
-
-       87, 2756, 2763,   87,   87, 2767, 2757, 2759, 2762, 2758,
-       87,   87,   87, 2764,   87, 2768,   87, 2769,   87, 2760,
-       87, 2770,   87, 2771,   87,   87, 3904, 2773, 2765, 2772,
-     2766, 2775,   87,   87,   87,   87,   87, 2776, 2778, 2779,
-     2780, 2774, 2782, 2783,   87,   87, 2784, 2786,   87,   87,
-     2777, 2781,   87,   87,   87,   87,   87, 2787,   87, 2785,
-     2788, 2791,   87,   87,   87,   87,   87, 2790,   87, 2798,
-     2789, 2793, 2794, 2795, 2796,   87, 2792, 2799,   87,   87,
-     2797,   87, 2800,   87,   87, 2804, 2805,   87, 2801,   87,
-     2803, 2809,   87,   87, 2806,   87,   87, 2811, 2808, 2802,
-
-      173,   87, 2807,   87, 2810, 2812,   87, 2817,   87,   87,
-       87,   87,   87,   87,   87,   87,   87, 2822, 2821, 2815,
-     2819, 2813, 2816, 2814, 2818, 2820, 2823,   87,   87, 2824,
-     2825, 2827,   87,   87,   87, 2831,   87, 2828, 3904, 2826,
-     2832,   87, 2833,   87,   87, 2834, 2830, 2835,   87,   87,
-       87, 2838, 2836, 2829, 2839, 2837,   87,   87, 2841,   87,
-       87,   87,   87, 2843,   87, 2840,   87,   87,   87, 2847,
-       87, 2848,   87,   87, 3904, 2842, 2844,   87, 2850,   87,
-     2845, 2856,   87, 2851, 2849, 2852, 2846, 2853,   87,   87,
-       87,   87,   87,   87, 2854, 2855,   87, 2859, 2860,   87,
-
-     2857,   87,   87,   87,   87,   87, 2862,   87,   87, 2861,
-       87, 2867, 2858,   87, 2870, 2869,   87, 2872,   87, 2866,
-       87,   87, 2863, 2864, 2865,   87, 2873, 2871, 2868,   87,
-       87, 2874,   87, 2879,   87, 2877,   87, 2875,   87,   87,
-     2883, 2884,   87,   87, 2882,   87,   87,   87, 2876,   87,
-     2880, 2885, 2881, 2878,   87,   87, 2886, 2894, 2887, 2888,
-       87, 2890,   87,   87, 2892, 2891,   87,   87,   87, 2889,
-     2893, 2895,   87, 2897,   87, 2899,   87,   87, 2898, 2901,
-       87,   87, 2903,   87,   87,   87, 2902,   87, 2900,   87,
-       87,   87, 2896,   87, 2907,   87,   87, 2913,   87, 2905,
-
-     2911, 2912, 2904, 2906, 2914,   87, 2915,   87,   87, 2909,
-       87, 2917,   87,   87, 2910,   87, 2908,   87,   87,   87,
-     2920, 2922,   87,   87, 2918, 2925,   87, 2916,   87,   87,
-       87, 2923,   87, 3904, 2924, 2919, 2921, 2927, 2928, 2926,
-     2929, 2932,   87,   87,   87, 2931,   87, 2930,   87,   87,
-       87, 2933, 2934,   87, 2939, 2940,   87,   87,   87,   87,
-       87,   87, 2935, 2936, 2937, 2941, 2945, 2938, 2943,   87,
-       87, 2944, 2946,   87,   87, 2942,   87,   87,   87,   87,
-       87, 2950,   87, 2947, 2953, 3904, 2949, 2948, 2954,   87,
-     2956,   87, 2957,   87, 2959, 2955,   87, 2951, 2952, 2958,
-
-       87,   87,   87, 2960,   87, 2963,   87, 2962,   87, 2964,
-       87, 2965,   87,   87, 2961,   87,   87,   87, 2966, 2972,
-       87,   87, 2974,   87,   87, 2968, 2975,   87,   87, 2977,
-       87,   87, 2967, 2971,   87, 2969, 2978, 2970, 2979, 2976,
-     2973,   87,   87,   87,   87,   87, 2980, 2982, 2985,   87,
-     2987,   87,   87,   87, 2986,   87,   87,   87,   87,   87,
-       87, 2981,   87, 2983, 2984,  173,   87, 2993, 2990,   87,
-     2998, 2992, 2994, 2989,   87, 2999, 2996, 2997, 2988,   87,
-     2991, 2995,   87,   87, 3003,   87,   87, 3006,   87,   87,
-       87, 3005,   87, 3008, 3000,   87, 3904, 3001,   87,   87,
-
-     3010, 3002,   87, 3011, 3012,   87, 3009, 3004, 3013,   87,
-       87, 3014, 3007,   87, 3015,   87, 3016, 3017,   87,   87,
-       87, 3019,   87,   87,   87,   87,   87,   87,   87, 3018,
-     3027,   87,   87, 3025, 3020,   87, 3031,   87,   87,   87,
-     3021, 3022, 3032, 3904, 3023, 3024, 3026, 3028,   87, 3029,
-     3030, 3033,   87, 3034, 3037,   87,   87, 3036,   87, 3035,
-     3039,   87,   87,   87,   87, 3038,   87,   87,   87,   87,
-       87, 3043,   87,   87, 3051,   87, 3040, 3049,   87, 3050,
-     3041, 3042, 3044,   87, 3045, 3047, 3046, 3052,   87, 3048,
-       87, 3056,   87, 3057,   87,   87, 3055, 3058, 3053,   87,
-
-       87, 3054,   87,   87,   87,   87, 3065,   87,   87,   87,
-     3064,   87,   87, 3059,   87, 3061,   87, 3060, 3063,   87,
-       87, 3062, 3073, 3069, 3072, 3070, 3074,   87, 3066, 3067,
-       87, 3068, 3075, 3076,   87,   87, 3071,   87,   87,   87,
-       87,   87,   87,   87,   87,   87, 3078, 3082, 3084,   87,
-       87, 3080,   87, 3089, 3077, 3090,   87, 3079,   87,   87,
-     3081, 3083, 3093,   87, 3085, 3087,   87,   87, 3086,   87,
-     3088,   87,   87, 3091,   87, 3096,   87, 3092, 3094,   87,
-     3099, 3095,   87, 3100, 3097, 3101,   87, 3098,   87, 3102,
-     3104,   87,   87,   87,   87, 3109,   87, 3103,   87,   87,
-
-       87, 3107,   87, 3112,   87, 3113, 3114,   87, 3105, 3111,
-     3110, 3106, 3116,   87, 3108,   87,   87,   87,   87,   87,
-     3117, 3115, 3122,   87,   87, 3118,   87, 3124,   87,   87,
-     3120, 3127,   87, 3119,   87,   87,   87, 3125,   87, 3121,
-     3161,   87,   87,   87,   87, 3123,   87, 3128, 3129, 3130,
-     3131, 3126, 3132, 3133, 3134,   87,   87, 3136, 3135, 3137,
-       87, 3138,   87,   87,   87,   87,   87, 3139,   87, 3141,
-       87,   87,   87, 3142,   87,   87, 3145, 3140,   87, 3144,
-     3147, 3150,   87, 3148,   87, 3143, 3146, 3149, 3151,   87,
-       87,   87,   87, 3155,   87, 3152, 3154, 3156,  173, 3153,
-
-       87, 3157,   87,   87,   87, 3158, 3904,   87, 3162, 3163,
-     3159,   87, 3165,   87,   87, 3168,   87, 3169,   87, 3167,
-     3160, 3164,   87, 3171,   87, 3173,   87,   87, 3166, 3172,
-     3174,   87, 3175,   87,   87, 3170, 3178,   87, 3176,   87,
-       87, 3179,   87,   87, 3180,   87,   87,   87, 3177, 3181,
-     3185, 3186, 3187, 3183,   87,   87,   87,   87, 3182, 3189,
-       87,   87, 3190,   87, 3192,   87, 3188, 3184, 3191,   87,
-       87,   87,   87,   87, 3194, 3195, 3196, 3193,   87,   87,
-       87, 3201,   87,   87,   87,   87, 3198, 3199, 3200, 3203,
-     3197, 3202,   87, 3206,   87,   87,   87, 3204,   87,   87,
-
-     3207, 3205,   87, 3208, 3212,   87,   87,   87, 3217, 3213,
-       87,   87,   87,   87,   87, 3209, 3210, 3211,   87, 3215,
-     3216,   87, 3219, 3221,   87, 3214,   87, 3218,   87, 3220,
-     3226,   87, 3225,   87, 3228, 3229, 3223, 3222,   87, 3232,
-       87,   87,   87, 3233,   87,   87, 3224,   87,   87,   87,
-       87,   87,   87,   87, 3236, 3234, 3239, 3230, 3227, 3237,
-     3231,   87,   87,   87, 3238, 3241, 3240, 3243, 3244,   87,
-     3242,   87,   87, 3235,   87, 3246, 3248,   87,   87, 3250,
-       87, 3251,   87, 3252,   87,   87, 3245,   87,   87, 3253,
-     3247,   87, 3254, 3256,   87,   87,   87, 3255, 3260,   87,
-
-     3258, 3249,   87, 3261,   87,   87,   87, 3904, 3259,   87,
-     3266, 3257, 3267,   87, 3262, 3268,   87, 3269,   87, 3263,
-       87,   87,   87, 3270,   87, 3264, 3265, 3273,   87,   87,
-     3276,   87,   87, 3277, 3271, 3272, 3278,   87,   87, 3280,
-       87,   87, 3274,   87,   87, 3284, 3285,   87,   87, 3275,
-     3287,   87, 3286, 3279, 3281, 3288,   87,   87, 3283, 3290,
-     3289, 3282,   87, 3292,   87,   87,   87, 3291, 3293,   87,
-       87,   87, 3298, 3299, 3300,   87,   87, 3297,   87,   87,
-       87,   87, 3303,   87,   87, 3302, 3295, 3294,   87, 3304,
-     3296,   87,   87,   87, 3306, 3308, 3305,   87, 3309,   87,
-
-     3301, 3307,   87,   87, 3312,   87, 3316,   87,   87,   87,
-     3310, 3311,   87,   87, 3328,   87, 3318,   87,   87, 3315,
-     3313, 3904, 3317, 3314, 3319, 3322, 3320, 3323, 3321, 3325,
-       87, 3329, 3324,   87, 3326,   87,   87, 3327,   87, 3330,
-       87, 3331,   87, 3332,   87, 3333,   87,   87,   87,   87,
-       87, 3335, 3334,   87,   87,   87,   87,   87, 3338, 3340,
-     3342,   87,   87,   87, 3339, 3343, 3349, 3336, 3347,   87,
-     3348,   87, 3341,   87, 3337, 3351,   87, 3344,   87,   87,
-       87, 3345, 3346,   87, 3352, 3353, 3355,   87, 3350,   87,
-     3356, 3357,   87,   87, 3358, 3359,   87, 3354,   87, 3362,
-
-       87,   87, 3360,   87,   87, 3366,   87, 3361, 3367,   87,
-     3363,   87, 3364,   87,   87, 3368,   87,   87,   87, 3374,
-       87,   87, 3365, 3369, 3375,   87,   87, 3371,   87, 3377,
-     3378,   87, 3370, 3372, 3376,   87, 3380, 3373, 3381,   87,
-     3383,   87,   87, 3379,   87,   87, 3387,   87,   87, 3382,
-     3388,   87, 3390,   87,   87,   87, 3384, 3389,   87,   87,
-     3393,   87,   87, 3386, 3396, 3391,   87,   87, 3394, 3385,
-       87,   87, 3399,   87, 3397,   87, 3400,   87, 3401, 3392,
-     3403, 3395, 3402,   87,   87,   87,   87, 3398,   87, 3408,
-     3410,   87, 3409, 3411,   87, 3405,   87, 3404, 3406,   87,
-
-     3407, 3412,   87,   87,   87, 3413,   87,   87, 3419, 3418,
-       87,   87, 3422,   87,   87, 3420, 3421,   87,   87, 3414,
-       87,   87,   87, 3415,   87, 3416, 3417, 3426, 3428,   87,
-     3424, 3430,   87, 3431,   87, 3423,   87,   87,   87, 3427,
-       87, 3425, 3432, 3433,   87, 3434,   87,   87,   87, 3429,
-     3439,   87,   87,   87,   87, 3435,   87, 3444,   87,   87,
-     3438, 3436, 3437, 3443,   87, 3440, 3441, 3442,   87, 3448,
-       87,   87, 3445,   87, 3451,   87, 3447, 3446,   87,   87,
-     3455,   87, 3456,   87, 3452,   87,   87, 3458,   87,   87,
-     3449, 3450, 3459,   87, 3461,   87, 3453, 3462,   87,   87,
-
-     3460, 3463,   87,   87, 3457, 3454, 3465,   87, 3468,   87,
-     3464, 3466,   87, 3471,   87, 3467,   87, 3470,   87,   87,
-     3474, 3476,   87,   87,   87, 3469,   87, 3473,   87, 3478,
-       87,   87,   87, 3482,   87, 3483, 3472, 3479, 3485,   87,
-       87,   87, 3475, 3477,   87, 3486,   87, 3489,   87, 3480,
-     3481, 3484, 3490,   87,   87,   87, 3493,   87,   87,   87,
-       87, 3487, 3498,   87,   87,   87,   87, 3496,   87, 3491,
-     3495, 3503, 3488, 3502,   87, 3492, 3494, 3500, 3504,   87,
-     3497,   87, 3499,   87, 3501,   87, 3506,   87, 3507,   87,
-     3508,   87,   87,   87, 3513,   87, 3505,   87, 3512, 3509,
-
-       87, 3514,   87,   87, 3516,   87, 3515, 3519,   87,   87,
-       87, 3510, 3511, 3517, 3518,   87, 3521, 3522,   87,   87,
-     3520, 3525,   87,   87,   87,   87, 3530,   87,   87,   87,
-     3528, 3526,   87, 3534,   87, 3523, 3524, 3904, 3529, 3535,
-       87, 3533, 3527, 3536,   87, 3532,   87, 3531,   87,   87,
-       87, 3537, 3540,   87, 3539, 3541,   87, 3542,   87, 3543,
-     3544,   87, 3538,   87,   87, 3547,   87,   87, 3549,   87,
-       87,   87, 3548, 3551,   87,   87, 3545, 3552,   87,   87,
-       87,   87, 3550,   87, 3558, 3559,   87,   87,   87, 3553,
-     3546,   87,   87,   87, 3565,   87,   87, 3554,   87, 3556,
-
-     3567, 3555, 3564, 3557, 3569, 3562,   87, 3561, 3566,   87,
-       87,   87, 3563, 3560,   87,   87, 3568,   87, 3904, 3572,
-     3573, 3575,   87, 3576,   87,   87, 3570,   87, 3579,   87,
-     3571,   87, 3577,   87,   87,   87, 3582,   87, 3574, 3578,
-       87, 3580,   87, 3581,   87, 3583, 3585,   87,   87, 3586,
-       87, 3584,   87, 3587,   87, 3589,   87,   87,   87,   87,
-     3590,   87, 3593,   87, 3591, 3594,   87, 3588,   87,   87,
-       87,   87, 3592,   87, 3606,   87, 3603, 3595, 3604, 3596,
-       87, 3597, 3904, 3605, 3598, 3599,   87, 3600, 3601, 3602,
-       87, 3607,   87, 3609,   87, 3608, 3611,   87, 3612,   87,
-
-       87, 3615,   87,   87, 3613, 3610,   87,   87, 3616, 3614,
-     3618,   87, 3620,   87, 3621, 3622,   87,   87, 3623, 3624,
-     3628,   87, 3619, 3625,   87, 3617, 3626, 3627,   87,   87,
-       87, 3631,   87, 3629,   87,   87, 3634,   87,   87, 3630,
-       87, 3635,   87,   87, 3639,   87,   87,   87, 3638, 3633,
-       87,   87, 3632,   87,   87, 3644,   87, 3904, 3636,   87,
-     3643,   87, 3637, 3645, 3640,   87,   87, 3641, 3648,   87,
-     3649, 3646, 3650,   87,   87, 3642, 3657, 3647, 3651,   87,
-     3652, 3653,   87, 3654,   87, 3655,   87,   87,   87, 3661,
-       87,   87, 3658, 3663, 3662,   87, 3656, 3659,   87,   87,
-
-     3660,   87,   87,   87, 3670,   87, 3665, 3667, 3668,   87,
-     3671,   87, 3673,   87,   87, 3664,   87, 3672,   87, 3666,
-     3669, 3674,   87, 3676, 3675, 3677,   87,   87, 3678, 3679,
-       87,   87, 3682,   87, 3683,   87, 3680, 3684,   87, 3685,
-       87, 3686,   87, 3687,   87, 3688,   87, 3689,   87, 3681,
-       87,   87, 3692,   87, 3693,   87,   87,   87,   87,   87,
-     3691, 3698,   87,   87,   87, 3694, 3700,   87,   87, 3695,
-       87,   87,   87, 3704, 3697,   87, 3690,   87, 3696, 3701,
-       87, 3702, 3699, 3703, 3706,   87,   87, 3705, 3708,   87,
-       87, 3709, 3707, 3711,   87, 3713, 3712,   87, 3710,   87,
-
-     3716,   87, 3715,   87,   87,   87,   87,   87,   87, 3718,
-       87,   87,   87, 3722,   87, 3714, 3724, 3717,   87, 3723,
-     3719,   87, 3726, 3720, 3721,   87, 3725,   87,   87,   87,
-     3729, 3730, 3732,   87, 3733,   87, 3734,   87, 3728,   87,
-     3727,   87, 3731, 3735,   87, 3738,   87,   87, 3737,   87,
-     3736, 3742,   87,   87,   87,   87,   87,   87, 3746, 3745,
-       87, 3748, 3740, 3741, 3744,   87, 3739,   87,   87,   87,
-     3747,   87,   87,   87,   87, 3743,   87,   87, 3749, 3757,
-       87, 3755,   87,   87, 3752,   87, 3750, 3751, 3754, 3756,
-     3760,   87, 3759, 3762,   87,   87, 3753, 3758,   87,   87,
-
-     3764, 3761,   87, 3763,   87, 3765, 3767,   87, 3768,   87,
-     3770,   87, 3769,   87,   87,   87, 3772, 3904, 3766, 3771,
-     3773,   87, 3774,   87, 3776,   87,   87, 3780, 3777,   87,
-       87, 3778, 3775, 3782, 3779,   87,   87,   87,   87,   87,
-     3786,   87, 3785, 3788,   87, 3781, 3789,   87, 3784, 3783,
-     3790,   87, 3791,   87,   87,   87, 3794,   87, 3787,   87,
-       87,   87,   87, 3799,   87,   87, 3800,   87,   87, 3792,
-     3796, 3803, 3804,   87, 3793, 3795, 3801,   87,   87,   87,
-     3798,   87,   87,   87,   87, 3797, 3802, 3805, 3808, 3809,
-       87,   87, 3806, 3810,   87, 3814,   87,   87,   87,   87,
-
-     3807,   87, 3816, 3811, 3812, 3813, 3818,   87,   87,   87,
-       87,   87,   87, 3815, 3825,   87, 3823, 3824,   87, 3817,
-       87, 3820, 3821,   87,   87,   87, 3819, 3830,   87, 3822,
-     3831, 3832,   87, 3829,   87, 3833, 3904,   87, 3826, 3828,
-       87, 3827,   87,   87, 3838, 3834,   87, 3835, 3836,   87,
-       87, 3837, 3839,   87, 3840, 3841,   87,   87,   87,   87,
-       87, 3843,   87, 3848, 3842,   87, 3845,   87,   87,   87,
-       87, 3851,   87, 3852, 3853,   87,   87, 3844,   87, 3846,
-     3850, 3847,   87, 3856, 3849, 3854,   87,   87, 3855,   87,
-     3860, 3857, 3861,   87,   87,   87,   87, 3865, 3863, 3859,
-
-       87, 3858,   87, 3867,   87, 3868, 3862,   87,   87,   87,
-     3872,   87, 3869, 3873,   87, 3870,   87,   87, 3875, 3866,
-       87, 3864, 3874, 3876,   87,   87,   87, 3877, 3871,   87,
-       87,   87, 3878,   87, 3880, 3882,   87,   87, 3884,   87,
-       87,   87, 3885,   87, 3888, 3879, 3889,   87,   87, 3881,
-     3883,   87, 3892, 3893,   87,   87, 3895,   87, 3886, 3887,
-     3890,   87, 3894, 3896,   87,   87,   87, 3891, 3897,   87,
-     3898, 3899,   87, 3902,   87, 3903,   87, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3900, 3904,
-     3904, 3901,   48,   48,   48,   48,   48,   48,   48,   53,
-
-       53,   53,   53,   53,   53,   53,   58,   58,   58,   58,
-       58,   58,   58,   64,   64,   64,   64,   64,   64,   64,
-       69,   69,   69,   69,   69,   69,   69,   75,   75,   75,
-       75,   75,   75,   75,   81,   81,   81,   81,   81,   81,
-       81,   90,   90, 3904,   90,   90,   90,   90,  163,  163,
-     3904, 3904, 3904,  163,  163,  165,  165, 3904, 3904,  165,
-     3904,  165,  167, 3904, 3904, 3904, 3904, 3904,  167,  170,
-      170, 3904, 3904, 3904,  170,  170,  172, 3904, 3904, 3904,
-     3904, 3904,  172,  174,  174, 3904,  174,  174,  174,  174,
-      177, 3904, 3904, 3904, 3904, 3904,  177,  180,  180, 3904,
-
-     3904, 3904,  180,  180,   91,   91, 3904,   91,   91,   91,
-       91,   17, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904
+       87,   87,   87, 1251,   87, 1254,   87, 1258,   87, 1255,
+       87, 1250, 1257, 1260,   87, 1252, 1253,   87,   87, 1256,
+     1259,   87, 1267, 1264, 1262,   87, 1263, 1265,   87, 1261,
+     1266, 1268, 1269,   87, 1270, 1271,   87,   87,   87,   87,
+
+       87,   87,   87,   87,   87,   87,   87, 1286, 1283,   87,
+       87,   87, 1282,   87, 1287,   87, 1285, 1273, 1272, 1284,
+     1274,   87, 1275, 1288, 1289, 1291,   87, 1276,   87, 1277,
+       87, 1295, 1292,   87,   87, 1278,   87,   87, 1296,   87,
+     1279, 1280, 1290,   87, 1294,   87, 1297, 1281,   87, 1293,
+     1302,   87, 1303,   87, 1298, 1299, 1305,   87,   87,   87,
+     1310, 1300,   87, 1301, 1308,   87,   87,   87,   87,   87,
+     1311, 1309,   87, 1304, 1316,   87, 1307, 1313, 1314,   87,
+       87,   87,   87,   87, 1317,   87, 1312, 1319, 1315,   87,
+     1322,   87,   87,   87,   87,   87,   87, 1321, 1318,   87,
+
+     1327, 1320, 1325, 1324, 1326, 1323, 1329,   87,   87, 1328,
+     1331,   87,   87, 1335,   87, 1330, 1334,   87,   87,   87,
+       87,   87,   87, 1340,   87,   87, 1341, 1332, 1337, 1342,
+     1343,   87,   87, 1333,   87, 1345, 1336, 1339, 1338, 1346,
+     1344, 1347,   87,   87,   87,   87,   87,   87, 1351, 1352,
+       87, 1348,   87, 1354, 1353,   87, 1355, 1350, 1349,   87,
+       87, 1356, 1357,   87, 1358,   87,   87,   87,   87, 1365,
+       87, 1367, 1361,   87,   87,   87,  169,   87,   87, 1360,
+     1359, 1363, 1364, 1369, 1362,   87,   87, 1371, 1368,   87,
+     1366,   87, 1372,   87,   87, 1373, 1374,   87, 1375, 1370,
+
+       87,   87,   87,   87,   87, 1378, 1377, 1379,   87, 1381,
+     1376,   87, 1385, 1380, 1383, 1386,   87,   87,   87,   87,
+     1382,   87,   87, 1390, 1389,   87, 1387,   87,   87,   87,
+       87,   87, 1384, 1394, 1396, 1397, 1399, 1388, 1398,   87,
+       87,   87, 1395, 1391,   87,   87, 1392, 1401, 1393,   87,
+     1400, 1403,   87,   87, 1402,   87, 1407,   87,   87, 1406,
+     1404,   87,   87, 1408, 1409,   87,   87,   87,   87,   87,
+     1405,   87,   87, 1412, 1415, 1410, 1411,   87,   87, 1413,
+     1416,   87,   87, 1417,   87, 1422, 1418, 1423, 1414,   87,
+       87,   87,   87,   87, 1420, 1425, 1419, 1426,   87,   87,
+
+       87,   87, 1431, 1421, 1424,   87,   87,   87,   87,   87,
+       87, 1427, 1429, 1428,   87,   87, 1433, 1438,   87, 1430,
+       87,   87, 1439, 1432, 1437, 1440, 1441, 1434,  173, 1436,
+       87,   87,   87,   87, 1435,   87,   87, 1446,   87, 1449,
+       87,   87,   87, 1451, 1443, 1445, 1444, 1447, 1442,   87,
+     1448, 1452,   87,   87,   87, 1459, 1450,   87, 1455, 1456,
+     1453,   87,   87, 1457,   87,   87,   87, 1458, 1454,   87,
+     1461,   87,   87,   87, 1464,   87, 1468,   87, 1460, 1465,
+       87, 1462,   87,   87,   87,   87, 1470,   87, 1463,   87,
+     1466,   87, 1467, 1471, 1469, 1474, 1482,   87,   87,   87,
+
+     1473, 1472, 1476, 1480,   87, 1481,   87, 1475, 1483,   87,
+       87, 1477, 1486, 1478,   87,   87, 1479, 1484, 1487, 1485,
+       87,   87,   87,   87,   87, 1494,   87, 1491,   87,   87,
+     1490,   87,   87, 1488, 1495,   87, 1493,  168, 1489, 1497,
+     1496,   87, 1492, 1499,   87,   87, 1500,   87,   87,   87,
+     1501, 1498, 1503, 1504,   87, 1502,   87, 1505,   87,   87,
+       87,   87,   87, 1509,   87,   87,   87,   87, 1512, 1506,
+       87, 1507, 1510, 1517, 1511,   87, 1513, 1508,   87,   87,
+       87, 1514, 1520,   87, 1516, 1518, 1515,   87,   87, 1519,
+       87,   87, 1523,   87, 1530, 1521,   87,   87, 1532, 1522,
+
+       87,   87, 1524, 1526,   87, 1528,   87,   87,   87, 1525,
+       87, 1529, 1527,   87,   87, 1535, 1533, 1531, 1538,   87,
+     1534,   87,   87,   87, 1540,   87, 1537, 1557, 1536, 1541,
+       87, 1539,   87, 1542, 1554, 1543, 1544,   87, 1545,   87,
+     1546,   87, 1556, 1555, 1547, 1553,   87, 1548, 1549,   87,
+     1558,   87, 1550, 1560,   87, 1563,   87,   87, 1551,   87,
+     1559, 1561, 1552,   87,   87, 1565,   87,   87, 1562, 1566,
+       87, 1567,   87, 1570, 1571, 1572,   87,   87, 1564,   87,
+       87,   87,   87,   87, 1578, 1573, 1575, 1568, 1569,   87,
+       87,   87, 1580,   87,   87, 1579, 1576, 1574,   87, 1581,
+
+       87, 1577,   87,   87, 1582, 1590, 1583,   87, 1589,   87,
+     1591, 1584, 1592, 1593,   87,   87, 1585,   87, 1586,   87,
+     1587, 1595, 1588,   87,   87, 1594, 1600, 1597,   87,   87,
+       87, 1601,   87, 1599, 1596,   87,   87, 1602, 1603,   87,
+     1605, 1598,   87,   87,   87, 1611,   87, 1612, 1607,   87,
+     1606,   87, 1604,   87,   87,   87,   87, 1614, 1610,   87,
+     1616, 1608, 1609,   87,   87, 1613, 1619,   87, 1615,   87,
+     1617,   87, 1618,   87, 1622, 1623,   87, 1625,   87,   87,
+       87,   87, 1620, 1627, 1626,   87, 1624,   87, 1628,   87,
+     1632,   87, 1621, 1633, 1629,   87, 1631, 1634,   87, 1630,
+
+       87, 1635,   87,   87,   87, 1640,   87, 1636,   87,   87,
+       87,   87, 1645, 1643,   87,   87, 1637, 1648,   87, 1646,
+       87,   87,   87,   87, 1638, 1639, 1642,   87, 1641, 1647,
+     1650, 1644,   87,   87,   87,   87, 1652, 1651, 1653, 1649,
+     1655,   87, 1656,   87, 1658,   87, 1654,   87, 1657,   87,
+     1659,   87, 1660,   87, 1661,   87,   87, 1666, 1667, 1663,
+       87,   87, 1664,   87,   87, 1662, 1668,   87, 1670, 1665,
+       87,   87, 1669,   87,   87, 1674,   87,   87,   87, 1671,
+     1675,   87,   87, 1677, 1673,  173,   87,   87, 1683, 1684,
+     1672,   87, 1679,   87,   87,   87,   87, 1676,   87, 1678,
+
+     1680, 1687, 1685,   87, 1686, 1688, 1681,   87, 1692, 1693,
+     1682, 1689, 1690,   87,   87,   87,   87,   87, 1691,   87,
+     1698,   87,   87,   87,   87,   87, 1695,   87, 1702,   87,
+     1696, 1704,   87, 1694, 1706, 1697,   87,   87,   87,   87,
+     1710, 1699, 1701, 1703,   87, 1711,   87, 1700,   87,   87,
+     1705, 1708, 1709, 1713,   87, 1707, 1712, 1714,   87,   87,
+       87,   87, 1715,   87, 1719, 1722, 1724, 1720,   87, 1716,
+     1721,   87,   87, 1717, 1723, 1726, 1718,   87,   87,   87,
+     1728,   87,   87,   87, 1725, 1729,   87, 1733, 1727,   87,
+       87,   87,   87,   87, 1734, 1735,   87, 1730, 1738, 1732,
+
+       87, 1736,   87,   87, 1743, 1731,   87,   87, 1747,   87,
+     1740, 1737, 1739, 1744,   87,   87,   87,   87, 1741,   87,
+     1742,   87,   87,   87, 1745,   87, 1746, 1748,   87,   87,
+     1755,   87, 1749, 1751, 1757, 1756, 1750, 1752, 1753,   87,
+     1754,   87,   87,   87, 1762,   87,   87,   87, 1767, 1758,
+       87, 1761, 1768, 1759,   87, 1764,   87, 1766,   87,   87,
+     1763,   87, 1760,   87, 1769,   87, 1770, 1765, 1771,   87,
+       87,  166,   87, 1776, 1777, 1773, 1772, 1775, 1778,   87,
+       87, 1786, 1774,   87,   87,   87, 1779,   87, 1780, 1783,
+       87,   87, 1785,   87,   87, 1784,   87,   87,   87, 1791,
+
+       87,   87,   87,   87, 1790, 1787, 1794, 1781, 1788, 1782,
+     1793, 1789,   87, 1797,   87,  164, 1799, 1795, 1798,   87,
+     1792, 1800,   87,   87,   87, 1803,   87, 1801,   87,   87,
+       87, 1796,   87,   87, 1802, 1807,   87, 1811, 1806,   87,
+       87,   87,   87,   87, 1812, 1804,   87, 1805,   87, 1817,
+       87, 1808,   87, 1809, 1810,   87, 1819, 1815, 1813, 1820,
+       87, 1814,   87,   87,   87,   87,   87, 1818,   87, 1822,
+       87, 1821, 1816,   87,   87, 1830,   87,   87,   87, 1831,
+       87, 1823, 1824, 1825, 1827, 1826, 1835,   87, 1829, 1828,
+     1836,   87, 1834,   87,   87,   87, 1832, 1833, 1837, 1838,
+
+       87,   87,   87,   87, 1843,   87,   87, 1839, 1844, 1847,
+     1841,   87,   87,   87,   87, 1840, 1842, 1848, 1852,   87,
+       87, 1845, 1854, 1846,   87, 1853, 1849,   87,   87, 1857,
+     1851,   87,   87, 1850,   87,   87, 1858,   87, 1859, 1855,
+     1856, 1860,   87,   87,   87, 1865, 1866,   87,   87, 1868,
+       87,   87, 1861, 1863,   87,   87,   87, 1871, 1872, 1870,
+     1862,   87,   87, 1864,   87, 1875, 1867, 1874,   87, 1876,
+       87, 1869,   87,   87,   87,   87,   87,   87, 1880,   87,
+       87, 1873,   87, 1885,   87,   87, 1883,   87, 1877, 1878,
+     1879,   87,   87,   87, 1892, 1891, 1889, 1881,   87, 1882,
+
+     1884,   87, 1886,   87, 1888, 1887, 1890, 1893,   87,   87,
+       87,   87, 1898,   87,   87,   87,   87, 1903,   87,   87,
+     1901, 1894,   87, 1895,   87, 1906, 1904, 1899,   87,   87,
+     1897, 1902, 1900,   87, 1896,   87,   87,   87,   87, 1905,
+     1910, 1916, 1912,   87, 1909, 1913,   87, 1914, 1908,  173,
+     1907,   87, 1915,   87, 1911,   87, 1917,   87,   87,   87,
+     1918,   87,   87,   87,   87, 1919,   87, 1927,   87, 1920,
+       87, 1921, 1926, 1924,   87, 1928,   87, 1922, 1923, 1930,
+       87,   87, 1929, 1932, 1931, 1935, 1925, 1933, 1934,   87,
+       87,   87,   87, 1938, 1940, 1936,   87, 1939, 1942,   87,
+
+       87, 1937,   87,   87,   87, 1945,   87, 1943,   87,   87,
+       87,   87,   87, 1944, 1948, 1950, 1941, 1949,   87, 1952,
+       87, 1953, 1946,   87,   87,   87,   87, 1947,   87, 1957,
+       87, 1958,   87,   87,   87,   87, 1951, 1954,   87, 1967,
+     1956, 1968, 1955, 1966, 1960,   87, 1959, 1965, 1962,   87,
+       87, 1963,   87, 1961,   87,   87, 1976, 1969,   87, 1970,
+     1971, 1973,   87, 1964, 1974,   87, 1977,   87,   87,   87,
+     1979,   87,   87, 1978,   87, 1980, 1981, 1972, 1975,   87,
+     1983,   87,   87,   87, 1982,   87, 1988, 1989, 1987, 1984,
+     1990, 1992,   87,   87,   87,   87,   87,   87,   87, 1991,
+
+     1985,   87,   87, 1986, 1995,   87, 1994, 1996,   87,   87,
+       87,   87,   87,   87,   87,   87, 1997,   87, 1993,   87,
+       87, 2007, 2008,   87, 1999,   87, 2002, 2003, 1998, 2000,
+       87, 2001, 2005, 2004,   87,   87,   87, 2010, 2013, 2014,
+     2006,   87, 2009,   87,   87,   87, 2011, 2012,   87,   87,
+     2021, 2019,   87, 2023,   87,   87, 2015, 2016, 2018,   87,
+       87, 2022,   87, 2017, 2025,   87, 2027,   87,   87, 2020,
+       87,   87, 2026,   87,   87, 2024,   87, 2028,   87,   87,
+     2032, 2029, 2035, 2034,   87, 2036,   87,   87, 2031, 2033,
+     2042,   87, 2030,   87, 2037, 2043,   87, 2040,   87, 2038,
+
+     2044,   87,   87, 2045, 2039, 2047, 2048,   87,   87,   87,
+       87, 2041, 2050,   87, 2051, 2052, 2046,   87,   87,   87,
+     2053, 2049,   87, 2055,   87,   87,   87,   87,   87, 2064,
+       87, 2058, 2065,   87, 2054,   87, 2060, 2063, 2056, 2061,
+     2057,   87,   87, 2068, 2059,   87,   87, 2072, 2066,   87,
+     2062,   87, 2073,   87,   87,   87, 2074,   87,   87, 2078,
+     2070,   87, 2067, 2069, 2079, 2071, 2075,   87,   87,   87,
+     2082,   87, 2084,   87, 2083, 2077,   87, 2081,   87, 2089,
+     2076, 2088, 2086, 2080,   87, 2087, 2085,   87,   87, 2093,
+       87,   87,   87,   87, 2094,   87,   87, 2100, 2098,   87,
+
+     2102,   87, 2090,   87, 2095, 2103, 2092, 2096, 2091,   87,
+     2099,   87,   87, 2097, 2104, 2106,   87, 2101,   87,   87,
+       87,   87, 2107, 2111,   87, 2115, 2105,   87,   87,   87,
+     2113,   87,   87,   87, 2110,   87, 2114, 2112, 2108, 2109,
+     2116,   87,   87,   87,   87,   87,   87, 2117, 2121, 2120,
+       87, 2122, 2118,   87, 2119, 2124, 2130, 2123, 2125, 2128,
+       87,   87,   87, 2131, 2126,   87,   87, 2127, 2132,   87,
+     2134,   87,   87,   87, 2133, 2138,   87, 2140,   87,   87,
+       87, 2129,   87,   87, 2144,   87, 2135,   87,   87,   87,
+     2136, 2139, 2137, 2146,   87,   87, 2142,   87,   87, 2147,
+
+     2143, 2141, 2149, 2150, 2151,   87,   87, 2145, 2148, 2153,
+       87,   87,  173,   87, 2157,   87, 2160,   87,   87,   87,
+     2154, 2155, 2156,   87, 2158, 2164,   87,   87, 2152,   87,
+     2159, 2162, 2165,   87,   87,   87,   87, 2161,   87,   87,
+     2167,   87, 2163, 2166,   87, 2169, 2168, 2170, 2175,   87,
+     2171,   87,   87,   87,   87,   87, 2172,   87, 2178, 2231,
+     2173, 2176, 2179,   87, 2174,   87, 2182,   87, 2180, 2177,
+       87, 2184, 2185, 2181,   87, 2183, 2187,   87, 2188,   87,
+       87,   87,   87, 2186,   87,   87, 2190,   87, 2191,   87,
+       87,   87, 2189,   87,   87,   87, 2196,   87, 2197,   87,
+
+       87, 2192, 2201, 2198,   87, 2202,   87, 2194, 2195, 2193,
+     2200, 2199,   87, 2203,   87,   87, 2210,   87, 2211, 2208,
+     2206, 2209,   87,   87,   87,   87, 2204, 2207,   87,   87,
+       87,   87, 2205, 2218,   87,   87,   87, 2221,   87, 2213,
+     2222,   87,   87, 2212, 2214, 2216,   87, 2215,   87, 2219,
+     2217, 2220, 2223,   87, 2224, 2225,   87,   87, 2226, 2227,
+     2230,   87, 2232, 2228, 2234,   87,   87, 2229,   87, 2233,
+       87, 2236,   87,   87,   87,   87,   87,   87, 2238, 2240,
+     2241,   87,   87, 2235,   87, 2244,   87,   87,   87, 2243,
+     2245,   87,   87, 2247,   87, 2237, 2248,   87, 2249, 2239,
+
+       87, 2251, 2242,   87, 2259, 2250,   87,   87, 2246,   87,
+       87,   87, 2256,   87, 2258, 2252, 2253, 2254,   87,   87,
+     2262, 2264, 2255, 2263, 2257,   87, 2265,   87,   87, 2260,
+     2268, 2261,   87, 2266,   87, 2271,   87,   87,   87,   87,
+     2267,   87,   87, 2269,   87, 2272, 2275,   87,   87, 2270,
+       87, 2277,   87, 2280, 2281,   87,   87, 2273,   87, 2274,
+     2282,   87, 2278, 2284,   87, 2276, 2279, 2286, 2283,   87,
+       87, 2289,   87,   87,   87,   87,   87,   87, 2287, 2293,
+       87, 2285,   87, 2296,   87,   87,   87, 2299, 2291, 2292,
+       87, 2288, 2290, 2297,   87, 2294, 2303, 2295, 2300,   87,
+
+       87, 2305,   87,   87, 3920, 2304,   87,   87, 2308,   87,
+     2302, 2298, 2311, 2307,   87,   87, 2301, 2309,   87, 2312,
+       87,   87,   87, 2306,   87,   87, 2313,   87, 2310,   87,
+       87, 2314, 2318,   87,   87,   87, 2320,   87, 2323, 2315,
+       87, 2324, 2319,   87, 2326, 2316, 2317,   87,   87,   87,
+       87,   87, 2321, 2329,   87, 2325,   87,   87, 2334,   87,
+     2327, 2322, 2333, 2328,   87,   87,   87,   87,   87, 2330,
+     2398, 2331, 2339,   87, 2340,   87, 2332,   87,   87,   87,
+     2335, 2337,   87, 2336, 2338, 2341, 2342, 2343,   87,   87,
+       87, 2344, 2350, 2345, 2348,   87, 2349,   87,   87,   87,
+
+       87, 2346,   87, 2352, 2356,   87, 2347,   87,   87,   87,
+       87,   87, 2359, 2361,   87, 2363, 2351,   87, 2362, 2353,
+     2354, 2360, 2355, 2357, 2358,   87,   87,   87,   87, 2369,
+       87, 2370,   87, 2368, 2364, 2371,   87, 2365, 2373, 2374,
+     2372,   87, 2366,   87,   87,   87,   87, 2367, 2376, 2378,
+       87,   87,   87,   87, 2380,   87,   87, 2382, 2377, 2384,
+       87, 2386, 2375, 2379, 2381,   87,   87,   87,   87, 2389,
+       87,   87,   87, 2388,  173,   87,   87,   87, 2383, 2392,
+       87, 2387, 2385, 2397,   87, 2396, 3920, 2393, 2394, 2403,
+     2390,   87, 2391,   87, 2399,   87, 2395, 2400,   87,   87,
+
+     2401, 2402,   87,   87, 2406,   87, 2404,   87,   87,   87,
+       87, 2407, 2408,   87, 2409,   87, 2412, 2415, 2410,   87,
+     2411, 2413,   87, 2405,   87,   87,   87, 2414,   87, 2418,
+       87,   87, 2422,   87,   87,   87, 2421, 2417, 2419,   87,
+     2416,   87, 2420, 2423, 2424,   87, 2425,   87, 2426, 2427,
+       87,   87,   87, 2432,   87, 2428, 2429,   87, 2433,   87,
+     2435,   87, 2434,   87,   87,   87,   87,   87,   87, 2430,
+       87, 2431, 2437,   87, 2440,   87,   87, 2443,   87, 2436,
+       87, 2439, 2438, 2442, 2444, 2441,   87, 2446, 2448, 2447,
+     2445,   87,   87, 2452,   87,   87, 2450,   87, 2453, 2449,
+
+       87,   87, 2459,   87,   87, 2451,   87, 3920,   87,   87,
+     2461,   87,   87, 2454, 2462,   87, 2455, 2456, 2457,   87,
+     2458, 2460, 2465,   87,   87, 2463,   87, 2466, 2467,   87,
+       87, 2468, 2470, 2464, 2471,   87,   87,   87,   87,   87,
+       87,   87, 2476, 2473,   87, 2477,   87, 2469,   87, 2472,
+       87,   87,   87, 2478,   87,   87,   87,   87, 2475, 2474,
+     2479, 2482, 2480, 2481, 2483, 2485, 2487,   87,   87, 2486,
+       87, 2488,   87,   87, 2484, 2490, 2491, 2494, 2489, 2492,
+     2496, 2497,   87,   87,   87,   87,   87, 2500, 2498,   87,
+     2495, 2501, 2493,   87, 2503, 2504,   87,   87,   87,   87,
+
+       87,   87, 2506, 2499,   87, 2502, 2507, 2508,   87,   87,
+     2510, 2512,   87, 2515, 2505,   87, 2511,   87, 2509,   87,
+       87,   87, 2517, 2519,   87,   87,   87, 2513, 2522,   87,
+     2521, 2518, 2514,   87, 2523, 2516,   87,   87, 2524,   87,
+     2528,   87,   87,   87,   87, 2532,   87, 2520, 2529,   87,
+     2533,   87,   87, 2531, 2525, 2526,   87, 2530,   87, 2527,
+     2534, 2535,   87, 2536, 2538,   87,   87, 2539, 2537, 2540,
+       87,   87, 2543,   87,   87, 2545, 2544, 2541,   87, 2547,
+       87, 2550,   87,   87,   87,   87,   87, 2552, 2548,   87,
+     2542,   87, 2546,   87, 2553, 2551, 2549,   87, 2554,   87,
+
+       87,   87, 2555, 2557,   87, 2561, 2560,   87,   87, 2556,
+     2558, 2562, 2564, 2559,   87,   87, 2563,   87,   87, 2566,
+       87, 2567,   87, 2565,   87, 2569,   87, 2568,   87, 2570,
+     2572, 2571, 2575,   87,   87, 2574,   87,   87,   87,   87,
+       87,   87, 2573,   87, 2583,   87, 2576,   87, 3920,   87,
+       87,   87, 2577, 2579, 2578, 2581, 2587, 2584, 2582, 2585,
+     2586,   87,   87, 2580,   87,   87, 2588, 2590,   87,   87,
+     2591, 2589,   87, 2594, 2593,   87, 2599,   87,   87,   87,
+     2595, 2601,   87, 2592, 2598,   87,   87, 2596, 2600,   87,
+     2604,   87,   87,   87, 2605,   87, 2602, 2597,  173,   87,
+
+     3920, 2610, 2616, 2612, 2603, 2606, 2607,   87, 2613,   87,
+     2614, 2615,   87, 2608, 2609,   87,   87,   87,   87,   87,
+     2611,   87,   87, 2617, 2622,   87,   87, 2623, 2627,   87,
+       87, 2626, 2618,   87, 2628,   87,   87,   87, 2619, 2621,
+     2632, 2624, 2620, 2631,   87,   87,   87, 2629, 2630,   87,
+     2635, 2633, 2625,   87, 2636, 2637,   87,   87,   87, 2639,
+       87,   87, 2638,   87, 2634,   87,   87, 2640,   87, 2641,
+     2642,   87,   87, 2645,   87,   87,   87,   87, 2643, 2649,
+       87,   87,   87,   87, 2646, 2644, 2647, 2653, 2655,   87,
+     2648,   87, 2651, 2650,   87, 2656, 2657, 2652,   87, 2658,
+
+       87, 2659, 2654,   87,   87,   87,   87,   87, 2667,   87,
+     2664,   87,   87,   87,   87, 2662,   87,   87, 2661, 2665,
+     2668,   87,   87, 2663, 2660, 2666,   87,   87, 2678, 2679,
+     2669,   87, 2670, 2671,   87,   87,   87,   87, 2676, 2672,
+     2674, 2673,   87, 2675,   87,   87, 2680, 2684, 2677, 2681,
+     2683, 2682, 2686,   87,   87,   87,   87,   87, 2688, 2687,
+       87,   87, 2685,   87,   87, 2693, 2694,   87,   87, 2689,
+     2695, 2696,   87,   87, 2691,   87, 2692,   87,   87,   87,
+     2700, 2690, 2783, 2701, 2702,   87,   87, 2703, 2697,   87,
+     2698, 2699, 2704,   87, 2705, 2708,   87,   87, 2706, 2709,
+
+       87, 2707, 2710,   87,   87,   87,   87,   87, 2711, 2715,
+       87, 2716,   87, 2718,   87,   87, 2720,   87, 2714,   87,
+     2723,   87,   87,   87, 2712, 2713, 2717, 2722, 2724,   87,
+       87,   87, 2727, 2719, 2721,   87,   87, 2725,   87, 2726,
+     2729,   87,   87, 2733,   87,   87, 3920, 2732, 2735,   87,
+     2730,   87, 2728,   87,   87,   87,   87, 2731, 2737, 2739,
+     2738,   87, 2740,   87, 2734, 2742,   87,   87,   87, 2736,
+     2745,   87, 2748,   87, 2743, 2749,   87, 2741, 2744,   87,
+       87,   87, 2746,   87,   87, 2755,   87,   87, 2754,   87,
+     2747,   87,   87, 2758, 2751,   87, 2750, 2757, 2753,   87,
+
+     2760, 2762,   87, 2752,   87,   87, 2756,   87,   87,   87,
+     2759, 2763, 2764,   87, 2761,   87, 2770, 2776, 2765,   87,
+       87,   87, 2772,   87, 2768, 2766, 2767,   87, 2771,   87,
+     2773,   87,   87, 2777, 2778,   87, 2779, 2780,   87, 2769,
+       87,   87,   87,   87,   87, 2774, 2785, 2775, 2787, 2784,
+       87, 2782,   87,   87,   87, 2788, 2791, 2789, 2792, 2790,
+     2781, 2795,   87,   87,   87,   87,   87,   87, 2786, 2794,
+     2796, 2797,   87,   87, 2793,   87, 2800,   87,   87,   87,
+       87,   87,   87,   87, 3920, 2799, 2802, 2803, 2798, 2804,
+     2805, 2807, 2808, 2806, 3920, 2801,   87,   87,   87,   87,
+
+     2809, 2814, 2810, 2811,   87, 2813,   87,   87, 2812,   87,
+     2815,   87,   87, 2818,   87, 2820,   87, 2817, 2816,  173,
+       87, 2819,   87,   87, 2821,   87, 2826,   87,   87,   87,
+       87, 2828,   87,   87, 2831, 2827, 2822, 2829, 2823, 2824,
+     2830, 2825, 2832,   87,   87,   87,   87,   87, 2836, 2833,
+       87, 2837,   87, 2841,   87,   87, 2835, 2897, 2834, 2839,
+     2842,   87, 2843,   87, 2840,   87, 2844, 2838, 2845,   87,
+       87,   87, 2848, 2846, 2849,   87, 2847,   87,   87,   87,
+       87, 2851,   87,   87, 2850,   87, 2853,   87, 2855,   87,
+       87, 2852, 2859, 2856,   87, 2854,   87, 2858,   87, 2861,
+
+       87,   87,   87, 2863, 2860, 2862, 2864,   87, 2857,   87,
+       87, 2867,   87,   87, 2865, 2866,   87, 2871,   87,   87,
+     2870, 2868,   87,   87,   87,   87,   87, 2873,   87, 2881,
+       87,   87, 2872, 2869, 2878,   87, 2880,   87, 2883,   87,
+     2877,   87,   87, 2874, 2875, 2876,   87, 2882, 2879,   87,
+     2884,   87,   87, 2890,   87,   87, 2888, 2885,   87,   87,
+     2894, 2886, 2895,   87, 2893, 2887,   87, 2891,   87,   87,
+       87, 2896,   87, 2889, 2892,   87, 2901,   87, 2898,   87,
+     2902,   87, 2903,   87, 2899,   87, 2900,   87, 2904,   87,
+     2906,   87, 2908, 2909, 2905, 2910,   87, 2912,   87, 2914,
+
+       87,   87,   87,   87,   87,   87,   87,   87, 2911, 2907,
+     2918, 2913,   87,   87,   87,   87, 2924,   87, 2916, 2922,
+     2923, 2915, 2917, 2925,   87, 2926,   87,   87, 2928,   87,
+     2920,   87,   87, 2919, 2921,   87,   87,   87,   87,   87,
+     2931, 2933, 2936,   87,   87, 2929, 2927,   87,   87, 2934,
+       87, 2935,   87, 2940, 2930, 2932, 2938,   87, 2939,   87,
+     2937, 2943,   87,   87,   87, 2942, 2941, 2944,   87,   87,
+     2945,   87, 2950, 2951,   87,   87, 2946,   87,   87,   87,
+     2952,   87, 2947, 2948,   87,   87, 2956, 2949, 2954,   87,
+       87, 2955, 2957,   87,   87, 2953,   87,   87, 2958, 2959,
+
+       87, 2960, 2961, 2965,   87, 2964, 2967,   87, 2968,   87,
+       87, 2966,   87, 2962, 2963, 2969,   87,   87,   87, 2971,
+       87, 2974, 2970, 2973,   87, 2975,   87, 2976,   87,   87,
+     2972,   87,   87,   87,   87, 2983,   87,   87, 2985,   87,
+     2977, 2986,   87, 2979,   87, 2988,   87,   87,   87, 2978,
+     2982,   87, 2980,   87, 2981, 2987, 2984,   87, 2990, 2989,
+     2991,   87, 2993,   87, 2996,   87,   87, 2998,   87,   87,
+       87,   87,   87, 2992,   87, 2997,   87,   87,   87,  173,
+       87, 2994, 3007, 2995, 3001, 3004,   87, 3009, 3003, 3005,
+     3000, 3008,   87,   87,   87, 2999, 3002,   87,   87,   87,
+
+     3006, 3010,   87, 3017,   87,   87,   87, 3016, 3011, 3012,
+       87,   87,   87, 3019,   87, 3013, 3920, 3021, 3025, 3022,
+     3014, 3015, 3023,   87,   87, 3020, 3024,   87, 3018,   87,
+     3026,   87, 3027,   87, 3028,   87,   87,   87,   87,   87,
+       87,   87, 3029,   87,   87,   87, 3030,   87,   87, 3040,
+       87,   87, 3032, 3038,   87, 3031,   87, 3034, 3033,   87,
+     3044, 3036, 3035, 3037, 3047, 3039,   87,   87, 3041, 3042,
+     3045,   87, 3043, 3046,   87,   87, 3049,   87, 3048, 3050,
+       87, 3052,   87,   87, 3051,   87,   87,   87,   87, 3053,
+       87,   87, 3056,   87,   87, 3054,   87, 3062, 3064,   87,
+
+       87, 3055, 3057, 3063, 3058,   87, 3059, 3060,   87, 3061,
+     3065,   87,   87,   87, 3066, 3069,   87, 3071, 3067, 3068,
+     3070,   87,   87,   87, 3075,   87, 3072,   87, 3078,   87,
+     3073,   87, 3077,   87,   87,   87,   87, 3074,   87, 3076,
+       87,   87,   87, 3086, 3088, 3085, 3082, 3083, 3087,   87,
+       87, 3079,   87, 3080, 3081, 3089,   87,   87, 3084,   87,
+       87, 3091,   87,   87,   87,   87,   87, 3095,   87, 3090,
+     3097, 3093,   87,   87,   87, 3920, 3092, 3102, 3103,   87,
+     3094,   87,   87, 3096, 3098, 3099, 3106,   87, 3100,   87,
+     3101, 3105,   87, 3107,   87,   87, 3104,   87, 3109, 3114,
+
+       87,   87,   87, 3112, 3108, 3113,   87, 3110, 3117,   87,
+     3111,   87,   87,   87,   87, 3115, 3122,   87,   87,   87,
+     3120, 3116,   87,   87, 3126,   87, 3125,   87, 3124,   87,
+     3123, 3118, 3119,   87, 3121, 3127,   87, 3129,   87,   87,
+       87, 3133, 3131, 3132, 3128, 3130, 3135,   87,   87,   87,
+     3137,   87,   87, 3140,   87,   87,   87,   87,   87, 3134,
+     3138, 3147,   87,   87,   87, 3144,   87,   87, 3141, 3136,
+     3142, 3143, 3145, 3146, 3139, 3150,   87,   87,   87,   87,
+       87,   87, 3149, 3151, 3152, 3154, 3148,   87,   87, 3155,
+       87, 3153,   87,   87,   87,   87,   87, 3157, 3158, 3160,
+
+     3161, 3163,   87, 3164,   87,   87, 3156, 3159, 3162,   87,
+     3165, 3166,   87,   87, 3167, 3169,  173,   87,   87,   87,
+     3170, 3174, 3171,   87,   87,   87,   87,   87, 3175, 3176,
+       87, 3168,   87, 3178,   87, 3180, 3172, 3173,   87, 3177,
+     3664, 3179, 3181,   87, 3182,   87,   87, 3184, 3185,   87,
+       87, 3183, 3187, 3186,   87,   87,   87, 3188,   87, 3189,
+     3190, 3192,   87,   87,   87,   87, 3193,   87, 3194, 3195,
+     3191,   87,   87,   87, 3196, 3200, 3201,   87,   87,   87,
+     3198,   87,   87, 3202, 3204,   87, 3197,   87,   87, 3203,
+       87, 3208, 3206, 3207, 3199, 3205,   87,   87,   87,   87,
+
+       87, 3209, 3210, 3211,   87,   87,   87,   87, 3216,   87,
+       87,   87,   87, 3213, 3214, 3215, 3218, 3212, 3217,   87,
+     3221,   87, 3220,   87, 3219,   87,   87, 3222,   87, 3223,
+       87, 3224, 3227,   87,   87, 3228,   87,   87,   87, 3232,
+       87,   87,   87, 3225, 3226, 3230, 3231, 3236,   87, 3229,
+     3234,   87,   87, 3237,   87, 3233,   87, 3235, 3240, 3241,
+       87, 3243, 3244,   87, 3247,   87, 3238,   87,   87,   87,
+       87,   87, 3239, 3248,   87,   87,   87, 3249,   87,   87,
+     3251, 3242, 3245, 3246, 3254, 3252,   87,   87,   87, 3255,
+       87, 3253, 3256, 3259,   87,   87, 3250, 3257,   87, 3261,
+
+       87, 3258, 3263,   87,   87, 3265,   87, 3266,   87,   87,
+     3260, 3267,   87, 3268,   87,   87, 3271,   87, 3262, 3269,
+       87,   87,   87, 3275, 3270,   87, 3273, 3264, 3276,   87,
+       87,   87,   87,   87, 3274,   87, 3281, 3277, 3282,   87,
+     3272, 3283,   87, 3284,   87,   87, 3286,   87, 3285,   87,
+     3278, 3279, 3280, 3288,   87,   87, 3291,   87,   87, 3292,
+     3287, 3293,   87,   87, 3295,   87,   87, 3289,   87,   87,
+     3299, 3300,   87,   87, 3305, 3290,   87, 3301, 3294, 3296,
+       87,   87, 3302, 3298, 3304,   87, 3297, 3303,   87, 3307,
+     3306,   87,   87,   87, 3308,   87,   87, 3313, 3314, 3315,
+
+       87,   87, 3312,   87,   87,   87,   87, 3318,   87, 3321,
+     3317,   87, 3310, 3311, 3309, 3319,   87,   87,   87,   87,
+       87, 3322, 3320, 3324,   87, 3316,   87, 3325,   87,   87,
+       87, 3332,   87, 3328,   87,   87, 3323, 3329, 3334,   87,
+       87, 3326, 3327,   87, 3331,   87, 3335, 3920, 3333, 3330,
+     3339, 3338, 3341, 3336,   87, 3340,   87, 3342,   87, 3337,
+     3344,   87,   87, 3345, 3343,   87, 3346,   87, 3347,   87,
+     3348,   87, 3349,   87,   87,   87,   87,   87,   87, 3351,
+     3353,   87,   87, 3356,   87, 3354,   87, 3358,   87, 3350,
+       87, 3355,   87, 3359,   87, 3352, 3363,   87, 3364,   87,
+
+     3357,   87, 3367,   87, 3365,   87, 3360, 3366, 3361,   87,
+     3362, 3368, 3370,   87, 3369, 3371,   87, 3373,   87,   87,
+     3372, 3375,   87,   87, 3374,   87, 3378,   87,   87,   87,
+       87,   87, 3376,   87, 3377, 3382,   87, 3379, 3380, 3383,
+       87,   87, 3385,   87,   87, 3384,   87, 3390, 3381,   87,
+     3386,   87, 3391,   87, 3387,   87,   87,   87,   87, 3388,
+     3393, 3394, 3392, 3396, 3397,   87, 3389,   87, 3399,   87,
+     3395,   87,   87,   87, 3402, 3403,   87, 3404,   87,   87,
+     3406, 3398, 3405,   87,   87, 3400,   87,   87, 3412, 3409,
+       87, 3407,   87,   87,   87,   87, 3410, 3401,   87,   87,
+
+     3415,   87, 3417, 3416, 3413,   87,   87,   87, 3408,   87,
+     3411,   87, 3419, 3420, 3414, 3418, 3421,   87, 3424, 3426,
+       87, 3425, 3422, 3427,   87, 3423, 3428,   87,   87,   87,
+       87,   87,   87,   87, 3435,   87, 3434, 3429,   87,   87,
+       87, 3438,   87, 3436, 3437,   87,   87,   87,   87, 3430,
+     3431, 3432, 3433, 3439,   87, 3444,   87, 3440,   87, 3442,
+     3447,   87, 3446,   87,   87, 3443,   87, 3441,   87, 3448,
+       87, 3449,   87, 3445,   87, 3450,   87, 3451, 3455,   87,
+       87,   87,   87, 3452,   87, 3453, 3459,   87,   87, 3456,
+       87,   87, 3454, 3457, 3458,   87, 3460,   87, 3463,   87,
+
+     3461,   87, 3464,   87, 3467,   87,   87, 3462, 3468, 3471,
+       87, 3465, 3472,   87,   87, 3466, 3474,   87,   87, 3469,
+       87, 3475,   87, 3477,   87, 3473, 3478,   87, 3476, 3479,
+       87, 3470, 3481,   87,   87,   87, 3482,   87,   87, 3480,
+     3483,   87, 3484, 3486, 3487,   87, 3490,   87, 3492,   87,
+     3485,   87,   87,   87, 3494, 3488, 3489,   87,   87, 3499,
+       87, 3498,   87,   87, 3491,   87, 3501,   87,   87,   87,
+     3493, 3495,   87, 3502, 3505,   87,   87, 3496, 3497, 3506,
+       87,   87,   87, 3500, 3509,   87,   87,   87, 3514, 3503,
+       87, 3507,   87, 3511,   87, 3504, 3512,   87,   87, 3518,
+
+       87, 3508, 3519,   87, 3510,   87, 3513, 3520,   87, 3515,
+     3516,   87, 3517,   87, 3522,   87, 3523, 3525, 3521,   87,
+     3524,   87,   87, 3529, 3530,   87, 3532, 3528,   87,   87,
+       87, 3531,   87,   87,   87, 3526, 3535,   87, 3534, 3536,
+       87, 3527,   87, 3538,   87, 3541,   87,   87, 3533,   87,
+       87,   87, 3546,   87, 3542,   87,   87,   87,   87, 3537,
+     3920, 3539, 3540, 3553, 3545, 3543, 3549, 3550,   87, 3551,
+       87,   87, 3548,   87, 3547, 3544, 3552,   87, 3555, 3556,
+       87, 3557,   87, 3558,   87, 3554,   87, 3560,   87,   87,
+       87, 3563,   87,   87,   87, 3559,   87,   87, 3564, 3565,
+
+       87,   87, 3561, 3567,   87, 3568,   87,   87, 3566,   87,
+       87, 3574,   87, 3569, 3575,   87, 3562,   87, 3570,   87,
+       87,   87,   87, 3571, 3581,   87, 3572, 3582,   87,   87,
+     3580, 3573,   87, 3578,   87,   87, 3577, 3585, 3576, 3583,
+     3579,   87, 3586,   87,   87,   87, 3588, 3584,   87, 3589,
+     3593, 3587, 3591,   87, 3595, 3590, 3592,   87,   87,   87,
+       87,   87, 3594, 3598,   87,   87, 3599, 3597,   87,   87,
+     3596,   87, 3601,   87, 3602,   87,   87,   87,   87,   87,
+     3605,   87,   87,   87,   87, 3600,   87, 3609, 3606, 3607,
+     3610, 3603,   87, 3604,   87,   87, 3608,   87, 3611,   87,
+
+       87,   87, 3615, 3612, 3613, 3619, 3620, 3622,   87,   87,
+     3614, 3616, 3617,   87, 3623,   87, 3618, 3621, 3625, 3624,
+       87, 3626, 3627,   87, 3628,   87,   87, 3631,   87,   87,
+     3629,   87, 3634,   87, 3632, 3630,   87, 3636,   87, 3637,
+     3638,   87,   87, 3639, 3640, 3644,   87, 3641,   87,   87,
+     3633, 3635, 3642, 3643, 3645,   87,   87, 3647,   87,   87,
+       87, 3650,   87,   87, 3651, 3646,   87,   87,   87, 3655,
+       87,   87,   87, 3654, 3649,   87,   87, 3648,   87,   87,
+       87,   87, 3660, 3659, 3920,   87, 3652, 3653, 3661, 3656,
+     3665,   87, 3657, 3666,   87, 3662,   87,   87, 3668, 3663,
+
+     3658, 3669,   87, 3670,   87, 3667, 3671,   87,   87,   87,
+       87, 3677, 3679, 3672, 3674,   87, 3678,   87,   87, 3675,
+       87,   87, 3676, 3673,   87,   87,   87, 3686,   87, 3683,
+     3684, 3687,   87, 3689,   87, 3681,   87,   87, 3688,   87,
+     3680,   87, 3682, 3690,   87, 3685, 3692, 3693,   87, 3695,
+       87, 3691,   87, 3694,   87, 3698,   87, 3699,   87, 3700,
+       87, 3696, 3701,   87, 3702,   87, 3703,   87, 3704,   87,
+     3705,   87, 3697,   87,   87, 3708,   87, 3709,   87,   87,
+       87,   87,   87, 3707, 3714,   87,   87,   87, 3710, 3716,
+       87,   87, 3711,   87,   87,   87, 3720, 3713,   87, 3706,
+
+       87, 3712, 3717,   87, 3718, 3715, 3719, 3722,   87,   87,
+     3721, 3724,   87,   87, 3725, 3723, 3727,   87, 3729, 3728,
+       87, 3726,   87, 3732,   87, 3731,   87,   87,   87,   87,
+       87,   87, 3734,   87,   87,   87, 3738,   87, 3730, 3740,
+     3733,   87, 3739, 3735,   87, 3742, 3736, 3737,   87, 3741,
+       87,   87,   87, 3745, 3746, 3748,   87, 3749,   87, 3750,
+       87, 3744,   87, 3743,   87, 3747, 3751,   87, 3754,   87,
+       87, 3753,   87, 3752, 3758,   87,   87,   87,   87,   87,
+       87, 3762, 3761,   87, 3764, 3756, 3757, 3760,   87, 3755,
+       87,   87,   87, 3763,   87,   87,   87,   87, 3759,   87,
+
+       87, 3765, 3773,   87, 3771,   87,   87, 3768,   87, 3766,
+     3767, 3770, 3772, 3776,   87, 3775, 3778,   87,   87, 3769,
+     3774,   87,   87, 3780, 3777,   87, 3779,   87, 3781, 3783,
+       87, 3784,   87, 3786,   87, 3785,   87,   87,   87, 3788,
+     3920, 3782, 3787, 3789,   87, 3790,   87, 3792,   87,   87,
+     3796, 3793,   87,   87, 3794, 3791, 3798, 3795,   87,   87,
+       87,   87,   87, 3802,   87, 3801, 3804,   87, 3797, 3805,
+       87, 3800, 3799, 3806,   87, 3807,   87,   87,   87, 3810,
+       87, 3803,   87,   87,   87,   87, 3815,   87,   87, 3816,
+       87,   87, 3808, 3812, 3819, 3820,   87, 3809, 3811, 3817,
+
+       87,   87,   87, 3814,   87,   87,   87,   87, 3813, 3818,
+     3821, 3824, 3825,   87,   87, 3822, 3826,   87, 3830,   87,
+       87,   87,   87, 3823,   87, 3832, 3827, 3828, 3829, 3834,
+       87,   87,   87,   87,   87,   87, 3831, 3841,   87, 3839,
+     3840,   87, 3833,   87, 3836, 3837,   87,   87,   87, 3835,
+     3846,   87, 3838, 3847, 3848,   87, 3845,   87, 3849, 3920,
+       87, 3842, 3844,   87, 3843,   87,   87, 3854, 3850,   87,
+     3851, 3852,   87,   87, 3853, 3855,   87, 3856, 3857,   87,
+       87,   87,   87,   87, 3859,   87, 3864, 3858,   87, 3861,
+       87,   87,   87,   87, 3867,   87, 3868, 3869,   87,   87,
+
+     3860,   87, 3862, 3866, 3863,   87, 3872, 3865, 3870,   87,
+       87, 3871,   87, 3876, 3873, 3877,   87,   87,   87,   87,
+     3881, 3879, 3875,   87, 3874,   87, 3883,   87, 3884, 3878,
+       87,   87,   87, 3888,   87, 3885, 3889,   87, 3886,   87,
+       87, 3891, 3882,   87, 3880, 3890, 3892,   87,   87,   87,
+     3893, 3887,   87,   87,   87, 3894,   87, 3896, 3898,   87,
+       87, 3900,   87,   87,   87, 3901,   87, 3904, 3895, 3905,
+       87,   87, 3897, 3899,   87, 3908, 3909,   87,   87, 3911,
+       87, 3902, 3903, 3906,   87, 3910, 3912,   87,   87,   87,
+     3907, 3913,   87, 3914, 3915,   87, 3918,   87, 3919,   87,
+
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3916, 3920, 3920, 3917,   48,   48,   48,   48,   48,
+       48,   48,   53,   53,   53,   53,   53,   53,   53,   58,
+       58,   58,   58,   58,   58,   58,   64,   64,   64,   64,
+       64,   64,   64,   69,   69,   69,   69,   69,   69,   69,
+       75,   75,   75,   75,   75,   75,   75,   81,   81,   81,
+       81,   81,   81,   81,   90,   90, 3920,   90,   90,   90,
+       90,  163,  163, 3920, 3920, 3920,  163,  163,  165,  165,
+     3920, 3920,  165, 3920,  165,  167, 3920, 3920, 3920, 3920,
+     3920,  167,  170,  170, 3920, 3920, 3920,  170,  170,  172,
+
+     3920, 3920, 3920, 3920, 3920,  172,  174,  174, 3920,  174,
+      174,  174,  174,  177, 3920, 3920, 3920, 3920, 3920,  177,
+      180,  180, 3920, 3920, 3920,  180,  180,   91,   91, 3920,
+       91,   91,   91,   91,   17, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920
     } ;
 
-static yyconst flex_int16_t yy_chk[7653] =
+static yyconst flex_int16_t yy_chk[7676] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -2579,13 +2584,13 @@ static yyconst flex_int16_t yy_chk[7653] =
         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, 3912,   35,
+       10,   10,   19,   29,    9,   33,   19,   29, 3928,   35,
        10,   11,   11,   11,   11,   11,   11,   13,   13,   13,
 
        13,   34,   13,   11,   35,  101,   34,   29,   38,   13,
        46,   46,   11,   12,   12,   12,   12,   12,   12,   14,
        14,   14,   14,  101,   14,   12,   15,   15,   15,   38,
-       23,   14,   23,   23,   12,   23, 3156,   15,   16,   16,
+       23,   14,   23,   23,   12,   23, 3195,   15,   16,   16,
        16,   23,   23,   27,   27,   30,   30,   31,   31,   16,
        25,   27,  131,   25,   25,   27,   31,   25,   27,   32,
        30,   47,   25,   32,   25,  131,   32,   31,   40,   45,
@@ -2604,7 +2609,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       100,   99,  102,  100,   98,  104,  105,  106,  103,  103,
       111,  104,  107,  109,  108,  116,  100,  104,  110,  104,
 
-      108,  113,  114,  110,  105,  105,  112,  109, 1212,  106,
+      108,  113,  114,  110,  105,  105,  112,  109, 3169,  106,
       111,  107,  110,  108,  118,  116,  117,  112,  112,  113,
       114,  117,  115,  120,  119,  112,  115,  119,  118,  120,
       119,  121,  122,  123,  124,  125,  123,  122,  126,  127,
@@ -2618,18 +2623,18 @@ static yyconst flex_int16_t yy_chk[7653] =
       147,  149,  149,  145,  153,  148,  150,  145,  156,  154,
       155,  157,  155,  150,  158,  152,  157,  159,  160,  149,
       156,  155,  149,  160,  150,  154,  158,  161,  162,  164,
-      164,  166,  182,  155,  166,  159,  161,  182,  168,  180,
+      164,  166,  182,  155,  166,  159,  161,  182,  168, 1212,
       168,  168,  162,  168,  171,  171,  173,  184,  173,  173,
       174,  173,  174,  174,  176,  174,  178,  176,  178,  178,
       183,  178,  174,  181,  181,  184,  183,  185,  187,  188,
       189,  190,  191,  193,  192,  183,  187,  194,  189,  192,
       188,  197,  185,  187,  206,  195,  198,  191,  194,  196,
-      190,  198,  179,  193,  195,  196,  196,  199,  199,  200,
+      190,  198,  180,  193,  195,  196,  196,  199,  199,  200,
 
       199,  204,  201,  206,  201,  200,  197,  201,  202,  203,
       203,  207,  202,  204,  205,  209,  207,  202,  208,  205,
       205,  210,  202,  208,  201,  211,  212,  209,  202,  202,
-      212,  211,  213,  214,  215,  216,  177,  213,  218,  219,
+      212,  211,  213,  214,  215,  216,  179,  213,  218,  219,
       217,  210,  220,  224,  219,  223,  222,  220,  215,  214,
       216,  222,  217,  229,  211,  217,  218,  221,  221,  224,
       225,  221,  232,  221,  227,  223,  225,  226,  226,  235,
@@ -2650,7 +2655,7 @@ static yyconst flex_int16_t yy_chk[7653] =
 
       294,  291,  283,  292,  293,  290,  291,  285,  292,  295,
       293,  287,  296,  297,  298,  294,  299,  300,  302,  301,
-      172,  302,  297,  295,  299,  301,  307,  303,  298,  303,
+      177,  302,  297,  295,  299,  301,  307,  303,  298,  303,
       296,  304,  304,  305,  305,  306,  308,  308,  306,  309,
       309,  310,  300,  331,  307,  311,  311,  312,  313,  314,
       312,  316,  313,  315,  319,  318,  331,  310,  314,  320,
@@ -2671,7 +2676,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       409,  387,  379,  375,  371,  376,  376,  379,  376,  380,
 
       387,  374,  372,  384,  373,  380,  381,  376,  378,  409,
-      382,  381,  170,  383,  376,  382,  383,  384,  383,  385,
+      382,  381,  172,  383,  376,  382,  383,  384,  383,  385,
       386,  382,  389,  386,  394,  385,  388,  388,  389,  390,
       390,  395,  391,  396,  395,  397,  386,  391,  408,  386,
       398,  386,  392,  392,  394,  392,  464,  401,  396,  464,
@@ -2679,7 +2684,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       392,  401,  406,  392,  393,  393,  404,  393,  406,  405,
       411,  407,  400,  403,  405,  405,  412,  407,  410,  411,
       393,  414,  415,  393,  407,  393,  413,  393,  402,  416,
-      402,  402,  413,  410,  420,  412,  417,  169,  421,  414,
+      402,  402,  413,  410,  420,  412,  417,  170,  421,  414,
 
       402,  402,  402,  402,  402,  418,  422,  402,  415,  416,
       417,  418,  419,  425,  420,  418,  426,  419,  421,  423,
@@ -2693,7 +2698,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       452,  453,  453,  451,  458,  459,  456,  466,  458,  471,
 
       461,  460,  462,  453,  459,  453,  454,  460,  462,  463,
-      465,  454,  471,  463,  475,  465,  167,  466,  475,  454,
+      465,  454,  471,  463,  475,  465,  169,  466,  475,  454,
       454,  467,  467,  454,  454,  469,  469,  454,  470,  472,
       472,  473,  476,  470,  474,  477,  478,  473,  479,  474,
       481,  478,  482,  479,  480,  480,  483,  476,  484,  486,
@@ -2701,7 +2706,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       484,  489,  482,  490,  483,  491,  491,  492,  494,  494,
       486,  495,  492,  500,  497,  498,  498,  501,  502,  493,
       497,  503,  504,  505,  506,  501,  507,  509,  505,  512,
-      503,  510,  511,  495,  500,  512,  513,  165,  507,  502,
+      503,  510,  511,  495,  500,  512,  513,  167,  507,  502,
 
       514,  518,  515,  504,  506,  509,  514,  509,  516,  510,
       513,  515,  511,  517,  516,  518,  519,  520,  517,  521,
@@ -2711,7 +2716,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       538,  531,  527,  536,  539,  542,  543,  544,  533,  551,
       530,  535,  545,  537,  546,  548,  545,  539,  547,  538,
       540,  540,  544,  547,  551,  542,  540,  543,  540,  553,
-      552,  548,  163,  546,  540,  552,  540,  549,  550,  540,
+      552,  548,  165,  546,  540,  552,  540,  549,  550,  540,
       540,  549,  554,  550,  556,  553,  540,  550,  553,  557,
 
       555,  554,  559,  560,  558,  552,  555,  558,  562,  556,
@@ -2725,7 +2730,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       597,  596,  598,  600,  599,  595,  597,  599,  601,  603,
       602,  605,  591,  603,  598,  602,  604,  600,  606,  604,
 
-      605,   86,  608,  601,  609,  609,  607,  605,  610,  610,
+      605,  163,  608,  601,  609,  609,  607,  605,  610,  610,
       605,  607,  607,  612,  606,  608,  611,  617,  611,  612,
       613,  613,  614,  614,  615,  618,  616,  619,  622,  621,
       615,  616,  616,  620,  621,  617,  620,  623,  624,  619,
@@ -2740,7 +2745,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       657,  659,  658,  656,  660,  661,  662,  663,  661,  660,
       664,  662,  665,  666,  668,  673,  667,  669,  669,  665,
       659,  667,  670,  663,  658,  671,  666,  672,  664,  674,
-      675,  670,  672,  676,  668,  677,  673,  680,   81,  678,
+      675,  670,  672,  676,  668,  677,  673,  680,   86,  678,
       680,  682,  676,  674,  671,  678,  675,  677,  679,  681,
       681,  685,  681,  683,  679,  684,  683,  682,  686,  687,
       684,  688,  689,  691,  690,  692,  688,  694,  691,  685,
@@ -2756,12 +2761,12 @@ static yyconst flex_int16_t yy_chk[7653] =
       719,  723,  720,  721,  722,  732,  728,  724,  732,  734,
       730,  729,  735,  733,  736,  734,  731,  732,  737,  738,
       739,  740,  741,  743,  742,  744,  741,  745,  736,  746,
-      737,  747,  735,  749,  750,  750,   76,  753,  738,  743,
+      737,  747,  735,  749,  750,  750,   81,  753,  738,  743,
 
       740,  739,  742,  744,  748,  745,  745,  749,  746,  748,
       747,  751,  752,  754,  755,  751,  753,  756,  757,  758,
       759,  763,  756,  760,  754,  766,  752,  761,  755,  762,
-      760,   75,  761,  759,  757,  764,  762,  765,  758,  767,
+      760,   76,  761,  759,  757,  764,  762,  765,  758,  767,
       764,  768,  765,  766,  769,  763,  767,  770,  771,  772,
       768,  775,  779,  773,  775,  774,  770,  771,  769,  773,
       774,  772,  776,  777,  778,  780,  776,  779,  780,  781,
@@ -2770,7 +2775,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       794,  782,  793,  795,  790,  796,  793,  797,  799,  798,
 
       800,  789,  794,  797,  791,  798,  799,  800,  801,  792,
-      802,  803,  806,  796,  809,  810,  813,  809,  795,   69,
+      802,  803,  806,  796,  809,  810,  813,  809,  795,   75,
       816,  818,  814,  817,  819,  813,  801,  806,  814,  817,
       818,  803,  810,  820,  824,  802,  804,  820,  804,  823,
       819,  804,  816,  821,  821,  804,  822,  822,  804,  825,
@@ -2778,7 +2783,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       830,  834,  832,  825,  833,  830,  835,  840,  833,  837,
       835,  826,  828,  828,  828,  831,  828,  829,  836,  828,
       832,  839,  838,  836,  828,  834,  835,  838,  837,  845,
-      828,  828,  840,  828,  841,  842,  839,  841,  843,   64,
+      828,  828,  840,  828,  841,  842,  839,  841,  843,   69,
 
       842,  842,  844,  844,  845,  843,  846,  847,  847,  848,
       849,  846,  850,  849,  848,  851,  851,  850,  852,  853,
@@ -2805,7 +2810,7 @@ static yyconst flex_int16_t yy_chk[7653] =
       941,  946,  947,  950,  944,  948,  949,  949,  943,  946,
       948,  951,  952,  953,  955,  954,  947,  956,  957,  960,
       958,  952,  950,  954,  959,  960,  961,  962,  964,  963,
-      965,  951,  961,  953,  955,  963,  969,  957,   59,  956,
+      965,  951,  961,  953,  955,  963,  969,  957,   64,  956,
       958,  962,  964,  966,  959,  967,  970,  972,  968,  966,
       965,  967,  968,  977,  971,  969,  973,  973,  970,  971,
       978,  974,  976,  975,  979,  976,  970,  974,  972,  975,
@@ -2819,600 +2824,602 @@ static yyconst flex_int16_t yy_chk[7653] =
      1012, 1002, 1003, 1010, 1010, 1003, 1007, 1003, 1013, 1066,
      1015, 1003, 1066, 1003, 1011, 1012, 1014, 1009, 1003, 1017,
      1016, 1014, 1013, 1003, 1015, 1016, 1016, 1018, 1017, 1019,
-     1022, 1020, 1021, 1019, 1023, 1024, 1026, 1021, 1027, 1023,
-       58, 1018, 1022, 1025, 1025, 1019, 1020, 1021, 1029, 1024,
-     1028, 1031, 1027, 1029, 1030, 1032, 1031, 1026, 1033, 1028,
-     1030, 1032, 1034, 1034, 1033, 1035, 1036, 1037, 1038, 1041,
-
-     1035, 1042, 1036, 1039, 1043, 1047, 1042, 1046, 1044, 1045,
-     1045, 1041, 1046, 1047, 1051, 1048, 1049, 1038, 1043, 1037,
-     1044, 1039, 1040, 1040, 1050, 1052,   53, 1053, 1040, 1048,
-     1040, 1054, 1049, 1051, 1055, 1056, 1040, 1054, 1050, 1055,
-     1057, 1040, 1040, 1053, 1052, 1058, 1059, 1056, 1040, 1060,
-     1061, 1061, 1062, 1063, 1065, 1067, 1062, 1068, 1057, 1069,
-     1065, 1058, 1068, 1070, 1059, 1071, 1072, 1060, 1074, 1070,
-     1071, 1075, 1069, 1063, 1067, 1076, 1077, 1074, 1078, 1079,
-     1075, 1080, 1077, 1081, 1084, 1072, 1080, 1078, 1082, 1083,
-     1083, 1076, 1086, 1085, 1088, 1089, 1094, 1087, 1079, 1092,
-
-     1088, 1086, 1082, 1081, 1084, 1085, 1087, 1090, 1095, 1096,
-     1094, 1097, 1089, 1090, 1098, 1092, 1097, 1099, 1100, 1101,
-     1098, 1103, 1104, 1102, 1107, 1108, 1103, 1104, 1095, 1107,
-     1108, 1109, 1100, 1111, 1096, 1113, 1099, 1101, 1102, 1111,
-     1109, 1110, 1110, 1112, 1113, 1114, 1115, 1117, 1118, 1112,
-     1121, 1120, 1120, 1118, 1118, 1120, 1123, 1124, 1122, 1115,
-     1114, 1122, 1125, 1117, 1126, 1121, 1127, 1128, 1129, 1130,
-     1123, 1126, 1131, 1132, 1133, 1130, 1134, 1124, 1125, 1132,
-     1128, 1134, 1135, 1129, 1127, 1137, 1137, 1138, 1139, 1133,
-     1138, 1142, 1131, 1140, 1141, 1143, 1135, 1144, 1140, 1141,
-
-     1145, 1146, 1144, 1149, 1143, 1145, 1148, 1142, 1150, 1139,
-     1151, 1152, 1148, 1146, 1150, 1153, 1153, 1152, 1154, 1149,
-     1155, 1156, 1157, 1157, 1156, 1158, 1159, 1154, 1160, 1161,
-     1163, 1151, 1161, 1162, 1164, 1165, 1163, 1166, 1155, 1167,
-     1164, 1165, 1166, 1158, 1167, 1159, 1162, 1168, 1160, 1169,
-     1170, 1173, 1172, 1168, 1169, 1174, 1170, 1172, 1175, 1178,
-     1176, 1177, 1177, 1179, 1175, 1176, 1180, 1181, 1178, 1173,
-     1182, 1180, 1179, 1183, 1184, 1174, 1183, 1184, 1186, 1185,
-     1187, 1188, 1189, 1186, 1192, 1181, 1190, 1195, 1191, 1182,
-     1185, 1193, 1190, 1188, 1191, 1196, 1193, 1198, 1187, 1192,
-
-     1197, 1189, 1194, 1194, 1199, 1200, 1195, 1201, 1199, 1196,
-     1202, 1203, 1197, 1205, 1208, 1198, 1201, 1206, 1207, 1207,
-     1209, 1211, 1208, 1200, 1213, 1209, 1206, 1214, 1210, 1202,
-     1216, 1215, 1205, 1210, 1218, 1216, 1203, 1217, 1213, 1219,
-     1219, 1211, 1214, 1215, 1220, 1221, 1217, 1222, 1223, 1218,
-     1224, 1221, 1225, 1222, 1226, 1227, 1223, 1227, 1228, 1226,
-     1229, 1230, 1231, 1228, 1220, 1224, 1232, 1231, 1225, 1233,
-     1234, 1235, 1236, 1234, 1229, 1230, 1237, 1240, 1235, 1239,
-     1239, 1232, 1241, 1242, 1243, 1244, 1241, 1236, 1233, 1246,
-     1245, 1240, 1242, 1249, 1247, 1237, 1245, 1249, 1253, 1247,
-
-     1244, 1251, 1243, 1250, 1250, 1253, 1251, 1254, 1247, 1246,
-     1247, 1252, 1252, 1247, 1255, 1256, 1258, 1255, 1257, 1260,
-     1261, 1254, 1263, 1262, 1260, 1258, 1264, 1265, 1263, 1266,
-     1267, 1264, 1269, 1269, 1256, 1262, 1257, 1270, 1271, 1261,
-     1266, 1265, 1270, 1271, 1272, 1273, 1275, 1274, 1276, 1267,
-     1273, 1274, 1277, 1278, 1279, 1275, 1280, 1279, 1281, 1283,
-     1284, 1282, 1285, 1276, 1272, 1281, 1279, 1277, 1286, 1287,
-     1289, 1280, 1278, 1282, 1286, 1288, 1289, 1290, 1283, 1291,
-     1285, 1284, 1292, 1293, 1287, 1294, 1288, 1296, 1295, 1297,
-     1298, 1292, 1300, 1303, 1307, 1299, 1302, 1290, 1293, 1291,
-
-     1295, 1299, 1302, 1304, 1294, 1298, 1296, 1305, 1303, 1306,
-     1307, 1308, 1300, 1309, 1297, 1305, 1308, 1304, 1310, 1311,
-     1312, 1317, 1313, 1310, 1310, 1309, 1314, 1314, 1316, 1306,
-     1317, 1318, 1319, 1319, 1312, 1313, 1327, 1318, 1311, 1315,
-     1315, 1316, 1321, 1323, 1315, 1320, 1321, 1315, 1315, 1323,
-     1320, 1322, 1315, 1330, 1324,   48, 1325, 1327, 1315, 1324,
-     1322, 1325, 1315, 1326, 1326, 1328, 1328, 1329, 1331, 1332,
-     1329, 1333, 1329, 1330, 1335, 1332, 1334, 1333, 1336, 1334,
-     1337, 1338, 1339, 1335, 1340, 1337, 1331, 1341, 1342, 1345,
-     1340, 1343, 1348, 1341, 1342, 1338, 1343, 1344, 1336, 1346,
-
-     1339, 1344, 1345, 1351, 1347, 1355, 1348, 1354, 1346, 1347,
-     1349, 1349, 1353, 1346, 1351, 1346, 1353, 1346, 1356, 1346,
-     1350, 1350, 1354, 1350, 1357, 1355, 1358, 1361, 1359, 1360,
-     1362, 1358, 1358, 1357, 1363, 1362, 1356, 1359, 1360, 1365,
-     1366, 1364, 1367, 1369, 1369, 1368, 1371, 1372, 1363, 1361,
-     1364, 1368, 1370, 1374, 1371, 1373, 1367, 1375, 1365, 1366,
-     1373, 1372, 1376, 1377, 1370, 1378, 1375, 1374, 1379, 1376,
-     1380, 1380, 1381, 1379, 1382, 1382, 1384, 1383, 1384, 1387,
-     1386, 1377, 1383, 1386, 1387, 1388, 1389, 1381, 1390, 1390,
-     1378, 1391, 1392, 1392, 1394, 1389, 1393, 1393, 1395, 1394,
-
-     1396, 1397, 1398, 1398, 1388, 1399, 1400, 1401, 1402, 1403,
-     1401, 1391, 1404, 1407, 1406, 1403, 1406, 1404, 1405, 1395,
-     1410, 1396, 1397, 1400, 1411, 1399, 1409, 1405, 1402, 1409,
-     1413, 1407, 1415, 1412, 1414, 1410, 1416, 1411, 1412, 1414,
-     1415, 1416, 1417, 1418, 1413, 1417, 1419, 1419, 1418, 1420,
-     1421, 1422, 1423, 1424, 1420, 1426, 1427, 1422, 1428, 1423,
-     1429, 1426, 1427, 1428, 1430, 1429, 1424, 1431, 1421, 1432,
-     1430, 1433, 1434, 1434, 1435, 1436, 1431, 1440, 1438, 1439,
-     1442, 1441, 1433, 1438, 1443, 1444, 1445, 1440, 1432, 1450,
-     1447, 1444, 1445, 1446, 1435, 1436, 1441, 1439, 1449, 1446,
-
-     1442, 1447, 1451, 1450, 1449, 1452, 1453, 1443, 1454, 1450,
-     1452, 1455, 1453, 1456, 1457, 1459, 1451, 1458, 1458, 1460,
-     1461, 1462, 1451, 1455, 1463, 1465, 1462, 1456, 1454, 1464,
-     1464, 1466, 1457, 1468, 1470, 1459, 1466, 1469, 1461, 1472,
-     1471, 1473, 1463, 1476, 1460, 1471, 1471, 1470, 1465, 1475,
-     1473, 1469, 1468, 1474, 1477,   18, 1479, 1472, 1476, 1478,
-     1480, 1474, 1480, 1475, 1478, 1479, 1481, 1478, 1483, 1477,
-     1485, 1484, 1477, 1486, 1483, 1484, 1487, 1488, 1486, 1486,
-     1481, 1485, 1489, 1490, 1491, 1492, 1493, 1494, 1490, 1491,
-     1492, 1495, 1496, 1499, 1498, 1487, 1495, 1500, 1501, 1501,
-
-     1489, 1502, 1503, 1488, 1493, 1502, 1504, 1494, 1498, 1506,
-     1505, 1499, 1496, 1507, 1508, 1500, 1505, 1509, 1518, 1510,
-     1503, 1506, 1511, 1512, 1517, 1504, 1516, 1513, 1514, 1507,
-     1523, 1509, 1513, 1508, 1510, 1514, 1515, 1511, 1517, 1518,
-     1519, 1515, 1512, 1521, 1516, 1520, 1520, 1522, 1525, 1519,
-     1523, 1524, 1524, 1526, 1525, 1527, 1522, 1531, 1521, 1526,
-     1528, 1528, 1529, 1529, 1530, 1532, 1533,   17, 1534, 1527,
-     1530, 1533, 1535, 1531, 1534, 1536, 1537, 1537, 1535, 1538,
-     1538, 1536, 1540, 1540, 1541, 1542, 1532, 1543, 1541, 1545,
-     1544, 1546, 1549, 1547, 1542, 1548, 1548, 1552, 1553, 1538,
-
-     1547, 1538, 1544, 1545, 1551, 1543, 1546, 1550, 1554, 1551,
-     1557, 1552, 1549, 1554, 1554, 1550, 1555, 1553, 1559, 1556,
-     1560, 1555, 1555, 1556, 1558, 1558, 1561, 1562, 1563, 1564,
-     1557, 1567, 1562, 1565, 1566, 1561, 1567, 1559, 1568, 1560,
-     1566, 1569, 1570, 1571, 1572, 1573, 1574, 1563, 1575, 1564,
-     1572, 1565, 1574, 1576, 1575, 1578, 1568, 1570, 1577, 1579,
-     1580, 1569, 1581, 1582, 1573, 1583, 1587, 1577, 1584, 1571,
-     1585, 1585, 1576, 1586, 1578, 1588, 1586, 1582, 1579, 1580,
-     1589, 1581, 1594, 1584, 1595, 1587, 1583, 1590, 1590, 1591,
-     1591, 1592, 1589, 1593, 1588, 1594, 1592, 1593, 1596, 1595,
-
-     1597, 1600, 1598, 1601, 1598, 1602, 1601, 1596, 1598, 1603,
-     1602, 1604, 1605, 1597, 1606, 1606, 1610, 1607, 1609, 1600,
-     1608, 1598, 1607, 1615, 1603, 1618, 1608, 1612, 1605, 1610,
-     1611, 1604, 1612, 1609, 1613, 1614, 1611, 1616, 1613, 1614,
-     1617, 1619, 1622, 1615, 1625, 1618, 1624, 1619, 1626, 1617,
-     1620, 1620, 1624, 1626, 1629, 1616, 1627, 1627, 1628, 1635,
-     1622, 1631, 1631, 1633, 1628, 1625, 1633, 1634, 1634, 1636,
-     1637, 1640, 1642, 1639, 1629, 1635, 1639, 1641, 1643, 1644,
-     1644, 1642, 1646, 1647, 1645, 1636, 1637, 1649, 1648, 1650,
-     1651, 1651, 1640, 1648, 1653, 1650, 1652, 1641, 1643, 1645,
-
-     1654, 1649, 1647, 1646, 1655, 1652, 1656, 1657, 1657, 1658,
-     1659, 1660, 1653, 1662, 1662, 1654, 1660, 1661, 1663, 1664,
-     1665, 1665, 1663, 1658, 1666, 1667, 1656, 1668, 1659, 1655,
-     1669, 1670, 1661, 1683, 1669, 1671, 1673, 1673, 1668, 1664,
-     1671, 1676, 1674, 1678, 1667, 1679, 1666, 1674, 1674, 1675,
-     1670, 1677, 1675, 1680, 1676, 1681, 1677, 1682, 1683, 1678,
-     1684, 1685, 1685, 1679, 1687, 1686, 1689, 1680, 1688, 1684,
-     1686, 1682, 1691, 1688, 1681, 1681, 1690, 1692, 1692, 1690,
-     1693, 1695, 1694, 1696, 1687, 1696, 1689, 1694, 1697, 1693,
-     1698, 1691, 1699, 1697, 1700, 1703, 1698, 1701, 1704, 1704,
-
-     1700, 1695, 1701, 1705, 1706, 1707, 1710, 1708, 1711, 1703,
-     1707, 1710, 1699, 1708, 1712, 1712, 1713, 1713, 1715, 1714,
-     1716, 1717, 1705, 1706, 1717, 1718, 1718, 1719, 1720, 1721,
-     1729, 1723, 1711, 1714, 1724, 1716, 1715, 1723, 1722, 1724,
-     1720, 1722, 1727, 1725, 1722, 1719, 1725, 1728, 1732, 1721,
-     1730, 1727, 1728, 1730, 1733, 1729, 1722, 1731, 1731, 1734,
-     1733, 1735, 1725, 1736, 1736, 1734, 1735, 1737, 1737, 1738,
-     1740, 1739, 1732, 1741, 1742, 1738, 1739, 1743, 1744, 1745,
-     1746, 1744, 1747, 1740, 1748, 1745, 1746, 1750, 1747, 1748,
-     1749, 1741, 1755, 1742, 1751, 1754, 1749, 1743, 1753, 1751,
-
-     1752, 1752, 1756, 1753, 1757, 1758, 1759, 1760, 1761, 1762,
-     1750, 1763, 1755, 1754, 1764, 1766,    0, 1756, 1764, 1769,
-     1759, 1760, 1761, 1757, 1765, 1758, 1765, 1762, 1767, 1770,
-     1771, 1769, 1772, 1773, 1766, 1767, 1763, 1775, 1772, 1774,
-     1776, 1770, 1777, 1771, 1782, 1777, 1778, 1778, 1784, 1779,
-     1781, 1781, 1786, 1773, 1776, 1774, 1783, 1775, 1779, 1787,
-     1784, 1783, 1788, 1777, 1782, 1785, 1785, 1786, 1790, 1789,
-     1791, 1792, 1793, 1787, 1794, 1798, 1796, 1790, 1792, 1799,
-     1800, 1793, 1804, 1800, 1793, 1791, 1788, 1789, 1801, 1801,
-     1794, 1796, 1807, 1798, 1802, 1802, 1796, 1803, 1805, 1808,
-
-     1804, 1805, 1806, 1806, 1799, 1807, 1809, 1810, 1812, 1803,
-     1811, 1809, 1810, 1811, 1813, 1814, 1815, 1816, 1808, 1813,
-     1817, 1818, 1819, 1822, 1822, 1821, 1816, 1820, 1823, 1812,
-     1818, 1821, 1815, 1818, 1814, 1823, 1820, 1824, 1825, 1817,
-     1826, 1827, 1829, 1828, 1830, 1834, 1819, 1829, 1829, 1830,
-     1831, 1825, 1838, 1835,    0, 1827, 1839, 1824, 1826, 1828,
-     1836, 1836, 1831, 1837, 1843, 1839, 1837, 1842, 1838, 1843,
-     1834, 1835, 1840, 1840, 1841, 1841, 1842, 1840, 1845, 1842,
-     1844, 1844, 1846, 1847, 1850, 1848, 1852, 1851, 1853, 1841,
-     1848, 1848, 1854, 1853, 1855, 1856, 1845, 1860, 1850, 1864,
-
-     1855, 1847, 1851, 1846, 1857, 1857, 1854, 1859, 1852, 1858,
-     1861, 1860, 1859, 1856, 1862, 1858, 1861, 1865, 1866, 1864,
-     1862, 1867, 1868, 1870, 1874, 1869, 1875, 1867, 1869, 1870,
-     1872, 1876, 1866, 1877, 1869, 1868,    0, 1865, 1872, 1878,
-     1879, 1877, 1880, 1874, 1878, 1875, 1882, 1881, 1883, 1879,
-     1876, 1884, 1885, 1885, 1886, 1880, 1881, 1887, 1888, 1882,
-     1886, 1888, 1883, 1887, 1889, 1884, 1890, 1890, 1891, 1892,
-     1893, 1894, 1894, 1895, 1885, 1896, 1897, 1889, 1898, 1899,
-     1902, 1896, 1901, 1901, 1905, 1904, 1895, 1892, 1891, 1893,
-     1904, 1903, 1909,    0, 1898, 1903, 1906, 1899, 1897, 1908,
-
-     1902, 1906, 1907, 1911, 1905, 1913, 1911, 1907, 1908, 1914,
-     1915, 1916, 1917, 1915, 1919, 1909, 1913, 1911, 1914, 1918,
-     1918, 1921, 1920, 1916, 1922, 1922, 1923, 1917, 1924, 1925,
-     1927, 1923, 1926, 1919, 1920, 1928, 1925, 1927, 1929, 1930,
-     1921, 1932, 1924, 1933, 1926, 1934, 1935, 1928, 1936, 1929,
-     1937, 1934, 1938, 1938, 1939, 1940, 1937, 1939, 1935, 1930,
-     1932, 1941, 1941, 1933, 1943, 1944, 1936, 1945, 1946, 1943,
-     1947, 1944, 1948, 1948, 1949, 1940, 1947, 1946, 1950, 1952,
-     1950, 1951, 1945, 1953, 1951, 1954, 1949, 1956, 1955, 1957,
-     1959, 1958, 1956, 1960, 1957, 1962, 1961, 1971, 1963, 1952,
-
-     1958, 1961, 1959, 1954, 1962, 1953, 1955, 1964, 1960, 1965,
-     1966, 1969, 1964, 1971, 1965, 1967, 1967, 1962, 1963, 1964,
-     1968, 1972, 1973, 1974, 1975, 1966, 1968, 1976, 1981, 1976,
-     1984, 1977, 1969, 1978, 1978, 1979, 1979, 1980, 1980, 1974,
-     1972, 1973, 1982, 1982, 1975, 1977, 1985, 1977, 1981, 1983,
-     1983, 1984, 1986, 1987, 1987, 1988, 1989, 1990, 1992, 1988,
-     1990, 1993, 1989, 1994, 1992, 1995, 1996, 1985, 1997, 1994,
-     2000, 1996, 1998, 1986, 2003, 1998, 1999, 1999, 2001, 1993,
-     2002, 2002, 2004, 2001, 2007, 2007, 2005, 2006, 1995, 2003,
-     2000, 2005, 2006, 1997, 2008, 2009, 2010, 2011, 2012, 2008,
-
-     2013, 2009, 2015, 2004, 2016, 2014, 2017, 2018, 2010, 2010,
-     2010, 2014, 2018, 2017, 2021, 2010, 2012, 2011, 2022, 2024,
-     2013, 2020, 2015, 2023, 2016, 2023, 2020, 2020, 2021, 2025,
-     2024, 2026, 2027, 2022, 2028, 2029, 2031, 2026, 2030, 2030,
-     2033, 2027, 2032, 2032, 2025, 2034, 2035, 2035, 2036, 2036,
-     2037, 2037, 2038, 2042, 2028, 2043, 2029, 2041, 2041, 2045,
-     2033, 2046, 2031, 2047, 2043, 2048, 2050, 2034, 2045, 2047,
-     2049, 2052, 2038, 2051, 2051, 2053, 2054, 2056, 2042, 2055,
-     2050, 2059, 2046, 2054, 2048, 2060, 2049,    0, 2055, 2065,
-     2053, 2062, 2052, 2057, 2057, 2058, 2058, 2062, 2066, 2063,
-
-     2064, 2060, 2067, 2056, 2063, 2066, 2064, 2059, 2067, 2065,
-     2068, 2070, 2068, 2071, 2072, 2072, 2073, 2074, 2075, 2071,
-     2076, 2073, 2077, 2079, 2078, 2080, 2074, 2078, 2080, 2081,
-     2070, 2082, 2084, 2075, 2085, 2079, 2083, 2083, 2084, 2086,
-     2076, 2077, 2087, 2088, 2089, 2086, 2085, 2081, 2089, 2091,
-     2092, 2093, 2094, 2094, 2095, 2096, 2093, 2082, 2088, 2100,
-     2097, 2099, 2087, 2100, 2089, 2101, 2101, 2102, 2103, 2091,
-     2104, 2104, 2092, 2102, 2096, 2097, 2105, 2103, 2095, 2106,
-     2099, 2107, 2109, 2106, 2110, 2105, 2108, 2108, 2111, 2112,
-     2113, 2114, 2107, 2115, 2112, 2116, 2117, 2107, 2110, 2119,
-
-     2118, 2116, 2123, 2109, 2119, 2120, 2123, 2111, 2121, 2121,
-     2113, 2114, 2125, 2115, 2117, 2118, 2122, 2122, 2120, 2126,
-     2127, 2125, 2128, 2129, 2129, 2131, 2131, 2128, 2132, 2136,
-     2126, 2133, 2135, 2132, 2132, 2126, 2137, 2133, 2135, 2138,
-     2127, 2137, 2139, 2142, 2141, 2143, 2145, 2142, 2139, 2144,
-     2144, 2138, 2146, 2147, 2148, 2136, 2141, 2143, 2146, 2149,
-     2148, 2150, 2151, 2151, 2152, 2153, 2150, 2154, 2155, 2157,
-     2158, 2145, 2154, 2159, 2149, 2147, 2161, 2161, 2159, 2162,
-     2155, 2157, 2162, 2152, 2168, 2153, 2163, 2163, 2169, 2158,
-     2164, 2164, 2165, 2165, 2166, 2166, 2167, 2170, 2171, 2168,
-
-     2172, 2173, 2167, 2170, 2171, 2172, 2174, 2173, 2169, 2176,
-     2177, 2177, 2181, 2179, 2176, 2174, 2179, 2180, 2182, 2183,
-     2183, 2180, 2185, 2186, 2187, 2188, 2188, 2189, 2192, 2187,
-     2182, 2192, 2190, 2181, 2185, 2186, 2189, 2190, 2191, 2193,
-     2193, 2194, 2195, 2191, 2196, 2197, 2198, 2199, 2200, 2201,
-     2198, 2195, 2199, 2203, 2200, 2204, 2202, 2207, 2206, 2206,
-     2210, 2194, 2196, 2208, 2197, 2202, 2213, 2201, 2209, 2204,
-     2206, 2203, 2208, 2211, 2211, 2207, 2212, 2209, 2213, 2214,
-     2210, 2215, 2216, 2219, 2219, 2212, 2215, 2221, 2222, 2223,
-     2221, 2224, 2227, 2226, 2229, 2216, 2228, 2230, 2230, 2231,
-
-     2214, 2231, 2228, 2232, 2222, 2223, 2227, 2224, 2226, 2233,
-     2235, 2229, 2234, 2234, 2237, 2237, 2240, 2232, 2235, 2238,
-     2238, 2243, 2241, 2242, 2244, 2245, 2246, 2233, 2241, 2242,
-     2249, 2244, 2247, 2247, 2252, 2243, 2248, 2248, 2250, 2240,
-     2251, 2253, 2254, 2256, 2258, 2248, 2246, 2245, 2255, 2252,
-     2250, 2249, 2251, 2253, 2257, 2261, 2262, 2255, 2256, 2257,
-     2257, 2263, 2265, 2259, 2266, 2259, 2259, 2258, 2254, 2259,
-     2264, 2264, 2269, 2263, 2267, 2261, 2268, 2267, 2271, 2262,
-     2265, 2268, 2259, 2271, 2266, 2272, 2273, 2272, 2274, 2275,
-     2278, 2280, 2269, 2274, 2281, 2282, 2275, 2284, 2283, 2278,
-
-     2283, 2285, 2286, 2281, 2273, 2287, 2290, 2282, 2286, 2280,
-     2289, 2292, 2289, 2291, 2291, 2298, 2284, 2293, 2296, 2300,
-     2290, 2285, 2293, 2296, 2294, 2287, 2294, 2297, 2299, 2301,
-     2303, 2302, 2297, 2298, 2308, 2301, 2302, 2292, 2304, 2300,
-     2309, 2306, 2305, 2303, 2310, 2314, 2299, 2305, 2305, 2306,
-     2304, 2311, 2311, 2308, 2309, 2313, 2310, 2312, 2312, 2315,
-     2314, 2316, 2318, 2317, 2318, 2319, 2313, 2316, 2317, 2320,
-     2321, 2322, 2322, 2323, 2328, 2320, 2324, 2324, 2321, 2315,
-     2325, 2325, 2326, 2319, 2327, 2323, 2321, 2331, 2333, 2327,
-     2330, 2326, 2328, 2332, 2330, 2332, 2331, 2334, 2335, 2331,
-
-     2337, 2339, 2334, 2334, 2336, 2340, 2341, 2348, 2344, 2333,
-     2335, 2341, 2337, 2336, 2339, 2342, 2345, 2340, 2346, 2349,
-     2342, 2344, 2347, 2347, 2345, 2348, 2350, 2346, 2352, 2351,
-     2355, 2357, 2353, 2354, 2359, 2355, 2345, 2349, 2358, 2363,
-     2362, 2369, 2360, 2357, 2350, 2351, 2353, 2360, 2354, 2362,
-     2358, 2361, 2366, 2352, 2359, 2368, 2361, 2363, 2366, 2370,
-     2371, 2368, 2372, 2373, 2369, 2374, 2374, 2375, 2376, 2376,
-     2377, 2366, 2373, 2378, 2370, 2379, 2375, 2380, 2371, 2379,
-     2381, 2382, 2380, 2383, 2386, 2385, 2387, 2372, 2377, 2388,
-     2386, 2389, 2378, 2381, 2388, 2388, 2382, 2389, 2391, 2390,
-
-     2394, 2391, 2393, 2383, 2385, 2390, 2396, 2398, 2387, 2399,
-     2393, 2400, 2400, 2401, 2401, 2402, 2403, 2403, 2404, 2404,
-     2394, 2405, 2406, 2408, 2402, 2410, 2396, 2399, 2401, 2408,
-     2398, 2409, 2411, 2405, 2412, 2412, 2418, 2411, 2414, 2401,
-     2406, 2413, 2413, 2414, 2415, 2410, 2409, 2417, 2419, 2420,
-     2415, 2417, 2419, 2422, 2423, 2425, 2418, 2424, 2426, 2423,
-     2428, 2427, 2429, 2426, 2431, 2437, 2430, 2432, 2432, 2420,
-     2425, 2430, 2434, 2433, 2436, 2438, 2428, 2433, 2422, 2427,
-     2424, 2440, 2429, 2435, 2439, 2441, 2431, 2434, 2435, 2442,
-     2441, 2437, 2436, 2438, 2443, 2446, 2439, 2444, 2444, 2447,
-
-     2440, 2448, 2442, 2446, 2449, 2450, 2451, 2452, 2453, 2454,
-     2455, 2456, 2443, 2457, 2461, 2465, 2506, 2456, 2447, 2457,
-     2448, 2454, 2459, 2449, 2462, 2506, 2452, 2461, 2450, 2453,
-     2451, 2455, 2464, 2463, 2464, 2465, 2469, 2459, 2462, 2463,
-     2466, 2466, 2467, 2468, 2470, 2471, 2468, 2467, 2472, 2469,
-     2473, 2473, 2474, 2474, 2475, 2477, 2475, 2476, 2476, 2471,
-     2478, 2472, 2484, 2479,    0, 2480, 2480, 2492, 2470, 2480,
-     2477, 2482, 2482, 2483, 2483, 2478, 2479, 2484, 2485, 2485,
-     2486, 2487, 2487, 2488, 2488, 2489, 2491, 2492, 2493, 2486,
-     2489, 2491, 2486, 2494, 2495, 2495, 2496, 2496, 2497, 2498,
-
-     2498, 2499, 2500, 2500, 2502, 2494, 2501, 2508, 2493, 2502,
-     2503, 2503, 2504, 2504, 2505, 2507, 2507, 2497, 2510, 2499,
-     2511, 2501, 2509, 2509, 2508, 2513, 2514, 2514, 2505, 2515,
-     2513, 2517, 2510, 2516, 2516, 2518, 2519, 2523, 2520, 2511,
-     2518, 2520, 2519, 2521, 2521, 2522, 2522, 2524, 2515, 2517,
-     2525, 2527, 2525, 2528, 2529, 2529, 2523, 2530, 2532, 2521,
-     2533, 2534, 2524, 2530, 2535, 2536, 2527, 2537, 2537, 2536,
-     2538, 2539, 2528, 2540, 2545, 2533, 2539, 2540, 2532, 2535,
-     2541, 2542, 2542, 2546, 2534, 2544, 2544, 2547, 2548, 2538,
-     2546, 2549, 2550, 2551, 2545, 2541, 2542, 2552, 2552, 2553,
-
-     2554, 2547, 2554, 2558, 2562, 2557, 2548, 2550, 2553, 2549,
-     2555, 2557, 2559, 2555, 2563, 2558, 2560, 2559, 2561, 2551,
-     2564, 2560, 2565, 2561, 2567, 2575,    0, 2563, 2555, 2562,
-     2555, 2565, 2566, 2569, 2570, 2571, 2572, 2566, 2569, 2570,
-     2571, 2564, 2573, 2574, 2576, 2580, 2575, 2577, 2573, 2574,
-     2567, 2572, 2578, 2577, 2581, 2579, 2583, 2578, 2582, 2576,
-     2579, 2582, 2584, 2585, 2586, 2587, 2588, 2581, 2593, 2589,
-     2580, 2584, 2585, 2586, 2587, 2589, 2583, 2590, 2591, 2595,
-     2588, 2596, 2591, 2590, 2597, 2597, 2598, 2600, 2593, 2601,
-     2596, 2601, 2598, 2599, 2599, 2602, 2603, 2603, 2600, 2595,
-
-     2604, 2605, 2599, 2607, 2602, 2604, 2608, 2609, 2609, 2610,
-     2613, 2611, 2614, 2617, 2616, 2618, 2612, 2614, 2613, 2607,
-     2611, 2605, 2608, 2605, 2610, 2612, 2616, 2619, 2621, 2617,
-     2618, 2621, 2622, 2623, 2624, 2625, 2625, 2622,    0, 2619,
-     2626, 2626, 2627, 2627, 2628, 2628, 2624, 2630, 2630, 2631,
-     2632, 2633, 2631, 2623, 2634, 2632, 2635, 2633, 2636, 2636,
-     2634, 2637, 2638, 2638, 2639, 2635, 2640, 2641, 2642, 2642,
-     2644, 2643, 2652, 2645,    0, 2637, 2639, 2643, 2645, 2647,
-     2640, 2652, 2648, 2647, 2644, 2648, 2641, 2649, 2649, 2650,
-     2651, 2653, 2654, 2655, 2650, 2651, 2657, 2655, 2656, 2656,
-
-     2653, 2659, 2660, 2661, 2662, 2663, 2659, 2664, 2665, 2657,
-     2666, 2664, 2654, 2671, 2667, 2666, 2669, 2669, 2672, 2663,
-     2667, 2668, 2660, 2661, 2662, 2670, 2670, 2668, 2665, 2673,
-     2674, 2671, 2675, 2676, 2676, 2674, 2679, 2672, 2678, 2680,
-     2681, 2682, 2695, 2683, 2680, 2688, 2681, 2682, 2673, 2686,
-     2678, 2683, 2679, 2675, 2684, 2689, 2684, 2695, 2686, 2688,
-     2690, 2690, 2691, 2692, 2692, 2691, 2697, 2694, 2696, 2689,
-     2694, 2696, 2698, 2698, 2701, 2702, 2703, 2705, 2701, 2704,
-     2704, 2702, 2708, 2708, 2710, 2712, 2705, 2713, 2703, 2716,
-     2717, 2718, 2697, 2719, 2716, 2721, 2722, 2723, 2723, 2712,
-
-     2721, 2722, 2710, 2713, 2725, 2725, 2727, 2728, 2730, 2718,
-     2729, 2729, 2727, 2731, 2719, 2732, 2717, 2734, 2735, 2736,
-     2732, 2735, 2737, 2740, 2730, 2738, 2738, 2728, 2741, 2744,
-     2745, 2736, 2742,    0, 2737, 2731, 2734, 2741, 2742, 2740,
-     2743, 2747, 2747, 2750, 2751, 2745, 2743, 2744, 2748, 2752,
-     2749, 2748, 2749, 2754, 2754, 2755, 2755, 2757, 2759, 2758,
-     2756, 2760, 2750, 2751, 2751, 2756, 2760, 2752, 2758, 2762,
-     2761, 2759, 2761, 2763, 2764, 2757, 2765, 2766, 2767, 2768,
-     2770, 2765, 2774, 2762, 2768,    0, 2764, 2763, 2769, 2769,
-     2771, 2771, 2772, 2772, 2774, 2770, 2776, 2766, 2767, 2773,
-
-     2773, 2775, 2777, 2775, 2778, 2778, 2781, 2777, 2779, 2779,
-     2780, 2780, 2782, 2783, 2776, 2784, 2785, 2786, 2781, 2787,
-     2787, 2788, 2789, 2789, 2793, 2783, 2790, 2790, 2791, 2792,
-     2792, 2794, 2782, 2786, 2795, 2784, 2793, 2785, 2794, 2791,
-     2788, 2796, 2797, 2798, 2799, 2801, 2795, 2797, 2800, 2800,
-     2802, 2802, 2803, 2804, 2801, 2805, 2806, 2807, 2808, 2810,
-     2809, 2796, 2819, 2798, 2799, 2812, 2814, 2808, 2805, 2813,
-     2813, 2807, 2809, 2804, 2811, 2814, 2811, 2812, 2803, 2815,
-     2806, 2810, 2816, 2818, 2819, 2820, 2821, 2822, 2822, 2823,
-     2824, 2821, 2825, 2824, 2815, 2826,    0, 2816, 2827, 2837,
-
-     2826, 2818, 2839, 2827, 2828, 2828, 2825, 2820, 2829, 2829,
-     2830, 2830, 2823, 2834, 2834, 2836, 2836, 2837, 2838, 2840,
-     2842, 2839, 2844, 2843, 2846, 2845, 2847, 2849, 2848, 2838,
-     2848, 2850, 2851, 2846, 2840, 2852, 2852, 2857, 2854, 2856,
-     2842, 2843, 2854,    0, 2844, 2845, 2847, 2849, 2858, 2850,
-     2851, 2855, 2855, 2856, 2859, 2859, 2861, 2858, 2863, 2857,
-     2862, 2862, 2864, 2865, 2866, 2861, 2868, 2867, 2869, 2870,
-     2871, 2866, 2873, 2872, 2874, 2874, 2863, 2872, 2876, 2873,
-     2864, 2865, 2867, 2877, 2868, 2870, 2869, 2875, 2875, 2871,
-     2878, 2880, 2880, 2881, 2881, 2883, 2878, 2882, 2876, 2884,
-
-     2885, 2877, 2886, 2882, 2887, 2888, 2889, 2889, 2890, 2891,
-     2888, 2892, 2893, 2883, 2894, 2885, 2895, 2884, 2887, 2896,
-     2897, 2886, 2897, 2893, 2896, 2894, 2898, 2898, 2890, 2891,
-     2899, 2892, 2899, 2900, 2900, 2902, 2895, 2904, 2905, 2906,
-     2907, 2909, 2908, 2910, 2911, 2915, 2904, 2908, 2910, 2912,
-     2917, 2906, 2916, 2917, 2902, 2918, 2918, 2905, 2919, 2920,
-     2907, 2909, 2921, 2921, 2911, 2915, 2923, 2922, 2912, 2926,
-     2916, 2924, 2927, 2919, 2928, 2924, 2931, 2920, 2922, 2929,
-     2928, 2923, 2933, 2929, 2926, 2930, 2930, 2927, 2935, 2931,
-     2934, 2934, 2936, 2937, 2938, 2939, 2939, 2933, 2941, 2943,
-
-     2942, 2937, 2946, 2943, 2944, 2944, 2945, 2945, 2935, 2942,
-     2941, 2936, 2947, 2947, 2938, 2948, 2949, 2950, 2951, 2952,
-     2948, 2946, 2953, 2953, 2955, 2949, 2959, 2959, 2960, 2961,
-     2951, 2962, 2962, 2950, 2963, 2964, 2965, 2960, 2970, 2952,
-     3002, 2966, 2971, 2967, 2968, 2955, 3002, 2963, 2964, 2965,
-     2966, 2961, 2967, 2968, 2969, 2969, 2976, 2971, 2970, 2973,
-     2973, 2976, 2978, 2979, 2980, 2981, 2982, 2978, 2984, 2980,
-     2983, 2986, 2990, 2981, 2996, 2988, 2984, 2979, 2989, 2983,
-     2988, 2991, 2991, 2989, 2994, 2982, 2986, 2990, 2992, 2992,
-     2993, 2995, 3000, 2996, 2998, 2993, 2995, 2997, 2997, 2994,
-
-     2999, 2998, 3001, 3003, 3004, 2999,    0, 3005, 3003, 3004,
-     3000, 3007, 3007, 3008, 3009, 3010, 3010, 3011, 3011, 3009,
-     3001, 3005, 3014, 3015, 3015, 3017, 3016, 3018, 3008, 3016,
-     3017, 3017, 3018, 3019, 3020, 3014, 3021, 3022, 3019, 3023,
-     3024, 3022, 3021, 3025, 3023, 3026, 3027, 3030, 3020, 3024,
-     3028, 3029, 3030, 3026, 3031, 3034, 3028, 3029, 3025, 3032,
-     3032, 3036, 3034, 3035, 3036, 3038, 3031, 3027, 3035, 3040,
-     3041, 3042, 3043, 3044, 3040, 3041, 3042, 3038, 3045, 3046,
-     3047, 3047, 3048, 3053, 3058, 3049, 3044, 3045, 3046, 3049,
-     3043, 3048, 3050, 3054, 3055, 3059, 3060, 3050, 3061, 3054,
-
-     3055, 3053, 3063, 3058, 3062, 3062, 3064, 3068, 3068, 3063,
-     3066, 3067, 3069, 3070, 3071, 3059, 3060, 3061, 3073, 3066,
-     3067, 3075, 3070, 3072, 3072, 3064, 3077, 3069, 3078, 3071,
-     3079, 3079, 3078, 3080, 3081, 3082, 3075, 3073, 3083, 3085,
-     3081, 3082, 3084, 3086, 3086, 3085, 3077, 3087, 3088, 3089,
-     3091, 3092, 3097, 3098, 3089, 3087, 3094, 3083, 3080, 3091,
-     3084, 3096, 3094, 3095, 3092, 3096, 3095, 3098, 3099, 3099,
-     3097, 3100, 3103, 3088, 3102, 3102, 3105, 3105, 3106, 3107,
-     3107, 3108, 3108, 3110, 3110, 3111, 3100, 3112, 3113, 3111,
-     3103, 3117, 3112, 3115, 3115, 3118, 3119, 3113, 3120, 3123,
-
-     3118, 3106, 3121, 3120, 3120, 3124, 3125,    0, 3119, 3126,
-     3126, 3117, 3128, 3128, 3121, 3129, 3129, 3130, 3130, 3123,
-     3131, 3132, 3133, 3131, 3136, 3124, 3125, 3135, 3135, 3138,
-     3139, 3139, 3140, 3140, 3132, 3133, 3141, 3141, 3142, 3143,
-     3143, 3144, 3136, 3145, 3146, 3147, 3148, 3148, 3149, 3138,
-     3152, 3147, 3149, 3142, 3144, 3152, 3152, 3153, 3146, 3154,
-     3153, 3145, 3155, 3157, 3158, 3154, 3159, 3155, 3157, 3157,
-     3160, 3161, 3162, 3163, 3164, 3165, 3175, 3161, 3162, 3163,
-     3164, 3166, 3167, 3167, 3170, 3166, 3159, 3158, 3172, 3170,
-     3160, 3173, 3176, 3178, 3173, 3176, 3172, 3177, 3177, 3179,
-
-     3165, 3175, 3180, 3181, 3179, 3182, 3183, 3183, 3184, 3187,
-     3178, 3178, 3186, 3185, 3193, 3193, 3185, 3188, 3192, 3182,
-     3180,    0, 3184, 3181, 3185, 3188, 3186, 3190, 3187, 3191,
-     3194, 3194, 3190, 3190, 3191, 3191, 3199, 3192, 3195, 3195,
-     3196, 3196, 3197, 3197, 3198, 3198, 3200, 3201, 3202, 3203,
-     3204, 3200, 3199, 3206, 3205, 3207, 3208, 3209, 3203, 3205,
-     3207, 3210, 3211, 3215, 3204, 3208, 3215, 3201, 3213, 3213,
-     3214, 3214, 3206, 3216, 3202, 3217, 3217, 3209, 3218, 3220,
-     3219, 3210, 3211, 3223, 3218, 3219, 3222, 3222, 3216, 3225,
-     3223, 3224, 3224, 3228, 3225, 3227, 3227, 3220, 3229, 3230,
-
-     3230, 3231, 3228, 3232, 3234, 3235, 3235, 3229, 3236, 3236,
-     3231, 3237, 3232, 3239, 3238, 3237, 3240, 3242, 3241, 3243,
-     3246, 3245, 3234, 3238, 3243, 3243, 3247, 3240, 3249, 3246,
-     3247, 3253, 3239, 3241, 3245, 3255, 3253, 3242, 3254, 3254,
-     3257, 3257, 3258, 3249, 3259, 3260, 3262, 3262, 3264, 3255,
-     3263, 3263, 3265, 3266, 3270, 3271, 3258, 3264, 3265, 3272,
-     3271, 3274, 3277, 3260, 3275, 3266, 3279, 3281, 3272, 3259,
-     3275, 3282, 3281, 3284, 3277, 3286, 3282, 3283, 3283, 3270,
-     3286, 3274, 3284, 3287, 3289, 3290, 3291, 3279, 3292, 3292,
-     3294, 3294, 3292, 3295, 3295, 3289, 3297, 3287, 3290, 3298,
-
-     3291, 3296, 3296, 3299, 3302, 3297, 3300, 3301, 3304, 3302,
-     3305, 3306, 3307, 3307, 3304, 3305, 3306, 3308, 3309, 3298,
-     3310, 3312, 3311, 3299, 3314, 3300, 3301, 3311, 3313, 3317,
-     3309, 3315, 3315, 3317, 3313, 3308, 3321, 3318, 3319, 3312,
-     3325, 3310, 3318, 3319, 3320, 3320, 3322, 3323, 3333, 3314,
-     3327, 3327, 3329, 3330, 3331, 3321, 3334, 3333, 3335, 3332,
-     3325, 3322, 3323, 3332, 3337, 3329, 3330, 3331, 3336, 3337,
-     3338, 3339, 3334, 3340, 3340, 3341, 3336, 3335, 3342, 3343,
-     3344, 3344, 3345, 3345, 3341, 3346, 3350, 3349, 3352, 3356,
-     3338, 3339, 3349, 3349, 3352, 3360, 3342, 3353, 3353, 3361,
-
-     3350, 3354, 3354, 3363, 3346, 3343, 3358, 3358, 3363, 3364,
-     3356, 3360, 3365, 3368, 3368, 3361, 3369, 3365, 3370, 3372,
-     3371, 3373, 3373, 3377, 3374, 3364, 3371, 3370, 3376, 3376,
-     3378, 3384, 3379, 3380, 3380, 3382, 3369, 3377, 3385, 3389,
-     3386, 3382, 3372, 3374, 3385, 3386, 3390, 3391, 3391, 3378,
-     3379, 3384, 3392, 3392, 3393, 3394, 3395, 3395, 3397, 3396,
-     3398, 3389, 3399, 3400, 3402, 3401, 3404, 3397, 3399, 3393,
-     3396, 3404, 3390, 3403, 3403, 3394, 3395, 3401, 3405, 3405,
-     3398, 3406, 3400, 3407, 3402, 3408, 3407, 3413, 3408, 3409,
-     3409, 3414, 3415, 3416, 3417, 3421, 3406, 3426, 3416, 3413,
-
-     3417, 3418, 3418, 3419, 3420, 3433, 3419, 3424, 3424, 3423,
-     3420, 3414, 3415, 3421, 3423, 3425, 3426, 3427, 3428, 3431,
-     3425, 3429, 3429, 3427, 3432, 3434, 3435, 3435, 3436, 3437,
-     3433, 3431, 3438, 3440, 3440, 3428, 3428,    0, 3434, 3441,
-     3441, 3438, 3432, 3442, 3442, 3437, 3443, 3436, 3444, 3445,
-     3449, 3443, 3446, 3446, 3445, 3447, 3447, 3448, 3448, 3449,
-     3450, 3450, 3444, 3451, 3452, 3453, 3458, 3454, 3457, 3457,
-     3464, 3453, 3454, 3460, 3460, 3466, 3451, 3461, 3461, 3467,
-     3468, 3469, 3458, 3470, 3470, 3472, 3472, 3473, 3474, 3464,
-     3452, 3475, 3477, 3478, 3479, 3479, 3481, 3466, 3483, 3468,
-
-     3481, 3467, 3478, 3469, 3484, 3475, 3485, 3474, 3480, 3480,
-     3484, 3486, 3477, 3473, 3487, 3488, 3483, 3491,    0, 3487,
-     3488, 3492, 3492, 3494, 3494, 3496, 3485, 3495, 3497, 3498,
-     3486, 3503, 3495, 3507, 3497, 3499, 3500, 3500, 3491, 3496,
-     3501, 3498, 3505, 3499, 3506, 3501, 3505, 3508, 3510, 3506,
-     3509, 3503, 3511, 3507, 3512, 3509, 3513, 3515, 3516, 3517,
-     3510, 3518, 3513, 3527, 3511, 3515, 3520, 3508, 3523, 3521,
-     3522, 3524, 3512, 3526, 3528, 3531, 3524, 3516, 3526, 3517,
-     3528, 3518,    0, 3527, 3520, 3521, 3529, 3522, 3522, 3523,
-     3532, 3529, 3533, 3532, 3543, 3531, 3537, 3537, 3538, 3538,
-
-     3539, 3545, 3545, 3546, 3539, 3533, 3547, 3550, 3546, 3543,
-     3548, 3548, 3553, 3553, 3554, 3554, 3558, 3554, 3555, 3555,
-     3558, 3555, 3550, 3556, 3556, 3547, 3557, 3557, 3560, 3557,
-     3561, 3562, 3562, 3560, 3563, 3564, 3567, 3567, 3569, 3561,
-     3568, 3568, 3570, 3571, 3572, 3572, 3573, 3574, 3571, 3564,
-     3577, 3579, 3563, 3578, 3580, 3579, 3581,    0, 3569, 3583,
-     3578, 3593, 3570, 3580, 3573, 3585, 3584, 3574, 3584, 3587,
-     3585, 3581, 3586, 3586, 3592, 3577, 3593, 3583, 3587, 3588,
-     3588, 3589, 3589, 3590, 3590, 3591, 3591, 3594, 3595, 3596,
-     3598, 3599, 3594, 3597, 3596, 3596, 3592, 3595, 3600, 3597,
-
-     3595, 3603, 3601, 3602, 3604, 3604, 3599, 3601, 3602, 3609,
-     3605, 3606, 3607, 3607, 3614, 3598, 3605, 3606, 3610, 3600,
-     3603, 3608, 3608, 3610, 3609, 3613, 3613, 3617, 3614, 3616,
-     3616, 3619, 3621, 3621, 3622, 3622, 3617, 3623, 3623, 3624,
-     3624, 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629, 3619,
-     3630, 3632, 3633, 3633, 3635, 3635, 3636, 3637, 3638, 3640,
-     3632, 3641, 3641, 3642, 3644, 3636, 3643, 3643, 3645, 3637,
-     3659, 3646, 3647, 3647, 3640, 3648, 3630, 3651, 3638, 3644,
-     3657, 3645, 3642, 3646, 3649, 3649, 3656, 3648, 3652, 3652,
-     3658, 3656, 3651, 3658, 3660, 3660, 3659, 3661, 3657, 3663,
-
-     3664, 3667, 3663, 3665, 3666, 3668, 3664, 3671, 3669, 3666,
-     3672, 3676, 3675, 3671, 3680, 3661, 3675, 3665, 3681, 3672,
-     3667, 3678, 3678, 3668, 3669, 3690, 3676, 3701, 3691, 3694,
-     3690, 3691, 3695, 3695, 3696, 3696, 3697, 3697, 3681, 3702,
-     3680, 3703, 3694, 3699, 3699, 3703, 3704, 3705, 3702, 3707,
-     3701, 3709, 3710, 3711, 3712, 3714, 3713, 3709, 3713, 3712,
-     3715, 3715, 3705, 3707, 3711, 3716, 3704, 3717, 3719, 3718,
-     3714, 3720, 3722, 3721, 3724, 3710, 3725, 3723, 3716, 3724,
-     3726, 3722, 3728, 3730, 3719, 3727, 3717, 3718, 3721, 3723,
-     3727, 3736, 3726, 3729, 3729, 3731, 3720, 3725, 3737, 3739,
-
-     3731, 3728, 3751, 3730, 3747, 3736, 3738, 3738, 3739, 3740,
-     3741, 3741, 3740, 3746, 3742, 3743, 3743,    0, 3737, 3742,
-     3744, 3744, 3745, 3745, 3747, 3748, 3749, 3751, 3748, 3750,
-     3752, 3749, 3746, 3753, 3750, 3754, 3755, 3756, 3758, 3753,
-     3757, 3757, 3756, 3759, 3759, 3752, 3760, 3760, 3755, 3754,
-     3761, 3761, 3763, 3763, 3764, 3765, 3766, 3766, 3758, 3769,
-     3768, 3771, 3772, 3775, 3775, 3776, 3776, 3778, 3777, 3764,
-     3769, 3779, 3780, 3781, 3765, 3768, 3777, 3779, 3780, 3782,
-     3772, 3783, 3792, 3784, 3793, 3771, 3778, 3781, 3784, 3785,
-     3785, 3795, 3782, 3787, 3787, 3796, 3796, 3797, 3798, 3800,
-
-     3783, 3801, 3798, 3792, 3793, 3795, 3801, 3802, 3803, 3804,
-     3805, 3806, 3807, 3797, 3808, 3808, 3806, 3807, 3811, 3800,
-     3813, 3803, 3804, 3812, 3815, 3817, 3802, 3816, 3816, 3805,
-     3817, 3818, 3823, 3815, 3819, 3819,    0, 3818, 3811, 3813,
-     3820, 3812, 3821, 3822, 3824, 3820, 3829, 3821, 3822, 3827,
-     3824, 3823, 3826, 3826, 3827, 3828, 3828, 3831, 3832, 3833,
-     3834, 3831, 3835, 3836, 3829, 3837, 3833, 3838, 3842, 3836,
-     3840, 3840, 3846, 3842, 3843, 3843, 3844, 3832, 3845, 3834,
-     3838, 3835, 3847, 3845, 3837, 3844, 3848, 3850, 3844, 3849,
-     3849, 3846, 3850, 3851, 3852, 3854, 3855, 3855, 3852, 3848,
-
-     3856, 3847, 3857, 3857, 3858, 3858, 3851, 3859, 3860, 3861,
-     3862, 3862, 3859, 3863, 3863, 3860, 3865, 3864, 3865, 3856,
-     3867, 3854, 3864, 3866, 3866, 3868, 3869, 3867, 3861, 3870,
-     3871, 3875, 3868, 3877, 3870, 3874, 3874, 3878, 3877, 3879,
-     3880, 3884, 3878, 3881, 3881, 3869, 3883, 3883, 3885, 3871,
-     3875, 3886, 3886, 3887, 3887, 3888, 3890, 3890, 3879, 3880,
-     3884, 3892, 3888, 3891, 3891, 3894, 3897, 3885, 3892, 3898,
-     3894, 3897, 3899, 3900, 3900, 3901, 3901,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0, 3898,    0,
-        0, 3899, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3906,
-
-     3906, 3906, 3906, 3906, 3906, 3906, 3907, 3907, 3907, 3907,
-     3907, 3907, 3907, 3908, 3908, 3908, 3908, 3908, 3908, 3908,
-     3909, 3909, 3909, 3909, 3909, 3909, 3909, 3910, 3910, 3910,
-     3910, 3910, 3910, 3910, 3911, 3911, 3911, 3911, 3911, 3911,
-     3911, 3913, 3913,    0, 3913, 3913, 3913, 3913, 3914, 3914,
-        0,    0,    0, 3914, 3914, 3915, 3915,    0,    0, 3915,
-        0, 3915, 3916,    0,    0,    0,    0,    0, 3916, 3917,
-     3917,    0,    0,    0, 3917, 3917, 3918,    0,    0,    0,
-        0,    0, 3918, 3919, 3919,    0, 3919, 3919, 3919, 3919,
-     3920,    0,    0,    0,    0,    0, 3920, 3921, 3921,    0,
-
-        0,    0, 3921, 3921, 3922, 3922,    0, 3922, 3922, 3922,
-     3922, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904,
-     3904, 3904
+     1022, 1020, 1023, 1019, 1021, 1021, 1024, 1023, 1026, 1021,
+     1027, 1018, 1022, 1025, 1025, 1019, 1020, 1028, 1029, 1021,
+     1024, 1030, 1032, 1029, 1027, 1031, 1028, 1030, 1032, 1026,
+     1031, 1033, 1034, 1034, 1035, 1036, 1037, 1033, 1038, 1035,
+
+     1041, 1036, 1039, 1042, 1044, 1043, 1045, 1045, 1042, 1046,
+     1048, 1050, 1041, 1051, 1046, 1047, 1044, 1038, 1037, 1043,
+     1039, 1040, 1040, 1047, 1048, 1050, 1049, 1040, 1053, 1040,
+     1052, 1054, 1051, 1055, 1056, 1040, 1057, 1054, 1055, 1058,
+     1040, 1040, 1049, 1059, 1053, 1060, 1056, 1040, 1062, 1052,
+     1061, 1061, 1062, 1063, 1057, 1058, 1065, 1067, 1069, 1068,
+     1070, 1059, 1065, 1060, 1068, 1071, 1070, 1072, 1074, 1075,
+     1071, 1069, 1076, 1063, 1077, 1078, 1067, 1074, 1075, 1079,
+     1077, 1081, 1080, 1082, 1078, 1084, 1072, 1080, 1076, 1083,
+     1083, 1085, 1089, 1086, 1088, 1087, 1094, 1082, 1079, 1092,
+
+     1088, 1081, 1086, 1085, 1087, 1084, 1090, 1095, 1096, 1089,
+     1094, 1097, 1090, 1098, 1100, 1092, 1097, 1099, 1103, 1098,
+     1101, 1104, 1102, 1103, 1107, 1108, 1104, 1095, 1100, 1107,
+     1108, 1109, 1117, 1096, 1110, 1110, 1099, 1102, 1101, 1111,
+     1109, 1112, 1113, 1114, 1115, 1111, 1121, 1112, 1117, 1118,
+     1123, 1113, 1120, 1120, 1118, 1118, 1120, 1115, 1114, 1122,
+     1124, 1121, 1122, 1125, 1123, 1126, 1127, 1129, 1128, 1130,
+     1131, 1132, 1126, 1133, 1139, 1130,   59, 1132, 1134, 1125,
+     1124, 1128, 1129, 1134, 1127, 1135, 1137, 1137, 1133, 1138,
+     1131, 1140, 1138, 1141, 1142, 1139, 1140, 1143, 1141, 1135,
+
+     1144, 1146, 1145, 1148, 1149, 1144, 1143, 1145, 1150, 1148,
+     1142, 1151, 1152, 1146, 1150, 1153, 1153, 1154, 1152, 1155,
+     1149, 1156, 1157, 1157, 1156, 1158, 1154, 1159, 1160, 1162,
+     1161, 1166, 1151, 1161, 1163, 1164, 1166, 1155, 1165, 1174,
+     1163, 1164, 1162, 1158, 1165, 1167, 1159, 1168, 1160, 1169,
+     1167, 1170, 1173, 1168, 1169, 1172, 1175, 1170, 1176, 1174,
+     1172, 1181, 1175, 1176, 1177, 1177, 1178, 1179, 1180, 1182,
+     1173, 1183, 1185, 1180, 1183, 1178, 1179, 1184, 1187, 1181,
+     1184, 1186, 1188, 1185, 1189, 1190, 1186, 1191, 1182, 1192,
+     1193, 1190, 1195, 1191, 1188, 1193, 1187, 1194, 1194, 1196,
+
+     1197, 1198, 1199, 1189, 1192, 1200, 1199, 1201, 1202, 1203,
+     1205, 1195, 1197, 1196, 1208, 1206, 1201, 1207, 1207, 1198,
+     1209, 1210, 1208, 1200, 1206, 1209, 1210, 1202, 1211, 1205,
+     1213, 1214, 1216, 1215, 1203, 1218, 1220, 1216, 1217, 1219,
+     1219, 1229, 1225, 1221, 1213, 1215, 1214, 1217, 1211, 1221,
+     1218, 1222, 1223, 1224, 1226, 1229, 1220, 1222, 1225, 1226,
+     1223, 1227, 1228, 1227, 1230, 1231, 1232, 1228, 1224, 1233,
+     1231, 1234, 1235, 1237, 1234, 1236, 1239, 1239, 1230, 1235,
+     1240, 1232, 1241, 1243, 1242, 1244, 1241, 1246, 1233, 1245,
+     1236, 1251, 1237, 1242, 1240, 1245, 1251, 1247, 1255, 1249,
+
+     1244, 1243, 1247, 1249, 1250, 1250, 1254, 1246, 1252, 1252,
+     1253, 1247, 1255, 1247, 1257, 1256, 1247, 1253, 1256, 1254,
+     1258, 1259, 1261, 1262, 1263, 1264, 1266, 1261, 1267, 1265,
+     1259, 1264, 1268, 1257, 1265, 1273, 1263,   58, 1258, 1267,
+     1266, 1271, 1262, 1270, 1270, 1272, 1271, 1274, 1276, 1275,
+     1272, 1268, 1274, 1275, 1277, 1273, 1278, 1276, 1279, 1281,
+     1280, 1282, 1284, 1280, 1283, 1285, 1286, 1287, 1282, 1277,
+     1288, 1278, 1280, 1287, 1281, 1291, 1283, 1279, 1289, 1292,
+     1298, 1284, 1290, 1293, 1286, 1288, 1285, 1294, 1290, 1289,
+     1295, 1296, 1293, 1297, 1300, 1291, 1299, 1301, 1303, 1292,
+
+     1300, 1304, 1294, 1296, 1303, 1298, 1305, 1306, 1307, 1295,
+     1308, 1299, 1297, 1309, 1312, 1306, 1304, 1301, 1309, 1310,
+     1305, 1313, 1321, 1314, 1311, 1318, 1308, 1321, 1307, 1311,
+     1311, 1310, 1317, 1312, 1318, 1313, 1314, 1315, 1315, 1316,
+     1316, 1320, 1320, 1319, 1316, 1317, 1322, 1316, 1316, 1319,
+     1322, 1323, 1316, 1324, 1327, 1327, 1325, 1328, 1316, 1324,
+     1323, 1325, 1316, 1326, 1329, 1329, 1330, 1331, 1326, 1330,
+     1332, 1330, 1335, 1333, 1334, 1335, 1336, 1337, 1328, 1333,
+     1334, 1338, 1339, 1340, 1341, 1336, 1338, 1331, 1332, 1342,
+     1341, 1349, 1343, 1346, 1344, 1342, 1339, 1337, 1343, 1344,
+
+     1345, 1340, 1347, 1348, 1345, 1349, 1346, 1356, 1348, 1350,
+     1350, 1347, 1351, 1351, 1352, 1351, 1347, 1354, 1347, 1355,
+     1347, 1354, 1347, 1357, 1358, 1352, 1359, 1356, 1360, 1361,
+     1362, 1359, 1359, 1358, 1355, 1363, 1364, 1360, 1361, 1365,
+     1363, 1357, 1366, 1367, 1368, 1369, 1370, 1370, 1365, 1372,
+     1364, 1369, 1362, 1371, 1373, 1374, 1375, 1372, 1368, 1377,
+     1374, 1366, 1367, 1376, 1378, 1371, 1377, 1379, 1373, 1380,
+     1375, 1382, 1376, 1392, 1380, 1381, 1381, 1383, 1383, 1384,
+     1389, 1385, 1378, 1385, 1384, 1387, 1382, 1390, 1387, 1388,
+     1391, 1391, 1379, 1392, 1388, 1396, 1390, 1393, 1393, 1389,
+
+     1394, 1394, 1395, 1397, 1398, 1399, 1399, 1395, 1400, 1401,
+     1402, 1403, 1404, 1402, 1405, 1407, 1396, 1407, 1404, 1405,
+     1406, 1408, 1411, 1412, 1397, 1398, 1401, 1410, 1400, 1406,
+     1410, 1403, 1414, 1413, 1416, 1415, 1412, 1411, 1413, 1408,
+     1415, 1418, 1416, 1417, 1418, 1419, 1414, 1422, 1417, 1421,
+     1419, 1420, 1420, 1423, 1421, 1424, 1425, 1427, 1428, 1423,
+     1436, 1429, 1424, 1427, 1428, 1422, 1429, 1430, 1431, 1425,
+     1432, 1433, 1430, 1434, 1431, 1435, 1435, 1437, 1439, 1432,
+     1436, 1440, 1441, 1439, 1434, 1442, 1443, 1444, 1445, 1446,
+     1433, 1451, 1441, 1448, 1445, 1446, 1447, 1437, 1452, 1440,
+
+     1442, 1450, 1447, 1453, 1448, 1451, 1443, 1450, 1453, 1454,
+     1444, 1451, 1452, 1455, 1456, 1454, 1457, 1458, 1452, 1459,
+     1459, 1460, 1461, 1463, 1462, 1464, 1456, 1466, 1463, 1467,
+     1457, 1465, 1465, 1455, 1467, 1458, 1469, 1470, 1473, 1471,
+     1472, 1460, 1462, 1464, 1474, 1472, 1472, 1461, 1476, 1475,
+     1466, 1470, 1471, 1474, 1477, 1469, 1473, 1475, 1478, 1479,
+     1482, 1480, 1476, 1481, 1479, 1481, 1484, 1479, 1485, 1477,
+     1480, 1486, 1484, 1478, 1482, 1486, 1478, 1487, 1489, 1490,
+     1488, 1491, 1492, 1495, 1485, 1488, 1488, 1492, 1487, 1493,
+     1494, 1496, 1498, 1497, 1493, 1494, 1500, 1489, 1497, 1491,
+
+     1501, 1495, 1502, 1503, 1503, 1490, 1505, 1506, 1507, 1504,
+     1500, 1496, 1498, 1504, 1507, 1508, 1509, 1510, 1501, 1511,
+     1502, 1514, 1512, 1513, 1505, 1515, 1506, 1508, 1516, 1517,
+     1515, 1518, 1509, 1511, 1517, 1516, 1510, 1512, 1513, 1519,
+     1514, 1520, 1521, 1522, 1522, 1523, 1524, 1525, 1527, 1518,
+     1529, 1521, 1528, 1519, 1527, 1524, 1526, 1526, 1528, 1533,
+     1523, 1534, 1520, 1545, 1529, 1530, 1530, 1525, 1531, 1531,
+     1532,   53, 1535, 1536, 1537, 1533, 1532, 1535, 1538, 1536,
+     1537, 1545, 1534, 1544, 1538, 1539, 1539, 1540, 1540, 1542,
+     1542, 1543, 1544, 1546, 1547, 1543, 1548, 1549, 1550, 1550,
+
+     1551, 1553, 1552, 1554, 1549, 1546, 1553, 1540, 1547, 1540,
+     1552, 1548, 1555, 1556, 1559,   48, 1557, 1554, 1556, 1556,
+     1551, 1557, 1557, 1558, 1560, 1560, 1561, 1558, 1562, 1563,
+     1564, 1555, 1565, 1566, 1559, 1564, 1567, 1568, 1563, 1569,
+     1570, 1571, 1572, 1568, 1569, 1561, 1573, 1562, 1575, 1574,
+     1576, 1565, 1578, 1566, 1567, 1574, 1576, 1572, 1570, 1577,
+     1579, 1571, 1580, 1581, 1582, 1577, 1583, 1575, 1585, 1579,
+     1584, 1578, 1573, 1586, 1587, 1587, 1588, 1589, 1590, 1588,
+     1591, 1580, 1581, 1582, 1584, 1583, 1592, 1592, 1586, 1585,
+     1593, 1593, 1591, 1594, 1596, 1595, 1589, 1590, 1594, 1595,
+
+     1597, 1598, 1600, 1599, 1600, 1602, 1603, 1596, 1600, 1603,
+     1598, 1605, 1604, 1606, 1607, 1597, 1599, 1604, 1608, 1608,
+     1609, 1600, 1610, 1602, 1611, 1609, 1605, 1612, 1610, 1613,
+     1607, 1614, 1617, 1606, 1615, 1613, 1614, 1616, 1615, 1611,
+     1612, 1616, 1618, 1620, 1619, 1621, 1622, 1622, 1624, 1626,
+     1627, 1621, 1617, 1619, 1628, 1626, 1629, 1629, 1630, 1628,
+     1618, 1631, 1635, 1620, 1630, 1635, 1624, 1633, 1633, 1636,
+     1636, 1627, 1637, 1638, 1639, 1641, 1642, 1644, 1641, 1643,
+     1645, 1631, 1646, 1646, 1648, 1649, 1644, 1647, 1637, 1638,
+     1639, 1650, 1651, 1653, 1653, 1652, 1650, 1642, 1654, 1643,
+
+     1645, 1652, 1647, 1655, 1649, 1648, 1651, 1654, 1656, 1657,
+     1658, 1659, 1659, 1660, 1661, 1662, 1663, 1664, 1664, 1666,
+     1662, 1655, 1665, 1656, 1667, 1667, 1665, 1660, 1668, 1669,
+     1658, 1663, 1661, 1670, 1657, 1672, 1671, 1673, 1677, 1666,
+     1671, 1677, 1673, 1678, 1670, 1675, 1675, 1676, 1669, 1680,
+     1668, 1681, 1676, 1676, 1672, 1679, 1678, 1682, 1683, 1684,
+     1679, 1685, 1689, 1686, 1691, 1680, 1687, 1687, 1693, 1681,
+     1688, 1682, 1686, 1684, 1690, 1688, 1695, 1683, 1683, 1690,
+     1692, 1697, 1689, 1692, 1691, 1695, 1685, 1693, 1694, 1694,
+     1696, 1698, 1699, 1698, 1700, 1696, 1701, 1699, 1702, 1705,
+
+     1700, 1697, 1703, 1707, 1702, 1706, 1706, 1703, 1708, 1709,
+     1712, 1710, 1713, 1705, 1709, 1712, 1701, 1710, 1714, 1714,
+     1715, 1715, 1707, 1716, 1717, 1718, 1719, 1708, 1721, 1719,
+     1720, 1720, 1722, 1723, 1727, 1725, 1713, 1716, 1728, 1727,
+     1718, 1728, 1717, 1726, 1722, 1724, 1721, 1725, 1724, 1726,
+     1730, 1724, 1732, 1723, 1735, 1731, 1736, 1728, 1733, 1730,
+     1731, 1733, 1736, 1724, 1734, 1734, 1737, 1743, 1738, 1739,
+     1739, 1744, 1737, 1738, 1740, 1740, 1741, 1732, 1735, 1742,
+     1743, 1745, 1741, 1746, 1742, 1747, 1748, 1749, 1747, 1744,
+     1750, 1752, 1748, 1749, 1751, 1753, 1750, 1752, 1757, 1751,
+
+     1745, 1754, 1756, 1746, 1755, 1755, 1754, 1756, 1758, 1759,
+     1760, 1761, 1762, 1763, 1765, 1766, 1757, 1767, 1753, 1764,
+     1768, 1767, 1768, 1769, 1759, 1774, 1762, 1763, 1758, 1760,
+     1770, 1761, 1765, 1764, 1772, 1773, 1776, 1770, 1774, 1775,
+     1766, 1777, 1769, 1778, 1779, 1775, 1772, 1773, 1780, 1781,
+     1781, 1780, 1782, 1784, 1784, 1785, 1776, 1777, 1779, 1786,
+     1787, 1782, 1789, 1778, 1786, 1788, 1788, 1790, 1791, 1780,
+     1792, 1793, 1787, 1796, 1794, 1785, 1795, 1789, 1797, 1801,
+     1793, 1790, 1796, 1795, 1799, 1796, 1802, 1803, 1792, 1794,
+     1803, 1806, 1791, 1811, 1797, 1804, 1804, 1801, 1807, 1799,
+
+     1805, 1805, 1808, 1806, 1799, 1808, 1809, 1809, 1810, 1812,
+     1813, 1802, 1811, 1815, 1812, 1813, 1807, 1814, 1816, 1817,
+     1814, 1810, 1819, 1816, 1818, 1820, 1822, 1821, 1823, 1824,
+     1828, 1819, 1825, 1825, 1815, 1824, 1821, 1823, 1817, 1821,
+     1818, 1826, 1827, 1828, 1820, 1829, 1830, 1832, 1826, 1831,
+     1822, 1833, 1832, 1832, 1834, 1837, 1833, 1838, 1839, 1839,
+     1830, 1840, 1827, 1829, 1840, 1831, 1834, 1841, 1842, 1843,
+     1843, 1844, 1844, 1845, 1843, 1838, 1846, 1842, 1847, 1847,
+     1837, 1846, 1845, 1841, 1848, 1845, 1844, 1849, 1850, 1851,
+     1853, 1855, 1854, 1856, 1851, 1851, 1857, 1858, 1856, 1859,
+
+     1860, 1860, 1848, 1858, 1853, 1861, 1850, 1854, 1849, 1862,
+     1857, 1861, 1863, 1855, 1862, 1864, 1865, 1859, 1867, 1868,
+     1869, 1864, 1865, 1870, 1871, 1873, 1863, 1872, 1877, 1870,
+     1872, 1873, 1875, 1878, 1869, 1879, 1872, 1871, 1867, 1868,
+     1875, 1880, 1882, 1881, 1883, 1885, 1884, 1877, 1881, 1880,
+     1886, 1882, 1878, 1887, 1879, 1884, 1889, 1883, 1885, 1888,
+     1888, 1892, 1889, 1890, 1886, 1891, 1894, 1887, 1891, 1890,
+     1893, 1893, 1895, 1896, 1892, 1897, 1897, 1899, 1898, 1900,
+     1901, 1888, 1902, 1899, 1904, 1904, 1894, 1905, 1908, 1906,
+     1895, 1898, 1896, 1906, 1907, 1911, 1901, 1909, 1910, 1907,
+
+     1902, 1900, 1909, 1910, 1911, 1912, 1914, 1905, 1908, 1914,
+     1916, 1918, 1919, 1917, 1918, 1920, 1921, 1921, 1922, 1923,
+     1914, 1916, 1917, 1924, 1919, 1925, 1925, 1926, 1912, 1927,
+     1920, 1923, 1926, 1928, 1929, 1931, 1933, 1922, 1930, 1932,
+     1928, 1935, 1924, 1927, 1936, 1930, 1929, 1931, 1937, 1938,
+     1932, 1939, 1940, 1943, 1937, 1992, 1933, 1948, 1940, 1992,
+     1935, 1938, 1941, 1941, 1936, 1942, 1944, 1944, 1942, 1939,
+     1946, 1947, 1948, 1943, 1949, 1946, 1950, 1947, 1951, 1951,
+     1952, 1955, 1950, 1949, 1953, 1954, 1953, 1956, 1954, 1957,
+     1958, 1959, 1952, 1960, 1961, 1963, 1959, 1964, 1960, 1962,
+
+     1965, 1955, 1964, 1961, 1966, 1965, 1970, 1957, 1958, 1956,
+     1963, 1962, 1967, 1966, 1969, 1968, 1971, 1971, 1972, 1969,
+     1968, 1970, 1973, 1975, 1972, 1976, 1966, 1968, 1977, 1978,
+     1979, 1980, 1967, 1980, 1985, 1981, 1982, 1982, 1988, 1975,
+     1983, 1983, 1989, 1973, 1976, 1978, 1990, 1977,   18, 1981,
+     1979, 1981, 1984, 1984, 1985, 1986, 1986, 1987, 1987, 1988,
+     1991, 1991, 1993, 1989, 1996, 1997, 1994, 1990, 1993, 1994,
+     1996, 1998, 1999, 2000, 2001, 2007, 2002, 1998, 2000, 2002,
+     2003, 2003, 2004, 1997, 2005, 2006, 2006, 2008, 2009, 2005,
+     2007, 2010, 2015, 2009, 2017, 1999, 2010, 2011, 2011, 2001,
+
+     2012, 2013, 2004, 2014, 2018, 2012, 2016, 2013, 2008, 2019,
+     2018, 2020, 2015, 2021, 2017, 2014, 2014, 2014, 2022, 2025,
+     2021, 2024, 2014, 2022, 2016, 2026, 2024, 2024, 2027, 2019,
+     2027, 2020, 2028, 2025, 2029, 2030, 2031, 2032, 2033, 2035,
+     2026, 2030, 2037, 2028, 2038, 2031, 2034, 2034, 2042, 2029,
+     2036, 2036, 2039, 2039, 2040, 2040, 2046, 2032, 2047, 2033,
+     2041, 2041, 2037, 2045, 2045, 2035, 2038, 2047, 2042, 2049,
+     2050, 2051, 2053, 2052, 2056, 2054, 2058, 2051, 2049, 2055,
+     2055, 2046, 2057, 2058, 2059, 2060, 2061, 2061, 2053, 2054,
+     2063, 2050, 2052, 2059, 2064, 2056, 2066, 2057, 2062, 2062,
+
+     2067, 2068, 2066, 2069,   17, 2067, 2070, 2068, 2071, 2074,
+     2064, 2060, 2075, 2070, 2071, 2072, 2063, 2072, 2075, 2076,
+     2076, 2077, 2078, 2069, 2079, 2080, 2077, 2081, 2074, 2082,
+     2083, 2078, 2082, 2084, 2085, 2086, 2084, 2087, 2087, 2079,
+     2091, 2088, 2083, 2089, 2090, 2080, 2081, 2088, 2092, 2093,
+     2090, 2095, 2085, 2093, 2096, 2089, 2099, 2097, 2098, 2098,
+     2091, 2086, 2097, 2092, 2100, 2103, 2101, 2166, 2104, 2093,
+     2166, 2095, 2104, 2105, 2105, 2113, 2096, 2107, 2114, 2106,
+     2099, 2101, 2109, 2100, 2103, 2106, 2107, 2108, 2108, 2110,
+     2111, 2109, 2114, 2110, 2112, 2112, 2113, 2115, 2116, 2117,
+
+     2118, 2111, 2119, 2116, 2120, 2121, 2111, 2123, 2124, 2122,
+     2120, 2127, 2123, 2125, 2125, 2127, 2115, 2126, 2126, 2117,
+     2118, 2124, 2119, 2121, 2122, 2129, 2130, 2131, 2132, 2133,
+     2133, 2135, 2135, 2132, 2129, 2136, 2140, 2130, 2137, 2139,
+     2136, 2136, 2130, 2141, 2137, 2139, 2142, 2131, 2141, 2143,
+     2146, 2145, 2147, 2149, 2146, 2143, 2148, 2148, 2142, 2150,
+     2151, 2152, 2140, 2145, 2147, 2150, 2153, 2152, 2154, 2155,
+     2155, 2156, 2157, 2154, 2158, 2159, 2161, 2162, 2149, 2158,
+     2163, 2153, 2151, 2165, 2165, 2163,    0, 2159, 2161, 2171,
+     2156, 2172, 2157, 2167, 2167, 2171, 2162, 2168, 2168, 2169,
+
+     2169, 2170, 2170, 2173, 2174, 2175, 2172, 2176, 2177, 2178,
+     2174, 2175, 2176, 2184, 2177, 2180, 2181, 2184, 2178, 2185,
+     2180, 2181, 2181, 2173, 2183, 2186, 2189, 2183, 2187, 2187,
+     2190, 2191, 2192, 2192, 2193, 2198, 2191, 2186, 2189, 2194,
+     2185, 2195, 2190, 2193, 2194, 2196, 2195, 2199, 2196, 2197,
+     2197, 2200, 2201, 2202, 2203, 2198, 2199, 2204, 2203, 2202,
+     2205, 2206, 2204, 2207, 2208, 2212, 2205, 2209, 2213, 2200,
+     2215, 2201, 2207, 2211, 2211, 2214, 2218, 2213, 2219, 2206,
+     2217, 2209, 2208, 2212, 2214, 2211, 2216, 2216, 2218, 2217,
+     2215, 2220, 2221, 2224, 2224, 2226, 2220, 2227, 2226, 2219,
+
+     2228, 2229, 2233, 2231, 2234, 2221, 2232,    0, 2233, 2235,
+     2235, 2237, 2236, 2227, 2236, 2238, 2228, 2229, 2231, 2240,
+     2232, 2234, 2239, 2239, 2245, 2237, 2246, 2240, 2242, 2242,
+     2243, 2243, 2246, 2238, 2247, 2248, 2249, 2250, 2251, 2254,
+     2247, 2252, 2252, 2249, 2253, 2253, 2257, 2245, 2259, 2248,
+     2255, 2256, 2258, 2253, 2261, 2263, 2260, 2266, 2251, 2250,
+     2254, 2257, 2255, 2256, 2258, 2260, 2262, 2267, 2268, 2261,
+     2270, 2262, 2262, 2264, 2259, 2264, 2264, 2266, 2263, 2264,
+     2268, 2269, 2269, 2271, 2272, 2274, 2273, 2272, 2270, 2276,
+     2267, 2273, 2264, 2277, 2276, 2277, 2278, 2279, 2283, 2280,
+
+     2285, 2286, 2279, 2271, 2287, 2274, 2280, 2283, 2289, 2288,
+     2286, 2288, 2290, 2291, 2278, 2292, 2287, 2295, 2285, 2291,
+     2294, 2297, 2294, 2296, 2296, 2298, 2299, 2289, 2299, 2301,
+     2298, 2295, 2290, 2302, 2301, 2292, 2303, 2304, 2302, 2305,
+     2306, 2309, 2313, 2307, 2308, 2310, 2306, 2297, 2307, 2314,
+     2310, 2310, 2311, 2309, 2303, 2304, 2315, 2308, 2318, 2305,
+     2311, 2313, 2319, 2314, 2316, 2316, 2317, 2317, 2315, 2318,
+     2320, 2322, 2321, 2323, 2324, 2323, 2322, 2319, 2321, 2325,
+     2326, 2327, 2327, 2328, 2338, 2325, 2329, 2329, 2326, 2331,
+     2320, 2333, 2324, 2330, 2330, 2328, 2326, 2332, 2331, 2335,
+
+     2340, 2336, 2332, 2335, 2337, 2338, 2337, 2342, 2344, 2333,
+     2336, 2339, 2340, 2336, 2341, 2345, 2339, 2339, 2349, 2342,
+     2346, 2344, 2350, 2341, 2347, 2346, 2351, 2345, 2353, 2347,
+     2350, 2349, 2352, 2352, 2354, 2351, 2355, 2356, 2357, 2360,
+     2364, 2358, 2350, 2359, 2360, 2362, 2353, 2363,    0, 2368,
+     2374, 2365, 2354, 2356, 2355, 2358, 2365, 2362, 2359, 2363,
+     2364, 2366, 2367, 2357, 2371, 2375, 2366, 2368, 2373, 2376,
+     2371, 2367, 2377, 2374, 2373, 2378, 2379, 2379, 2382, 2380,
+     2375, 2381, 2381, 2371, 2378, 2383, 2384, 2376, 2380, 2385,
+     2384, 2387, 2386, 2388, 2385, 2390, 2382, 2377, 2392, 2396,
+
+        0, 2391, 2396, 2393, 2383, 2386, 2387, 2391, 2393, 2393,
+     2394, 2395, 2399, 2388, 2390, 2398, 2394, 2395, 2401, 2403,
+     2392, 2404, 2407, 2398, 2405, 2405, 2406, 2406, 2408, 2408,
+     2411, 2407, 2399, 2409, 2409, 2410, 2415, 2412, 2401, 2404,
+     2414, 2406, 2403, 2412, 2416, 2417, 2414, 2410, 2411, 2424,
+     2417, 2415, 2406, 2418, 2418, 2419, 2419, 2420, 2426, 2421,
+     2428, 2430, 2420, 2423, 2416, 2421, 2425, 2423, 2429, 2424,
+     2425, 2431, 2432, 2429, 2433, 2434, 2435, 2436, 2426, 2433,
+     2438, 2441, 2437, 2443, 2430, 2428, 2431, 2437, 2439, 2439,
+     2432, 2440, 2435, 2434, 2442, 2440, 2441, 2436, 2444, 2442,
+
+     2445, 2443, 2438, 2446, 2447, 2448, 2449, 2450, 2451, 2451,
+     2448, 2454, 2453, 2455, 2456, 2446, 2457, 2458, 2445, 2449,
+     2453, 2459, 2460, 2447, 2444, 2450, 2461, 2462, 2463, 2464,
+     2454, 2466, 2455, 2456, 2463, 2464, 2468, 2469, 2461, 2457,
+     2459, 2458, 2472, 2460, 2470, 2471, 2466, 2471, 2462, 2468,
+     2470, 2469, 2473, 2473, 2474, 2475, 2476, 2477, 2475, 2474,
+     2478, 2571, 2472, 2479, 2480, 2480, 2481, 2481, 2482, 2476,
+     2482, 2483, 2483, 2484, 2478, 2485, 2479, 2491, 2486, 2487,
+     2487, 2477, 2571, 2487, 2489, 2489, 2490, 2490, 2484, 2493,
+     2485, 2486, 2491, 2492, 2492, 2494, 2494, 2496, 2493, 2495,
+
+     2495, 2493, 2496, 2498, 2499, 2500, 2501, 2504, 2498, 2502,
+     2502, 2503, 2503, 2505, 2505, 2506, 2507, 2507, 2501, 2508,
+     2510, 2510, 2509, 2512, 2499, 2500, 2504, 2509, 2511, 2511,
+     2513, 2514, 2514, 2506, 2508, 2515, 2517, 2512, 2518, 2513,
+     2516, 2516, 2520, 2521, 2521, 2522,    0, 2520, 2523, 2523,
+     2517, 2524, 2515, 2525, 2526, 2530, 2527, 2518, 2525, 2527,
+     2526, 2528, 2528, 2531, 2522, 2529, 2529, 2534, 2532, 2524,
+     2532, 2535, 2536, 2536, 2530, 2537, 2539, 2528, 2531, 2540,
+     2541, 2537, 2534, 2542, 2543, 2544, 2544, 2545, 2543, 2547,
+     2535, 2552, 2546, 2547, 2540, 2548, 2539, 2546, 2542, 2549,
+
+     2549, 2551, 2551, 2541, 2554, 2553, 2545, 2555, 2556, 2557,
+     2548, 2552, 2553, 2558, 2549, 2559, 2559, 2564, 2554, 2560,
+     2561, 2565, 2561, 2564, 2557, 2555, 2556, 2562, 2560, 2566,
+     2562, 2567, 2568, 2565, 2566, 2569, 2567, 2568, 2570, 2558,
+     2572, 2573, 2574, 2576, 2579, 2562, 2573, 2562, 2576, 2572,
+     2577, 2570, 2578, 2582, 2583, 2577, 2580, 2578, 2581, 2579,
+     2569, 2584, 2580, 2587, 2581, 2585, 2586, 2584, 2574, 2583,
+     2585, 2586, 2588, 2589, 2582, 2590, 2589, 2591, 2592, 2595,
+     2593, 2594, 2600, 2602,    0, 2588, 2591, 2592, 2587, 2593,
+     2594, 2596, 2597, 2595,    0, 2590, 2598, 2596, 2597, 2603,
+
+     2598, 2605, 2600, 2602, 2604, 2604, 2607, 2605, 2603, 2606,
+     2606, 2608, 2609, 2608, 2610, 2610, 2612, 2607, 2606, 2611,
+     2617, 2609, 2618, 2614, 2611, 2615, 2616, 2616, 2619, 2621,
+     2623, 2618, 2620, 2624, 2621, 2617, 2612, 2619, 2612, 2614,
+     2620, 2615, 2623, 2625, 2626, 2628, 2629, 2630, 2628, 2624,
+     2631, 2629, 2632, 2633, 2633, 2693, 2626, 2693, 2625, 2631,
+     2634, 2634, 2635, 2635, 2632, 2636, 2636, 2630, 2638, 2638,
+     2639, 2640, 2641, 2639, 2642, 2643, 2640, 2645, 2641, 2649,
+     2642, 2644, 2644, 2647, 2643, 2646, 2646, 2648, 2648, 2650,
+     2653, 2645, 2652, 2649, 2654, 2647, 2651, 2651, 2652, 2654,
+
+     2657, 2656, 2661, 2657, 2653, 2656, 2658, 2658, 2650, 2659,
+     2660, 2661, 2662, 2663, 2659, 2660, 2664, 2665, 2665, 2666,
+     2664, 2662, 2668, 2669, 2670, 2671, 2672, 2668, 2674, 2676,
+     2673, 2675, 2666, 2663, 2673, 2676, 2675, 2678, 2678, 2680,
+     2672, 2677, 2681, 2669, 2670, 2671, 2682, 2677, 2674, 2679,
+     2679, 2683, 2684, 2685, 2685, 2687, 2683, 2680, 2688, 2689,
+     2690, 2681, 2691, 2692, 2689, 2682, 2690, 2687, 2691, 2695,
+     2697, 2692, 2698, 2684, 2688, 2699, 2699, 2700, 2695, 2704,
+     2700, 2701, 2701, 2706, 2697, 2703, 2698, 2705, 2703, 2710,
+     2705, 2707, 2707, 2710, 2704, 2711, 2712, 2713, 2713, 2717,
+
+     2717, 2711, 2714, 2719, 2721, 2725, 2722, 2726, 2712, 2706,
+     2725, 2714, 2727, 2728, 2730, 2731, 2732, 2732, 2721, 2730,
+     2731, 2719, 2722, 2734, 2734, 2736, 2737, 2738, 2738, 2739,
+     2727, 2736, 2740, 2726, 2728, 2741, 2743, 2745, 2744, 2746,
+     2741, 2744, 2747, 2747, 2749, 2739, 2737, 2750, 2753, 2745,
+     2754, 2746, 2751, 2752, 2740, 2743, 2750, 2759, 2751, 2752,
+     2749, 2756, 2756, 2760, 2757, 2754, 2753, 2757, 2758, 2761,
+     2758, 2763, 2763, 2764, 2764, 2765, 2759, 2766, 2768, 2767,
+     2765, 2769, 2760, 2760, 2771, 2772, 2769, 2761, 2767, 2773,
+     2770, 2768, 2770, 2775, 2776, 2766, 2779, 2774, 2771, 2772,
+
+     2777, 2773, 2774, 2778, 2778, 2777, 2780, 2780, 2781, 2781,
+     2783, 2779, 2785, 2775, 2776, 2782, 2782, 2784, 2786, 2784,
+     2787, 2787, 2783, 2786, 2788, 2788, 2789, 2789, 2790, 2791,
+     2785, 2792, 2793, 2794, 2795, 2796, 2796, 2797, 2798, 2798,
+     2790, 2799, 2799, 2792, 2800, 2801, 2801, 2802, 2804, 2791,
+     2795, 2803, 2793, 2805, 2794, 2800, 2797, 2806, 2803, 2802,
+     2804, 2807, 2806, 2808, 2809, 2809, 2810, 2811, 2811, 2812,
+     2813, 2814, 2815, 2805, 2816, 2810, 2817, 2818, 2819, 2821,
+     2820, 2807, 2820, 2808, 2814, 2817, 2822, 2822, 2816, 2818,
+     2813, 2821, 2823, 2824, 2825, 2812, 2815, 2827, 2828, 2829,
+
+     2819, 2823, 2830, 2831, 2831, 2832, 2839, 2830, 2824, 2825,
+     2833, 2834, 2835, 2833, 2836, 2827,    0, 2835, 2839, 2836,
+     2828, 2829, 2837, 2837, 2847, 2834, 2838, 2838, 2832, 2840,
+     2840, 2844, 2844, 2846, 2846, 2848, 2849, 2850, 2852, 2853,
+     2854, 2855, 2847, 2856, 2857, 2858, 2848, 2859, 2860, 2859,
+     2867, 2861, 2850, 2857, 2862, 2849, 2868, 2853, 2852, 2863,
+     2863, 2855, 2854, 2856, 2867, 2858, 2865, 2869, 2860, 2861,
+     2865, 2874, 2862, 2866, 2866, 2872, 2869, 2875, 2868, 2870,
+     2870, 2873, 2873, 2876, 2872, 2877, 2879, 2878, 2880, 2874,
+     2882, 2881, 2877, 2883, 2887, 2875, 2884, 2883, 2885, 2885,
+
+     2888, 2876, 2878, 2884, 2879, 2897, 2880, 2881, 2894, 2882,
+     2886, 2886, 2895, 2889, 2887, 2891, 2891, 2893, 2888, 2889,
+     2892, 2892, 2896, 2893, 2897, 2898, 2894, 2899, 2900, 2900,
+     2895, 2901, 2899, 2902, 2903, 2904, 2905, 2896, 2906, 2898,
+     2907, 2908, 2910, 2908, 2910, 2907, 2904, 2905, 2909, 2909,
+     2913, 2901, 2915, 2902, 2903, 2911, 2911, 2916, 2906, 2917,
+     2918, 2915, 2919, 2920, 2922, 2921, 2923, 2919, 2926, 2913,
+     2921, 2917, 2927, 2931, 2928,    0, 2916, 2928, 2929, 2929,
+     2918, 2930, 2933, 2920, 2922, 2923, 2932, 2932, 2926, 2934,
+     2927, 2931, 2937, 2933, 2935, 2938, 2930, 2939, 2935, 2941,
+
+     2941, 2940, 2942, 2939, 2934, 2940, 2944, 2937, 2945, 2945,
+     2938, 2946, 2948, 2947, 2949, 2942, 2950, 2950, 2952, 2953,
+     2948, 2944, 2954, 2955, 2955, 2957, 2954, 2961, 2953, 2962,
+     2952, 2946, 2947, 2960, 2949, 2956, 2956, 2958, 2958, 2963,
+     2959, 2962, 2960, 2961, 2957, 2959, 2964, 2964, 2966, 2970,
+     2970, 2971, 2972, 2973, 2973, 2974, 2977, 2975, 2976, 2963,
+     2971, 2980, 2980, 2978, 2979, 2977, 2981, 2982, 2974, 2966,
+     2975, 2976, 2978, 2979, 2972, 2984, 2984, 2990, 2987, 2989,
+     2991, 2992, 2982, 2987, 2989, 2991, 2981, 2993, 2994, 2992,
+     2995, 2990, 2997, 3001, 2999, 3000, 3005, 2994, 2995, 2999,
+
+     3000, 3002, 3002, 3003, 3003, 3004, 2993, 2997, 3001, 3006,
+     3004, 3005, 3007, 3009, 3006, 3008, 3008, 3010, 3011, 3012,
+     3009, 3013, 3010, 3014, 3015, 3016, 3019, 3013, 3014, 3015,
+     3020, 3007, 3018, 3018, 3026, 3020, 3011, 3012, 3600, 3016,
+     3600, 3019, 3021, 3021, 3022, 3022, 3025, 3026, 3027, 3027,
+     3028, 3025, 3029, 3028, 3030, 3031, 3032, 3029, 3029, 3030,
+     3031, 3033, 3034, 3035, 3036, 3037, 3034, 3033, 3035, 3036,
+     3032, 3038, 3039, 3040, 3037, 3041, 3042, 3044, 3043, 3051,
+     3039, 3041, 3042, 3043, 3045, 3045, 3038, 3048, 3047, 3044,
+     3049, 3051, 3048, 3049, 3040, 3047, 3053, 3054, 3055, 3056,
+
+     3057, 3053, 3054, 3055, 3066, 3058, 3059, 3060, 3060, 3061,
+     3071, 3072, 3062, 3057, 3058, 3059, 3062, 3056, 3061, 3063,
+     3067, 3068, 3066, 3073, 3063, 3074, 3067, 3068, 3076, 3071,
+     3077, 3072, 3075, 3075, 3086, 3076, 3079, 3080, 3081, 3081,
+     3082, 3083, 3084, 3073, 3074, 3079, 3080, 3085, 3085, 3077,
+     3083, 3088, 3090, 3086, 3091, 3082, 3093, 3084, 3091, 3092,
+     3092, 3094, 3095, 3096, 3098, 3097, 3088, 3094, 3095, 3100,
+     3098, 3101, 3090, 3099, 3099, 3102, 3104, 3100, 3105, 3110,
+     3102, 3093, 3096, 3097, 3107, 3104, 3108, 3111, 3109, 3108,
+     3107, 3105, 3109, 3112, 3112, 3113, 3101, 3110, 3115, 3115,
+
+     3116, 3111, 3118, 3118, 3119, 3120, 3120, 3121, 3121, 3124,
+     3113, 3123, 3123, 3124, 3125, 3126, 3128, 3128, 3116, 3125,
+     3130, 3131, 3132, 3133, 3126, 3134, 3131, 3119, 3133, 3133,
+     3136, 3137, 3138, 3145, 3132, 3139, 3139, 3134, 3141, 3141,
+     3130, 3142, 3142, 3143, 3143, 3144, 3145, 3146, 3144, 3149,
+     3136, 3137, 3138, 3148, 3148, 3151, 3152, 3152, 3153, 3153,
+     3146, 3154, 3154, 3155, 3156, 3156, 3157, 3149, 3158, 3159,
+     3160, 3161, 3161, 3162, 3167, 3151, 3160, 3162, 3155, 3157,
+     3167, 3166, 3165, 3159, 3166, 3168, 3158, 3165, 3165, 3170,
+     3168, 3171, 3172, 3173, 3170, 3170, 3174, 3175, 3176, 3177,
+
+     3178, 3186, 3174, 3175, 3176, 3177, 3179, 3180, 3180, 3186,
+     3179, 3189, 3172, 3173, 3171, 3183, 3183, 3184, 3187, 3194,
+     3190, 3187, 3184, 3190, 3192, 3178, 3191, 3191, 3193, 3196,
+     3197, 3198, 3198, 3193, 3199, 3200, 3189, 3194, 3200, 3201,
+     3202, 3192, 3192, 3203, 3197, 3207, 3200,    0, 3199, 3196,
+     3205, 3203, 3206, 3201, 3217, 3205, 3205, 3206, 3206, 3202,
+     3208, 3208, 3209, 3209, 3207, 3210, 3210, 3211, 3211, 3212,
+     3212, 3213, 3213, 3214, 3215, 3216, 3218, 3219, 3220, 3215,
+     3217, 3221, 3222, 3220, 3223, 3218, 3224, 3222, 3225, 3214,
+     3226, 3219, 3231, 3223, 3235, 3216, 3228, 3228, 3229, 3229,
+
+     3221, 3230, 3232, 3232, 3230, 3233, 3224, 3231, 3225, 3234,
+     3226, 3233, 3235, 3238, 3234, 3237, 3237, 3239, 3239, 3240,
+     3238, 3242, 3242, 3243, 3240, 3244, 3245, 3245, 3246, 3247,
+     3249, 3254, 3243, 3253, 3244, 3250, 3250, 3246, 3247, 3251,
+     3251, 3252, 3253, 3255, 3256, 3252, 3257, 3258, 3249, 3260,
+     3254, 3261, 3258, 3258, 3255, 3264, 3275, 3262, 3268, 3256,
+     3261, 3262, 3260, 3268, 3269, 3269, 3257, 3270, 3272, 3272,
+     3264, 3273, 3274, 3279, 3275, 3277, 3277, 3278, 3278, 3281,
+     3280, 3270, 3279, 3285, 3286, 3273, 3280, 3287, 3290, 3286,
+     3289, 3281, 3292, 3294, 3290, 3296, 3287, 3274, 3297, 3302,
+
+     3296, 3298, 3298, 3297, 3292, 3304, 3299, 3301, 3285, 3305,
+     3289, 3306, 3301, 3302, 3294, 3299, 3304, 3307, 3307, 3309,
+     3309, 3307, 3305, 3310, 3310, 3306, 3311, 3311, 3312, 3313,
+     3314, 3317, 3315, 3316, 3320, 3324, 3317, 3312, 3321, 3322,
+     3320, 3323, 3323, 3321, 3322, 3325, 3326, 3328, 3330, 3313,
+     3314, 3315, 3316, 3324, 3327, 3329, 3333, 3325, 3337, 3327,
+     3333, 3329, 3331, 3331, 3334, 3328, 3335, 3326, 3338, 3334,
+     3339, 3335, 3341, 3330, 3336, 3336, 3345, 3337, 3343, 3343,
+     3346, 3347, 3348, 3338, 3350, 3339, 3348, 3349, 3351, 3345,
+     3352, 3354, 3341, 3346, 3347, 3355, 3349, 3353, 3352, 3357,
+
+     3350, 3358, 3353, 3356, 3356, 3359, 3362, 3351, 3357, 3360,
+     3360, 3354, 3361, 3361, 3366, 3355, 3365, 3368, 3372, 3358,
+     3376, 3365, 3365, 3368, 3377, 3362, 3369, 3369, 3366, 3370,
+     3370, 3359, 3374, 3374, 3380, 3385, 3376, 3379, 3381, 3372,
+     3377, 3388, 3379, 3381, 3384, 3384, 3387, 3386, 3389, 3389,
+     3380, 3390, 3387, 3392, 3392, 3385, 3386, 3393, 3394, 3398,
+     3395, 3396, 3396, 3400, 3388, 3398, 3401, 3405, 3402, 3406,
+     3390, 3393, 3401, 3402, 3407, 3407, 3409, 3394, 3395, 3408,
+     3408, 3410, 3412, 3400, 3411, 3411, 3414, 3413, 3415, 3405,
+     3416, 3409, 3418, 3412, 3415, 3406, 3413, 3420, 3417, 3419,
+
+     3419, 3410, 3420, 3422, 3411, 3429, 3414, 3421, 3421, 3416,
+     3417, 3423, 3418, 3424, 3423, 3430, 3424, 3429, 3422, 3425,
+     3425, 3431, 3432, 3433, 3434, 3434, 3436, 3432, 3435, 3433,
+     3437, 3435, 3436, 3439, 3441, 3430, 3440, 3440, 3439, 3441,
+     3442, 3431, 3447, 3443, 3444, 3445, 3445, 3448, 3437, 3443,
+     3449, 3450, 3451, 3451, 3447, 3452, 3453, 3454, 3459, 3442,
+        0, 3444, 3444, 3459, 3450, 3448, 3454, 3456, 3456, 3457,
+     3457, 3460, 3453, 3461, 3452, 3449, 3458, 3458, 3461, 3462,
+     3462, 3463, 3463, 3464, 3464, 3460, 3465, 3466, 3466, 3467,
+     3468, 3469, 3474, 3470, 3480, 3465, 3482, 3469, 3470, 3473,
+
+     3473, 3483, 3467, 3476, 3476, 3477, 3477, 3484, 3474, 3485,
+     3486, 3486, 3489, 3480, 3488, 3488, 3468, 3490, 3482, 3491,
+     3493, 3494, 3501, 3483, 3495, 3495, 3484, 3496, 3496, 3499,
+     3494, 3485, 3502, 3491, 3507, 3497, 3490, 3500, 3489, 3497,
+     3493, 3503, 3501, 3500, 3504, 3511, 3503, 3499, 3512, 3504,
+     3511, 3502, 3508, 3508, 3513, 3507, 3510, 3510, 3514, 3515,
+     3513, 3517, 3512, 3516, 3516, 3519, 3517, 3515, 3521, 3522,
+     3514, 3523, 3521, 3524, 3522, 3525, 3526, 3527, 3528, 3532,
+     3525, 3529, 3531, 3533, 3534, 3519, 3537, 3529, 3526, 3527,
+     3531, 3523, 3536, 3524, 3538, 3539, 3528, 3543, 3532, 3547,
+
+     3540, 3542, 3537, 3533, 3534, 3540, 3542, 3544, 3549, 3545,
+     3536, 3538, 3538, 3544, 3545, 3548, 3539, 3543, 3548, 3547,
+     3559, 3549, 3553, 3553, 3554, 3554, 3555, 3561, 3561, 3562,
+     3555, 3563, 3564, 3564, 3562, 3559, 3566, 3569, 3569, 3570,
+     3570, 3574, 3570, 3571, 3571, 3574, 3571, 3572, 3572, 3576,
+     3563, 3566, 3573, 3573, 3576, 3573, 3577, 3578, 3578, 3579,
+     3580, 3583, 3583, 3584, 3584, 3577, 3585, 3586, 3587, 3588,
+     3588, 3589, 3590, 3587, 3580, 3593, 3594, 3579, 3595, 3596,
+     3597, 3599, 3595, 3594,    0, 3601, 3585, 3586, 3596, 3589,
+     3601, 3608, 3590, 3602, 3602, 3597, 3603, 3604, 3604, 3599,
+
+     3593, 3605, 3605, 3606, 3606, 3603, 3607, 3607, 3609, 3610,
+     3611, 3612, 3613, 3608, 3610, 3614, 3612, 3612, 3613, 3611,
+     3615, 3616, 3611, 3609, 3617, 3618, 3619, 3620, 3620, 3617,
+     3618, 3621, 3622, 3623, 3623, 3615, 3625, 3621, 3622, 3630,
+     3614, 3626, 3616, 3624, 3624, 3619, 3626, 3629, 3629, 3632,
+     3632, 3625, 3633, 3630, 3635, 3637, 3637, 3638, 3638, 3639,
+     3639, 3633, 3640, 3640, 3642, 3642, 3643, 3643, 3644, 3644,
+     3645, 3645, 3635, 3646, 3648, 3649, 3649, 3651, 3651, 3652,
+     3653, 3654, 3656, 3648, 3657, 3657, 3658, 3660, 3652, 3659,
+     3659, 3661, 3653, 3675, 3662, 3663, 3663, 3656, 3664, 3646,
+
+     3667, 3654, 3660, 3673, 3661, 3658, 3662, 3665, 3665, 3672,
+     3664, 3668, 3668, 3674, 3672, 3667, 3674, 3676, 3676, 3675,
+     3677, 3673, 3679, 3680, 3683, 3679, 3681, 3682, 3684, 3680,
+     3687, 3685, 3682, 3688, 3692, 3691, 3687, 3696, 3677, 3691,
+     3681, 3697, 3688, 3683, 3694, 3694, 3684, 3685, 3706, 3692,
+     3717, 3707, 3710, 3706, 3707, 3711, 3711, 3712, 3712, 3713,
+     3713, 3697, 3718, 3696, 3719, 3710, 3715, 3715, 3719, 3720,
+     3721, 3718, 3723, 3717, 3725, 3726, 3727, 3728, 3730, 3729,
+     3725, 3729, 3728, 3731, 3731, 3721, 3723, 3727, 3732, 3720,
+     3733, 3735, 3734, 3730, 3736, 3738, 3737, 3740, 3726, 3741,
+
+     3739, 3732, 3740, 3742, 3738, 3744, 3746, 3735, 3743, 3733,
+     3734, 3737, 3739, 3743, 3752, 3742, 3745, 3745, 3747, 3736,
+     3741, 3753, 3755, 3747, 3744, 3767, 3746, 3763, 3752, 3754,
+     3754, 3755, 3756, 3757, 3757, 3756, 3762, 3758, 3759, 3759,
+        0, 3753, 3758, 3760, 3760, 3761, 3761, 3763, 3764, 3765,
+     3767, 3764, 3766, 3768, 3765, 3762, 3769, 3766, 3770, 3771,
+     3772, 3774, 3769, 3773, 3773, 3772, 3775, 3775, 3768, 3776,
+     3776, 3771, 3770, 3777, 3777, 3779, 3779, 3780, 3781, 3782,
+     3782, 3774, 3785, 3784, 3787, 3788, 3791, 3791, 3792, 3792,
+     3794, 3793, 3780, 3785, 3795, 3796, 3797, 3781, 3784, 3793,
+
+     3795, 3796, 3798, 3788, 3799, 3808, 3800, 3809, 3787, 3794,
+     3797, 3800, 3801, 3801, 3811, 3798, 3803, 3803, 3812, 3812,
+     3813, 3814, 3816, 3799, 3817, 3814, 3808, 3809, 3811, 3817,
+     3818, 3819, 3820, 3821, 3822, 3823, 3813, 3824, 3824, 3822,
+     3823, 3827, 3816, 3829, 3819, 3820, 3828, 3831, 3833, 3818,
+     3832, 3832, 3821, 3833, 3834, 3839, 3831, 3835, 3835,    0,
+     3834, 3827, 3829, 3836, 3828, 3837, 3838, 3840, 3836, 3845,
+     3837, 3838, 3843, 3840, 3839, 3842, 3842, 3843, 3844, 3844,
+     3847, 3848, 3849, 3850, 3847, 3851, 3852, 3845, 3853, 3849,
+     3854, 3858, 3852, 3856, 3856, 3862, 3858, 3859, 3859, 3860,
+
+     3848, 3861, 3850, 3854, 3851, 3863, 3861, 3853, 3860, 3864,
+     3866, 3860, 3865, 3865, 3862, 3866, 3867, 3868, 3870, 3871,
+     3871, 3868, 3864, 3872, 3863, 3873, 3873, 3874, 3874, 3867,
+     3875, 3876, 3877, 3878, 3878, 3875, 3879, 3879, 3876, 3881,
+     3880, 3881, 3872, 3883, 3870, 3880, 3882, 3882, 3884, 3885,
+     3883, 3877, 3886, 3887, 3891, 3884, 3893, 3886, 3890, 3890,
+     3894, 3893, 3895, 3896, 3900, 3894, 3897, 3897, 3885, 3899,
+     3899, 3901, 3887, 3891, 3902, 3902, 3903, 3903, 3904, 3906,
+     3906, 3895, 3896, 3900, 3908, 3904, 3907, 3907, 3910, 3913,
+     3901, 3908, 3914, 3910, 3913, 3915, 3916, 3916, 3917, 3917,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0, 3914,    0,    0, 3915, 3921, 3921, 3921, 3921, 3921,
+     3921, 3921, 3922, 3922, 3922, 3922, 3922, 3922, 3922, 3923,
+     3923, 3923, 3923, 3923, 3923, 3923, 3924, 3924, 3924, 3924,
+     3924, 3924, 3924, 3925, 3925, 3925, 3925, 3925, 3925, 3925,
+     3926, 3926, 3926, 3926, 3926, 3926, 3926, 3927, 3927, 3927,
+     3927, 3927, 3927, 3927, 3929, 3929,    0, 3929, 3929, 3929,
+     3929, 3930, 3930,    0,    0,    0, 3930, 3930, 3931, 3931,
+        0,    0, 3931,    0, 3931, 3932,    0,    0,    0,    0,
+        0, 3932, 3933, 3933,    0,    0,    0, 3933, 3933, 3934,
+
+        0,    0,    0,    0,    0, 3934, 3935, 3935,    0, 3935,
+     3935, 3935, 3935, 3936,    0,    0,    0,    0,    0, 3936,
+     3937, 3937,    0,    0,    0, 3937, 3937, 3938, 3938,    0,
+     3938, 3938, 3938, 3938, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3920, 3920, 3920, 3920, 3920
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -3627,7 +3634,7 @@ static void config_end_include(void)
 #define YY_NO_INPUT 1
 #endif
 
-#line 3629 "<stdout>"
+#line 3636 "<stdout>"
 
 #define INITIAL 0
 #define quotedstring 1
@@ -3845,7 +3852,7 @@ YY_DECL
        {
 #line 211 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 
-#line 3847 "<stdout>"
+#line 3854 "<stdout>"
 
        while ( 1 )             /* loops until end-of-file is reached */
                {
@@ -3878,13 +3885,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 >= 3905 )
+                               if ( yy_current_state >= 3921 )
                                        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] != 7612 );
+               while ( yy_base[yy_current_state] != 7635 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -5383,102 +5390,102 @@ YY_RULE_SETUP
 case 293:
 YY_RULE_SETUP
 #line 516 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+{ YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
        YY_BREAK
 case 294:
 YY_RULE_SETUP
 #line 517 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
        YY_BREAK
 case 295:
 YY_RULE_SETUP
 #line 518 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
        YY_BREAK
 case 296:
 YY_RULE_SETUP
 #line 519 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+{ YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
        YY_BREAK
 case 297:
 YY_RULE_SETUP
 #line 520 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_RATELIMIT) }
        YY_BREAK
 case 298:
 YY_RULE_SETUP
 #line 521 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
        YY_BREAK
 case 299:
 YY_RULE_SETUP
 #line 522 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
        YY_BREAK
 case 300:
 YY_RULE_SETUP
 #line 523 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
        YY_BREAK
 case 301:
 YY_RULE_SETUP
 #line 524 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
        YY_BREAK
 case 302:
 YY_RULE_SETUP
 #line 525 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
        YY_BREAK
 case 303:
 YY_RULE_SETUP
 #line 526 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
        YY_BREAK
 case 304:
 YY_RULE_SETUP
 #line 527 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
        YY_BREAK
 case 305:
 YY_RULE_SETUP
 #line 528 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
        YY_BREAK
 case 306:
 YY_RULE_SETUP
 #line 529 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
+{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
        YY_BREAK
 case 307:
 YY_RULE_SETUP
 #line 530 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
+{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
        YY_BREAK
 case 308:
 YY_RULE_SETUP
 #line 531 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_SENT_COUNT) }
+{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
        YY_BREAK
 case 309:
 YY_RULE_SETUP
 #line 532 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_QUERY_RESTARTS) }
+{ YDVAR(1, VAR_MAX_SENT_COUNT) }
        YY_BREAK
 case 310:
 YY_RULE_SETUP
 #line 533 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_MAX_QUERY_RESTARTS) }
        YY_BREAK
 case 311:
 YY_RULE_SETUP
 #line 534 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_NUM) }
+{ YDVAR(1, VAR_LOW_RTT) }
        YY_BREAK
 case 312:
 YY_RULE_SETUP
 #line 535 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_FAST_SERVER_NUM) }
        YY_BREAK
 case 313:
 YY_RULE_SETUP
@@ -5493,119 +5500,119 @@ YY_RULE_SETUP
 case 315:
 YY_RULE_SETUP
 #line 538 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 316:
 YY_RULE_SETUP
 #line 539 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
        YY_BREAK
 case 317:
 YY_RULE_SETUP
 #line 540 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
        YY_BREAK
 case 318:
 YY_RULE_SETUP
 #line 541 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
        YY_BREAK
 case 319:
 YY_RULE_SETUP
 #line 542 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(0, VAR_DNSCRYPT) }
        YY_BREAK
 case 320:
 YY_RULE_SETUP
 #line 543 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
        YY_BREAK
 case 321:
 YY_RULE_SETUP
 #line 544 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
        YY_BREAK
 case 322:
 YY_RULE_SETUP
 #line 545 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
        YY_BREAK
 case 323:
 YY_RULE_SETUP
 #line 546 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
        YY_BREAK
 case 324:
 YY_RULE_SETUP
 #line 547 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
        YY_BREAK
 case 325:
 YY_RULE_SETUP
 #line 548 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
        YY_BREAK
 case 326:
 YY_RULE_SETUP
-#line 550 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 549 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
        YY_BREAK
 case 327:
 YY_RULE_SETUP
-#line 552 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 551 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
        YY_BREAK
 case 328:
 YY_RULE_SETUP
 #line 553 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
        YY_BREAK
 case 329:
 YY_RULE_SETUP
 #line 554 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
        YY_BREAK
 case 330:
 YY_RULE_SETUP
 #line 555 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
+{ YDVAR(1, VAR_PAD_RESPONSES) }
        YY_BREAK
 case 331:
 YY_RULE_SETUP
 #line 556 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES) }
+{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
        YY_BREAK
 case 332:
 YY_RULE_SETUP
 #line 557 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
+{ YDVAR(1, VAR_PAD_QUERIES) }
        YY_BREAK
 case 333:
 YY_RULE_SETUP
 #line 558 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
        YY_BREAK
 case 334:
 YY_RULE_SETUP
 #line 559 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
        YY_BREAK
 case 335:
 YY_RULE_SETUP
 #line 560 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
        YY_BREAK
 case 336:
 YY_RULE_SETUP
 #line 561 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
        YY_BREAK
 case 337:
 YY_RULE_SETUP
 #line 562 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
        YY_BREAK
 case 338:
 YY_RULE_SETUP
@@ -5615,163 +5622,173 @@ YY_RULE_SETUP
 case 339:
 YY_RULE_SETUP
 #line 564 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
        YY_BREAK
 case 340:
 YY_RULE_SETUP
 #line 565 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
        YY_BREAK
 case 341:
 YY_RULE_SETUP
 #line 566 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(0, VAR_CACHEDB) }
        YY_BREAK
 case 342:
 YY_RULE_SETUP
 #line 567 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
        YY_BREAK
 case 343:
 YY_RULE_SETUP
 #line 568 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_NO_STORE) }
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
        YY_BREAK
 case 344:
 YY_RULE_SETUP
 #line 569 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_CACHEDB_NO_STORE) }
        YY_BREAK
 case 345:
 YY_RULE_SETUP
 #line 570 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED) }
        YY_BREAK
 case 346:
 YY_RULE_SETUP
 #line 571 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
        YY_BREAK
 case 347:
 YY_RULE_SETUP
 #line 572 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPATH) }
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
        YY_BREAK
 case 348:
 YY_RULE_SETUP
 #line 573 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPASSWORD) }
+{ YDVAR(1, VAR_CACHEDB_REDISPATH) }
        YY_BREAK
 case 349:
 YY_RULE_SETUP
 #line 574 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(1, VAR_CACHEDB_REDISPASSWORD) }
        YY_BREAK
 case 350:
 YY_RULE_SETUP
 #line 575 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
        YY_BREAK
 case 351:
 YY_RULE_SETUP
 #line 576 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISLOGICALDB) }
+{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
        YY_BREAK
 case 352:
 YY_RULE_SETUP
 #line 577 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_IPSET) }
+{ YDVAR(1, VAR_CACHEDB_REDISLOGICALDB) }
        YY_BREAK
 case 353:
 YY_RULE_SETUP
 #line 578 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V4) }
+{ YDVAR(0, VAR_IPSET) }
        YY_BREAK
 case 354:
 YY_RULE_SETUP
 #line 579 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V6) }
+{ YDVAR(1, VAR_IPSET_NAME_V4) }
        YY_BREAK
 case 355:
 YY_RULE_SETUP
 #line 580 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_IPSET_NAME_V6) }
        YY_BREAK
 case 356:
 YY_RULE_SETUP
 #line 581 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
        YY_BREAK
 case 357:
 YY_RULE_SETUP
 #line 582 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ANSWER_COOKIE ) }
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
        YY_BREAK
 case 358:
 YY_RULE_SETUP
 #line 583 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_COOKIE_SECRET) }
+{ YDVAR(1, VAR_ANSWER_COOKIE ) }
        YY_BREAK
 case 359:
 YY_RULE_SETUP
 #line 584 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+{ YDVAR(1, VAR_COOKIE_SECRET) }
        YY_BREAK
 case 360:
 YY_RULE_SETUP
 #line 585 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+{ YDVAR(1, VAR_COOKIE_SECRET_FILE) }
        YY_BREAK
 case 361:
 YY_RULE_SETUP
 #line 586 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_NSID ) }
+{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
        YY_BREAK
 case 362:
 YY_RULE_SETUP
 #line 587 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ED) }
+{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
        YY_BREAK
 case 363:
 YY_RULE_SETUP
 #line 588 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+{ YDVAR(1, VAR_NSID ) }
        YY_BREAK
 case 364:
-/* rule 364 can match eol */
 YY_RULE_SETUP
 #line 589 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_EDE ) }
+       YY_BREAK
+case 365:
+YY_RULE_SETUP
+#line 590 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+       YY_BREAK
+case 366:
+/* rule 366 can match eol */
+YY_RULE_SETUP
+#line 591 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++; }
        YY_BREAK
 /* Quoted strings. Strip leading and ending quotes */
-case 365:
+case 367:
 YY_RULE_SETUP
-#line 592 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 594 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { BEGIN(quotedstring); LEXOUT(("QS ")); }
        YY_BREAK
 case YY_STATE_EOF(quotedstring):
-#line 593 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 595 "/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 366:
+case 368:
 YY_RULE_SETUP
-#line 598 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 600 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 367:
-/* rule 367 can match eol */
+case 369:
+/* rule 369 can match eol */
 YY_RULE_SETUP
-#line 599 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 601 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline inside quoted string, no end \"");
                          cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 368:
+case 370:
 YY_RULE_SETUP
-#line 601 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 603 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         LEXOUT(("QE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -5784,34 +5801,34 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* Single Quoted strings. Strip leading and ending quotes */
-case 369:
+case 371:
 YY_RULE_SETUP
-#line 613 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 615 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
        YY_BREAK
 case YY_STATE_EOF(singlequotedstr):
-#line 614 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 616 "/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 370:
+case 372:
 YY_RULE_SETUP
-#line 619 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 621 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 371:
-/* rule 371 can match eol */
+case 373:
+/* rule 373 can match eol */
 YY_RULE_SETUP
-#line 620 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 622 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline inside quoted string, no end '");
                             cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 372:
+case 374:
 YY_RULE_SETUP
-#line 622 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 624 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         LEXOUT(("SQE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -5824,38 +5841,38 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* include: directive */
-case 373:
+case 375:
 YY_RULE_SETUP
-#line 634 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 636 "/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 636 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 638 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside include directive");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 374:
+case 376:
 YY_RULE_SETUP
-#line 640 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ISP ")); /* ignore */ }
        YY_BREAK
-case 375:
-/* rule 375 can match eol */
+case 377:
+/* rule 377 can match eol */
 YY_RULE_SETUP
-#line 641 "/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 376:
+case 378:
 YY_RULE_SETUP
-#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 644 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("IQS ")); BEGIN(include_quoted); }
        YY_BREAK
-case 377:
+case 379:
 YY_RULE_SETUP
-#line 643 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 645 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("Iunquotedstr(%s) ", yytext));
        config_start_include_glob(yytext, 0);
@@ -5863,27 +5880,27 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_quoted):
-#line 648 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 650 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 378:
+case 380:
 YY_RULE_SETUP
-#line 652 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 654 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 379:
-/* rule 379 can match eol */
+case 381:
+/* rule 381 can match eol */
 YY_RULE_SETUP
-#line 653 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 655 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline before \" in include name");
                                  cfg_parser->line++; BEGIN(inc_prev); }
        YY_BREAK
-case 380:
+case 382:
 YY_RULE_SETUP
-#line 655 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 657 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("IQE "));
        yytext[yyleng - 1] = '\0';
@@ -5893,7 +5910,7 @@ YY_RULE_SETUP
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(val):
-#line 661 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 663 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("LEXEOF "));
        yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
@@ -5908,39 +5925,39 @@ case YY_STATE_EOF(val):
 }
        YY_BREAK
 /* include-toplevel: directive */
-case 381:
+case 383:
 YY_RULE_SETUP
-#line 675 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 677 "/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 678 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 680 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("EOF inside include_toplevel directive");
        BEGIN(inc_prev);
 }
        YY_BREAK
-case 382:
+case 384:
 YY_RULE_SETUP
-#line 682 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 684 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITSP ")); /* ignore */ }
        YY_BREAK
-case 383:
-/* rule 383 can match eol */
+case 385:
+/* rule 385 can match eol */
 YY_RULE_SETUP
-#line 683 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 685 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++; }
        YY_BREAK
-case 384:
+case 386:
 YY_RULE_SETUP
-#line 684 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 686 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); }
        YY_BREAK
-case 385:
+case 387:
 YY_RULE_SETUP
-#line 685 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 687 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("ITunquotedstr(%s) ", yytext));
        config_start_include_glob(yytext, 1);
@@ -5949,29 +5966,29 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_toplevel_quoted):
-#line 691 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 693 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("EOF inside quoted string");
        BEGIN(inc_prev);
 }
        YY_BREAK
-case 386:
+case 388:
 YY_RULE_SETUP
-#line 695 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 697 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITSTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 387:
-/* rule 387 can match eol */
+case 389:
+/* rule 389 can match eol */
 YY_RULE_SETUP
-#line 696 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 698 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("newline before \" in include name");
        cfg_parser->line++; BEGIN(inc_prev);
 }
        YY_BREAK
-case 388:
+case 390:
 YY_RULE_SETUP
-#line 700 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 702 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("ITQE "));
        yytext[yyleng - 1] = '\0';
@@ -5980,33 +5997,33 @@ YY_RULE_SETUP
        return (VAR_FORCE_TOPLEVEL);
 }
        YY_BREAK
-case 389:
+case 391:
 YY_RULE_SETUP
-#line 708 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 710 "/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 390:
+case 392:
 YY_RULE_SETUP
-#line 712 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 714 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        ub_c_error_msg("unknown keyword '%s'", yytext);
        }
        YY_BREAK
-case 391:
+case 393:
 YY_RULE_SETUP
-#line 716 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 718 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        ub_c_error_msg("stray '%s'", yytext);
        }
        YY_BREAK
-case 392:
+case 394:
 YY_RULE_SETUP
-#line 720 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 722 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 ECHO;
        YY_BREAK
-#line 6008 "<stdout>"
+#line 6025 "<stdout>"
 
        case YY_END_OF_BUFFER:
                {
@@ -6299,7 +6316,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 >= 3905 )
+                       if ( yy_current_state >= 3921 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -6327,11 +6344,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 >= 3905 )
+               if ( yy_current_state >= 3921 )
                        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 == 3904);
+       yy_is_jam = (yy_current_state == 3920);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
@@ -6964,7 +6981,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 720 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 722 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 
 
 
index 7ae1b8c..cd50620 100644 (file)
@@ -513,6 +513,7 @@ dnstap-log-forwarder-query-messages{COLON}  {
                YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
 dnstap-log-forwarder-response-messages{COLON}  {
                YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+dnstap-sample-rate             { YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
 disable-dnssec-lame-check{COLON} { YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
 ip-ratelimit{COLON}            { YDVAR(1, VAR_IP_RATELIMIT) }
 ip-ratelimit-cookie{COLON}     { YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
@@ -581,6 +582,7 @@ udp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNS
 tcp-connection-limit{COLON}    { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
 answer-cookie{COLON}           { YDVAR(1, VAR_ANSWER_COOKIE ) }
 cookie-secret{COLON}           { YDVAR(1, VAR_COOKIE_SECRET) }
+cookie-secret-file{COLON}      { YDVAR(1, VAR_COOKIE_SECRET_FILE) }
 edns-client-string{COLON}      { YDVAR(2, VAR_EDNS_CLIENT_STRING) }
 edns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
 nsid{COLON}                    { YDVAR(1, VAR_NSID ) }
index a6eb58a..e7db8d2 100644 (file)
 #define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 443
 #define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 444
 #define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 445
-#define VAR_RESPONSE_IP_TAG 446
-#define VAR_RESPONSE_IP 447
-#define VAR_RESPONSE_IP_DATA 448
-#define VAR_HARDEN_ALGO_DOWNGRADE 449
-#define VAR_IP_TRANSPARENT 450
-#define VAR_IP_DSCP 451
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 452
-#define VAR_IP_RATELIMIT 453
-#define VAR_IP_RATELIMIT_SLABS 454
-#define VAR_IP_RATELIMIT_SIZE 455
-#define VAR_RATELIMIT 456
-#define VAR_RATELIMIT_SLABS 457
-#define VAR_RATELIMIT_SIZE 458
-#define VAR_OUTBOUND_MSG_RETRY 459
-#define VAR_MAX_SENT_COUNT 460
-#define VAR_MAX_QUERY_RESTARTS 461
-#define VAR_RATELIMIT_FOR_DOMAIN 462
-#define VAR_RATELIMIT_BELOW_DOMAIN 463
-#define VAR_IP_RATELIMIT_FACTOR 464
-#define VAR_RATELIMIT_FACTOR 465
-#define VAR_IP_RATELIMIT_BACKOFF 466
-#define VAR_RATELIMIT_BACKOFF 467
-#define VAR_SEND_CLIENT_SUBNET 468
-#define VAR_CLIENT_SUBNET_ZONE 469
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 470
-#define VAR_CLIENT_SUBNET_OPCODE 471
-#define VAR_MAX_CLIENT_SUBNET_IPV4 472
-#define VAR_MAX_CLIENT_SUBNET_IPV6 473
-#define VAR_MIN_CLIENT_SUBNET_IPV4 474
-#define VAR_MIN_CLIENT_SUBNET_IPV6 475
-#define VAR_MAX_ECS_TREE_SIZE_IPV4 476
-#define VAR_MAX_ECS_TREE_SIZE_IPV6 477
-#define VAR_CAPS_WHITELIST 478
-#define VAR_CACHE_MAX_NEGATIVE_TTL 479
-#define VAR_PERMIT_SMALL_HOLDDOWN 480
-#define VAR_CACHE_MIN_NEGATIVE_TTL 481
-#define VAR_QNAME_MINIMISATION 482
-#define VAR_QNAME_MINIMISATION_STRICT 483
-#define VAR_IP_FREEBIND 484
-#define VAR_DEFINE_TAG 485
-#define VAR_LOCAL_ZONE_TAG 486
-#define VAR_ACCESS_CONTROL_TAG 487
-#define VAR_LOCAL_ZONE_OVERRIDE 488
-#define VAR_ACCESS_CONTROL_TAG_ACTION 489
-#define VAR_ACCESS_CONTROL_TAG_DATA 490
-#define VAR_VIEW 491
-#define VAR_ACCESS_CONTROL_VIEW 492
-#define VAR_VIEW_FIRST 493
-#define VAR_SERVE_EXPIRED 494
-#define VAR_SERVE_EXPIRED_TTL 495
-#define VAR_SERVE_EXPIRED_TTL_RESET 496
-#define VAR_SERVE_EXPIRED_REPLY_TTL 497
-#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 498
-#define VAR_EDE_SERVE_EXPIRED 499
-#define VAR_SERVE_ORIGINAL_TTL 500
-#define VAR_FAKE_DSA 501
-#define VAR_FAKE_SHA1 502
-#define VAR_LOG_IDENTITY 503
-#define VAR_HIDE_TRUSTANCHOR 504
-#define VAR_HIDE_HTTP_USER_AGENT 505
-#define VAR_HTTP_USER_AGENT 506
-#define VAR_TRUST_ANCHOR_SIGNALING 507
-#define VAR_AGGRESSIVE_NSEC 508
-#define VAR_USE_SYSTEMD 509
-#define VAR_SHM_ENABLE 510
-#define VAR_SHM_KEY 511
-#define VAR_ROOT_KEY_SENTINEL 512
-#define VAR_DNSCRYPT 513
-#define VAR_DNSCRYPT_ENABLE 514
-#define VAR_DNSCRYPT_PORT 515
-#define VAR_DNSCRYPT_PROVIDER 516
-#define VAR_DNSCRYPT_SECRET_KEY 517
-#define VAR_DNSCRYPT_PROVIDER_CERT 518
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 519
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 520
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 521
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 522
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 523
-#define VAR_PAD_RESPONSES 524
-#define VAR_PAD_RESPONSES_BLOCK_SIZE 525
-#define VAR_PAD_QUERIES 526
-#define VAR_PAD_QUERIES_BLOCK_SIZE 527
-#define VAR_IPSECMOD_ENABLED 528
-#define VAR_IPSECMOD_HOOK 529
-#define VAR_IPSECMOD_IGNORE_BOGUS 530
-#define VAR_IPSECMOD_MAX_TTL 531
-#define VAR_IPSECMOD_WHITELIST 532
-#define VAR_IPSECMOD_STRICT 533
-#define VAR_CACHEDB 534
-#define VAR_CACHEDB_BACKEND 535
-#define VAR_CACHEDB_SECRETSEED 536
-#define VAR_CACHEDB_REDISHOST 537
-#define VAR_CACHEDB_REDISPORT 538
-#define VAR_CACHEDB_REDISTIMEOUT 539
-#define VAR_CACHEDB_REDISEXPIRERECORDS 540
-#define VAR_CACHEDB_REDISPATH 541
-#define VAR_CACHEDB_REDISPASSWORD 542
-#define VAR_CACHEDB_REDISLOGICALDB 543
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 544
-#define VAR_FOR_UPSTREAM 545
-#define VAR_AUTH_ZONE 546
-#define VAR_ZONEFILE 547
-#define VAR_MASTER 548
-#define VAR_URL 549
-#define VAR_FOR_DOWNSTREAM 550
-#define VAR_FALLBACK_ENABLED 551
-#define VAR_TLS_ADDITIONAL_PORT 552
-#define VAR_LOW_RTT 553
-#define VAR_LOW_RTT_PERMIL 554
-#define VAR_FAST_SERVER_PERMIL 555
-#define VAR_FAST_SERVER_NUM 556
-#define VAR_ALLOW_NOTIFY 557
-#define VAR_TLS_WIN_CERT 558
-#define VAR_TCP_CONNECTION_LIMIT 559
-#define VAR_ANSWER_COOKIE 560
-#define VAR_COOKIE_SECRET 561
-#define VAR_IP_RATELIMIT_COOKIE 562
-#define VAR_FORWARD_NO_CACHE 563
-#define VAR_STUB_NO_CACHE 564
-#define VAR_LOG_SERVFAIL 565
-#define VAR_DENY_ANY 566
-#define VAR_UNKNOWN_SERVER_TIME_LIMIT 567
-#define VAR_LOG_TAG_QUERYREPLY 568
-#define VAR_DISCARD_TIMEOUT 569
-#define VAR_WAIT_LIMIT 570
-#define VAR_WAIT_LIMIT_COOKIE 571
-#define VAR_WAIT_LIMIT_NETBLOCK 572
-#define VAR_WAIT_LIMIT_COOKIE_NETBLOCK 573
-#define VAR_STREAM_WAIT_SIZE 574
-#define VAR_TLS_CIPHERS 575
-#define VAR_TLS_CIPHERSUITES 576
-#define VAR_TLS_USE_SNI 577
-#define VAR_IPSET 578
-#define VAR_IPSET_NAME_V4 579
-#define VAR_IPSET_NAME_V6 580
-#define VAR_TLS_SESSION_TICKET_KEYS 581
-#define VAR_RPZ 582
-#define VAR_TAGS 583
-#define VAR_RPZ_ACTION_OVERRIDE 584
-#define VAR_RPZ_CNAME_OVERRIDE 585
-#define VAR_RPZ_LOG 586
-#define VAR_RPZ_LOG_NAME 587
-#define VAR_DYNLIB 588
-#define VAR_DYNLIB_FILE 589
-#define VAR_EDNS_CLIENT_STRING 590
-#define VAR_EDNS_CLIENT_STRING_OPCODE 591
-#define VAR_NSID 592
-#define VAR_ZONEMD_PERMISSIVE_MODE 593
-#define VAR_ZONEMD_CHECK 594
-#define VAR_ZONEMD_REJECT_ABSENCE 595
-#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 596
-#define VAR_INTERFACE_AUTOMATIC_PORTS 597
-#define VAR_EDE 598
-#define VAR_INTERFACE_ACTION 599
-#define VAR_INTERFACE_VIEW 600
-#define VAR_INTERFACE_TAG 601
-#define VAR_INTERFACE_TAG_ACTION 602
-#define VAR_INTERFACE_TAG_DATA 603
-#define VAR_PROXY_PROTOCOL_PORT 604
-#define VAR_STATISTICS_INHIBIT_ZERO 605
-#define VAR_HARDEN_UNKNOWN_ADDITIONAL 606
-#define VAR_DISABLE_EDNS_DO 607
-#define VAR_CACHEDB_NO_STORE 608
-#define VAR_LOG_DESTADDR 609
-#define VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED 610
+#define VAR_DNSTAP_SAMPLE_RATE 446
+#define VAR_RESPONSE_IP_TAG 447
+#define VAR_RESPONSE_IP 448
+#define VAR_RESPONSE_IP_DATA 449
+#define VAR_HARDEN_ALGO_DOWNGRADE 450
+#define VAR_IP_TRANSPARENT 451
+#define VAR_IP_DSCP 452
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 453
+#define VAR_IP_RATELIMIT 454
+#define VAR_IP_RATELIMIT_SLABS 455
+#define VAR_IP_RATELIMIT_SIZE 456
+#define VAR_RATELIMIT 457
+#define VAR_RATELIMIT_SLABS 458
+#define VAR_RATELIMIT_SIZE 459
+#define VAR_OUTBOUND_MSG_RETRY 460
+#define VAR_MAX_SENT_COUNT 461
+#define VAR_MAX_QUERY_RESTARTS 462
+#define VAR_RATELIMIT_FOR_DOMAIN 463
+#define VAR_RATELIMIT_BELOW_DOMAIN 464
+#define VAR_IP_RATELIMIT_FACTOR 465
+#define VAR_RATELIMIT_FACTOR 466
+#define VAR_IP_RATELIMIT_BACKOFF 467
+#define VAR_RATELIMIT_BACKOFF 468
+#define VAR_SEND_CLIENT_SUBNET 469
+#define VAR_CLIENT_SUBNET_ZONE 470
+#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 471
+#define VAR_CLIENT_SUBNET_OPCODE 472
+#define VAR_MAX_CLIENT_SUBNET_IPV4 473
+#define VAR_MAX_CLIENT_SUBNET_IPV6 474
+#define VAR_MIN_CLIENT_SUBNET_IPV4 475
+#define VAR_MIN_CLIENT_SUBNET_IPV6 476
+#define VAR_MAX_ECS_TREE_SIZE_IPV4 477
+#define VAR_MAX_ECS_TREE_SIZE_IPV6 478
+#define VAR_CAPS_WHITELIST 479
+#define VAR_CACHE_MAX_NEGATIVE_TTL 480
+#define VAR_PERMIT_SMALL_HOLDDOWN 481
+#define VAR_CACHE_MIN_NEGATIVE_TTL 482
+#define VAR_QNAME_MINIMISATION 483
+#define VAR_QNAME_MINIMISATION_STRICT 484
+#define VAR_IP_FREEBIND 485
+#define VAR_DEFINE_TAG 486
+#define VAR_LOCAL_ZONE_TAG 487
+#define VAR_ACCESS_CONTROL_TAG 488
+#define VAR_LOCAL_ZONE_OVERRIDE 489
+#define VAR_ACCESS_CONTROL_TAG_ACTION 490
+#define VAR_ACCESS_CONTROL_TAG_DATA 491
+#define VAR_VIEW 492
+#define VAR_ACCESS_CONTROL_VIEW 493
+#define VAR_VIEW_FIRST 494
+#define VAR_SERVE_EXPIRED 495
+#define VAR_SERVE_EXPIRED_TTL 496
+#define VAR_SERVE_EXPIRED_TTL_RESET 497
+#define VAR_SERVE_EXPIRED_REPLY_TTL 498
+#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 499
+#define VAR_EDE_SERVE_EXPIRED 500
+#define VAR_SERVE_ORIGINAL_TTL 501
+#define VAR_FAKE_DSA 502
+#define VAR_FAKE_SHA1 503
+#define VAR_LOG_IDENTITY 504
+#define VAR_HIDE_TRUSTANCHOR 505
+#define VAR_HIDE_HTTP_USER_AGENT 506
+#define VAR_HTTP_USER_AGENT 507
+#define VAR_TRUST_ANCHOR_SIGNALING 508
+#define VAR_AGGRESSIVE_NSEC 509
+#define VAR_USE_SYSTEMD 510
+#define VAR_SHM_ENABLE 511
+#define VAR_SHM_KEY 512
+#define VAR_ROOT_KEY_SENTINEL 513
+#define VAR_DNSCRYPT 514
+#define VAR_DNSCRYPT_ENABLE 515
+#define VAR_DNSCRYPT_PORT 516
+#define VAR_DNSCRYPT_PROVIDER 517
+#define VAR_DNSCRYPT_SECRET_KEY 518
+#define VAR_DNSCRYPT_PROVIDER_CERT 519
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 520
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 521
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 522
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 523
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 524
+#define VAR_PAD_RESPONSES 525
+#define VAR_PAD_RESPONSES_BLOCK_SIZE 526
+#define VAR_PAD_QUERIES 527
+#define VAR_PAD_QUERIES_BLOCK_SIZE 528
+#define VAR_IPSECMOD_ENABLED 529
+#define VAR_IPSECMOD_HOOK 530
+#define VAR_IPSECMOD_IGNORE_BOGUS 531
+#define VAR_IPSECMOD_MAX_TTL 532
+#define VAR_IPSECMOD_WHITELIST 533
+#define VAR_IPSECMOD_STRICT 534
+#define VAR_CACHEDB 535
+#define VAR_CACHEDB_BACKEND 536
+#define VAR_CACHEDB_SECRETSEED 537
+#define VAR_CACHEDB_REDISHOST 538
+#define VAR_CACHEDB_REDISPORT 539
+#define VAR_CACHEDB_REDISTIMEOUT 540
+#define VAR_CACHEDB_REDISEXPIRERECORDS 541
+#define VAR_CACHEDB_REDISPATH 542
+#define VAR_CACHEDB_REDISPASSWORD 543
+#define VAR_CACHEDB_REDISLOGICALDB 544
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 545
+#define VAR_FOR_UPSTREAM 546
+#define VAR_AUTH_ZONE 547
+#define VAR_ZONEFILE 548
+#define VAR_MASTER 549
+#define VAR_URL 550
+#define VAR_FOR_DOWNSTREAM 551
+#define VAR_FALLBACK_ENABLED 552
+#define VAR_TLS_ADDITIONAL_PORT 553
+#define VAR_LOW_RTT 554
+#define VAR_LOW_RTT_PERMIL 555
+#define VAR_FAST_SERVER_PERMIL 556
+#define VAR_FAST_SERVER_NUM 557
+#define VAR_ALLOW_NOTIFY 558
+#define VAR_TLS_WIN_CERT 559
+#define VAR_TCP_CONNECTION_LIMIT 560
+#define VAR_ANSWER_COOKIE 561
+#define VAR_COOKIE_SECRET 562
+#define VAR_IP_RATELIMIT_COOKIE 563
+#define VAR_FORWARD_NO_CACHE 564
+#define VAR_STUB_NO_CACHE 565
+#define VAR_LOG_SERVFAIL 566
+#define VAR_DENY_ANY 567
+#define VAR_UNKNOWN_SERVER_TIME_LIMIT 568
+#define VAR_LOG_TAG_QUERYREPLY 569
+#define VAR_DISCARD_TIMEOUT 570
+#define VAR_WAIT_LIMIT 571
+#define VAR_WAIT_LIMIT_COOKIE 572
+#define VAR_WAIT_LIMIT_NETBLOCK 573
+#define VAR_WAIT_LIMIT_COOKIE_NETBLOCK 574
+#define VAR_STREAM_WAIT_SIZE 575
+#define VAR_TLS_CIPHERS 576
+#define VAR_TLS_CIPHERSUITES 577
+#define VAR_TLS_USE_SNI 578
+#define VAR_IPSET 579
+#define VAR_IPSET_NAME_V4 580
+#define VAR_IPSET_NAME_V6 581
+#define VAR_TLS_SESSION_TICKET_KEYS 582
+#define VAR_RPZ 583
+#define VAR_TAGS 584
+#define VAR_RPZ_ACTION_OVERRIDE 585
+#define VAR_RPZ_CNAME_OVERRIDE 586
+#define VAR_RPZ_LOG 587
+#define VAR_RPZ_LOG_NAME 588
+#define VAR_DYNLIB 589
+#define VAR_DYNLIB_FILE 590
+#define VAR_EDNS_CLIENT_STRING 591
+#define VAR_EDNS_CLIENT_STRING_OPCODE 592
+#define VAR_NSID 593
+#define VAR_ZONEMD_PERMISSIVE_MODE 594
+#define VAR_ZONEMD_CHECK 595
+#define VAR_ZONEMD_REJECT_ABSENCE 596
+#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 597
+#define VAR_INTERFACE_AUTOMATIC_PORTS 598
+#define VAR_EDE 599
+#define VAR_INTERFACE_ACTION 600
+#define VAR_INTERFACE_VIEW 601
+#define VAR_INTERFACE_TAG 602
+#define VAR_INTERFACE_TAG_ACTION 603
+#define VAR_INTERFACE_TAG_DATA 604
+#define VAR_PROXY_PROTOCOL_PORT 605
+#define VAR_STATISTICS_INHIBIT_ZERO 606
+#define VAR_HARDEN_UNKNOWN_ADDITIONAL 607
+#define VAR_DISABLE_EDNS_DO 608
+#define VAR_CACHEDB_NO_STORE 609
+#define VAR_LOG_DESTADDR 610
+#define VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED 611
+#define VAR_COOKIE_SECRET_FILE 612
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 0feeb61..f201e66 100644 (file)
@@ -137,6 +137,7 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
 %token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
 %token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
+%token VAR_DNSTAP_SAMPLE_RATE
 %token VAR_RESPONSE_IP_TAG VAR_RESPONSE_IP VAR_RESPONSE_IP_DATA
 %token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
 %token VAR_IP_DSCP
@@ -204,6 +205,7 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_PROXY_PROTOCOL_PORT VAR_STATISTICS_INHIBIT_ZERO
 %token VAR_HARDEN_UNKNOWN_ADDITIONAL VAR_DISABLE_EDNS_DO VAR_CACHEDB_NO_STORE
 %token VAR_LOG_DESTADDR VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED
+%token VAR_COOKIE_SECRET_FILE
 
 %%
 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -341,7 +343,7 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_interface_automatic_ports | server_ede |
        server_proxy_protocol_port | server_statistics_inhibit_zero |
        server_harden_unknown_additional | server_disable_edns_do |
-       server_log_destaddr
+       server_log_destaddr | server_cookie_secret_file
        ;
 stubstart: VAR_STUB_ZONE
        {
@@ -357,8 +359,14 @@ stubstart: VAR_STUB_ZONE
                }
        }
        ;
-contents_stub: contents_stub content_stub
-       | ;
+contents_stub: content_stub contents_stub
+       |
+       {
+               /* stub end */
+               if(cfg_parser->cfg->stubs &&
+                       !cfg_parser->cfg->stubs->name)
+                       yyerror("stub-zone without name");
+       };
 content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
        stub_no_cache | stub_ssl_upstream | stub_tcp_upstream
        ;
@@ -376,8 +384,14 @@ forwardstart: VAR_FORWARD_ZONE
                }
        }
        ;
-contents_forward: contents_forward content_forward
-       | ;
+contents_forward: content_forward contents_forward
+       |
+       {
+               /* forward end */
+               if(cfg_parser->cfg->forwards &&
+                       !cfg_parser->cfg->forwards->name)
+                       yyerror("forward-zone without name");
+       };
 content_forward: forward_name | forward_host | forward_addr | forward_first |
        forward_no_cache | forward_ssl_upstream | forward_tcp_upstream
        ;
@@ -389,16 +403,20 @@ viewstart: VAR_VIEW
                s = (struct config_view*)calloc(1, sizeof(struct config_view));
                if(s) {
                        s->next = cfg_parser->cfg->views;
-                       if(s->next && !s->next->name)
-                               yyerror("view without name");
                        cfg_parser->cfg->views = s;
                } else {
                        yyerror("out of memory");
                }
        }
        ;
-contents_view: contents_view content_view
-       | ;
+contents_view: content_view contents_view
+       |
+       {
+               /* view end */
+               if(cfg_parser->cfg->views &&
+                       !cfg_parser->cfg->views->name)
+                       yyerror("view without name");
+       };
 content_view: view_name | view_local_zone | view_local_data | view_first |
                view_response_ip | view_response_ip_data | view_local_data_ptr
        ;
@@ -3437,7 +3455,8 @@ content_dt: dt_dnstap_enable | dt_dnstap_socket_path | dt_dnstap_bidirectional |
        dt_dnstap_log_client_query_messages |
        dt_dnstap_log_client_response_messages |
        dt_dnstap_log_forwarder_query_messages |
-       dt_dnstap_log_forwarder_response_messages
+       dt_dnstap_log_forwarder_response_messages |
+       dt_dnstap_sample_rate
        ;
 dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
        {
@@ -3601,6 +3620,17 @@ dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MES
                free($2);
        }
        ;
+dt_dnstap_sample_rate: VAR_DNSTAP_SAMPLE_RATE STRING_ARG
+       {
+               OUTYY(("P(dt_dnstap_sample_rate:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else if(atoi($2) < 0)
+                       yyerror("dnstap sample rate too small");
+               else    cfg_parser->cfg->dnstap_sample_rate = atoi($2);
+               free($2);
+       }
+       ;
 pythonstart: VAR_PYTHON
        {
                OUTYY(("\nP(python:)\n"));
@@ -3969,6 +3999,13 @@ server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG
                free($2);
        }
        ;
+server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG
+       {
+               OUTYY(("P(cookie_secret_file:%s)\n", $2));
+               free(cfg_parser->cfg->cookie_secret_file);
+               cfg_parser->cfg->cookie_secret_file = $2;
+       }
+       ;
        ipsetstart: VAR_IPSET
                {
                        OUTYY(("\nP(ipset:)\n"));
index cb0f673..15e28bd 100644 (file)
@@ -225,7 +225,7 @@ int dname_strict_subdomain(uint8_t* d1, int labs1, uint8_t* d2, int labs2);
 int dname_strict_subdomain_c(uint8_t* d1, uint8_t* d2);
 
 /**
- * Counts labels. Tests is d1 is a subdomain of d2.
+ * Counts labels. Tests if d1 is a subdomain of d2.
  * @param d1: domain name, uncompressed wireformat
  * @param d2: domain name, uncompressed wireformat
  * @return true if d1 is a subdomain of d2.
index d06b7bb..f11f0fd 100644 (file)
@@ -947,7 +947,8 @@ parse_packet(sldns_buffer* pkt, struct msg_parse* msg, struct regional* region)
 static int
 parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len,
        struct edns_data* edns, struct config_file* cfg, struct comm_point* c,
-       struct comm_reply* repinfo, uint32_t now, struct regional* region)
+       struct comm_reply* repinfo, uint32_t now, struct regional* region,
+       struct cookie_secrets* cookie_secrets)
 {
        /* To respond with a Keepalive option, the client connection must have
         * received one message with a TCP Keepalive EDNS option, and that
@@ -1070,13 +1071,24 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len,
                                        &((struct sockaddr_in6*)&repinfo->remote_addr)->sin6_addr, 16);
                        }
 
+                       if(cfg->cookie_secret_file &&
+                               cfg->cookie_secret_file[0]) {
+                               /* Loop over the active and staging cookies. */
+                               cookie_val_status =
+                                       cookie_secrets_server_validate(
+                                       rdata_ptr, opt_len, cookie_secrets,
+                                       cookie_is_v4, server_cookie, now);
+                       } else {
+                               /* Use the cookie option value to validate. */
                        cookie_val_status = edns_cookie_server_validate(
                                rdata_ptr, opt_len, cfg->cookie_secret,
                                cfg->cookie_secret_len, cookie_is_v4,
                                server_cookie, now);
+                       }
+                       if(cookie_val_status == COOKIE_STATUS_VALID_RENEW)
+                               edns->cookie_valid = 1;
                        switch(cookie_val_status) {
                        case COOKIE_STATUS_VALID:
-                       case COOKIE_STATUS_VALID_RENEW:
                                edns->cookie_valid = 1;
                                /* Reuse cookie */
                                if(!edns_opt_list_append(
@@ -1091,13 +1103,30 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len,
                                break;
                        case COOKIE_STATUS_CLIENT_ONLY:
                                edns->cookie_client = 1;
+                               ATTR_FALLTHROUGH
                                /* fallthrough */
+                       case COOKIE_STATUS_VALID_RENEW:
                        case COOKIE_STATUS_FUTURE:
                        case COOKIE_STATUS_EXPIRED:
                        case COOKIE_STATUS_INVALID:
                        default:
+                               if(cfg->cookie_secret_file &&
+                                       cfg->cookie_secret_file[0]) {
+                                       if(!cookie_secrets)
+                                               break;
+                                       lock_basic_lock(&cookie_secrets->lock);
+                                       if(cookie_secrets->cookie_count < 1) {
+                                               lock_basic_unlock(&cookie_secrets->lock);
+                                               break;
+                                       }
+                                       edns_cookie_server_write(server_cookie,
+                                               cookie_secrets->cookie_secrets[0].cookie_secret,
+                                               cookie_is_v4, now);
+                                       lock_basic_unlock(&cookie_secrets->lock);
+                               } else {
                                edns_cookie_server_write(server_cookie,
                                        cfg->cookie_secret, cookie_is_v4, now);
+                               }
                                if(!edns_opt_list_append(&edns->opt_list_out,
                                        LDNS_EDNS_COOKIE, 24, server_cookie,
                                        region)) {
@@ -1239,7 +1268,8 @@ skip_pkt_rrs(sldns_buffer* pkt, int num)
 int 
 parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns,
        struct config_file* cfg, struct comm_point* c,
-       struct comm_reply* repinfo, time_t now, struct regional* region)
+       struct comm_reply* repinfo, time_t now, struct regional* region,
+       struct cookie_secrets* cookie_secrets)
 {
        size_t rdata_len;
        uint8_t* rdata_ptr;
@@ -1285,7 +1315,7 @@ parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns,
        rdata_ptr = sldns_buffer_current(pkt);
        /* ignore rrsigs */
        return parse_edns_options_from_query(rdata_ptr, rdata_len, edns, cfg,
-               c, repinfo, now, region);
+               c, repinfo, now, region, cookie_secrets);
 }
 
 void
index 656e0d2..aebd48e 100644 (file)
@@ -73,6 +73,7 @@ struct edns_option;
 struct config_file;
 struct comm_point;
 struct comm_reply;
+struct cookie_secrets;
 
 /** number of buckets in parse rrset hash table. Must be power of 2. */
 #define PARSE_TABLE_SIZE 32
@@ -322,12 +323,14 @@ int skip_pkt_rrs(struct sldns_buffer* pkt, int num);
  * @param repinfo: commreply to determine the client address
  * @param now: current time
  * @param region: region to alloc results in (edns option contents)
+ * @param cookie_secrets: the cookie secrets for EDNS COOKIE validation.
  * @return: 0 on success, or an RCODE on error.
  *     RCODE formerr if OPT is badly formatted and so on.
  */
 int parse_edns_from_query_pkt(struct sldns_buffer* pkt, struct edns_data* edns,
        struct config_file* cfg, struct comm_point* c,
-       struct comm_reply* repinfo, time_t now, struct regional* region);
+       struct comm_reply* repinfo, time_t now, struct regional* region,
+       struct cookie_secrets* cookie_secrets);
 
 /**
  * Calculate hash value for rrset in packet.
index 2b4047f..ee95a69 100644 (file)
@@ -187,3 +187,189 @@ edns_cookie_server_validate(const uint8_t* cookie, size_t cookie_len,
                return COOKIE_STATUS_VALID_RENEW;
        return COOKIE_STATUS_VALID;
 }
+
+struct cookie_secrets*
+cookie_secrets_create(void)
+{
+       struct cookie_secrets* cookie_secrets = calloc(1,
+               sizeof(*cookie_secrets));
+       if(!cookie_secrets)
+               return NULL;
+       lock_basic_init(&cookie_secrets->lock);
+       lock_protect(&cookie_secrets->lock, &cookie_secrets->cookie_count,
+               sizeof(cookie_secrets->cookie_count));
+       lock_protect(&cookie_secrets->lock, cookie_secrets->cookie_secrets,
+               sizeof(cookie_secret_type)*UNBOUND_COOKIE_HISTORY_SIZE);
+       return cookie_secrets;
+}
+
+void
+cookie_secrets_delete(struct cookie_secrets* cookie_secrets)
+{
+       if(!cookie_secrets)
+               return;
+       lock_basic_destroy(&cookie_secrets->lock);
+       explicit_bzero(cookie_secrets->cookie_secrets,
+               sizeof(cookie_secret_type)*UNBOUND_COOKIE_HISTORY_SIZE);
+       free(cookie_secrets);
+}
+
+/** Read the cookie secret file */
+static int
+cookie_secret_file_read(struct cookie_secrets* cookie_secrets,
+       char* cookie_secret_file)
+{
+       char secret[UNBOUND_COOKIE_SECRET_SIZE * 2 + 2/*'\n' and '\0'*/];
+       FILE* f;
+       int corrupt = 0;
+       size_t count;
+
+       log_assert(cookie_secret_file != NULL);
+       cookie_secrets->cookie_count = 0;
+       f = fopen(cookie_secret_file, "r");
+       /* a non-existing cookie file is not an error */
+       if( f == NULL ) {
+               if(errno != EPERM) {
+                       log_err("Could not read cookie-secret-file '%s': %s",
+                               cookie_secret_file, strerror(errno));
+                       return 0;
+               }
+               return 1;
+       }
+       /* cookie secret file exists and is readable */
+       for( count = 0; count < UNBOUND_COOKIE_HISTORY_SIZE; count++ ) {
+               size_t secret_len = 0;
+               ssize_t decoded_len = 0;
+               if( fgets(secret, sizeof(secret), f) == NULL ) { break; }
+               secret_len = strlen(secret);
+               if( secret_len == 0 ) { break; }
+               log_assert( secret_len <= sizeof(secret) );
+               secret_len = secret[secret_len - 1] == '\n' ? secret_len - 1 : secret_len;
+               if( secret_len != UNBOUND_COOKIE_SECRET_SIZE * 2 ) { corrupt++; break; }
+               /* needed for `hex_pton`; stripping potential `\n` */
+               secret[secret_len] = '\0';
+               decoded_len = hex_pton(secret, cookie_secrets->cookie_secrets[count].cookie_secret,
+                                      UNBOUND_COOKIE_SECRET_SIZE);
+               if( decoded_len != UNBOUND_COOKIE_SECRET_SIZE ) { corrupt++; break; }
+               cookie_secrets->cookie_count++;
+       }
+       fclose(f);
+       return corrupt == 0;
+}
+
+int
+cookie_secrets_apply_cfg(struct cookie_secrets* cookie_secrets,
+       char* cookie_secret_file)
+{
+       if(!cookie_secrets) {
+               if(!cookie_secret_file || !cookie_secret_file[0])
+                       return 1; /* There is nothing to read anyway */
+               log_err("Could not read cookie secrets, no structure alloced");
+               return 0;
+       }
+       if(!cookie_secret_file_read(cookie_secrets, cookie_secret_file))
+               return 0;
+       return 1;
+}
+
+enum edns_cookie_val_status
+cookie_secrets_server_validate(const uint8_t* cookie, size_t cookie_len,
+       struct cookie_secrets* cookie_secrets, int v4,
+       const uint8_t* hash_input, uint32_t now)
+{
+       size_t i;
+       enum edns_cookie_val_status cookie_val_status,
+               last = COOKIE_STATUS_INVALID;
+       if(!cookie_secrets)
+               return COOKIE_STATUS_INVALID; /* There are no cookie secrets.*/
+       lock_basic_lock(&cookie_secrets->lock);
+       if(cookie_secrets->cookie_count == 0) {
+               lock_basic_unlock(&cookie_secrets->lock);
+               return COOKIE_STATUS_INVALID; /* There are no cookie secrets.*/
+       }
+       for(i=0; i<cookie_secrets->cookie_count; i++) {
+               cookie_val_status = edns_cookie_server_validate(cookie,
+                       cookie_len,
+                       cookie_secrets->cookie_secrets[i].cookie_secret,
+                       UNBOUND_COOKIE_SECRET_SIZE, v4, hash_input, now);
+               if(cookie_val_status == COOKIE_STATUS_VALID ||
+                       cookie_val_status == COOKIE_STATUS_VALID_RENEW) {
+                       lock_basic_unlock(&cookie_secrets->lock);
+                       /* For staging cookies, write a fresh cookie. */
+                       if(i != 0)
+                               return COOKIE_STATUS_VALID_RENEW;
+                       return cookie_val_status;
+               }
+               if(last == COOKIE_STATUS_INVALID)
+                       last = cookie_val_status; /* Store more interesting
+                               failure to return. */
+       }
+       lock_basic_unlock(&cookie_secrets->lock);
+       return last;
+}
+
+void add_cookie_secret(struct cookie_secrets* cookie_secrets,
+       uint8_t* secret, size_t secret_len)
+{
+       log_assert(secret_len == UNBOUND_COOKIE_SECRET_SIZE);
+       (void)secret_len;
+       if(!cookie_secrets)
+               return;
+
+       /* New cookie secret becomes the staging secret (position 1)
+        * unless there is no active cookie yet, then it becomes the active
+        * secret.  If the UNBOUND_COOKIE_HISTORY_SIZE > 2 then all staging cookies
+        * are moved one position down.
+        */
+       if(cookie_secrets->cookie_count == 0) {
+               memcpy( cookie_secrets->cookie_secrets->cookie_secret
+                      , secret, UNBOUND_COOKIE_SECRET_SIZE);
+               cookie_secrets->cookie_count = 1;
+               explicit_bzero(secret, UNBOUND_COOKIE_SECRET_SIZE);
+               return;
+       }
+#if UNBOUND_COOKIE_HISTORY_SIZE > 2
+       memmove( &cookie_secrets->cookie_secrets[2], &cookie_secrets->cookie_secrets[1]
+              , sizeof(struct cookie_secret) * (UNBOUND_COOKIE_HISTORY_SIZE - 2));
+#endif
+       memcpy( cookie_secrets->cookie_secrets[1].cookie_secret
+             , secret, UNBOUND_COOKIE_SECRET_SIZE);
+       cookie_secrets->cookie_count = cookie_secrets->cookie_count     < UNBOUND_COOKIE_HISTORY_SIZE
+                         ? cookie_secrets->cookie_count + 1 : UNBOUND_COOKIE_HISTORY_SIZE;
+       explicit_bzero(secret, UNBOUND_COOKIE_SECRET_SIZE);
+}
+
+void activate_cookie_secret(struct cookie_secrets* cookie_secrets)
+{
+       uint8_t active_secret[UNBOUND_COOKIE_SECRET_SIZE];
+       if(!cookie_secrets)
+               return;
+       /* The staging secret becomes the active secret.
+        * The active secret becomes a staging secret.
+        * If the UNBOUND_COOKIE_HISTORY_SIZE > 2 then all staging secrets are moved
+        * one position up and the previously active secret becomes the last
+        * staging secret.
+        */
+       if(cookie_secrets->cookie_count < 2)
+               return;
+       memcpy( active_secret, cookie_secrets->cookie_secrets[0].cookie_secret
+             , UNBOUND_COOKIE_SECRET_SIZE);
+       memmove( &cookie_secrets->cookie_secrets[0], &cookie_secrets->cookie_secrets[1]
+              , sizeof(struct cookie_secret) * (UNBOUND_COOKIE_HISTORY_SIZE - 1));
+       memcpy( cookie_secrets->cookie_secrets[cookie_secrets->cookie_count - 1].cookie_secret
+             , active_secret, UNBOUND_COOKIE_SECRET_SIZE);
+       explicit_bzero(active_secret, UNBOUND_COOKIE_SECRET_SIZE);
+}
+
+void drop_cookie_secret(struct cookie_secrets* cookie_secrets)
+{
+       if(!cookie_secrets)
+               return;
+       /* Drops a staging cookie secret. If there are more than one, it will
+        * drop the last staging secret. */
+       if(cookie_secrets->cookie_count < 2)
+               return;
+       explicit_bzero( cookie_secrets->cookie_secrets[cookie_secrets->cookie_count - 1].cookie_secret
+                     , UNBOUND_COOKIE_SECRET_SIZE);
+       cookie_secrets->cookie_count -= 1;
+}
index 5da0ecb..47ccb1a 100644 (file)
@@ -43,6 +43,7 @@
 #define UTIL_EDNS_H
 
 #include "util/storage/dnstree.h"
+#include "util/locks.h"
 
 struct edns_data;
 struct config_file;
@@ -75,6 +76,31 @@ struct edns_string_addr {
        size_t string_len;
 };
 
+#define UNBOUND_COOKIE_HISTORY_SIZE 2
+#define UNBOUND_COOKIE_SECRET_SIZE 16
+
+typedef struct cookie_secret cookie_secret_type;
+struct cookie_secret {
+       /** cookie secret */
+       uint8_t cookie_secret[UNBOUND_COOKIE_SECRET_SIZE];
+};
+
+/**
+ * The cookie secrets from the cookie-secret-file.
+ */
+struct cookie_secrets {
+       /** lock on the structure, in case there are modifications
+        * from remote control, this avoids race conditions. */
+       lock_basic_type lock;
+
+       /** how many cookies are there in the cookies array */
+       size_t cookie_count;
+
+       /* keep track of the last `UNBOUND_COOKIE_HISTORY_SIZE`
+        * cookies as per rfc requirement .*/
+       cookie_secret_type cookie_secrets[UNBOUND_COOKIE_HISTORY_SIZE];
+};
+
 enum edns_cookie_val_status {
        COOKIE_STATUS_CLIENT_ONLY = -3,
        COOKIE_STATUS_FUTURE = -2,
@@ -165,4 +191,63 @@ enum edns_cookie_val_status edns_cookie_server_validate(const uint8_t* cookie,
        size_t cookie_len, const uint8_t* secret, size_t secret_len, int v4,
        const uint8_t* hash_input, uint32_t now);
 
+/**
+ * Create the cookie secrets structure.
+ * @return the structure or NULL on failure.
+ */
+struct cookie_secrets* cookie_secrets_create(void);
+
+/**
+ * Delete the cookie secrets.
+ * @param cookie_secrets: the cookie secrets.
+ */
+void cookie_secrets_delete(struct cookie_secrets* cookie_secrets);
+
+/**
+ * Apply configuration to cookie secrets, read them from file.
+ * @param cookie_secrets: the cookie secrets structure.
+ * @param cookie_secret_file: the file name, it is read.
+ * @return false on failure.
+ */
+int cookie_secrets_apply_cfg(struct cookie_secrets* cookie_secrets,
+       char* cookie_secret_file);
+
+/**
+ * Validate the cookie secrets, try all of them.
+ * @param cookie: pointer to the cookie data.
+ * @param cookie_len: the length of the cookie data.
+ * @param cookie_secrets: struct of cookie secrets.
+ * @param v4: if the client IP is v4 or v6.
+ * @param hash_input: pointer to the hash input for validation. It needs to be:
+ *     Client Cookie | Version | Reserved | Timestamp | Client-IP
+ * @param now: the current time.
+ * return edns_cookie_val_status with the cookie validation status i.e.,
+ *     <=0 for invalid, else valid.
+ */
+enum edns_cookie_val_status cookie_secrets_server_validate(
+       const uint8_t* cookie, size_t cookie_len,
+       struct cookie_secrets* cookie_secrets, int v4,
+       const uint8_t* hash_input, uint32_t now);
+
+/**
+ * Add a cookie secret. If there are no secrets yet, the secret will become
+ * the active secret. Otherwise it will become the staging secret.
+ * Active secrets are used to both verify and create new DNS Cookies.
+ * Staging secrets are only used to verify DNS Cookies. Caller has to lock.
+ */
+void add_cookie_secret(struct cookie_secrets* cookie_secrets, uint8_t* secret,
+       size_t secret_len);
+
+/**
+ * Makes the staging cookie secret active and the active secret staging.
+ * Caller has to lock.
+ */
+void activate_cookie_secret(struct cookie_secrets* cookie_secrets);
+
+/**
+ * Drop a cookie secret. Drops the staging secret. An active secret will not
+ * be dropped. Caller has to lock.
+ */
+void drop_cookie_secret(struct cookie_secrets* cookie_secrets);
+
 #endif
index a792a34..6919b44 100644 (file)
@@ -448,6 +448,28 @@ fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id))
        return 0;
 }
 
+int
+fptr_whitelist_mod_startup(int (*fptr)(struct module_env* env, int id))
+{
+#ifdef USE_IPSET
+       if(fptr == &ipset_startup) return 1;
+#else
+       (void)fptr;
+#endif
+       return 0;
+}
+
+int
+fptr_whitelist_mod_destartup(void (*fptr)(struct module_env* env, int id))
+{
+#ifdef USE_IPSET
+       if(fptr == &ipset_destartup) return 1;
+#else
+       (void)fptr;
+#endif
+       return 0;
+}
+
 int 
 fptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate,
         enum module_ev event, int id, struct outbound_entry* outbound))
index a0d9867..fb2475c 100644 (file)
@@ -278,6 +278,22 @@ int fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id));
  */
 int fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id));
 
+/**
+ * Check function pointer whitelist for module startup call values.
+ *
+ * @param fptr: function pointer to check.
+ * @return false if not in whitelist.
+ */
+int fptr_whitelist_mod_startup(int (*fptr)(struct module_env* env, int id));
+
+/**
+ * Check function pointer whitelist for module destartup call values.
+ *
+ * @param fptr: function pointer to check.
+ * @return false if not in whitelist.
+ */
+int fptr_whitelist_mod_destartup(void (*fptr)(struct module_env* env, int id));
+
 /**
  * Check function pointer whitelist for module operate call values.
  *
index c9df746..ab2eabc 100644 (file)
  * also contain an rcode that is nonzero, but in this case additional
  * information (query, additional) can be passed along.
  *
- * The rcode and dns_msg are used to pass the result from the the rightmost
+ * The rcode and dns_msg are used to pass the result from the rightmost
  * module towards the leftmost modules and then towards the user.
  *
  * If you want to avoid recursion-cycles where queries need other queries
@@ -713,7 +713,28 @@ struct module_func_block {
        const char* name;
 
        /** 
-        * init the module. Called once for the global state.
+        * Set up the module for start. This is called only once at startup.
+        * Privileged operations like opening device files may be done here.
+        * The function ptr can be NULL, if it is not used.
+        * @param env: module environment.
+        * @param id: module id number.
+        * return: 0 on error
+        */
+       int (*startup)(struct module_env* env, int id);
+
+       /**
+        * Close down the module for stop. This is called only once before
+        * shutdown to free resources allocated during startup().
+        * Closing privileged ports or files must be done here.
+        * The function ptr can be NULL, if it is not used.
+        * @param env: module environment.
+        * @param id: module id number.
+        */
+       void (*destartup)(struct module_env* env, int id);
+
+       /**
+        * Initialise the module. Called when restarting or reloading the
+        * daemon.
         * This is the place to apply settings from the config file.
         * @param env: module environment.
         * @param id: module id number.
@@ -722,7 +743,8 @@ struct module_func_block {
        int (*init)(struct module_env* env, int id);
 
        /**
-        * de-init, delete, the module. Called once for the global state.
+        * Deinitialise the module, undo stuff done during init().
+        * Called before reloading the daemon.
         * @param env: module environment.
         * @param id: module id number.
         */
index d2218ea..5cf702e 100644 (file)
@@ -47,6 +47,7 @@
 #ifdef HAVE_NETIOAPI_H
 #include <netioapi.h>
 #endif
+#include <ctype.h>
 #include "util/net_help.h"
 #include "util/log.h"
 #include "util/data/dname.h"
@@ -862,6 +863,20 @@ addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
        return (memcmp(s, map_prefix, 12) == 0);
 }
 
+int addr_is_ip6linklocal(struct sockaddr_storage* addr, socklen_t addrlen)
+{
+       const uint8_t prefix[2] = {0xfe, 0x80};
+       int af = (int)((struct sockaddr_in6*)addr)->sin6_family;
+       void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
+       uint8_t start[2];
+       if(af != AF_INET6 || addrlen<(socklen_t)sizeof(struct sockaddr_in6))
+               return 0;
+       /* Put the first 10 bits of sin6addr in start, match fe80::/10. */
+       memmove(start, sin6addr, 2);
+       start[1] &= 0xc0;
+       return memcmp(start, prefix, 2) == 0;
+}
+
 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
 {
        int af = (int)((struct sockaddr_in*)addr)->sin_family;
@@ -1206,7 +1221,7 @@ listen_sslctx_setup_2(void* ctxt)
        if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
                log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
        }
-#elif defined(USE_ECDSA)
+#elif defined(USE_ECDSA) && defined(HAVE_SSL_CTX_SET_TMP_ECDH)
        if(1) {
                EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
                if (!ecdh) {
@@ -1857,3 +1872,42 @@ sock_close(int socket)
        closesocket(socket);
 }
 #  endif /* USE_WINSOCK */
+
+ssize_t
+hex_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize)
+{
+       static char hexdigits[] = {
+               '0', '1', '2', '3', '4', '5', '6', '7',
+               '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+       };
+       size_t i;
+
+       if (targsize < srclength * 2 + 1) {
+               return -1;
+       }
+
+       for (i = 0; i < srclength; ++i) {
+               *target++ = hexdigits[src[i] >> 4U];
+               *target++ = hexdigits[src[i] & 0xfU];
+       }
+       *target = '\0';
+       return 2 * srclength;
+}
+
+ssize_t
+hex_pton(const char* src, uint8_t* target, size_t targsize)
+{
+       uint8_t *t = target;
+       if(strlen(src) % 2 != 0 || strlen(src)/2 > targsize) {
+               return -1;
+       }
+       while(*src) {
+               if(!isxdigit((unsigned char)src[0]) ||
+                       !isxdigit((unsigned char)src[1]))
+                       return -1;
+               *t++ = sldns_hexdigit_to_int(src[0]) * 16 +
+                       sldns_hexdigit_to_int(src[1]) ;
+               src += 2;
+       }
+       return t-target;
+}
index edaea42..28245ea 100644 (file)
@@ -362,6 +362,14 @@ void addr_to_nat64(const struct sockaddr_storage* addr,
  */
 int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
 
+/**
+ * See if sockaddr is an ipv6 fe80::/10 link local address.
+ * @param addr: address
+ * @param addrlen: length of address
+ * @return true if so
+ */
+int addr_is_ip6linklocal(struct sockaddr_storage* addr, socklen_t addrlen);
+
 /**
  * See if sockaddr is 255.255.255.255.
  * @param addr: address
@@ -564,4 +572,13 @@ char* sock_strerror(int errn);
 /** close the socket with close, or wsa closesocket */
 void sock_close(int socket);
 
+/**
+ * Convert binary data to a string of hexadecimal characters.
+ */
+ssize_t hex_ntop(uint8_t const *src, size_t srclength, char *target,
+                size_t targsize);
+
+/** Convert hexadecimal data to binary. */
+ssize_t hex_pton(const char* src, uint8_t* target, size_t targsize);
+
 #endif /* NET_HELP_H */
index 980829d..4c40c9c 100644 (file)
@@ -329,6 +329,7 @@ udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
                case EACCES:
                        if(verbosity < VERB_ALGO)
                                return 0;
+                       break;
                default:
                        break;
        }
@@ -2365,11 +2366,11 @@ recv_error:
 #ifndef USE_WINSOCK
        if(errno == EINTR || errno == EAGAIN)
                return 1;
-       if(recv_initial) {
 #ifdef ECONNRESET
                if(errno == ECONNRESET && verbosity < 2)
                        return 0; /* silence reset by peer */
 #endif
+       if(recv_initial) {
 #ifdef ECONNREFUSED
                if(errno == ECONNREFUSED && verbosity < 2)
                        return 0; /* silence reset by peer */
@@ -2396,7 +2397,7 @@ recv_error:
 #endif
 #ifdef ENOTCONN
                if(errno == ENOTCONN) {
-                       log_err_addr("read (in tcp s) failed and this "
+                       log_err_addr("read (in tcp initial) failed and this "
                                "could be because TCP Fast Open is "
                                "enabled [--disable-tfo-client "
                                "--disable-tfo-server] but does not "
@@ -2430,8 +2431,9 @@ recv_error:
                return 1;
        }
 #endif
-       log_err_addr("read (in tcp s)", sock_strerror(errno),
-               &c->repinfo.remote_addr, c->repinfo.remote_addrlen);
+       log_err_addr((recv_initial?"read (in tcp initial)":"read (in tcp)"),
+               sock_strerror(errno), &c->repinfo.remote_addr,
+               c->repinfo.remote_addrlen);
        return 0;
 }
 
@@ -3306,6 +3308,13 @@ void http2_stream_add_meshstate(struct http2_stream* h2_stream,
        h2_stream->mesh_state = m;
 }
 
+void http2_stream_remove_mesh_state(struct http2_stream* h2_stream)
+{
+       if(!h2_stream)
+               return;
+       h2_stream->mesh_state = NULL;
+}
+
 /** delete http2 session server. After closing connection. */
 static void http2_session_server_delete(struct http2_session* h2_session)
 {
index 1e4a13f..6f43ce5 100644 (file)
@@ -955,6 +955,9 @@ void http2_session_add_stream(struct http2_session* h2_session,
 void http2_stream_add_meshstate(struct http2_stream* h2_stream,
        struct mesh_area* mesh, struct mesh_state* m);
 
+/** Remove mesh state from stream. When the mesh state has been removed. */
+void http2_stream_remove_mesh_state(struct http2_stream* h2_stream);
+
 /**
  * This routine is published for checks and tests, and is only used internally.
  * handle libevent callback for timer comm.
index a188049..235538b 100644 (file)
@@ -153,6 +153,7 @@ pp2_write_to_buf(uint8_t* buf, size_t buflen,
                break;
 #endif /* INET6 */
        case AF_UNIX:
+               ATTR_FALLTHROUGH
                /* fallthrough */
        default:
                return 0;
index 32797df..a13657c 100644 (file)
@@ -128,26 +128,32 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k,
     case 7:
         b |= ((uint64_t)in[6]) << 48;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 6:
         b |= ((uint64_t)in[5]) << 40;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 5:
         b |= ((uint64_t)in[4]) << 32;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 4:
         b |= ((uint64_t)in[3]) << 24;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 3:
         b |= ((uint64_t)in[2]) << 16;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 2:
         b |= ((uint64_t)in[1]) << 8;
         /** EDIT annotate case statement fallthrough for gcc */
+       ATTR_FALLTHROUGH
         /* fallthrough */
     case 1:
         b |= ((uint64_t)in[0]);
index f2a48f4..3712837 100644 (file)
@@ -254,11 +254,15 @@ uint32_t        initval)         /* the previous hash, or an arbitrary value */
   switch(length)                     /* all the case statements fall through */
   { 
   case 3 : c+=k[2];
+       ATTR_FALLTHROUGH
        /* fallthrough */
   case 2 : b+=k[1];
+       ATTR_FALLTHROUGH
        /* fallthrough */
   case 1 : a+=k[0];
     final(a,b,c);
+       ATTR_FALLTHROUGH
+       /* fallthrough */
   case 0:     /* case 0: nothing left to add */
     break;
   }
@@ -304,9 +308,15 @@ uint32_t       *pb)               /* IN: more seed OUT: secondary hash value */
   switch(length)                     /* all the case statements fall through */
   { 
   case 3 : c+=k[2];
+       ATTR_FALLTHROUGH
+       /* fallthrough */
   case 2 : b+=k[1];
+       ATTR_FALLTHROUGH
+       /* fallthrough */
   case 1 : a+=k[0];
     final(a,b,c);
+       ATTR_FALLTHROUGH
+       /* fallthrough */
   case 0:     /* case 0: nothing left to add */
     break;
   }
@@ -404,16 +414,32 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
     switch(length)
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
-    case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
-    case 9 : c+=k8[8];                   /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
+    case 10: c+=((uint32_t)k8[9])<<8;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
+    case 9 : c+=k8[8];
+       ATTR_FALLTHROUGH
+       /* fallthrough */
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
-    case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
-    case 5 : b+=k8[4];                   /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
+    case 6 : b+=((uint32_t)k8[5])<<8;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
+    case 5 : b+=k8[4];
+       ATTR_FALLTHROUGH
+       /* fallthrough */
     case 4 : a+=k[0]; break;
-    case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
-    case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
+    case 2 : a+=((uint32_t)k8[1])<<8;
+       ATTR_FALLTHROUGH
+       /* fallthrough */
     case 1 : a+=k8[0]; break;
     case 0 : return c;
     }
@@ -443,23 +469,33 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
              b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 11: c+=((uint32_t)k8[10])<<16;     /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 10: c+=k[4];
              b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 9 : c+=k8[8];                      /* fall through */
+    case 9 : c+=k8[8];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 7 : b+=((uint32_t)k8[6])<<16;      /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 6 : b+=k[2];
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 5 : b+=k8[4];                      /* fall through */
+    case 5 : b+=k8[4];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 3 : a+=((uint32_t)k8[2])<<16;      /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 2 : a+=k[0];
              break;
     case 1 : a+=k8[0];
@@ -494,26 +530,37 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
     switch(length)                   /* all the case statements fall through */
     {
     case 12: c+=((uint32_t)k[11])<<24;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 11: c+=((uint32_t)k[10])<<16;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 10: c+=((uint32_t)k[9])<<8;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 9 : c+=k[8];
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 8 : b+=((uint32_t)k[7])<<24;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 7 : b+=((uint32_t)k[6])<<16;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 6 : b+=((uint32_t)k[5])<<8;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 5 : b+=k[4];
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 4 : a+=((uint32_t)k[3])<<24;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 3 : a+=((uint32_t)k[2])<<16;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 2 : a+=((uint32_t)k[1])<<8;
+       ATTR_FALLTHROUGH
        /* fallthrough */
     case 1 : a+=k[0];
              break;
@@ -603,16 +650,32 @@ void hashlittle2(
     switch(length)
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
-    case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
-    case 9 : c+=k8[8];                   /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 10: c+=((uint32_t)k8[9])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 9 : c+=k8[8];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
-    case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
-    case 5 : b+=k8[4];                   /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 6 : b+=((uint32_t)k8[5])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 5 : b+=k8[4];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=k[0]; break;
-    case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
-    case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 2 : a+=((uint32_t)k8[1])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 1 : a+=k8[0]; break;
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
     }
@@ -642,23 +705,33 @@ void hashlittle2(
              b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 11: c+=((uint32_t)k8[10])<<16;     /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 10: c+=k[4];
              b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 9 : c+=k8[8];                      /* fall through */
+    case 9 : c+=k8[8];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 7 : b+=((uint32_t)k8[6])<<16;      /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 6 : b+=k[2];
              a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 5 : b+=k8[4];                      /* fall through */
+    case 5 : b+=k8[4];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
              break;
-    case 3 : a+=((uint32_t)k8[2])<<16;      /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 2 : a+=k[0];
              break;
     case 1 : a+=k8[0];
@@ -693,16 +766,38 @@ void hashlittle2(
     switch(length)                   /* all the case statements fall through */
     {
     case 12: c+=((uint32_t)k[11])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 11: c+=((uint32_t)k[10])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 10: c+=((uint32_t)k[9])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 9 : c+=k[8];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=((uint32_t)k[7])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 7 : b+=((uint32_t)k[6])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 6 : b+=((uint32_t)k[5])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 5 : b+=k[4];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=((uint32_t)k[3])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 3 : a+=((uint32_t)k[2])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 2 : a+=((uint32_t)k[1])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 1 : a+=k[0];
              break;
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
@@ -784,16 +879,32 @@ uint32_t hashbig( const void *key, size_t length, uint32_t initval)
     switch(length)                   /* all the case statements fall through */
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((uint32_t)k8[10])<<8;  /* fall through */
-    case 10: c+=((uint32_t)k8[9])<<16;  /* fall through */
-    case 9 : c+=((uint32_t)k8[8])<<24;  /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 10: c+=((uint32_t)k8[9])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 9 : c+=((uint32_t)k8[8])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((uint32_t)k8[6])<<8;   /* fall through */
-    case 6 : b+=((uint32_t)k8[5])<<16;  /* fall through */
-    case 5 : b+=((uint32_t)k8[4])<<24;  /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 6 : b+=((uint32_t)k8[5])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 5 : b+=((uint32_t)k8[4])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=k[0]; break;
-    case 3 : a+=((uint32_t)k8[2])<<8;   /* fall through */
-    case 2 : a+=((uint32_t)k8[1])<<16;  /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
+    case 2 : a+=((uint32_t)k8[1])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 1 : a+=((uint32_t)k8[0])<<24; break;
     case 0 : return c;
     }
@@ -827,16 +938,38 @@ uint32_t hashbig( const void *key, size_t length, uint32_t initval)
     switch(length)                   /* all the case statements fall through */
     {
     case 12: c+=k[11];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 11: c+=((uint32_t)k[10])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 10: c+=((uint32_t)k[9])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 9 : c+=((uint32_t)k[8])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 8 : b+=k[7];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 7 : b+=((uint32_t)k[6])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 6 : b+=((uint32_t)k[5])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 5 : b+=((uint32_t)k[4])<<24;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 4 : a+=k[3];
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 3 : a+=((uint32_t)k[2])<<8;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 2 : a+=((uint32_t)k[1])<<16;
+            ATTR_FALLTHROUGH
+            /* fallthrough */
     case 1 : a+=((uint32_t)k[0])<<24;
              break;
     case 0 : return c;
index 2c38664..b37f684 100644 (file)
@@ -1266,12 +1266,13 @@ verify_dnskey(struct module_env* env, struct val_env* ve,
         struct trust_anchor* tp, struct ub_packed_rrset_key* rrset,
        struct module_qstate* qstate)
 {
+       char reasonbuf[256];
        char* reason = NULL;
        uint8_t sigalg[ALGO_NEEDS_MAX+1];
        int downprot = env->cfg->harden_algo_downgrade;
        enum sec_status sec = val_verify_DNSKEY_with_TA(env, ve, rrset,
                tp->ds_rrset, tp->dnskey_rrset, downprot?sigalg:NULL, &reason,
-               NULL, qstate);
+               NULL, qstate, reasonbuf, sizeof(reasonbuf));
        /* sigalg is ignored, it returns algorithms signalled to exist, but
         * in 5011 there are no other rrsets to check.  if downprot is
         * enabled, then it checks that the DNSKEY is signed with all
index d0cc67f..ad0cba1 100644 (file)
@@ -177,7 +177,7 @@ static int
 nsec_verify_rrset(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key* nsec, struct key_entry_key* kkey,
        char** reason, sldns_ede_code* reason_bogus,
-       struct module_qstate* qstate)
+       struct module_qstate* qstate, char* reasonbuf, size_t reasonlen)
 {
        struct packed_rrset_data* d = (struct packed_rrset_data*)
                nsec->entry.data;
@@ -189,7 +189,8 @@ nsec_verify_rrset(struct module_env* env, struct val_env* ve,
        if(d->security == sec_status_secure)
                return 1;
        d->security = val_verify_rrset_entry(env, ve, nsec, kkey, reason,
-               reason_bogus, LDNS_SECTION_AUTHORITY, qstate, &verified);
+               reason_bogus, LDNS_SECTION_AUTHORITY, qstate, &verified,
+               reasonbuf, reasonlen);
        if(d->security == sec_status_secure) {
                rrset_update_sec_status(env->rrset_cache, nsec, *env->now);
                return 1;
@@ -201,7 +202,8 @@ enum sec_status
 val_nsec_prove_nodata_dsreply(struct module_env* env, struct val_env* ve, 
        struct query_info* qinfo, struct reply_info* rep, 
        struct key_entry_key* kkey, time_t* proof_ttl, char** reason,
-       sldns_ede_code* reason_bogus, struct module_qstate* qstate)
+       sldns_ede_code* reason_bogus, struct module_qstate* qstate,
+       char* reasonbuf, size_t reasonlen)
 {
        struct ub_packed_rrset_key* nsec = reply_find_rrset_section_ns(
                rep, qinfo->qname, qinfo->qname_len, LDNS_RR_TYPE_NSEC, 
@@ -219,7 +221,7 @@ val_nsec_prove_nodata_dsreply(struct module_env* env, struct val_env* ve,
         * 2) this is not a delegation point */
        if(nsec) {
                if(!nsec_verify_rrset(env, ve, nsec, kkey, reason,
-                       reason_bogus, qstate)) {
+                       reason_bogus, qstate, reasonbuf, reasonlen)) {
                        verbose(VERB_ALGO, "NSEC RRset for the "
                                "referral did not verify.");
                        return sec_status_bogus;
@@ -250,7 +252,7 @@ val_nsec_prove_nodata_dsreply(struct module_env* env, struct val_env* ve,
                if(rep->rrsets[i]->rk.type != htons(LDNS_RR_TYPE_NSEC))
                        continue;
                if(!nsec_verify_rrset(env, ve, rep->rrsets[i], kkey, reason,
-                       reason_bogus, qstate)) {
+                       reason_bogus, qstate, reasonbuf, reasonlen)) {
                        verbose(VERB_ALGO, "NSEC for empty non-terminal "
                                "did not verify.");
                        *reason = "NSEC for empty non-terminal "
index 81844c9..c1d4531 100644 (file)
@@ -68,6 +68,8 @@ struct key_entry_key;
  * @param reason: string explaining why bogus.
  * @param reason_bogus: relevant EDE code for validation failure.
  * @param qstate: qstate with region.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return security status.
  *     SECURE: proved absence of DS.
  *     INSECURE: proved that this was not a delegation point.
@@ -78,7 +80,7 @@ enum sec_status val_nsec_prove_nodata_dsreply(struct module_env* env,
        struct val_env* ve, struct query_info* qinfo, 
        struct reply_info* rep, struct key_entry_key* kkey,
        time_t* proof_ttl, char** reason, sldns_ede_code* reason_bogus,
-       struct module_qstate* qstate);
+       struct module_qstate* qstate, char* reasonbuf, size_t reasonlen);
 
 /** 
  * nsec typemap check, takes an NSEC-type bitmap as argument, checks for type.
index 95d1e4d..e790e99 100644 (file)
@@ -1445,7 +1445,7 @@ static int
 list_is_secure(struct module_env* env, struct val_env* ve, 
        struct ub_packed_rrset_key** list, size_t num,
        struct key_entry_key* kkey, char** reason, sldns_ede_code *reason_bogus,
-       struct module_qstate* qstate)
+       struct module_qstate* qstate, char* reasonbuf, size_t reasonlen)
 {
        struct packed_rrset_data* d;
        size_t i;
@@ -1461,7 +1461,7 @@ list_is_secure(struct module_env* env, struct val_env* ve,
                        continue;
                d->security = val_verify_rrset_entry(env, ve, list[i], kkey,
                        reason, reason_bogus, LDNS_SECTION_AUTHORITY, qstate,
-                       &verified);
+                       &verified, reasonbuf, reasonlen);
                if(d->security != sec_status_secure) {
                        verbose(VERB_ALGO, "NSEC3 did not verify");
                        return 0;
@@ -1476,7 +1476,7 @@ nsec3_prove_nods(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key** list, size_t num,
        struct query_info* qinfo, struct key_entry_key* kkey, char** reason,
        sldns_ede_code* reason_bogus, struct module_qstate* qstate,
-       struct nsec3_cache_table* ct)
+       struct nsec3_cache_table* ct, char* reasonbuf, size_t reasonlen)
 {
        struct nsec3_filter flt;
        struct ce_response ce;
@@ -1491,7 +1491,8 @@ nsec3_prove_nods(struct module_env* env, struct val_env* ve,
                *reason = "no valid NSEC3s";
                return sec_status_bogus; /* no valid NSEC3s, bogus */
        }
-       if(!list_is_secure(env, ve, list, num, kkey, reason, reason_bogus, qstate)) {
+       if(!list_is_secure(env, ve, list, num, kkey, reason, reason_bogus,
+               qstate, reasonbuf, reasonlen)) {
                *reason = "not all NSEC3 records secure";
                return sec_status_bogus; /* not all NSEC3 records secure */
        }
index 8ca9129..f668a27 100644 (file)
@@ -210,6 +210,8 @@ nsec3_prove_wildcard(struct module_env* env, struct val_env* ve,
  * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
  * @param qstate: qstate with region.
  * @param ct: cached hashes table.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return:
  *     sec_status SECURE of the proposition is proven by the NSEC3 RRs, 
  *     BOGUS if not, INSECURE if all of the NSEC3s could be validly ignored.
@@ -222,7 +224,7 @@ nsec3_prove_nods(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key** list, size_t num, 
        struct query_info* qinfo, struct key_entry_key* kkey, char** reason,
        sldns_ede_code* reason_bogus, struct module_qstate* qstate,
-       struct nsec3_cache_table* ct);
+       struct nsec3_cache_table* ct, char* reasonbuf, size_t reasonlen);
 
 /**
  * Prove NXDOMAIN or NODATA.
index 7865167..be8347b 100644 (file)
@@ -423,7 +423,10 @@ setup_dsa_sig(unsigned char** sig, unsigned int* len)
        if(!dsasig) return 0;
 
 #ifdef HAVE_DSA_SIG_SET0
-       if(!DSA_SIG_set0(dsasig, R, S)) return 0;
+       if(!DSA_SIG_set0(dsasig, R, S)) {
+               DSA_SIG_free(dsasig);
+               return 0;
+       }
 #else
 #  ifndef S_SPLINT_S
        dsasig->r = R;
@@ -2057,11 +2060,13 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
                digest_size = (digest_size ? digest_size : SHA1_DIGEST_SIZE);
 #endif
                /* double fallthrough annotation to please gcc parser */
+               ATTR_FALLTHROUGH
                /* fallthrough */
 #ifdef USE_SHA2
                /* fallthrough */
        case LDNS_RSASHA256:
                digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
+               ATTR_FALLTHROUGH
                /* fallthrough */
        case LDNS_RSASHA512:
                digest_size = (digest_size ? digest_size : SHA512_DIGEST_SIZE);
@@ -2077,6 +2082,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
 #ifdef USE_ECDSA
        case LDNS_ECDSAP256SHA256:
                digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
+               ATTR_FALLTHROUGH
                /* fallthrough */
        case LDNS_ECDSAP384SHA384:
                digest_size = (digest_size ? digest_size : SHA384_DIGEST_SIZE);
index 7c2b9d7..9251d2b 100644 (file)
@@ -623,7 +623,8 @@ enum sec_status
 dnskeyset_verify_rrset(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey,
        uint8_t* sigalg, char** reason, sldns_ede_code *reason_bogus,
-       sldns_pkt_section section, struct module_qstate* qstate, int* verified)
+       sldns_pkt_section section, struct module_qstate* qstate, int* verified,
+       char* reasonbuf, size_t reasonlen)
 {
        enum sec_status sec;
        size_t i, num;
@@ -680,7 +681,8 @@ dnskeyset_verify_rrset(struct module_env* env, struct val_env* ve,
                verbose(VERB_ALGO, "rrset failed to verify: "
                        "no valid signatures for %d algorithms",
                        (int)algo_needs_num_missing(&needs));
-               algo_needs_reason(env, alg, reason, "no signatures");
+               algo_needs_reason(alg, reason, "no signatures", reasonbuf,
+                       reasonlen);
        } else {
                verbose(VERB_ALGO, "rrset failed to verify: "
                        "no valid signatures");
@@ -688,17 +690,16 @@ dnskeyset_verify_rrset(struct module_env* env, struct val_env* ve,
        return sec_status_bogus;
 }
 
-void algo_needs_reason(struct module_env* env, int alg, char** reason, char* s)
+void algo_needs_reason(int alg, char** reason, char* s, char* reasonbuf,
+       size_t reasonlen)
 {
-       char buf[256];
        sldns_lookup_table *t = sldns_lookup_by_id(sldns_algorithms, alg);
        if(t&&t->name)
-               snprintf(buf, sizeof(buf), "%s with algorithm %s", s, t->name);
-       else    snprintf(buf, sizeof(buf), "%s with algorithm ALG%u", s,
+               snprintf(reasonbuf, reasonlen, "%s with algorithm %s", s,
+                       t->name);
+       else    snprintf(reasonbuf, reasonlen, "%s with algorithm ALG%u", s,
                        (unsigned)alg);
-       *reason = regional_strdup(env->scratch, buf);
-       if(!*reason)
-               *reason = s;
+       *reason = reasonbuf;
 }
 
 enum sec_status
index 1a3d8fc..1fac8bd 100644 (file)
@@ -134,12 +134,14 @@ int algo_needs_missing(struct algo_needs* n);
 
 /**
  * Format error reason for algorithm missing.
- * @param env: module env with scratch for temp storage of string.
  * @param alg: DNSKEY-algorithm missing.
  * @param reason: destination.
  * @param s: string, appended with 'with algorithm ..'.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  */
-void algo_needs_reason(struct module_env* env, int alg, char** reason, char* s);
+void algo_needs_reason(int alg, char** reason, char* s, char* reasonbuf,
+       size_t reasonlen);
 
 /** 
  * Check if dnskey matches a DS digest 
@@ -261,6 +263,8 @@ uint16_t dnskey_get_flags(struct ub_packed_rrset_key* k, size_t idx);
  * @param section: section of packet where this rrset comes from.
  * @param qstate: qstate with region.
  * @param verified: if not NULL the number of RRSIG validations is returned.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return SECURE if one key in the set verifies one rrsig.
  *     UNCHECKED on allocation errors, unsupported algorithms, malformed data,
  *     and BOGUS on verification failures (no keys match any signatures).
@@ -269,8 +273,8 @@ enum sec_status dnskeyset_verify_rrset(struct module_env* env,
        struct val_env* ve, struct ub_packed_rrset_key* rrset, 
        struct ub_packed_rrset_key* dnskey, uint8_t* sigalg,
        char** reason, sldns_ede_code *reason_bogus,
-       sldns_pkt_section section, struct module_qstate* qstate, int* verified);
-
+       sldns_pkt_section section, struct module_qstate* qstate, int* verified,
+       char* reasonbuf, size_t reasonlen);
 
 /** 
  * verify rrset against one specific dnskey (from rrset) 
index a7db41d..22c204b 100644 (file)
@@ -240,6 +240,26 @@ val_find_best_signer(struct ub_packed_rrset_key* rrset,
        }
 }
 
+/** Detect if the, unsigned, CNAME is under a previous DNAME RR in the
+ * message, and thus it was generated from that previous DNAME.
+ */
+static int
+cname_under_previous_dname(struct reply_info* rep, size_t cname_idx,
+       size_t* ret)
+{
+       size_t i;
+       for(i=0; i<cname_idx; i++) {
+               if(ntohs(rep->rrsets[i]->rk.type) == LDNS_RR_TYPE_DNAME &&
+                       dname_strict_subdomain_c(rep->rrsets[cname_idx]->
+                       rk.dname, rep->rrsets[i]->rk.dname)) {
+                       *ret = i;
+                       return 1;
+               }
+       }
+       *ret = 0;
+       return 0;
+}
+
 void 
 val_find_signer(enum val_classification subtype, struct query_info* qinf, 
        struct reply_info* rep, size_t skip, uint8_t** signer_name, 
@@ -275,12 +295,19 @@ val_find_signer(enum val_classification subtype, struct query_info* qinf,
                *signer_name = NULL;
                *signer_len = 0;
        } else if(subtype == VAL_CLASS_CNAME) {
+               size_t j;
                /* check for the first signed cname/dname rrset */
                for(i=skip; i<rep->an_numrrsets; i++) {
                        val_find_rrset_signer(rep->rrsets[i], 
                                signer_name, signer_len);
                        if(*signer_name)
                                return;
+                       if(ntohs(rep->rrsets[i]->rk.type) == LDNS_RR_TYPE_CNAME
+                               && cname_under_previous_dname(rep, i, &j)) {
+                               val_find_rrset_signer(rep->rrsets[j],
+                                       signer_name, signer_len);
+                               return;
+                       }
                        if(ntohs(rep->rrsets[i]->rk.type) != LDNS_RR_TYPE_DNAME)
                                break; /* only check CNAME after a DNAME */
                }
@@ -379,7 +406,7 @@ val_verify_rrset(struct module_env* env, struct val_env* ve,
         struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* keys,
        uint8_t* sigalg, char** reason, sldns_ede_code *reason_bogus,
        sldns_pkt_section section, struct module_qstate* qstate,
-       int *verified)
+       int *verified, char* reasonbuf, size_t reasonlen)
 {
        enum sec_status sec;
        struct packed_rrset_data* d = (struct packed_rrset_data*)rrset->
@@ -404,7 +431,7 @@ val_verify_rrset(struct module_env* env, struct val_env* ve,
        log_nametypeclass(VERB_ALGO, "verify rrset", rrset->rk.dname,
                ntohs(rrset->rk.type), ntohs(rrset->rk.rrset_class));
        sec = dnskeyset_verify_rrset(env, ve, rrset, keys, sigalg, reason,
-               reason_bogus, section, qstate, verified);
+               reason_bogus, section, qstate, verified, reasonbuf, reasonlen);
        verbose(VERB_ALGO, "verify result: %s", sec_status_to_string(sec));
        regional_free_all(env->scratch);
 
@@ -439,7 +466,7 @@ val_verify_rrset_entry(struct module_env* env, struct val_env* ve,
         struct ub_packed_rrset_key* rrset, struct key_entry_key* kkey,
        char** reason, sldns_ede_code *reason_bogus,
        sldns_pkt_section section, struct module_qstate* qstate,
-       int* verified)
+       int* verified, char* reasonbuf, size_t reasonlen)
 {
        /* temporary dnskey rrset-key */
        struct ub_packed_rrset_key dnskey;
@@ -453,7 +480,7 @@ val_verify_rrset_entry(struct module_env* env, struct val_env* ve,
        dnskey.entry.key = &dnskey;
        dnskey.entry.data = kd->rrset_data;
        sec = val_verify_rrset(env, ve, rrset, &dnskey, kd->algo, reason,
-               reason_bogus, section, qstate, verified);
+               reason_bogus, section, qstate, verified, reasonbuf, reasonlen);
        return sec;
 }
 
@@ -463,7 +490,7 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key* dnskey_rrset,
         struct ub_packed_rrset_key* ds_rrset, size_t ds_idx, char** reason,
        sldns_ede_code *reason_bogus, struct module_qstate* qstate,
-       int *nonechecked)
+       int *nonechecked, char* reasonbuf, size_t reasonlen)
 {
        enum sec_status sec = sec_status_bogus;
        size_t i, num, numchecked = 0, numhashok = 0, numsizesupp = 0;
@@ -517,8 +544,8 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
                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");
+               algo_needs_reason(ds_get_key_algo(ds_rrset, ds_idx),
+                       reason, "no keys have a DS", reasonbuf, reasonlen);
                *nonechecked = 1;
        } else if(numhashok == 0) {
                *reason = "DS hash mismatches key";
@@ -549,7 +576,8 @@ enum sec_status
 val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key* dnskey_rrset,
        struct ub_packed_rrset_key* ds_rrset, uint8_t* sigalg, char** reason,
-       sldns_ede_code *reason_bogus, struct module_qstate* qstate)
+       sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+       char* reasonbuf, size_t reasonlen)
 {
        /* as long as this is false, we can consider this DS rrset to be
         * equivalent to no DS rrset. */
@@ -588,7 +616,7 @@ val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve,
 
                sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
                        ds_rrset, i, reason, reason_bogus, qstate,
-                       &nonechecked);
+                       &nonechecked, reasonbuf, reasonlen);
                if(sec == sec_status_insecure) {
                        /* DNSKEY too large unsupported or algo refused by
                         * crypto lib. */
@@ -639,8 +667,8 @@ val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve,
        /* If any were understandable, then it is bad. */
        verbose(VERB_QUERY, "Failed to match any usable DS to a DNSKEY.");
        if(sigalg && (alg=algo_needs_missing(&needs)) != 0) {
-               algo_needs_reason(env, alg, reason, "missing verification of "
-                       "DNSKEY signature");
+               algo_needs_reason(alg, reason, "missing verification of "
+                       "DNSKEY signature", reasonbuf, reasonlen);
        }
        return sec_status_bogus;
 }
@@ -649,12 +677,13 @@ struct key_entry_key*
 val_verify_new_DNSKEYs(struct regional* region, struct module_env* env, 
        struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset, 
        struct ub_packed_rrset_key* ds_rrset, int downprot, char** reason,
-       sldns_ede_code *reason_bogus, struct module_qstate* qstate)
+       sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+       char* reasonbuf, size_t reasonlen)
 {
        uint8_t sigalg[ALGO_NEEDS_MAX+1];
        enum sec_status sec = val_verify_DNSKEY_with_DS(env, ve,
                dnskey_rrset, ds_rrset, downprot?sigalg:NULL, reason, 
-               reason_bogus, qstate);
+               reason_bogus, qstate, reasonbuf, reasonlen);
 
        if(sec == sec_status_secure) {
                return key_entry_create_rrset(region, 
@@ -679,7 +708,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
        struct ub_packed_rrset_key* dnskey_rrset,
        struct ub_packed_rrset_key* ta_ds,
        struct ub_packed_rrset_key* ta_dnskey, uint8_t* sigalg, char** reason,
-       sldns_ede_code *reason_bogus, struct module_qstate* qstate)
+       sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+       char* reasonbuf, size_t reasonlen)
 {
        /* as long as this is false, we can consider this anchor to be
         * equivalent to no anchor. */
@@ -730,7 +760,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
                        continue;
 
                sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
-                       ta_ds, i, reason, reason_bogus, qstate, &nonechecked);
+                       ta_ds, i, reason, reason_bogus, qstate, &nonechecked,
+                       reasonbuf, reasonlen);
                if(sec == sec_status_insecure) {
                        has_algo_refusal = 1;
                        continue;
@@ -810,8 +841,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
        /* If any were understandable, then it is bad. */
        verbose(VERB_QUERY, "Failed to match any usable anchor to a DNSKEY.");
        if(sigalg && (alg=algo_needs_missing(&needs)) != 0) {
-               algo_needs_reason(env, alg, reason, "missing verification of "
-                       "DNSKEY signature");
+               algo_needs_reason(alg, reason, "missing verification of "
+                       "DNSKEY signature", reasonbuf, reasonlen);
        }
        return sec_status_bogus;
 }
@@ -821,12 +852,14 @@ val_verify_new_DNSKEYs_with_ta(struct regional* region, struct module_env* env,
        struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset,
        struct ub_packed_rrset_key* ta_ds_rrset,
        struct ub_packed_rrset_key* ta_dnskey_rrset, int downprot,
-       char** reason, sldns_ede_code *reason_bogus, struct module_qstate* qstate)
+       char** reason, sldns_ede_code *reason_bogus,
+       struct module_qstate* qstate, char* reasonbuf, size_t reasonlen)
 {
        uint8_t sigalg[ALGO_NEEDS_MAX+1];
        enum sec_status sec = val_verify_DNSKEY_with_TA(env, ve,
                dnskey_rrset, ta_ds_rrset, ta_dnskey_rrset,
-               downprot?sigalg:NULL, reason, reason_bogus, qstate);
+               downprot?sigalg:NULL, reason, reason_bogus, qstate,
+               reasonbuf, reasonlen);
 
        if(sec == sec_status_secure) {
                return key_entry_create_rrset(region,
@@ -979,7 +1012,7 @@ void
 val_fill_reply(struct reply_info* chase, struct reply_info* orig, 
        size_t skip, uint8_t* name, size_t len, uint8_t* signer)
 {
-       size_t i;
+       size_t i, j;
        int seen_dname = 0;
        chase->rrset_count = 0;
        chase->an_numrrsets = 0;
@@ -1002,6 +1035,13 @@ val_fill_reply(struct reply_info* chase, struct reply_info* orig,
                                LDNS_RR_TYPE_DNAME) {
                                        seen_dname = 1;
                        }
+               } else if(ntohs(orig->rrsets[i]->rk.type) == LDNS_RR_TYPE_CNAME
+                       && ((struct packed_rrset_data*)orig->rrsets[i]->
+                       entry.data)->rrsig_count == 0 &&
+                       cname_under_previous_dname(orig, i, &j) &&
+                       rrset_has_signer(orig->rrsets[j], name, len)) {
+                       chase->rrsets[chase->an_numrrsets++] = orig->rrsets[j];
+                       chase->rrsets[chase->an_numrrsets++] = orig->rrsets[i];
                }
        }       
        /* AUTHORITY section */
index e8cdcef..ed69b1a 100644 (file)
@@ -125,13 +125,15 @@ void val_find_signer(enum val_classification subtype,
  * @param section: section of packet where this rrset comes from.
  * @param qstate: qstate with region.
  * @param verified: if not NULL, the number of RRSIG validations is returned.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return security status of verification.
  */
 enum sec_status val_verify_rrset_entry(struct module_env* env, 
        struct val_env* ve, struct ub_packed_rrset_key* rrset, 
        struct key_entry_key* kkey, char** reason, sldns_ede_code *reason_bogus,
        sldns_pkt_section section, struct module_qstate* qstate,
-       int* verified);
+       int* verified, char* reasonbuf, size_t reasonlen);
 
 /**
  * Verify DNSKEYs with DS rrset. Like val_verify_new_DNSKEYs but
@@ -146,6 +148,8 @@ enum sec_status val_verify_rrset_entry(struct module_env* env,
  * @param reason: reason of failure. Fixed string or alloced in scratch.
  * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
  * @param qstate: qstate with region.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return: sec_status_secure if a DS matches.
  *     sec_status_insecure if end of trust (i.e., unknown algorithms).
  *     sec_status_bogus if it fails.
@@ -153,7 +157,8 @@ enum sec_status val_verify_rrset_entry(struct module_env* env,
 enum sec_status val_verify_DNSKEY_with_DS(struct module_env* env,
     struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset,
     struct ub_packed_rrset_key* ds_rrset, uint8_t* sigalg, char** reason,
-    sldns_ede_code *reason_bogus, struct module_qstate* qstate);
+    sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+    char* reasonbuf, size_t reasonlen);
 
 /**
  * Verify DNSKEYs with DS and DNSKEY rrset.  Like val_verify_DNSKEY_with_DS
@@ -169,6 +174,8 @@ enum sec_status val_verify_DNSKEY_with_DS(struct module_env* env,
  * @param reason: reason of failure. Fixed string or alloced in scratch.
 * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
  * @param qstate: qstate with region.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return: sec_status_secure if a DS matches.
  *     sec_status_insecure if end of trust (i.e., unknown algorithms).
  *     sec_status_bogus if it fails.
@@ -177,7 +184,8 @@ enum sec_status val_verify_DNSKEY_with_TA(struct module_env* env,
     struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset,
     struct ub_packed_rrset_key* ta_ds,
     struct ub_packed_rrset_key* ta_dnskey, uint8_t* sigalg, char** reason,
-    sldns_ede_code *reason_bogus, struct module_qstate* qstate);
+    sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+    char* reasonbuf, size_t reasonlen);
 
 /**
  * Verify new DNSKEYs with DS rrset. The DS contains hash values that should
@@ -194,6 +202,8 @@ enum sec_status val_verify_DNSKEY_with_TA(struct module_env* env,
  * @param reason: reason of failure. Fixed string or alloced in scratch.
  * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
  * @param qstate: qstate with region.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return a KeyEntry. This will either contain the now trusted
  *         dnskey_rrset, a "null" key entry indicating that this DS
  *         rrset/DNSKEY pair indicate an secure end to the island of trust
@@ -208,7 +218,8 @@ struct key_entry_key* val_verify_new_DNSKEYs(struct regional* region,
     struct module_env* env, struct val_env* ve,
     struct ub_packed_rrset_key* dnskey_rrset, 
     struct ub_packed_rrset_key* ds_rrset, int downprot, char** reason,
-    sldns_ede_code *reason_bogus, struct module_qstate* qstate);
+    sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+    char* reasonbuf, size_t reasonlen);
 
 /**
  * Verify rrset with trust anchor: DS and DNSKEY rrset.
@@ -224,6 +235,8 @@ struct key_entry_key* val_verify_new_DNSKEYs(struct regional* region,
  * @param reason: reason of failure. Fixed string or alloced in scratch.
  * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
  * @param qstate: qstate with region.
+ * @param reasonbuf: buffer to use for fail reason string print.
+ * @param reasonlen: length of reasonbuf.
  * @return a KeyEntry. This will either contain the now trusted
  *         dnskey_rrset, a "null" key entry indicating that this DS
  *         rrset/DNSKEY pair indicate an secure end to the island of trust
@@ -239,7 +252,8 @@ struct key_entry_key* val_verify_new_DNSKEYs_with_ta(struct regional* region,
     struct ub_packed_rrset_key* dnskey_rrset,
     struct ub_packed_rrset_key* ta_ds_rrset,
     struct ub_packed_rrset_key* ta_dnskey_rrset, int downprot,
-    char** reason, sldns_ede_code *reason_bogus, struct module_qstate* qstate);
+    char** reason, sldns_ede_code *reason_bogus, struct module_qstate* qstate,
+    char* reasonbuf, size_t reasonlen);
 
 /**
  * Determine if DS rrset is usable for validator or not.
index 3cf2916..e6d19a2 100644 (file)
@@ -72,7 +72,8 @@
 /* forward decl for cache response and normal super inform calls of a DS */
 static void 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, int* suspend);
+       struct query_info* qinfo, struct sock_list* origin, int* suspend,
+       struct module_qstate* sub_qstate);
 
 
 /* Updates the suplied EDE (RFC8914) code selectively so we don't lose
@@ -273,11 +274,17 @@ val_new_getmsg(struct module_qstate* qstate, struct val_qstate* vq)
                return NULL;
        if(vq->orig_msg->rep->rrset_count > RR_COUNT_MAX)
                return NULL; /* protect against integer overflow */
-       vq->chase_reply->rrsets = regional_alloc_init(qstate->region,
-               vq->orig_msg->rep->rrsets, sizeof(struct ub_packed_rrset_key*)
-                       * vq->orig_msg->rep->rrset_count);
+       /* Over allocate (+an_numrrsets) in case we need to put extra DNAME
+        * records for unsigned CNAME repetitions */
+       vq->chase_reply->rrsets = regional_alloc(qstate->region,
+               sizeof(struct ub_packed_rrset_key*) *
+               (vq->orig_msg->rep->rrset_count
+               + vq->orig_msg->rep->an_numrrsets));
        if(!vq->chase_reply->rrsets)
                return NULL;
+       memmove(vq->chase_reply->rrsets, vq->orig_msg->rep->rrsets,
+               sizeof(struct ub_packed_rrset_key*) *
+               vq->orig_msg->rep->rrset_count);
        vq->rrset_skip = 0;
        return vq;
 }
@@ -640,6 +647,7 @@ validate_msg_signatures(struct module_qstate* qstate, struct val_qstate* vq,
        struct ub_packed_rrset_key* s;
        enum sec_status sec;
        int num_verifies = 0, verified, have_state = 0;
+       char reasonbuf[256];
        char* reason = NULL;
        sldns_ede_code reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
        *suspend = 0;
@@ -675,7 +683,8 @@ validate_msg_signatures(struct module_qstate* qstate, struct val_qstate* vq,
 
                /* Verify the answer rrset */
                sec = val_verify_rrset_entry(env, ve, s, key_entry, &reason,
-                       &reason_bogus, LDNS_SECTION_ANSWER, qstate, &verified);
+                       &reason_bogus, LDNS_SECTION_ANSWER, qstate, &verified,
+                       reasonbuf, sizeof(reasonbuf));
                /* If the (answer) rrset failed to validate, then this 
                 * message is BAD. */
                if(sec != sec_status_secure) {
@@ -720,7 +729,7 @@ validate_msg_signatures(struct module_qstate* qstate, struct val_qstate* vq,
                s = chase_reply->rrsets[i];
                sec = val_verify_rrset_entry(env, ve, s, key_entry, &reason,
                        &reason_bogus, LDNS_SECTION_AUTHORITY, qstate,
-                       &verified);
+                       &verified, reasonbuf, sizeof(reasonbuf));
                /* If anything in the authority section fails to be secure, 
                 * we have a bad message. */
                if(sec != sec_status_secure) {
@@ -766,7 +775,7 @@ validate_msg_signatures(struct module_qstate* qstate, struct val_qstate* vq,
                if(sname && query_dname_compare(sname, key_entry->name)==0)
                        (void)val_verify_rrset_entry(env, ve, s, key_entry,
                                &reason, NULL, LDNS_SECTION_ADDITIONAL, qstate,
-                               &verified);
+                               &verified, reasonbuf, sizeof(reasonbuf));
                /* the additional section can fail to be secure, 
                 * it is optional, check signature in case we need
                 * to clean the additional section later. */
@@ -2060,7 +2069,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
                        verbose(VERB_ALGO, "Process suspended sub DS response");
                        msg = vq->sub_ds_msg;
                        process_ds_response(qstate, vq, id, LDNS_RCODE_NOERROR,
-                               msg, &msg->qinfo, NULL, &suspend);
+                               msg, &msg->qinfo, NULL, &suspend, NULL);
                        if(suspend) {
                                /* we'll come back here later to continue */
                                if(!validate_suspend_setup_timer(qstate, vq,
@@ -2076,7 +2085,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
                        vq->key_entry->name)) ) {
                        verbose(VERB_ALGO, "Process cached DS response");
                        process_ds_response(qstate, vq, id, LDNS_RCODE_NOERROR,
-                               msg, &msg->qinfo, NULL, &suspend);
+                               msg, &msg->qinfo, NULL, &suspend, NULL);
                        if(suspend) {
                                /* we'll come back here later to continue */
                                if(!validate_suspend_setup_timer(qstate, vq,
@@ -2658,6 +2667,8 @@ val_operate(struct module_qstate* qstate, enum module_ev event, int id,
  * @param ta: trust anchor.
  * @param qstate: qstate that needs key.
  * @param id: module id.
+ * @param sub_qstate: the sub query state, that is the lookup that fetched
+ *     the trust anchor data, it contains error information for the answer.
  * @return new key entry or NULL on allocation failure.
  *     The key entry will either contain a validated DNSKEY rrset, or
  *     represent a Null key (query failed, but validation did not), or a
@@ -2665,31 +2676,38 @@ val_operate(struct module_qstate* qstate, enum module_ev event, int id,
  */
 static struct key_entry_key*
 primeResponseToKE(struct ub_packed_rrset_key* dnskey_rrset, 
-       struct trust_anchor* ta, struct module_qstate* qstate, int id)
+       struct trust_anchor* ta, struct module_qstate* qstate, int id,
+       struct module_qstate* sub_qstate)
 {
        struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
        struct key_entry_key* kkey = NULL;
        enum sec_status sec = sec_status_unchecked;
+       char reasonbuf[256];
        char* reason = NULL;
        sldns_ede_code reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
        int downprot = qstate->env->cfg->harden_algo_downgrade;
 
        if(!dnskey_rrset) {
+               char* err = errinf_to_str_misc(sub_qstate);
+               char rstr[1024];
                log_nametypeclass(VERB_OPS, "failed to prime trust anchor -- "
                        "could not fetch DNSKEY rrset", 
                        ta->name, LDNS_RR_TYPE_DNSKEY, ta->dclass);
                reason_bogus = LDNS_EDE_DNSKEY_MISSING;
-               reason = "no DNSKEY rrset";
+               if(!err) {
+                       snprintf(rstr, sizeof(rstr), "no DNSKEY rrset");
+               } else {
+                       snprintf(rstr, sizeof(rstr), "no DNSKEY rrset "
+                               "[%s]", err);
+               }
                if(qstate->env->cfg->harden_dnssec_stripped) {
-                       errinf_ede(qstate, reason, reason_bogus);
+                       errinf_ede(qstate, rstr, reason_bogus);
                        kkey = key_entry_create_bad(qstate->region, ta->name,
                                ta->namelen, ta->dclass, BOGUS_KEY_TTL,
-                               reason_bogus, reason,
-                               *qstate->env->now);
+                               reason_bogus, rstr, *qstate->env->now);
                } else  kkey = key_entry_create_null(qstate->region, ta->name,
                                ta->namelen, ta->dclass, NULL_KEY_TTL,
-                               reason_bogus, reason,
-                               *qstate->env->now);
+                               reason_bogus, rstr, *qstate->env->now);
                if(!kkey) {
                        log_err("out of memory: allocate fail prime key");
                        return NULL;
@@ -2699,7 +2717,7 @@ primeResponseToKE(struct ub_packed_rrset_key* dnskey_rrset,
        /* attempt to verify with trust anchor DS and DNSKEY */
        kkey = val_verify_new_DNSKEYs_with_ta(qstate->region, qstate->env, ve, 
                dnskey_rrset, ta->ds_rrset, ta->dnskey_rrset, downprot,
-               &reason, &reason_bogus, qstate);
+               &reason, &reason_bogus, qstate, reasonbuf, sizeof(reasonbuf));
        if(!kkey) {
                log_err("out of memory: verifying prime TA");
                return NULL;
@@ -2754,6 +2772,9 @@ primeResponseToKE(struct ub_packed_rrset_key* dnskey_rrset,
  *     DS response indicated an end to secure space, is_good if the DS
  *     validated. It returns ke=NULL if the DS response indicated that the
  *     request wasn't a delegation point.
+ * @param sub_qstate: the sub query state, that is the lookup that fetched
+ *     the trust anchor data, it contains error information for the answer.
+ *     Can be NULL.
  * @return
  *     0 on success,
  *     1 on servfail error (malloc failure),
@@ -2762,9 +2783,10 @@ primeResponseToKE(struct ub_packed_rrset_key* dnskey_rrset,
 static int
 ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
         int id, int rcode, struct dns_msg* msg, struct query_info* qinfo,
-       struct key_entry_key** ke)
+       struct key_entry_key** ke, struct module_qstate* sub_qstate)
 {
        struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
+       char reasonbuf[256];
        char* reason = NULL;
        sldns_ede_code reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
        enum val_classification subtype;
@@ -2777,6 +2799,14 @@ ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
                verbose(VERB_DETAIL, "DS response was error, thus bogus");
                errinf(qstate, rc);
                reason = "no DS";
+               if(sub_qstate) {
+                       char* err = errinf_to_str_misc(sub_qstate);
+                       if(err) {
+                               char buf[1024];
+                               snprintf(buf, sizeof(buf), "[%s]", err);
+                               errinf(qstate, buf);
+                       }
+               }
                reason_bogus = LDNS_EDE_NETWORK_ERROR;
                errinf_ede(qstate, reason, reason_bogus);
                goto return_bogus;
@@ -2799,7 +2829,9 @@ ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
                /* Verify only returns BOGUS or SECURE. If the rrset is 
                 * bogus, then we are done. */
                sec = val_verify_rrset_entry(qstate->env, ve, ds,
-                       vq->key_entry, &reason, &reason_bogus, LDNS_SECTION_ANSWER, qstate, &verified);
+                       vq->key_entry, &reason, &reason_bogus,
+                       LDNS_SECTION_ANSWER, qstate, &verified, reasonbuf,
+                       sizeof(reasonbuf));
                if(sec != sec_status_secure) {
                        verbose(VERB_DETAIL, "DS rrset in DS response did "
                                "not verify");
@@ -2849,7 +2881,8 @@ ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
                /* Try to prove absence of the DS with NSEC */
                sec = val_nsec_prove_nodata_dsreply(
                        qstate->env, ve, qinfo, msg->rep, vq->key_entry, 
-                       &proof_ttl, &reason, &reason_bogus, qstate);
+                       &proof_ttl, &reason, &reason_bogus, qstate,
+                       reasonbuf, sizeof(reasonbuf));
                switch(sec) {
                        case sec_status_secure:
                                verbose(VERB_DETAIL, "NSEC RRset for the "
@@ -2886,7 +2919,8 @@ ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
                sec = nsec3_prove_nods(qstate->env, ve, 
                        msg->rep->rrsets + msg->rep->an_numrrsets,
                        msg->rep->ns_numrrsets, qinfo, vq->key_entry, &reason,
-                       &reason_bogus, qstate, &vq->nsec3_cache_table);
+                       &reason_bogus, qstate, &vq->nsec3_cache_table,
+                       reasonbuf, sizeof(reasonbuf));
                switch(sec) {
                        case sec_status_insecure:
                                /* case insecure also continues to unsigned
@@ -2953,7 +2987,8 @@ ds_response_to_ke(struct module_qstate* qstate, struct val_qstate* vq,
                }
                sec = val_verify_rrset_entry(qstate->env, ve, cname,
                        vq->key_entry, &reason, &reason_bogus,
-                       LDNS_SECTION_ANSWER, qstate, &verified);
+                       LDNS_SECTION_ANSWER, qstate, &verified, reasonbuf,
+                       sizeof(reasonbuf));
                if(sec == sec_status_secure) {
                        verbose(VERB_ALGO, "CNAME validated, "
                                "proof that DS does not exist");
@@ -3002,11 +3037,15 @@ return_bogus:
  * @param origin: the origin of msg.
  * @param suspend: returned true if the task takes too long and needs to
  *     suspend to continue the effort later.
+ * @param sub_qstate: the sub query state, that is the lookup that fetched
+ *     the trust anchor data, it contains error information for the answer.
+ *     Can be NULL.
  */
 static void
 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, int* suspend)
+       struct sock_list* origin, int* suspend,
+       struct module_qstate* sub_qstate)
 {
        struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
        struct key_entry_key* dske = NULL;
@@ -3014,7 +3053,8 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq,
        int ret;
        *suspend = 0;
        vq->empty_DS_name = NULL;
-       ret = ds_response_to_ke(qstate, vq, id, rcode, msg, qinfo, &dske);
+       ret = ds_response_to_ke(qstate, vq, id, rcode, msg, qinfo, &dske,
+               sub_qstate);
        if(ret != 0) {
                switch(ret) {
                case 1:
@@ -3090,16 +3130,19 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq,
  * @param msg: result message (if rcode is OK).
  * @param qinfo: from the sub query state, query info.
  * @param origin: the origin of msg.
+ * @param sub_qstate: the sub query state, that is the lookup that fetched
+ *     the trust anchor data, it contains error information for the answer.
  */
 static void
 process_dnskey_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 sock_list* origin, struct module_qstate* sub_qstate)
 {
        struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
        struct key_entry_key* old = vq->key_entry;
        struct ub_packed_rrset_key* dnskey = NULL;
        int downprot;
+       char reasonbuf[256];
        char* reason = NULL;
        sldns_ede_code reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
 
@@ -3107,6 +3150,8 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
                dnskey = reply_find_answer_rrset(qinfo, msg->rep);
 
        if(dnskey == NULL) {
+               char* err;
+               char rstr[1024];
                /* bad response */
                verbose(VERB_DETAIL, "Missing DNSKEY RRset in response to "
                        "DNSKEY query.");
@@ -3118,17 +3163,22 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
                        vq->restart_count++;
                        return;
                }
-               reason = "No DNSKEY record";
+               err = errinf_to_str_misc(sub_qstate);
+               if(!err) {
+                       snprintf(rstr, sizeof(rstr), "No DNSKEY record");
+               } else {
+                       snprintf(rstr, sizeof(rstr), "No DNSKEY record "
+                               "[%s]", err);
+               }
                reason_bogus = LDNS_EDE_DNSKEY_MISSING;
                vq->key_entry = key_entry_create_bad(qstate->region,
                        qinfo->qname, qinfo->qname_len, qinfo->qclass,
-                       BOGUS_KEY_TTL, reason_bogus, reason,
-                       *qstate->env->now);
+                       BOGUS_KEY_TTL, reason_bogus, rstr, *qstate->env->now);
                if(!vq->key_entry) {
                        log_err("alloc failure in missing dnskey response");
                        /* key_entry is NULL for failure in Validate */
                }
-               errinf_ede(qstate, reason, reason_bogus);
+               errinf_ede(qstate, rstr, reason_bogus);
                errinf_origin(qstate, origin);
                errinf_dname(qstate, "for key", qinfo->qname);
                vq->state = VAL_VALIDATE_STATE;
@@ -3142,7 +3192,8 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
        }
        downprot = qstate->env->cfg->harden_algo_downgrade;
        vq->key_entry = val_verify_new_DNSKEYs(qstate->region, qstate->env,
-               ve, dnskey, vq->ds_rrset, downprot, &reason, &reason_bogus, qstate);
+               ve, dnskey, vq->ds_rrset, downprot, &reason, &reason_bogus,
+               qstate, reasonbuf, sizeof(reasonbuf));
 
        if(!vq->key_entry) {
                log_err("out of memory in verify new DNSKEYs");
@@ -3192,10 +3243,13 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
  * @param rcode: rcode result value.
  * @param msg: result message (if rcode is OK).
  * @param origin: the origin of msg.
+ * @param sub_qstate: the sub query state, that is the lookup that fetched
+ *     the trust anchor data, it contains error information for the answer.
  */
 static void
 process_prime_response(struct module_qstate* qstate, struct val_qstate* vq,
-       int id, int rcode, struct dns_msg* msg, struct sock_list* origin)
+       int id, int rcode, struct dns_msg* msg, struct sock_list* origin,
+       struct module_qstate* sub_qstate)
 {
        struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
        struct ub_packed_rrset_key* dnskey_rrset = NULL;
@@ -3227,7 +3281,8 @@ process_prime_response(struct module_qstate* qstate, struct val_qstate* vq,
                        return;
                }
        }
-       vq->key_entry = primeResponseToKE(dnskey_rrset, ta, qstate, id);
+       vq->key_entry = primeResponseToKE(dnskey_rrset, ta, qstate, id,
+               sub_qstate);
        lock_basic_unlock(&ta->lock);
        if(vq->key_entry) {
                if(key_entry_isbad(vq->key_entry) 
@@ -3278,14 +3333,14 @@ val_inform_super(struct module_qstate* qstate, int id,
        if(vq->wait_prime_ta) {
                vq->wait_prime_ta = 0;
                process_prime_response(super, vq, id, qstate->return_rcode,
-                       qstate->return_msg, qstate->reply_origin);
+                       qstate->return_msg, qstate->reply_origin, qstate);
                return;
        }
        if(qstate->qinfo.qtype == LDNS_RR_TYPE_DS) {
                int suspend;
                process_ds_response(super, vq, id, qstate->return_rcode,
                        qstate->return_msg, &qstate->qinfo,
-                       qstate->reply_origin, &suspend);
+                       qstate->reply_origin, &suspend, qstate);
                /* If NSEC3 was needed during validation, NULL the NSEC3 cache;
                 * it will be re-initiated if needed later on.
                 * Validation (and the cache table) are happening/allocated in
@@ -3306,7 +3361,7 @@ val_inform_super(struct module_qstate* qstate, int id,
        } else if(qstate->qinfo.qtype == LDNS_RR_TYPE_DNSKEY) {
                process_dnskey_response(super, vq, id, qstate->return_rcode,
                        qstate->return_msg, &qstate->qinfo,
-                       qstate->reply_origin);
+                       qstate->reply_origin, qstate);
                return;
        }
        log_err("internal error in validator: no inform_supers possible");
@@ -3344,8 +3399,8 @@ val_get_mem(struct module_env* env, int id)
  */
 static struct module_func_block val_block = {
        "validator",
-       &val_init, &val_deinit, &val_operate, &val_inform_super, &val_clear,
-       &val_get_mem
+       NULL, NULL, &val_init, &val_deinit, &val_operate, &val_inform_super,
+       &val_clear, &val_get_mem
 };
 
 struct module_func_block*