]> granicus.if.org Git - sudo/commitdiff
Add NOTBEFORE and NOTAFTER command options similar to what is
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 18 Feb 2017 22:35:48 +0000 (15:35 -0700)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 18 Feb 2017 22:35:48 +0000 (15:35 -0700)
already available in LDAP.

29 files changed:
MANIFEST
config.h.in
configure
configure.ac
doc/sudoers.cat
doc/sudoers.man.in
doc/sudoers.mdoc.in
include/sudo_debug.h
lib/util/sudo_debug.c
lib/util/util.exp.in
plugins/sudoers/Makefile.in
plugins/sudoers/gentime.c [new file with mode: 0644]
plugins/sudoers/gmtoff.c [new file with mode: 0644]
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/parse.c
plugins/sudoers/parse.h
plugins/sudoers/regress/parser/check_gentime.c [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test19.in [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test19.json.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test19.out.ok [new file with mode: 0644]
plugins/sudoers/regress/sudoers/test19.toke.ok [new file with mode: 0644]
plugins/sudoers/regress/visudo/test10.out.ok [new file with mode: 0644]
plugins/sudoers/regress/visudo/test10.sh [new file with mode: 0755]
plugins/sudoers/sudoers_version.h
plugins/sudoers/testsudoers.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l

index e14e0890c686af1eee752a397457926f5bddb682..bba1c5c4320ca158039252e9c0c86397d46bc9a4 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -264,9 +264,11 @@ plugins/sudoers/editor.c
 plugins/sudoers/env.c
 plugins/sudoers/find_path.c
 plugins/sudoers/gc.c
+plugins/sudoers/gentime.c
 plugins/sudoers/getdate.c
 plugins/sudoers/getdate.y
 plugins/sudoers/getspwuid.c
+plugins/sudoers/gmtoff.c
 plugins/sudoers/goodpath.c
 plugins/sudoers/gram.c
 plugins/sudoers/gram.h
@@ -374,6 +376,7 @@ plugins/sudoers/regress/parser/check_base64.c
 plugins/sudoers/regress/parser/check_digest.c
 plugins/sudoers/regress/parser/check_digest.out.ok
 plugins/sudoers/regress/parser/check_fill.c
+plugins/sudoers/regress/parser/check_gentime.c
 plugins/sudoers/regress/parser/check_hexchar.c
 plugins/sudoers/regress/sudoers/test1.in
 plugins/sudoers/regress/sudoers/test1.json.ok
@@ -415,6 +418,10 @@ plugins/sudoers/regress/sudoers/test18.in
 plugins/sudoers/regress/sudoers/test18.json.ok
 plugins/sudoers/regress/sudoers/test18.out.ok
 plugins/sudoers/regress/sudoers/test18.toke.ok
+plugins/sudoers/regress/sudoers/test19.in
+plugins/sudoers/regress/sudoers/test19.json.ok
+plugins/sudoers/regress/sudoers/test19.out.ok
+plugins/sudoers/regress/sudoers/test19.toke.ok
 plugins/sudoers/regress/sudoers/test2.in
 plugins/sudoers/regress/sudoers/test2.json.ok
 plugins/sudoers/regress/sudoers/test2.out.ok
@@ -465,6 +472,8 @@ plugins/sudoers/regress/testsudoers/test7.out.ok
 plugins/sudoers/regress/testsudoers/test7.sh
 plugins/sudoers/regress/visudo/test1.out.ok
 plugins/sudoers/regress/visudo/test1.sh
+plugins/sudoers/regress/visudo/test10.out.ok
+plugins/sudoers/regress/visudo/test10.sh
 plugins/sudoers/regress/visudo/test2.err.ok
 plugins/sudoers/regress/visudo/test2.out.ok
 plugins/sudoers/regress/visudo/test2.sh
index 14275b252a08d5e6a35c8586a86a46bd108edd6e..b5a86ebfd07563bcdb8d2527d3e94ee9a777d31a 100644 (file)
 /* Define if your struct sockaddr has an sa_len field. */
 #undef HAVE_STRUCT_SOCKADDR_SA_LEN
 
+/* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */
+#undef HAVE_STRUCT_TM_TM_GMTOFF
+
 /* Define to 1 if `ut_exit' is a member of `struct utmpx'. */
 #undef HAVE_STRUCT_UTMPX_UT_EXIT
 
 /* The size of `long long', as computed by sizeof. */
 #undef SIZEOF_LONG_LONG
 
+/* The size of `time_t', as computed by sizeof. */
+#undef SIZEOF_TIME_T
+
 /* Define to 1 to compile the sudoers plugin statically into the sudo binary.
    */
 #undef STATIC_SUDOERS_PLUGIN
index 735733f259d2d8873469918106cc1adad4415ff5..edf2eeba16d6bc2fa598484e5e150c44515df254 100755 (executable)
--- a/configure
+++ b/configure
@@ -18262,6 +18262,39 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
+$as_echo_n "checking size of time_t... " >&6; }
+if ${ac_cv_sizeof_time_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_time_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (time_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_time_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
+$as_echo "$ac_cv_sizeof_time_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_TIME_T $ac_cv_sizeof_time_t
+_ACEOF
+
+
 if test $ac_cv_header_utmpx_h = "yes"; then
     ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_id" "ac_cv_member_struct_utmpx_ut_id" "
 #      include <sys/types.h>
@@ -20356,6 +20389,20 @@ esac
 "
     done
 
+ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "
+$ac_includes_default
+#include <errno.h>
+
+"
+if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_TM_TM_GMTOFF 1
+_ACEOF
+
+
+fi
+
 ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default"
 if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then :
   $as_echo "#define HAVE_ST_MTIM 1" >>confdefs.h
index 38bdb6b29df40a4ea8ff6d805fbca070cbb03365..ff87731325d65c41dd0fcf2652f8a7840e177467 100644 (file)
@@ -2348,6 +2348,7 @@ SUDO_SOCK_SA_LEN
 SUDO_SOCK_SIN_LEN
 AC_CHECK_SIZEOF([id_t])
 AC_CHECK_SIZEOF([long long])
+AC_CHECK_SIZEOF([time_t])
 dnl
 dnl Check for utmp/utmpx struct members.
 dnl We need to have already defined _GNU_SOURCE on glibc which only has
@@ -2665,6 +2666,10 @@ fi
 AC_CHECK_FUNCS([strtonum])
 AC_LIBOBJ(strtonum)
 SUDO_APPEND_COMPAT_EXP(sudo_strtonum)
+AC_CHECK_MEMBERS([struct tm.tm_gmtoff], [], [], [
+AC_INCLUDES_DEFAULT
+#include <errno.h>
+])
 AC_CHECK_MEMBER([struct stat.st_mtim], [AC_DEFINE(HAVE_ST_MTIM)]
     [AC_CHECK_MEMBER([struct stat.st_mtim.st__tim], AC_DEFINE(HAVE_ST__TIM))],
     [AC_CHECK_MEMBER([struct stat.st_mtimespec], AC_DEFINE([HAVE_ST_MTIMESPEC]))])
index 7ff0152209b07ba3f834d7c7f5a196c4e710875e..871573422f1699c5326e649323be2518e4346504 100644 (file)
@@ -478,12 +478,14 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
 
      Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-     Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec)
+     Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Date_Spec | Timeout_Spec)
 
      SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
      Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+     Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
+
      Timeout_Spec ::= 'TIMEOUT=timeout'
 
      Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
@@ -608,6 +610,24 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
      Privileges can be excluded from a set by prefixing the privilege name
      with either an `!' or `-' character.
 
+   D\bDa\bat\bte\be_\b_S\bSp\bpe\bec\bc
+     s\bsu\bud\bdo\boe\ber\brs\bs rules can be specified with a start and end date via the
+     NOTBEFORE and NOTAFTER settings.  The time stamp must be specified in
+     _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd _\bT_\bi_\bm_\be as defined by RFC 4517.  The format is effectively
+     yyyymmddHHMMSSZ where the minutes and seconds are optional.  The `Z'
+     suffix indicates that the time stamp is in Coordinated Universal Time
+     (UTC).  It is also possible to specify a timezone offset from UTC in
+     hours and minutes instead of a `Z'.  For example, `-0500' would
+     correspond to Eastern Standard time in the US.  As an extension, if no
+     `Z' or timezone offset is specified, local time will be used.
+
+     The following are all valid time stamps:
+
+         20170214083000Z
+         2017021408Z
+         20160315220000-0500
+         20151201235900
+
    T\bTi\bim\bme\beo\bou\but\bt_\b_S\bSp\bpe\bec\bc
      A command may have a timeout associated with it.  If the timeout expires
      before the command has exited, the command will be terminated.  The
index b7fb617a2853dc539ac74a3a53f8a0bf3072d7cd..bad6c91690c156ce647a4111a7b3fd369202df61 100644 (file)
@@ -986,12 +986,14 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Tag_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec)
+Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Date_Spec | Timeout_Spec)
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
+
 Timeout_Spec ::= 'TIMEOUT=timeout'
 
 Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
@@ -1257,6 +1259,42 @@ name with either an
 or
 \(oq\-\(cq
 character.
+.SS "Date_Spec"
+\fBsudoers\fR
+rules can be specified with a start and end date via the
+\fRNOTBEFORE\fR
+and
+\fRNOTAFTER\fR
+settings.
+The time stamp must be specified in
+\fIGeneralized Time\fR
+as defined by RFC 4517.
+The format is effectively
+\fRyyyymmddHHMMSSZ\fR
+where the minutes and seconds are optional.
+The
+\(oqZ\(cq
+suffix indicates that the time stamp is in Coordinated Universal Time (UTC).
+It is also possible to specify a timezone offset from UTC in hours
+and minutes instead of a
+\(oqZ\(cq.
+For example,
+\(oq-0500\(cq
+would correspond to Eastern Standard time in the US.
+As an extension, if no
+\(oqZ\(cq
+or timezone offset is specified, local time will be used.
+.PP
+The following are all valid time stamps:
+.nf
+.sp
+.RS 4n
+20170214083000Z
+2017021408Z
+20160315220000-0500
+20151201235900
+.RE
+.fi
 .SS "Timeout_Spec"
 A command may have a timeout associated with it.
 If the timeout expires before the command has exited, the
index 281ee7e15fa1314d9513da3902f8a1d49f678fa8..03f378b810360fb6c84dbf87e2e94dfec76cffd9 100644 (file)
@@ -939,12 +939,14 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Tag_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
-Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec)
+Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Date_Spec | Timeout_Spec)
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
+Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
+
 Timeout_Spec ::= 'TIMEOUT=timeout'
 
 Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
@@ -1180,6 +1182,39 @@ name with either an
 or
 .Ql \-
 character.
+.Ss Date_Spec
+.Nm sudoers
+rules can be specified with a start and end date via the
+.Li NOTBEFORE
+and
+.Li NOTAFTER
+settings.
+The time stamp must be specified in
+.Em Generalized Time
+as defined by RFC 4517.
+The format is effectively
+.Li yyyymmddHHMMSSZ
+where the minutes and seconds are optional.
+The
+.Ql Z
+suffix indicates that the time stamp is in Coordinated Universal Time (UTC).
+It is also possible to specify a timezone offset from UTC in hours
+and minutes instead of a
+.Ql Z .
+For example,
+.Ql -0500
+would correspond to Eastern Standard time in the US.
+As an extension, if no
+.Ql Z
+or timezone offset is specified, local time will be used.
+.Pp
+The following are all valid time stamps:
+.Bd -literal -offset 4n
+20170214083000Z
+2017021408Z
+20160315220000-0500
+20151201235900
+.Ed
 .Ss Timeout_Spec
 A command may have a timeout associated with it.
 If the timeout expires before the command has exited, the
index 881dfce59f3880e45b7e0e32fdd3faecbab76737..c0b494889b8909fb41963d5ff69f986b7717b636 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2017 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -156,6 +156,14 @@ struct sudo_conf_debug_file_list;
        return sudo_debug_ret;                                                 \
     } while (0)
 
+#define debug_return_time_t(ret)                                              \
+    do {                                                                      \
+       time_t sudo_debug_ret = (ret);                                 \
+       sudo_debug_exit_time_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\
+           sudo_debug_ret);                                                   \
+       return sudo_debug_ret;                                                 \
+    } while (0)
+
 #define debug_return_long(ret)                                                \
     do {                                                                      \
        long sudo_debug_ret = (ret);                                           \
@@ -247,6 +255,7 @@ __dso_public void sudo_debug_exit_size_t_v1(const char *func, const char *file,
 __dso_public void sudo_debug_exit_ssize_t_v1(const char *func, const char *file, int line, int subsys, ssize_t ret);
 __dso_public void sudo_debug_exit_str_v1(const char *func, const char *file, int line, int subsys, const char *ret);
 __dso_public void sudo_debug_exit_str_masked_v1(const char *func, const char *file, int line, int subsys, const char *ret);
+__dso_public void sudo_debug_exit_time_t_v1(const char *func, const char *file, int line, int subsys, time_t ret);
 __dso_public pid_t sudo_debug_fork_v1(void);
 __dso_public int sudo_debug_get_active_instance_v1(void);
 __dso_public int sudo_debug_get_fds_v1(unsigned char **fds);
@@ -272,6 +281,7 @@ __dso_public void sudo_debug_write2_v1(int fd, const char *func, const char *fil
 #define sudo_debug_exit_ssize_t(_a, _b, _c, _d, _e) sudo_debug_exit_ssize_t_v1((_a), (_b), (_c), (_d), (_e))
 #define sudo_debug_exit_str(_a, _b, _c, _d, _e) sudo_debug_exit_str_v1((_a), (_b), (_c), (_d), (_e))
 #define sudo_debug_exit_str_masked(_a, _b, _c, _d, _e) sudo_debug_exit_str_masked_v1((_a), (_b), (_c), (_d), (_e))
+#define sudo_debug_exit_time_t(_a, _b, _c, _d, _e) sudo_debug_exit_time_t_v1((_a), (_b), (_c), (_d), (_e))
 #define sudo_debug_fork() sudo_debug_fork_v1()
 #define sudo_debug_get_active_instance() sudo_debug_get_active_instance_v1()
 #define sudo_debug_get_fds(_a) sudo_debug_get_fds_v1((_a))
index a9965ca8cc0728935cc959433be899856705eec3..927cb0f120443335e343d9155f85b6cc5ec450b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2017 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -481,6 +481,19 @@ sudo_debug_exit_ssize_t_v1(const char *func, const char *file, int line,
        "<- %s @ %s:%d := %zd", func, file, line, ret);
 }
 
+void
+sudo_debug_exit_time_t_v1(const char *func, const char *file, int line,
+    int subsys, time_t ret)
+{
+#if SIZEOF_TIME_T == 8
+    sudo_debug_printf2(NULL, NULL, 0, subsys | SUDO_DEBUG_TRACE,
+       "<- %s @ %s:%d := %lld", func, file, line, (long long)ret);
+#else
+    sudo_debug_printf2(NULL, NULL, 0, subsys | SUDO_DEBUG_TRACE,
+       "<- %s @ %s:%d := %d", func, file, line, (int)ret);
+#endif
+}
+
 void
 sudo_debug_exit_bool_v1(const char *func, const char *file, int line,
     int subsys, bool ret)
index 0c5f13bcf99f0d6530a84090a954499bc882f369..1582a18f7221f3d5fee18c7e7a7a36e088f56916 100644 (file)
@@ -25,6 +25,7 @@ sudo_debug_exit_size_t_v1
 sudo_debug_exit_ssize_t_v1
 sudo_debug_exit_str_v1
 sudo_debug_exit_str_masked_v1
+sudo_debug_exit_time_t_v1
 sudo_debug_fork_v1
 sudo_debug_get_active_instance_v1
 sudo_debug_get_fds_v1
index fa34a7594eb7c328ca3724c29288aad72ca051bd..f8f90b6195eea54ff4a6ea149a9b9a801a0ecf1f 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1996, 1998-2005, 2007-2015
+# Copyright (c) 1996, 1998-2005, 2007-2017
 #       Todd C. Miller <Todd.Miller@courtesan.com>
 #
 # Permission to use, copy, modify, and distribute this software for any
@@ -146,14 +146,15 @@ SHELL = @SHELL@
 PROGS = sudoers.la visudo sudoreplay testsudoers
 
 TEST_PROGS = check_iolog_path check_fill check_wrap check_addr check_digest \
-            check_base64 check_hexchar @SUDOERS_TEST_PROGS@
+            check_base64 check_gentime check_hexchar @SUDOERS_TEST_PROGS@
 
 AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@
 
-LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo hexchar.lo \
-                      gram.lo match.lo match_addr.lo pwutil.lo pwutil_impl.lo \
-                      rcstr.lo redblack.lo sudoers_debug.lo timeout.lo \
-                      timestr.lo toke.lo toke_util.lo
+LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo gentime.lo \
+                      hexchar.lo gmtoff.lo gram.lo match.lo match_addr.lo \
+                      pwutil.lo pwutil_impl.lo rcstr.lo redblack.lo \
+                      sudoers_debug.lo timeout.lo timestr.lo toke.lo \
+                      toke_util.lo
 
 SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo editor.lo env.lo find_path.lo \
               gc.lo goodpath.lo group_plugin.lo interfaces.lo iolog.lo \
@@ -178,6 +179,8 @@ CHECK_DIGEST_OBJS = check_digest.o
 
 CHECK_FILL_OBJS = check_fill.o hexchar.o toke_util.o sudoers_debug.o
 
+CHECK_GENTIME_OBJS = check_gentime.o gentime.o gmtoff.o sudoers_debug.o
+
 CHECK_HEXCHAR_OBJS = check_hexchar.o hexchar.o sudoers_debug.o
 
 CHECK_IOLOG_PATH_OBJS = check_iolog_path.o iolog_path.o locale.o \
@@ -248,6 +251,9 @@ check_digest: $(CHECK_DIGEST_OBJS) $(LT_LIBS)
 check_fill: $(CHECK_FILL_OBJS) $(LT_LIBS)
        $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_FILL_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
 
+check_gentime: $(CHECK_GENTIME_OBJS) $(LT_LIBS)
+       $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_GENTIME_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
+
 check_hexchar: $(CHECK_HEXCHAR_OBJS) $(LT_LIBS)
        $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_HEXCHAR_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
 
@@ -374,6 +380,7 @@ check: $(TEST_PROGS) visudo testsudoers
            ./check_digest > regress/parser/check_digest.out; \
            diff regress/parser/check_digest.out $(srcdir)/regress/parser/check_digest.out.ok || rval=`expr $$rval + $$?`; \
            ./check_fill || rval=`expr $$rval + $$?`; \
+           ./check_gentime || rval=`expr $$rval + $$?`; \
            ./check_hexchar || rval=`expr $$rval + $$?`; \
            ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \
            case "$(TEST_PROGS)" in \
@@ -601,6 +608,12 @@ check_fill.o: $(srcdir)/regress/parser/check_fill.c $(devdir)/gram.h \
               $(incdir)/sudo_util.h $(srcdir)/parse.h $(srcdir)/toke.h \
               $(top_builddir)/config.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_fill.c
+check_gentime.o: $(srcdir)/regress/parser/check_gentime.c \
+                 $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+                 $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \
+                 $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \
+                 $(top_builddir)/config.h
+       $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_gentime.c
 check_hexchar.o: $(srcdir)/regress/parser/check_hexchar.c \
                  $(incdir)/sudo_compat.h $(top_builddir)/config.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_hexchar.c
@@ -688,6 +701,12 @@ gc.lo: $(srcdir)/gc.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
        $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \
        $(top_builddir)/pathnames.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gc.c
+gentime.lo: $(srcdir)/gentime.c $(incdir)/compat/stdbool.h \
+            $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+            $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \
+            $(top_builddir)/config.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gentime.c
+gentime.o: gentime.lo
 getdate.o: $(devdir)/getdate.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/getdate.c
 getspwuid.lo: $(srcdir)/getspwuid.c $(devdir)/def_data.h \
@@ -700,6 +719,12 @@ getspwuid.lo: $(srcdir)/getspwuid.c $(devdir)/def_data.h \
               $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \
               $(top_builddir)/pathnames.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getspwuid.c
+gmtoff.lo: $(srcdir)/gmtoff.c $(incdir)/compat/stdbool.h \
+           $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+           $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \
+           $(top_builddir)/config.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gmtoff.c
+gmtoff.o: gmtoff.lo
 goodpath.lo: $(srcdir)/goodpath.c $(devdir)/def_data.h \
              $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
              $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
@@ -892,8 +917,8 @@ policy.lo: $(srcdir)/policy.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
            $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \
            $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \
            $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \
-           $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-           $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \
+           $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \
+           $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \
            $(srcdir)/sudoers_version.h $(top_builddir)/config.h \
            $(top_builddir)/pathnames.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/policy.c
diff --git a/plugins/sudoers/gentime.c b/plugins/sudoers/gentime.c
new file mode 100644 (file)
index 0000000..b81ed9c
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2017 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
+#include <ctype.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudoers_debug.h"
+#include "parse.h"
+
+/*
+ * Parse a timestamp in Generalized Time format as per RFC4517.
+ * E.g. yyyymmddHHMMSS.FZ or yyyymmddHHMMSS.F[+-]TZOFF
+ * where minutes, seconds and fraction are optional.
+ * Returns the time in Unix time format or -1 on error.
+ */
+time_t
+parse_gentime(const char *timestr)
+{
+    char tcopy[sizeof("yyyymmddHHMMSS.F")];
+    const char *cp;
+    time_t result;
+    struct tm tm;
+    size_t len;
+    int items, tzoff = 0;
+    bool islocal = false;
+    debug_decl(parse_gentime, SUDOERS_DEBUG_PARSER)
+
+    /* Make a copy of the time without time zone for easy parsing. */
+    len = strspn(timestr, "0123456789.,");
+    if (len >= sizeof(tcopy)) {
+       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+           "unable to parse general time string %s", timestr);
+       debug_return_time_t(-1);
+    }
+    memcpy(tcopy, timestr, len);
+    tcopy[len] = '\0';
+
+    /* Parse general time, ignoring the timezone for now. */
+    memset(&tm, 0, sizeof(tm));
+    items = sscanf(tcopy, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon,
+       &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
+    if (items == EOF || items < 4) {
+       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+           "only parsed %d items in general time string %s", items, timestr); 
+       debug_return_time_t(-1);
+    }
+    cp = timestr + ((items + 1) * 2);
+
+    /* Parse optional fractional hours/minute/second if present. */
+    if ((cp[0] == '.' || cp[0] == ',') && isdigit((unsigned char)cp[1])) {
+       int frac = cp[1] - '0';
+       switch (items) {
+       case 4:
+           /* convert fractional hour -> minutes */
+           tm.tm_min += 60 / 10 * frac;
+           break;
+       case 5:
+           /* convert fractional minute -> seconds */
+           tm.tm_sec += 60 / 10 * frac;
+           break;
+       case 6:
+           /* ignore fractional second */
+           break;
+       }
+       cp += 2;        /* skip over radix and fraction */
+    }
+
+    switch (*cp) {
+    case '-':
+    case '+': {
+       int hour = 0, min = 0;
+
+       /* No DST */
+       tm.tm_isdst = 0;
+       /* parse time zone offset */
+       items = sscanf(cp + 1, "%2d%2d", &hour, &min);
+       if (items == EOF || items < 1) {
+           sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+               "unable to parse time zone offset in %s, items %d",
+               timestr, items);
+           debug_return_time_t(-1);
+       }
+       if (*cp == '-')
+           tzoff = -((hour * 60) + min) * 60;
+       else
+           tzoff = ((hour * 60) + min) * 60;
+       cp += 1 + (items * 2);
+       break;
+    }
+    case 'Z':
+       /* GMT/UTC, no DST */
+       tm.tm_isdst = 0;
+       cp++;
+       break;
+    case '\0':
+       /* no zone specified, use local time */
+       tm.tm_isdst = -1;
+       islocal = true;
+       break;
+    default:
+       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+           "unable to parse general time string %s", timestr);
+       debug_return_time_t(-1);
+    }
+    if (*cp != '\0') {
+       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+           "trailing garbage in general time string %s", timestr);
+       debug_return_time_t(-1);
+    }
+
+    /* Adjust from Generalized Time to struct tm */
+    tm.tm_year -= 1900;
+    tm.tm_mon--;
+
+    result = mktime(&tm);
+    if (result != -1) {
+       if (!islocal) {
+           /* Not local time, convert to GMT */
+           result += get_gmtoff(&result);
+           /* Adjust time based on supplied GMT offset. */
+           result -= tzoff;
+       }
+    }
+
+    debug_return_time_t(result);
+}
diff --git a/plugins/sudoers/gmtoff.c b/plugins/sudoers/gmtoff.c
new file mode 100644 (file)
index 0000000..ccd4567
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2017 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudoers_debug.h"
+#include "parse.h"
+
+/*
+ * Returns the offset from GMT in seconds (algorithm taken from sendmail).
+ * Warning: clobbers the static storage used by localtime() and gmtime().
+ */
+#ifdef HAVE_STRUCT_TM_TM_GMTOFF
+long
+get_gmtoff(time_t *clock)
+{
+       struct tm *local;
+
+       local = localtime(clock);
+       return local->tm_gmtoff;
+}
+#else
+long
+get_gmtoff(time_t *clock)
+{
+       struct tm gmt, *local;
+       long offset;
+
+       gmt = *gmtime(clock);
+       local = localtime(clock);
+
+       offset = (local->tm_sec - gmt.tm_sec) +
+           ((local->tm_min - gmt.tm_min) * 60) +
+           ((local->tm_hour - gmt.tm_hour) * 3600);
+
+       /* Timezone may cause year rollover to happen on a different day. */
+       if (local->tm_year < gmt.tm_year)
+               offset -= 24 * 3600;
+       else if (local->tm_year > gmt.tm_year)
+               offset -= 24 * 3600;
+       else if (local->tm_yday < gmt.tm_yday)
+               offset -= 24 * 3600;
+       else if (local->tm_yday > gmt.tm_yday)
+               offset += 24 * 3600;
+
+       return offset;
+}
+#endif /* HAVE_TM_GMTOFF */
index cfe93468399a5beade9112eac2d17b2a91311fed..8dea2f2118a71b160366757925e39c9f2bc6e98d 100644 (file)
@@ -167,11 +167,13 @@ typedef union {
 #define PRIVS 293
 #define LIMITPRIVS 294
 #define CMND_TIMEOUT 295
-#define MYSELF 296
-#define SHA224_TOK 297
-#define SHA256_TOK 298
-#define SHA384_TOK 299
-#define SHA512_TOK 300
+#define NOTBEFORE 296
+#define NOTAFTER 297
+#define MYSELF 298
+#define SHA224_TOK 299
+#define SHA256_TOK 300
+#define SHA384_TOK 301
+#define SHA512_TOK 302
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslhs[] =
@@ -179,18 +181,18 @@ const short sudoerslhs[] =
 short sudoerslhs[] =
 #endif
        {                                        -1,
-    0,    0,   30,   30,   31,   31,   31,   31,   31,   31,
-   31,   31,   31,   31,   31,   31,    4,    4,    3,    3,
+    0,    0,   32,   32,   33,   33,   33,   33,   33,   33,
+   33,   33,   33,   33,   33,   33,    4,    4,    3,    3,
     3,    3,    3,   21,   21,   20,   11,   11,    9,    9,
-    9,    9,    9,    2,    2,    1,   29,   29,   29,   29,
-    7,    7,    6,    6,   28,   24,   25,   26,   27,   18,
-   18,   19,   19,   19,   19,   19,   23,   23,   23,   23,
-   23,   23,   22,   22,   22,   22,   22,   22,   22,   22,
-   22,   22,   22,   22,   22,   22,   22,    5,    5,    5,
-   33,   33,   36,   10,   10,   34,   34,   37,    8,    8,
-   35,   35,   38,   32,   32,   39,   14,   14,   12,   12,
-   13,   13,   13,   13,   13,   17,   17,   15,   15,   16,
-   16,   16,
+    9,    9,    9,    2,    2,    1,   31,   31,   31,   31,
+    7,    7,    6,    6,   28,   29,   30,   24,   25,   26,
+   27,   18,   18,   19,   19,   19,   19,   19,   23,   23,
+   23,   23,   23,   23,   23,   23,   22,   22,   22,   22,
+   22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
+   22,    5,    5,    5,   35,   35,   38,   10,   10,   36,
+   36,   39,    8,    8,   37,   37,   40,   34,   34,   41,
+   14,   14,   12,   12,   13,   13,   13,   13,   13,   17,
+   17,   15,   15,   16,   16,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslen[] =
@@ -202,14 +204,14 @@ short sudoerslen[] =
     2,    2,    3,    3,    3,    3,    1,    3,    1,    2,
     3,    3,    3,    1,    3,    3,    1,    2,    1,    1,
     1,    1,    1,    1,    3,    4,    3,    3,    3,    3,
-    1,    2,    1,    2,    3,    3,    3,    3,    3,    0,
-    3,    0,    1,    3,    2,    1,    0,    2,    2,    2,
-    2,    2,    0,    2,    2,    2,    2,    2,    2,    2,
-    2,    2,    2,    2,    2,    2,    2,    1,    1,    1,
-    1,    3,    3,    1,    3,    1,    3,    3,    1,    3,
-    1,    3,    3,    1,    3,    3,    1,    3,    1,    2,
-    1,    1,    1,    1,    1,    1,    3,    1,    2,    1,
-    1,    1,
+    1,    2,    1,    2,    3,    3,    3,    3,    3,    3,
+    3,    0,    3,    0,    1,    3,    2,    1,    0,    2,
+    2,    2,    2,    2,    2,    2,    0,    2,    2,    2,
+    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+    2,    1,    1,    1,    1,    3,    3,    1,    3,    1,
+    3,    3,    1,    3,    1,    3,    3,    1,    3,    3,
+    1,    3,    1,    2,    1,    1,    1,    1,    1,    1,
+    3,    1,    2,    1,    1,    1,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdefred[] =
@@ -217,24 +219,25 @@ const short sudoersdefred[] =
 short sudoersdefred[] =
 #endif
        {                                      0,
-    0,  101,  103,  104,  105,    0,    0,    0,    0,    0,
-  102,    5,    0,    0,    0,    0,    0,    0,   97,   99,
+    0,  105,  107,  108,  109,    0,    0,    0,    0,    0,
+  106,    5,    0,    0,    0,    0,    0,    0,  101,  103,
     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
-   31,   33,   30,    0,   27,    0,   84,    0,    0,   80,
-   79,   78,    0,    0,    0,    0,    0,   43,   41,   89,
-    0,    0,    0,    0,   81,    0,    0,   86,    0,    0,
-   94,    0,    0,   91,  100,    0,    0,   24,    0,    4,
+   31,   33,   30,    0,   27,    0,   88,    0,    0,   84,
+   83,   82,    0,    0,    0,    0,    0,   43,   41,   93,
+    0,    0,    0,    0,   85,    0,    0,   90,    0,    0,
+   98,    0,    0,   95,  104,    0,    0,   24,    0,    4,
     0,    0,    0,   20,    0,   28,    0,    0,    0,    0,
    44,    0,    0,    0,    0,    0,    0,   42,    0,    0,
-    0,    0,    0,    0,    0,    0,   98,    0,    0,   21,
-   22,   23,   18,   85,   37,   38,   39,   40,   90,    0,
-   82,    0,   87,    0,   95,    0,   92,    0,   34,    0,
-   57,   25,    0,    0,    0,    0,    0,  110,  112,  111,
-    0,  106,  108,    0,    0,   51,   35,    0,    0,    0,
-    0,    0,    0,   59,   60,   61,   62,   58,  109,    0,
-    0,    0,    0,    0,    0,    0,   64,   65,   66,   67,
-   68,   69,   70,   71,   72,   73,   76,   77,   74,   75,
-   36,  107,   47,   46,   48,   49,   45,
+    0,    0,    0,    0,    0,    0,  102,    0,    0,   21,
+   22,   23,   18,   89,   37,   38,   39,   40,   94,    0,
+   86,    0,   91,    0,   99,    0,   96,    0,   34,    0,
+   59,   25,    0,    0,    0,    0,    0,  114,  116,  115,
+    0,  110,  112,    0,    0,   53,   35,    0,    0,    0,
+    0,    0,    0,    0,    0,   63,   64,   65,   66,   62,
+   60,   61,  113,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   68,   69,   70,   71,   72,   73,   74,   75,
+   76,   77,   80,   81,   78,   79,   36,  111,   49,   48,
+   50,   51,   45,   46,   47,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdgoto[] =
@@ -244,42 +247,44 @@ short sudoersdgoto[] =
        {                                      18,
   119,  120,   27,   28,   48,   49,   50,   51,   35,   67,
    37,   19,   20,   21,  132,  133,  134,  121,  125,   68,
-   69,  143,  127,  144,  145,  146,  147,  148,   52,   22,
-   23,   60,   54,   57,   63,   55,   58,   64,   61,
+   69,  145,  127,  146,  147,  148,  149,  150,  151,  152,
+   52,   22,   23,   60,   54,   57,   63,   55,   58,   64,
+   61,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerssindex[] =
 #else
 short sudoerssindex[] =
 #endif
-       {                                    533,
+       {                                    512,
  -272,    0,    0,    0,    0,  -23,  227,  -19,  -19,   -5,
     0,    0, -239, -236, -234, -232, -231,    0,    0,    0,
-  -33,  533,    0,    0,   -3, -220,    0,    3,    0,    0,
+  -33,  512,    0,    0,   -3, -220,    0,    3,    0,    0,
     0,    0,    0, -225,    0,  -28,    0,  -24,  -24,    0,
     0,    0, -240,  -15,   -8,    2,    4,    0,    0,    0,
-  -21,  -12,   -9,    7,    0,    5,   10,    0,    9,   13,
-    0,   11,   16,    0,    0,  -19,  -36,    0,   22,    0,
- -208, -202, -182,    0,  -23,    0,  227,    3,    3,    3,
-    0, -181, -180, -179, -178,   -5,    3,    0,  227, -239,
-   -5, -236,  -19, -234,  -19, -232,    0,   50,  227,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   47,
-    0,   48,    0,   51,    0,   51,    0,  -29,    0,   54,
-    0,    0,  289,   -7,   52,   50, -216,    0,    0,    0,
- -217,    0,    0,   55,  289,    0,    0,   33,   39,   40,
-   41,   42,  450,    0,    0,    0,    0,    0,    0,  289,
-   55, -159, -158, -157, -155, -154,    0,    0,    0,    0,
+  -21,  -12,   -9,    6,    0,    7,   12,    0,   10,   14,
+    0,   13,   25,    0,    0,  -19,  -36,    0,   26,    0,
+ -208, -202, -198,    0,  -23,    0,  227,    3,    3,    3,
+    0, -179, -178, -174, -173,   -5,    3,    0,  227, -239,
+   -5, -236,  -19, -234,  -19, -232,    0,   52,  227,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   50,
+    0,   51,    0,   54,    0,   54,    0,  -29,    0,   55,
+    0,    0,  289,   -7,   59,   52, -216,    0,    0,    0,
+ -217,    0,    0,   57,  289,    0,    0,   32,   41,   42,
+   43,   44,   45,   47,  450,    0,    0,    0,    0,    0,
+    0,    0,    0,  289,   57, -154, -153, -150, -149, -148,
+ -147, -146,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersrindex[] =
 #else
 short sudoersrindex[] =
 #endif
-       {                                    110,
+       {                                    118,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  113,    0,    0,    1,    0,    0,  145,    0,    0,
+    0,  119,    0,    0,    1,    0,    0,  145,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,  159,    0,    0,  193,    0,    0,  207,
@@ -288,25 +293,27 @@ short sudoersrindex[] =
     0,    0,    0,    0,    0,    0,  371,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,  404,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,   15,
-    0,   49,    0,   63,    0,   97,    0,   73,    0,  111,
-    0,    0,   74,   75,    0,  404,  481,    0,    0,    0,
-    0,    0,    0,   76,    0,    0,    0,    0,    0,    0,
+    0,   49,    0,   63,    0,   97,    0,   79,    0,  111,
+    0,    0,   81,   82,    0,  404,  483,    0,    0,    0,
+    0,    0,    0,   83,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   84,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersgindex[] =
 #else
 short sudoersgindex[] =
 #endif
        {                                      0,
-   -4,    0,   44,   18,   80,   68,  -79,   34,   90,   -1,
-   56,   60,  112,   -6,  -22,    6,    8,    0,    0,   28,
+    5,    0,   53,   18,   86,   74,  -79,   36,   98,   -1,
+   56,   68,  120,   -6,  -18,    8,   11,    0,    0,   39,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  109,    0,    0,    0,    0,   45,   46,   36,   53,
+    0,    0,  113,    0,    0,    0,    0,   58,   48,   46,
+   60,
 };
-#define YYTABLESIZE 822
+#define YYTABLESIZE 801
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerstable[] =
 #else
@@ -314,21 +321,21 @@ short sudoerstable[] =
 #endif
        {                                      34,
    19,   38,   39,   17,   26,   36,  109,   77,   26,   26,
-   66,   26,   24,   17,   83,   77,   40,   41,   53,   66,
+   66,   26,   24,   17,   87,   77,   40,   41,   53,   66,
    43,   56,   86,   59,   98,   62,    2,   43,  123,    3,
     4,    5,   29,   19,   30,   31,   66,   32,   74,   72,
-  128,   73,   82,   42,   19,  129,   75,   83,   88,   83,
+  128,   73,   82,   42,   19,  129,   75,   87,   92,   83,
   135,   89,   11,   78,  100,   79,   80,   71,   33,   84,
-  101,   85,   96,  171,   90,   91,  130,   92,   87,   93,
-   94,   95,   83,   96,  138,  139,  140,  141,  142,   99,
-  102,   88,  105,  106,  107,  108,  114,  110,  116,  118,
-   77,   86,  136,  152,   66,   96,   93,  126,  150,  153,
-  154,  155,  156,  173,  174,  175,   88,  176,  177,    1,
-   26,  124,    2,   52,   56,   53,   55,   54,  103,   88,
-   96,  137,   81,   76,  112,   97,  122,  172,   65,   93,
-   70,  117,  104,    0,  111,    0,  149,  113,    0,    0,
-    0,    0,  151,   26,   12,    0,  115,    0,    0,    0,
-    0,    0,    0,    0,   93,    0,    0,    0,    9,    0,
+  101,   85,  100,   90,  102,  177,  130,   91,   87,   92,
+   93,   94,   87,   95,  138,  139,  140,  141,  142,  143,
+  144,   92,   96,   99,  105,  106,  114,  110,  116,  107,
+  108,  118,  156,   77,   86,  100,   97,   66,  126,  136,
+  154,  157,  158,  159,  160,  161,   92,  162,  179,  180,
+   26,  124,  181,  182,  183,  184,  185,    1,    2,   54,
+  100,   58,   55,   57,   56,   88,  112,  103,   81,   97,
+  137,   76,  104,   97,   70,  178,   65,  122,  153,  113,
+    0,  117,    0,   26,   12,  155,    0,  111,    0,    0,
+    0,    0,    0,  115,   97,    0,    0,    0,    9,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   26,    0,
     0,    0,    0,    0,    0,    0,    0,   12,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -340,23 +347,23 @@ short sudoerstable[] =
    11,    3,    4,    5,   40,   41,    0,    0,    0,    0,
    33,   40,   41,    0,   11,    0,   19,    0,   19,   34,
     0,   19,   19,   19,   11,   19,   19,   19,   19,   19,
-   83,   42,   83,   11,    7,   83,   83,   83,   42,   83,
-   83,   83,   83,   83,   19,   19,   19,   19,   19,   19,
-    0,   44,   45,   46,   47,    0,    0,    0,   83,   83,
-   83,   83,   83,   83,   88,    0,   88,    7,   15,   88,
-   88,   88,    0,   88,   88,   88,   88,   88,   96,    0,
-   96,  131,   13,   96,   96,   96,    0,   96,   96,   96,
-   96,   96,   88,   88,   88,   88,   88,   88,    0,    0,
-    0,   15,    0,    0,    0,    0,   96,   96,   96,   96,
-   96,   96,   93,    0,   93,   13,   14,   93,   93,   93,
-    0,   93,   93,   93,   93,   93,   26,    0,   26,    0,
+   87,   42,   87,   11,    7,   87,   87,   87,   42,   87,
+   87,   87,   87,   87,   19,   19,   19,   19,   19,   19,
+    0,    0,    0,   44,   45,   46,   47,    0,   87,   87,
+   87,   87,   87,   87,   92,    0,   92,    7,   15,   92,
+   92,   92,    0,   92,   92,   92,   92,   92,  100,    0,
+  100,  131,   13,  100,  100,  100,    0,  100,  100,  100,
+  100,  100,   92,   92,   92,   92,   92,   92,    0,    0,
+    0,   15,    0,    0,    0,    0,  100,  100,  100,  100,
+  100,  100,   97,    0,   97,   13,   14,   97,   97,   97,
+    0,   97,   97,   97,   97,   97,   26,    0,   26,    0,
    16,   26,   26,   26,    0,   26,   26,   26,   26,   26,
-   93,   93,   93,   93,   93,   93,    0,    0,    0,   14,
+   97,   97,   97,   97,   97,   97,    0,    0,    0,   14,
     0,    0,    0,    0,   26,   26,   26,   26,   26,   26,
    12,    0,   12,   16,    0,   12,   12,   12,    0,   12,
    12,   12,   12,   12,    9,    0,    9,    0,    0,    9,
     9,    9,    0,    9,    9,    9,    9,    9,   12,   12,
-   12,   12,   12,   12,    0,    0,   50,    0,    0,    0,
+   12,   12,   12,   12,    0,    0,   52,    0,    0,    0,
     0,    0,    9,    9,    9,    9,    9,    9,   10,    0,
    10,    0,    0,   10,   10,   10,    0,   10,   10,   10,
    10,   10,    8,    0,    8,    0,    0,    8,    8,    8,
@@ -364,12 +371,12 @@ short sudoerstable[] =
    10,   10,   43,    0,   29,    0,   30,   31,    0,   32,
     8,    8,    8,    8,    8,    8,   11,    0,   11,    0,
     0,   11,   11,   11,    0,   11,   11,   11,   11,   11,
-   33,    0,    0,   63,    0,    0,    0,    0,    0,    0,
+   33,    0,    0,    0,    0,   67,    0,    0,    0,    0,
     0,    0,    0,    0,   11,   11,   11,   11,   11,   11,
     7,    0,    7,    0,    0,    7,    7,    7,    0,    7,
-    7,    7,    7,    7,    0,    0,  128,    0,    0,    0,
+    7,    7,    7,    7,   17,    0,  128,    0,    0,    0,
     0,  129,    0,    0,    0,    0,    0,    0,    7,    7,
-    7,    7,    7,    7,   15,   17,   15,    0,    0,   15,
+    7,    7,    7,    7,   15,    0,   15,    0,    0,   15,
    15,   15,  130,   15,   15,   15,   15,   15,   13,    0,
    13,    0,    0,   13,   13,   13,    0,   13,   13,   13,
    13,   13,   15,   15,   15,   15,   15,   15,    0,    0,
@@ -379,23 +386,21 @@ short sudoerstable[] =
     0,   16,   16,   16,    0,   16,   16,   16,   16,   16,
    14,   14,   14,   14,   14,   14,    0,    0,    0,    0,
     0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
-   50,   50,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   50,   50,   50,   50,   50,   50,   50,
-   50,   50,   50,   50,   50,   50,   50,   50,    0,    0,
-    0,    0,    0,    0,   50,   50,   50,   50,   50,    0,
-   50,   50,   50,   50,    0,    0,   40,   41,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  157,
-  158,  159,  160,  161,  162,  163,  164,  165,  166,  167,
-  168,  169,  170,   42,    0,    0,    0,   63,   63,    0,
-    0,    0,    0,    0,    0,    0,   44,   45,   46,   47,
-   63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
-   63,   63,   63,   63,   63,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   63,   63,   63,
-   63,    0,    0,    0,    0,    0,    0,    0,    1,    0,
-    2,    0,    0,    3,    4,    5,    0,    6,    7,    8,
-    9,   10,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   11,   12,   13,   14,
-   15,   16,
+   52,   52,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   52,   52,   52,   52,   52,   52,   52,
+   52,   52,   52,   52,   52,   52,   52,   52,    0,    0,
+    0,    0,    0,    0,   52,   52,   52,   52,   52,   52,
+   52,    0,   52,   52,   52,   52,   40,   41,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  163,
+  164,  165,  166,  167,  168,  169,  170,  171,  172,  173,
+  174,  175,  176,   42,    0,    0,    0,    0,    0,   67,
+   67,    0,    0,    0,    0,    0,    0,    0,   44,   45,
+   46,   47,   67,   67,   67,   67,   67,   67,   67,   67,
+   67,   67,   67,   67,   67,   67,   67,    1,    0,    2,
+    0,    0,    3,    4,    5,    0,    6,    7,    8,    9,
+   10,   67,   67,   67,   67,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   11,   12,   13,   14,   15,
+   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerscheck[] =
@@ -409,16 +414,16 @@ short sudoerscheck[] =
   262,  263,  258,   33,  260,  261,   44,  263,  259,   43,
   258,   45,   58,  284,   44,  263,   44,   33,    0,   58,
    58,   61,  284,   36,  263,   38,   39,   61,  284,   58,
-  263,   58,    0,  143,   58,   61,  284,   58,   51,   61,
-   58,   61,   58,   58,  291,  292,  293,  294,  295,   58,
-  263,   33,  264,  264,  264,  264,   93,   89,   95,   40,
-   44,   44,   41,   61,   44,   33,    0,   44,   44,   61,
-   61,   61,   61,  263,  263,  263,   58,  263,  263,    0,
-    0,  118,    0,   41,   41,   41,   41,   41,   75,   52,
-   58,  126,   43,   34,   91,   66,   99,  150,   17,   33,
-   22,   96,   77,   -1,   90,   -1,  131,   92,   -1,   -1,
-   -1,   -1,  135,   33,    0,   -1,   94,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   58,   -1,   -1,   -1,    0,   -1,
+  263,   58,    0,   58,  263,  145,  284,   61,   51,   58,
+   61,   58,   58,   61,  291,  292,  293,  294,  295,  296,
+  297,   33,   58,   58,  264,  264,   93,   89,   95,  264,
+  264,   40,   61,   44,   44,   33,    0,   44,   44,   41,
+   44,   61,   61,   61,   61,   61,   58,   61,  263,  263,
+    0,  118,  263,  263,  263,  263,  263,    0,    0,   41,
+   58,   41,   41,   41,   41,   52,   91,   75,   43,   33,
+  126,   34,   77,   66,   22,  154,   17,   99,  131,   92,
+   -1,   96,   -1,   33,    0,  135,   -1,   90,   -1,   -1,
+   -1,   -1,   -1,   94,   58,   -1,   -1,   -1,    0,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
@@ -432,7 +437,7 @@ short sudoerscheck[] =
    -1,  261,  262,  263,  284,  265,  266,  267,  268,  269,
   256,  284,  258,   33,    0,  261,  262,  263,  284,  265,
   266,  267,  268,  269,  284,  285,  286,  287,  288,  289,
-   -1,  297,  298,  299,  300,   -1,   -1,   -1,  284,  285,
+   -1,   -1,   -1,  299,  300,  301,  302,   -1,  284,  285,
   286,  287,  288,  289,  256,   -1,  258,   33,    0,  261,
   262,  263,   -1,  265,  266,  267,  268,  269,  256,   -1,
   258,   33,    0,  261,  262,  263,   -1,  265,  266,  267,
@@ -454,12 +459,12 @@ short sudoerscheck[] =
   288,  289,   33,   -1,  258,   -1,  260,  261,   -1,  263,
   284,  285,  286,  287,  288,  289,  256,   -1,  258,   -1,
    -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
-  284,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  284,   -1,   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
   256,   -1,  258,   -1,   -1,  261,  262,  263,   -1,  265,
-  266,  267,  268,  269,   -1,   -1,  258,   -1,   -1,   -1,
+  266,  267,  268,  269,   33,   -1,  258,   -1,   -1,   -1,
    -1,  263,   -1,   -1,   -1,   -1,   -1,   -1,  284,  285,
-  286,  287,  288,  289,  256,   33,  258,   -1,   -1,  261,
+  286,  287,  288,  289,  256,   -1,  258,   -1,   -1,  261,
   262,  263,  284,  265,  266,  267,  268,  269,  256,   -1,
   258,   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,
   268,  269,  284,  285,  286,  287,  288,  289,   -1,   -1,
@@ -472,26 +477,24 @@ short sudoerscheck[] =
   257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,  270,  271,  272,  273,  274,  275,  276,
   277,  278,  279,  280,  281,  282,  283,  284,   -1,   -1,
-   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,   -1,
-  297,  298,  299,  300,   -1,   -1,  257,  258,   -1,   -1,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+  297,   -1,  299,  300,  301,  302,  257,  258,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  270,
   271,  272,  273,  274,  275,  276,  277,  278,  279,  280,
-  281,  282,  283,  284,   -1,   -1,   -1,  257,  258,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  297,  298,  299,  300,
-  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
-  280,  281,  282,  283,  284,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  297,  298,  299,
-  300,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  256,   -1,
-  258,   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,
-  268,  269,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  284,  285,  286,  287,
-  288,  289,
+  281,  282,  283,  284,   -1,   -1,   -1,   -1,   -1,  257,
+  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  299,  300,
+  301,  302,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,  280,  281,  282,  283,  284,  256,   -1,  258,
+   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,  268,
+  269,  299,  300,  301,  302,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,
+  289,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 300
+#define YYMAXTOKEN 302
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersname[] =
@@ -511,8 +514,8 @@ char *sudoersname[] =
 "NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT",
 "NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOW","NOFOLLOW",
 "ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE",
-"ROLE","PRIVS","LIMITPRIVS","CMND_TIMEOUT","MYSELF","SHA224_TOK","SHA256_TOK",
-"SHA384_TOK","SHA512_TOK",
+"ROLE","PRIVS","LIMITPRIVS","CMND_TIMEOUT","NOTBEFORE","NOTAFTER","MYSELF",
+"SHA224_TOK","SHA256_TOK","SHA384_TOK","SHA512_TOK",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersrule[] =
@@ -565,6 +568,8 @@ char *sudoersrule[] =
 "opcmnd : cmnd",
 "opcmnd : '!' cmnd",
 "timeoutspec : CMND_TIMEOUT '=' WORD",
+"notbeforespec : NOTBEFORE '=' WORD",
+"notafterspec : NOTAFTER '=' WORD",
 "rolespec : ROLE '=' WORD",
 "typespec : TYPE '=' WORD",
 "privsspec : PRIVS '=' WORD",
@@ -577,6 +582,8 @@ char *sudoersrule[] =
 "runaslist : ':' grouplist",
 "runaslist : ':'",
 "options :",
+"options : options notbeforespec",
+"options : options notafterspec",
 "options : options timeoutspec",
 "options : options rolespec",
 "options : options typespec",
@@ -660,7 +667,7 @@ short *yysslim;
 YYSTYPE *yyvs;
 unsigned int yystacksize;
 int yyparse(void);
-#line 863 "gram.y"
+#line 899 "gram.y"
 void
 sudoerserror(const char *s)
 {
@@ -986,6 +993,8 @@ init_parser(const char *path, bool quiet)
 static void
 init_options(struct command_options *opts)
 {
+    opts->notbefore = UNSPEC;
+    opts->notafter = UNSPEC;
     opts->timeout = UNSPEC;
 #ifdef HAVE_SELINUX
     opts->role = NULL;
@@ -996,7 +1005,7 @@ init_options(struct command_options *opts)
     opts->limitprivs = NULL;
 #endif
 }
-#line 947 "gram.c"
+#line 956 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1205,23 +1214,23 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 172 "gram.y"
+#line 176 "gram.y"
 { ; }
 break;
 case 5:
-#line 180 "gram.y"
+#line 184 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 183 "gram.y"
+#line 187 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 186 "gram.y"
+#line 190 "gram.y"
 {
                            if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1230,73 +1239,73 @@ case 7:
                        }
 break;
 case 8:
-#line 192 "gram.y"
+#line 196 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 195 "gram.y"
+#line 199 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 198 "gram.y"
+#line 202 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 201 "gram.y"
+#line 205 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 204 "gram.y"
+#line 208 "gram.y"
 {
                            if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 13:
-#line 208 "gram.y"
+#line 212 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 14:
-#line 212 "gram.y"
+#line 216 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 15:
-#line 216 "gram.y"
+#line 220 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 16:
-#line 220 "gram.y"
+#line 224 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults))
                                YYERROR;
                        }
 break;
 case 18:
-#line 227 "gram.y"
+#line 231 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 233 "gram.y"
+#line 237 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                            if (yyval.defaults == NULL) {
@@ -1306,7 +1315,7 @@ case 19:
                        }
 break;
 case 20:
-#line 240 "gram.y"
+#line 244 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                            if (yyval.defaults == NULL) {
@@ -1316,7 +1325,7 @@ case 20:
                        }
 break;
 case 21:
-#line 247 "gram.y"
+#line 251 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                            if (yyval.defaults == NULL) {
@@ -1326,7 +1335,7 @@ case 21:
                        }
 break;
 case 22:
-#line 254 "gram.y"
+#line 258 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                            if (yyval.defaults == NULL) {
@@ -1336,7 +1345,7 @@ case 22:
                        }
 break;
 case 23:
-#line 261 "gram.y"
+#line 265 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                            if (yyval.defaults == NULL) {
@@ -1346,14 +1355,14 @@ case 23:
                        }
 break;
 case 25:
-#line 271 "gram.y"
+#line 275 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 277 "gram.y"
+#line 281 "gram.y"
 {
                            struct privilege *p = calloc(1, sizeof(*p));
                            if (p == NULL) {
@@ -1367,21 +1376,21 @@ case 26:
                        }
 break;
 case 27:
-#line 290 "gram.y"
+#line 294 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 294 "gram.y"
+#line 298 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 300 "gram.y"
+#line 304 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1391,7 +1400,7 @@ case 29:
                        }
 break;
 case 30:
-#line 307 "gram.y"
+#line 311 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1401,7 +1410,7 @@ case 30:
                        }
 break;
 case 31:
-#line 314 "gram.y"
+#line 318 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -1411,7 +1420,7 @@ case 31:
                        }
 break;
 case 32:
-#line 321 "gram.y"
+#line 325 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                            if (yyval.member == NULL) {
@@ -1421,7 +1430,7 @@ case 32:
                        }
 break;
 case 33:
-#line 328 "gram.y"
+#line 332 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -1431,7 +1440,7 @@ case 33:
                        }
 break;
 case 35:
-#line 338 "gram.y"
+#line 342 "gram.y"
 {
                            struct cmndspec *prev;
                            prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries);
@@ -1450,6 +1459,11 @@ case 35:
                                yyvsp[0].cmndspec->limitprivs = prev->limitprivs;
                            }
 #endif /* HAVE_PRIV_SET */
+                           /* propagate command time restrictions */
+                           if (yyvsp[0].cmndspec->notbefore == UNSPEC)
+                               yyvsp[0].cmndspec->notbefore = prev->notbefore;
+                           if (yyvsp[0].cmndspec->notafter == UNSPEC)
+                               yyvsp[0].cmndspec->notafter = prev->notafter;
                            /* propagate command timeout */
                            if (yyvsp[0].cmndspec->timeout == UNSPEC)
                                yyvsp[0].cmndspec->timeout = prev->timeout;
@@ -1480,7 +1494,7 @@ case 35:
                        }
 break;
 case 36:
-#line 386 "gram.y"
+#line 395 "gram.y"
 {
                            struct cmndspec *cs = calloc(1, sizeof(*cs));
                            if (cs == NULL) {
@@ -1518,6 +1532,8 @@ case 36:
                            cs->privs = yyvsp[-2].options.privs;
                            cs->limitprivs = yyvsp[-2].options.limitprivs;
 #endif
+                           cs->notbefore = yyvsp[-2].options.notbefore;
+                           cs->notafter = yyvsp[-2].options.notafter;
                            cs->timeout = yyvsp[-2].options.timeout;
                            cs->tags = yyvsp[-1].tag;
                            cs->cmnd = yyvsp[0].member;
@@ -1530,7 +1546,7 @@ case 36:
                        }
 break;
 case 37:
-#line 435 "gram.y"
+#line 446 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1540,7 +1556,7 @@ case 37:
                        }
 break;
 case 38:
-#line 442 "gram.y"
+#line 453 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1550,7 +1566,7 @@ case 38:
                        }
 break;
 case 39:
-#line 449 "gram.y"
+#line 460 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1560,7 +1576,7 @@ case 39:
                        }
 break;
 case 40:
-#line 456 "gram.y"
+#line 467 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1570,13 +1586,13 @@ case 40:
                        }
 break;
 case 41:
-#line 465 "gram.y"
+#line 476 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                        }
 break;
 case 42:
-#line 468 "gram.y"
+#line 479 "gram.y"
 {
                            if (yyvsp[0].member->type != COMMAND) {
                                sudoerserror(N_("a digest requires a path name"));
@@ -1588,63 +1604,75 @@ case 42:
                        }
 break;
 case 43:
-#line 479 "gram.y"
+#line 490 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 44:
-#line 483 "gram.y"
+#line 494 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 45:
-#line 489 "gram.y"
+#line 500 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 46:
-#line 494 "gram.y"
+#line 505 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 47:
-#line 499 "gram.y"
+#line 509 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 48:
-#line 504 "gram.y"
+#line 514 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 49:
-#line 508 "gram.y"
+#line 519 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 50:
-#line 513 "gram.y"
+#line 524 "gram.y"
 {
-                           yyval.runas = NULL;
+                           yyval.string = yyvsp[0].string;
                        }
 break;
 case 51:
-#line 516 "gram.y"
+#line 528 "gram.y"
 {
-                           yyval.runas = yyvsp[-1].runas;
+                           yyval.string = yyvsp[0].string;
                        }
 break;
 case 52:
-#line 521 "gram.y"
+#line 533 "gram.y"
+{
+                           yyval.runas = NULL;
+                       }
+break;
+case 53:
+#line 536 "gram.y"
+{
+                           yyval.runas = yyvsp[-1].runas;
+                       }
+break;
+case 54:
+#line 541 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1661,8 +1689,8 @@ case 52:
                            }
                        }
 break;
-case 53:
-#line 536 "gram.y"
+case 55:
+#line 556 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1673,8 +1701,8 @@ case 53:
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 54:
-#line 545 "gram.y"
+case 56:
+#line 565 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1685,8 +1713,8 @@ case 54:
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 55:
-#line 554 "gram.y"
+case 57:
+#line 574 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1697,8 +1725,8 @@ case 55:
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 56:
-#line 563 "gram.y"
+case 58:
+#line 583 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1715,14 +1743,36 @@ case 56:
                            }
                        }
 break;
-case 57:
-#line 580 "gram.y"
+case 59:
+#line 600 "gram.y"
 {
                            init_options(&yyval.options);
                        }
 break;
-case 58:
-#line 583 "gram.y"
+case 60:
+#line 603 "gram.y"
+{
+                           yyval.options.notbefore = parse_gentime(yyvsp[0].string);
+                           free(yyvsp[0].string);
+                           if (yyval.options.notbefore == -1) {
+                               sudoerserror(N_("invalid notbefore value"));
+                               YYERROR;
+                           }
+                       }
+break;
+case 61:
+#line 611 "gram.y"
+{
+                           yyval.options.notafter = parse_gentime(yyvsp[0].string);
+                           free(yyvsp[0].string);
+                           if (yyval.options.notafter == -1) {
+                               sudoerserror(N_("invalid notafter value"));
+                               YYERROR;
+                           }
+                       }
+break;
+case 62:
+#line 619 "gram.y"
 {
                            yyval.options.timeout = parse_timeout(yyvsp[0].string);
                            free(yyvsp[0].string);
@@ -1735,8 +1785,8 @@ case 58:
                            }
                        }
 break;
-case 59:
-#line 594 "gram.y"
+case 63:
+#line 630 "gram.y"
 {
 #ifdef HAVE_SELINUX
                            free(yyval.options.role);
@@ -1744,8 +1794,8 @@ case 59:
 #endif
                        }
 break;
-case 60:
-#line 600 "gram.y"
+case 64:
+#line 636 "gram.y"
 {
 #ifdef HAVE_SELINUX
                            free(yyval.options.type);
@@ -1753,8 +1803,8 @@ case 60:
 #endif
                        }
 break;
-case 61:
-#line 606 "gram.y"
+case 65:
+#line 642 "gram.y"
 {
 #ifdef HAVE_PRIV_SET
                            free(yyval.options.privs);
@@ -1762,8 +1812,8 @@ case 61:
 #endif
                        }
 break;
-case 62:
-#line 612 "gram.y"
+case 66:
+#line 648 "gram.y"
 {
 #ifdef HAVE_PRIV_SET
                            free(yyval.options.limitprivs);
@@ -1771,98 +1821,98 @@ case 62:
 #endif
                        }
 break;
-case 63:
-#line 620 "gram.y"
+case 67:
+#line 656 "gram.y"
 {
                            TAGS_INIT(yyval.tag);
                        }
 break;
-case 64:
-#line 623 "gram.y"
+case 68:
+#line 659 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
-case 65:
-#line 626 "gram.y"
+case 69:
+#line 662 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
-case 66:
-#line 629 "gram.y"
+case 70:
+#line 665 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
-case 67:
-#line 632 "gram.y"
+case 71:
+#line 668 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
-case 68:
-#line 635 "gram.y"
+case 72:
+#line 671 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
-case 69:
-#line 638 "gram.y"
+case 73:
+#line 674 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
-case 70:
-#line 641 "gram.y"
+case 74:
+#line 677 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
-case 71:
-#line 644 "gram.y"
+case 75:
+#line 680 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
-case 72:
-#line 647 "gram.y"
+case 76:
+#line 683 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
-case 73:
-#line 650 "gram.y"
+case 77:
+#line 686 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
-case 74:
-#line 653 "gram.y"
+case 78:
+#line 689 "gram.y"
 {
                            yyval.tag.follow = true;
                        }
 break;
-case 75:
-#line 656 "gram.y"
+case 79:
+#line 692 "gram.y"
 {
                            yyval.tag.follow = false;
                        }
 break;
-case 76:
-#line 659 "gram.y"
+case 80:
+#line 695 "gram.y"
 {
                            yyval.tag.send_mail = true;
                        }
 break;
-case 77:
-#line 662 "gram.y"
+case 81:
+#line 698 "gram.y"
 {
                            yyval.tag.send_mail = false;
                        }
 break;
-case 78:
-#line 667 "gram.y"
+case 82:
+#line 703 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1871,8 +1921,8 @@ case 78:
                            }
                        }
 break;
-case 79:
-#line 674 "gram.y"
+case 83:
+#line 710 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1881,8 +1931,8 @@ case 79:
                            }
                        }
 break;
-case 80:
-#line 681 "gram.y"
+case 84:
+#line 717 "gram.y"
 {
                            struct sudo_command *c = calloc(1, sizeof(*c));
                            if (c == NULL) {
@@ -1899,8 +1949,8 @@ case 80:
                            }
                        }
 break;
-case 83:
-#line 702 "gram.y"
+case 87:
+#line 738 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, HOSTALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1910,15 +1960,15 @@ case 83:
                            }
                        }
 break;
-case 85:
-#line 713 "gram.y"
+case 89:
+#line 749 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 88:
-#line 723 "gram.y"
+case 92:
+#line 759 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, CMNDALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1928,15 +1978,15 @@ case 88:
                            }
                        }
 break;
-case 90:
-#line 734 "gram.y"
+case 94:
+#line 770 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 93:
-#line 744 "gram.y"
+case 97:
+#line 780 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, RUNASALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1946,8 +1996,8 @@ case 93:
                            }
                        }
 break;
-case 96:
-#line 758 "gram.y"
+case 100:
+#line 794 "gram.y"
 {
                            const char *s;
                            s = alias_add(yyvsp[-2].string, USERALIAS, sudoers, this_lineno, yyvsp[0].member);
@@ -1957,29 +2007,29 @@ case 96:
                            }
                        }
 break;
-case 98:
-#line 769 "gram.y"
+case 102:
+#line 805 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 99:
-#line 775 "gram.y"
+case 103:
+#line 811 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 100:
-#line 779 "gram.y"
+case 104:
+#line 815 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 101:
-#line 785 "gram.y"
+case 105:
+#line 821 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1988,8 +2038,8 @@ case 101:
                            }
                        }
 break;
-case 102:
-#line 792 "gram.y"
+case 106:
+#line 828 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1998,8 +2048,8 @@ case 102:
                            }
                        }
 break;
-case 103:
-#line 799 "gram.y"
+case 107:
+#line 835 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -2008,8 +2058,8 @@ case 103:
                            }
                        }
 break;
-case 104:
-#line 806 "gram.y"
+case 108:
+#line 842 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                            if (yyval.member == NULL) {
@@ -2018,8 +2068,8 @@ case 104:
                            }
                        }
 break;
-case 105:
-#line 813 "gram.y"
+case 109:
+#line 849 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -2028,29 +2078,29 @@ case 105:
                            }
                        }
 break;
-case 107:
-#line 823 "gram.y"
+case 111:
+#line 859 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 108:
-#line 829 "gram.y"
+case 112:
+#line 865 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 109:
-#line 833 "gram.y"
+case 113:
+#line 869 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 110:
-#line 839 "gram.y"
+case 114:
+#line 875 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -2059,8 +2109,8 @@ case 110:
                            }
                        }
 break;
-case 111:
-#line 846 "gram.y"
+case 115:
+#line 882 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -2069,8 +2119,8 @@ case 111:
                            }
                        }
 break;
-case 112:
-#line 853 "gram.y"
+case 116:
+#line 889 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -2079,7 +2129,7 @@ case 112:
                            }
                        }
 break;
-#line 2030 "gram.c"
+#line 2080 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 9a2d7e1ded00a8dd694f42e3551c38884e95bb17..d9fe6e9a64a73f9f8c754f2610142e03a3e2a236 100644 (file)
 #define PRIVS 293
 #define LIMITPRIVS 294
 #define CMND_TIMEOUT 295
-#define MYSELF 296
-#define SHA224_TOK 297
-#define SHA256_TOK 298
-#define SHA384_TOK 299
-#define SHA512_TOK 300
+#define NOTBEFORE 296
+#define NOTAFTER 297
+#define MYSELF 298
+#define SHA224_TOK 299
+#define SHA256_TOK 300
+#define SHA384_TOK 301
+#define SHA512_TOK 302
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 5f95721af977fe847c1e57e773aaba5d43595c7b..e2963c2b523bbf8fc42dbc6bcf769228f5618946 100644 (file)
@@ -130,6 +130,8 @@ static struct sudo_digest *new_digest(int, char *);
 %token <tok>    PRIVS                  /* Solaris privileges */
 %token <tok>    LIMITPRIVS             /* Solaris limit privileges */
 %token <tok>    CMND_TIMEOUT           /* command timeout */
+%token <tok>    NOTBEFORE              /* time restriction */
+%token <tok>    NOTAFTER               /* time restriction */
 %token <tok>    MYSELF                 /* run as myself, not another user */
 %token <tok>    SHA224_TOK             /* sha224 token */
 %token <tok>    SHA256_TOK             /* sha256 token */
@@ -164,6 +166,8 @@ static struct sudo_digest *new_digest(int, char *);
 %type <string>   privsspec
 %type <string>   limitprivsspec
 %type <string>   timeoutspec
+%type <string>   notbeforespec
+%type <string>   notafterspec
 %type <digest>   digest
 %type <options>          options
 
@@ -353,6 +357,11 @@ cmndspeclist       :       cmndspec
                                $3->limitprivs = prev->limitprivs;
                            }
 #endif /* HAVE_PRIV_SET */
+                           /* propagate command time restrictions */
+                           if ($3->notbefore == UNSPEC)
+                               $3->notbefore = prev->notbefore;
+                           if ($3->notafter == UNSPEC)
+                               $3->notafter = prev->notafter;
                            /* propagate command timeout */
                            if ($3->timeout == UNSPEC)
                                $3->timeout = prev->timeout;
@@ -420,6 +429,8 @@ cmndspec    :       runasspec options cmndtag digcmnd {
                            cs->privs = $2.privs;
                            cs->limitprivs = $2.limitprivs;
 #endif
+                           cs->notbefore = $2.notbefore;
+                           cs->notafter = $2.notafter;
                            cs->timeout = $2.timeout;
                            cs->tags = $3;
                            cs->cmnd = $4;
@@ -491,6 +502,15 @@ timeoutspec        :       CMND_TIMEOUT '=' WORD {
                        }
                ;
 
+notbeforespec  :       NOTBEFORE '=' WORD {
+                           $$ = $3;
+                       }
+
+notafterspec   :       NOTAFTER '=' WORD {
+                           $$ = $3;
+                       }
+               ;
+
 rolespec       :       ROLE '=' WORD {
                            $$ = $3;
                        }
@@ -580,6 +600,22 @@ runaslist  :       /* empty */ {
 options                :       /* empty */ {
                            init_options(&$$);
                        }
+               |       options notbeforespec {
+                           $$.notbefore = parse_gentime($2);
+                           free($2);
+                           if ($$.notbefore == -1) {
+                               sudoerserror(N_("invalid notbefore value"));
+                               YYERROR;
+                           }
+                       }
+               |       options notafterspec {
+                           $$.notafter = parse_gentime($2);
+                           free($2);
+                           if ($$.notafter == -1) {
+                               sudoerserror(N_("invalid notafter value"));
+                               YYERROR;
+                           }
+                       }
                |       options timeoutspec {
                            $$.timeout = parse_timeout($2);
                            free($2);
@@ -1185,6 +1221,8 @@ init_parser(const char *path, bool quiet)
 static void
 init_options(struct command_options *opts)
 {
+    opts->notbefore = UNSPEC;
+    opts->notafter = UNSPEC;
     opts->timeout = UNSPEC;
 #ifdef HAVE_SELINUX
     opts->role = NULL;
index 527dd96a7606807f49323a36b86be207769a8163..749a3eb21816256da9a1fedfc3d2c60478ef2bcd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2005, 2007-2016 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2007-2017 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -29,8 +29,9 @@
 #endif /* HAVE_STRINGS_H */
 #include <unistd.h>
 #include <ctype.h>
-#include <pwd.h>
 #include <grp.h>
+#include <pwd.h>
+#include <time.h>
 
 #include "sudoers.h"
 #include "parse.h"
@@ -151,6 +152,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
     struct privilege *priv;
     struct userspec *us;
     struct member *matching_user;
+    time_t now;
     debug_decl(sudo_file_lookup, SUDOERS_DEBUG_NSS)
 
     if (nss->handle == NULL)
@@ -207,6 +209,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
     if (!set_perms(PERM_RUNAS))
        debug_return_int(validated);
 
+    time(&now);
     match = UNSPEC;
     TAILQ_FOREACH_REVERSE(us, &userspecs, userspec_list, entries) {
        if (userlist_matches(sudo_user.pw, &us->users) != ALLOW)
@@ -219,6 +222,14 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
            else
                continue;
            TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) {
+               if (cs->notbefore != UNSPEC) {
+                   if (now < cs->notbefore)
+                       continue;
+               }
+               if (cs->notafter != UNSPEC) {
+                   if (now > cs->notafter)
+                       continue;
+               }
                matching_user = NULL;
                runas_match = runaslist_matches(cs->runasuserlist,
                    cs->runasgrouplist, &matching_user, NULL);
@@ -378,6 +389,22 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags,
        snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
        sudo_lbuf_append(lbuf, "TIMEOUT=%s ", numbuf);
     }
+    if (cs->notbefore != UNSPEC) {
+       char buf[sizeof("CCYYMMDDHHMMSSZ")];
+       struct tm *tm = gmtime(&cs->notbefore);
+       snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+           tm->tm_hour, tm->tm_min, tm->tm_sec);
+       sudo_lbuf_append(lbuf, "NOTBEFORE=%s ", buf);
+    }
+    if (cs->notafter != UNSPEC) {
+       char buf[sizeof("CCYYMMDDHHMMSSZ")];
+       struct tm *tm = gmtime(&cs->notafter);
+       snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+           tm->tm_hour, tm->tm_min, tm->tm_sec);
+       sudo_lbuf_append(lbuf, "NOTAFTER=%s ", buf);
+    }
     if (TAG_CHANGED(setenv)) {
        tags->setenv = cs->tags.setenv;
        sudo_lbuf_append(lbuf, tags->setenv ? "SETENV: " : "NOSETENV: ");
@@ -568,6 +595,22 @@ sudo_file_display_priv_long(struct passwd *pw, struct userspec *us,
                    snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout);
                    sudo_lbuf_append(lbuf, "    Timeout: %s\n", numbuf);
                }
+               if (cs->notbefore != UNSPEC) {
+                   char buf[sizeof("CCYYMMDDHHMMSSZ")];
+                   struct tm *tm = gmtime(&cs->notbefore);
+                   snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+                       tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+                       tm->tm_hour, tm->tm_min, tm->tm_sec);
+                   sudo_lbuf_append(lbuf, "    NotBefore: %s\n", buf);
+               }
+               if (cs->notafter != UNSPEC) {
+                   char buf[sizeof("CCYYMMDDHHMMSSZ")];
+                   struct tm *tm = gmtime(&cs->notafter);
+                   snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02dZ",
+                       tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+                       tm->tm_hour, tm->tm_min, tm->tm_sec);
+                   sudo_lbuf_append(lbuf, "    NotAfter: %s\n", buf);
+               }
                sudo_lbuf_append(lbuf, _("    Commands:\n"));
            }
            sudo_lbuf_append(lbuf, "\t");
index 4d01ae5e6844fe366c15203ac59870d6a4ba1c44..407651c0c2b8017d586e7b2d27ce0e70447ec7e0 100644 (file)
@@ -113,6 +113,8 @@ struct cmndtag {
  * Per-command option container struct.
  */
 struct command_options {
+    time_t notbefore;                  /* time restriction */
+    time_t notafter;                   /* time restriction */
     int timeout;                       /* command timeout */
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
@@ -176,6 +178,8 @@ struct cmndspec {
     struct member_list *runasgrouplist;        /* list of runas groups */
     struct member *cmnd;               /* command to allow/deny */
     struct cmndtag tags;               /* tag specificaion */
+    time_t notbefore;                  /* time restriction */
+    time_t notafter;                   /* time restriction */
     int timeout;                       /* command timeout */
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
@@ -280,4 +284,10 @@ size_t base64_decode(const char *str, unsigned char *dst, size_t dsize);
 /* timeout.c */
 int parse_timeout(const char *timestr);
 
+/* gmtoff.c */
+long get_gmtoff(time_t *clock);
+
+/* gentime.c */
+time_t parse_gentime(const char *expstr);
+
 #endif /* SUDOERS_PARSE_H */
diff --git a/plugins/sudoers/regress/parser/check_gentime.c b/plugins/sudoers/regress/parser/check_gentime.c
new file mode 100644 (file)
index 0000000..6d75680
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
+#include <time.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudoers_debug.h"
+#include "parse.h"
+
+__dso_public int main(int argc, char *argv[]);
+
+struct gentime_test {
+    char *gentime;
+    time_t unixtime;
+} tests[] = {
+    { "199412161032ZZ", -1 },
+    { "199412161032Z", 787573920 },
+    { "199412160532-0500", 787573920 },
+    { "199412160532-05000", -1 },
+    { "199412160532", 787573920 },             /* local time is EST */
+    { "20170214083000-0500", 1487079000 },
+    { "201702140830-0500", 1487079000 },
+    { "201702140830", 1487079000 },            /* local time is EST */
+    { "201702140830.3-0500", 1487079018 },
+    { "201702140830,3-0500", 1487079018 },
+    { "20170214083000.5Z", 1487061000 },
+    { "20170214083000,5Z", 1487061000 },
+    { "201702142359.4Z", 1487116764 },
+    { "201702142359,4Z", 1487116764 },
+    { "2017021408.5Z", 1487061000 },
+    { "2017021408,5Z", 1487061000 },
+    { "20170214Z", -1 },
+    { NULL, -1 }
+};
+
+int
+main(int argc, char *argv[])
+{
+    int ntests, errors = 0;
+    time_t result;
+
+    /* Do local time tests in Eastern Standard Time. */
+    putenv("TZ=EST5EST5");
+    tzset();
+
+    for (ntests = 0; tests[ntests].gentime != NULL; ntests++) {
+       result = parse_gentime(tests[ntests].gentime);
+       if (result != tests[ntests].unixtime) {
+           fprintf(stderr, "check_gentime[%d]: %s: expected %lld, got %lld\n",
+               ntests, tests[ntests].gentime,
+               (long long)tests[ntests].unixtime, (long long)result);
+           errors++;
+       }
+    }
+    printf("check_gentime: %d tests run, %d errors, %d%% success rate\n",
+       ntests, errors, (ntests - errors) * 100 / ntests);
+    exit(errors);
+}
diff --git a/plugins/sudoers/regress/sudoers/test19.in b/plugins/sudoers/regress/sudoers/test19.in
new file mode 100644 (file)
index 0000000..5f637a7
--- /dev/null
@@ -0,0 +1,12 @@
+# Test parsing of NOTBEFORE and NOTAFTER syntax
+# Local time zone parsing is checked in visudo/test10.sh
+user0  ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, /bin/ls
+user1  ALL = NOTBEFORE=201702140830Z /usr/bin/id, NOTAFTER=20170301083000Z /bin/ls
+user2  ALL = NOTBEFORE=201702140830.3Z /usr/bin/id
+user3  ALL = NOTBEFORE=2017021408Z /usr/bin/id
+user4  ALL = NOTBEFORE=2017021408.4Z /usr/bin/id
+user5  ALL = NOTBEFORE=20170214083000.5Z /usr/bin/id
+user6  ALL = NOTBEFORE=20170214083000\,5Z /usr/bin/id
+user7  ALL = NOTBEFORE=20170214033000-0500 /usr/bin/id
+user8  ALL = NOTBEFORE=20170214033000.0-0500 /usr/bin/id
+user9  ALL = NOTBEFORE=20170214033000\,0-0500 /usr/bin/id
diff --git a/plugins/sudoers/regress/sudoers/test19.json.ok b/plugins/sudoers/regress/sudoers/test19.json.ok
new file mode 100644 (file)
index 0000000..e9cc9dd
--- /dev/null
@@ -0,0 +1,156 @@
+{
+    "User_Specs": [
+        {
+            "User_List": [
+                { "username": "user0" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" },
+                        { "command": "/bin/ls" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user1" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" },
+                        { "command": "/bin/ls" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user2" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user3" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user4" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user5" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user6" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user7" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user8" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user9" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Commands": [
+                        { "command": "/usr/bin/id" }
+                    ]
+                }
+            ]
+        }
+    ]
+}
diff --git a/plugins/sudoers/regress/sudoers/test19.out.ok b/plugins/sudoers/regress/sudoers/test19.out.ok
new file mode 100644 (file)
index 0000000..8178829
--- /dev/null
@@ -0,0 +1,14 @@
+Parses OK.
+
+
+
+user0  ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /bin/ls
+user1  ALL = NOTBEFORE=20170214083000Z /usr/bin/id, NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /bin/ls
+user2  ALL = NOTBEFORE=20170214083018Z /usr/bin/id
+user3  ALL = NOTBEFORE=20170214080000Z /usr/bin/id
+user4  ALL = NOTBEFORE=20170214082400Z /usr/bin/id
+user5  ALL = NOTBEFORE=20170214083000Z /usr/bin/id
+user6  ALL = NOTBEFORE=20170214083000Z /usr/bin/id
+user7  ALL = NOTBEFORE=20170214083000Z /usr/bin/id
+user8  ALL = NOTBEFORE=20170214083000Z /usr/bin/id
+user9  ALL = NOTBEFORE=20170214083000Z /usr/bin/id
diff --git a/plugins/sudoers/regress/sudoers/test19.toke.ok b/plugins/sudoers/regress/sudoers/test19.toke.ok
new file mode 100644 (file)
index 0000000..45c5d27
--- /dev/null
@@ -0,0 +1,12 @@
+#
+#
+WORD(5) ALL = NOTBEFORE = WORD(5) NOTAFTER = WORD(5) COMMAND , COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND , NOTAFTER = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
+WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND 
diff --git a/plugins/sudoers/regress/visudo/test10.out.ok b/plugins/sudoers/regress/visudo/test10.out.ok
new file mode 100644 (file)
index 0000000..e5c355c
--- /dev/null
@@ -0,0 +1 @@
+stdin: parsed OK
diff --git a/plugins/sudoers/regress/visudo/test10.sh b/plugins/sudoers/regress/visudo/test10.sh
new file mode 100755 (executable)
index 0000000..ea0ca41
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# Test parsing of NOTBEFORE/NOTAFTER using local time zone
+#
+
+./visudo -cf - <<-EOF
+       user1   ALL = NOTBEFORE=20151201235900 /usr/bin/id
+       user2   ALL = NOTBEFORE=20151201235900.2 /usr/bin/id
+       user3   ALL = NOTBEFORE=20151201235900\,2 /usr/bin/id
+       user4   ALL = NOTBEFORE=2015120123 /usr/bin/id
+       EOF
index 37e708f02ecbdab5a481aad9c4232bfe1f6b9277..6418a196c06da33f33e20ac7af7c8eb8ea77fbda 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2011-2013 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2013, 2015, 2017
+ *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -17,7 +18,6 @@
 /*
  * Major sudoers grammar changes are documented here.
  * Note that minor changes such as added Defaults options are not listed here.
- * This file placed in the public domain by Todd C. Miller on Apr 5, 2011.
  *
  * 1   sudo 1.1
  * 2   sudo 1.3, adds support specifying a directory instead of a command.
  * 43  sudo 1.8.7, Support for specifying a digest along with the command.
  * 44  sudo 1.8.13, added MAIL/NOMAIL tags.
  * 45  sudo 1.8.15, added FOLLOW/NOFOLLOW tags as well as sudoedit_follow and sudoedit_checkdir Defaults.
-*/
+ * 46  sudo 1.8.20, added TIMEOUT, NOTBEFORE and NOTAFTER options.
+ */
 
 #ifndef SUDOERS_VERSION_H
 #define        SUDOERS_VERSION_H
 
-#define SUDOERS_GRAMMAR_VERSION        45
+#define SUDOERS_GRAMMAR_VERSION        46
 
 #endif /* SUDOERS_VERSION_H */
index bfe4f2ad89a4aa0a5341d066a8862305e736cbb5..937a6aa2a9a33a33fa929a4fa0255da08aa92060 100644 (file)
@@ -38,6 +38,7 @@
 #ifdef HAVE_NETGROUP_H
 # include <netgroup.h>
 #endif /* HAVE_NETGROUP_H */
+#include <time.h>
 #include <ctype.h>
 #include <errno.h>
 #include <netinet/in.h>
@@ -636,6 +637,18 @@ print_privilege(struct privilege *priv)
 #endif /* HAVE_PRIV_SET */
        if (cs->timeout > 0)
            printf("TIMEOUT=%d ", cs->timeout);
+       if (cs->notbefore != UNSPEC) {
+           struct tm *tm = gmtime(&cs->notbefore);
+           printf("NOTBEFORE=%04d%02d%02d%02d%02d%02dZ ",
+               tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+               tm->tm_hour, tm->tm_min, tm->tm_sec);
+       }
+       if (cs->notafter != UNSPEC) {
+           struct tm *tm = gmtime(&cs->notafter);
+           printf("NOTAFTER=%04d%02d%02d%02d%02d%02dZ ",
+               tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+               tm->tm_hour, tm->tm_min, tm->tm_sec);
+       }
        if (TAG_CHANGED(follow))
            printf("%sFOLLOW: ", cs->tags.follow ? "" : "NO");
        if (TAG_CHANGED(log_input))
index c03ad83561c9358a883d5e825b397752c45710eb..4341756c259fed7bd75b4fbcb5c19f2cf812df1a 100644 (file)
@@ -306,105 +306,107 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 72
-#define YY_END_OF_BUFFER 73
-static yyconst short int yy_accept[868] =
+#define YY_NUM_RULES 74
+#define YY_END_OF_BUFFER 75
+static yyconst short int yy_accept[882] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   73,   60,   68,   67,   66,   59,
-       70,   38,   61,   62,   38,   63,   60,   60,   60,   60,
-       65,   64,   71,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   71,   60,   60,   68,   70,
-       51,   51,   51,   51,   51,    2,   71,    1,   60,   51,
-       51,   60,   17,   16,   17,   16,   16,   71,   70,   71,
-        3,    9,    8,    9,    4,    9,    5,   71,   13,   13,
-       13,   11,   12,   71,   19,   19,   18,   18,   18,   19,
-       18,   18,   18,   18,   19,   19,   19,   19,   19,   19,
-
-       18,   19,   19,   60,    0,   68,   66,   70,   70,    0,
-       60,   40,    0,   38,    0,   39,    0,   58,   58,    0,
-       60,   60,    0,   60,   60,   60,   60,    0,   43,   51,
-       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   60,   69,   60,   60,   68,    0,
-        0,    0,    0,    0,   70,   60,   60,   60,   60,   60,
-        2,    1,    0,    1,   52,   52,    0,   60,   17,   17,
-       15,   14,   15,    0,    0,    3,    9,    0,    6,    7,
-        9,    9,   13,    0,   13,   13,    0,   10,   40,    0,
-        0,   39,   19,   19,    0,   19,    0,    0,   18,   18,
-
-       18,   18,   18,   18,   19,   19,   51,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   70,   70,    0,   40,
-       60,   60,   60,   60,   60,    0,    0,   43,   43,   51,
-       45,   51,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   51,   51,   51,   60,   60,
-        0,    0,    0,    0,    0,   70,   60,   60,   60,   60,
-       60,    0,   60,   10,    0,    0,    0,   18,   18,   18,
+        0,    0,    0,    0,   75,   62,   70,   69,   68,   61,
+       72,   38,   63,   64,   38,   65,   62,   62,   62,   62,
+       67,   66,   73,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   73,   62,   62,   70,   72,
+       53,   53,   53,   53,   53,    2,   73,    1,   62,   53,
+       53,   53,   62,   17,   16,   17,   16,   16,   73,   72,
+       73,    3,    9,    8,    9,    4,    9,    5,   73,   13,
+       13,   13,   11,   12,   73,   19,   19,   18,   18,   18,
+       19,   18,   18,   18,   18,   19,   19,   19,   19,   19,
+
+       19,   18,   19,   19,   62,    0,   70,   68,   72,   72,
+        0,   62,   40,    0,   38,    0,   39,    0,   60,   60,
+        0,   62,   62,    0,   62,   62,   62,   62,    0,   43,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   62,   71,   62,   62,   70,
+        0,    0,    0,    0,    0,   72,   62,   62,   62,   62,
+       62,    2,    1,    0,    1,   54,   54,    0,   53,   62,
+       17,   17,   15,   14,   15,    0,    0,    3,    9,    0,
+        6,    7,    9,    9,   13,    0,   13,   13,    0,   10,
+       40,    0,    0,   39,   19,   19,    0,   19,    0,    0,
+
+       18,   18,   18,   18,   18,   18,   19,   19,   53,   19,
+       19,   19,   19,   19,   19,   19,   19,   19,   72,   72,
+        0,   40,   62,   62,   62,   62,   62,    0,    0,   43,
+       43,   53,   45,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   62,   62,    0,    0,    0,    0,    0,   72,   62,
+       62,   62,   62,   62,    0,   62,   10,    0,    0,    0,
+       18,   18,   18,   19,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   19,   72,   62,
+       62,   62,   62,   62,   62,    0,   44,   44,   44,    0,
+
+        0,   43,   43,   43,   43,   43,   43,   43,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   49,   53,   53,   50,   62,   62,
+       62,   62,    0,    0,    0,    0,    0,   72,   62,   62,
+       62,   62,    0,    0,    0,    0,    0,   18,   18,   19,
+       19,   53,   19,   19,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   62,   62,   62,    0,    0,
+       44,   44,   44,    0,   43,   43,    0,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,    0,   27,
+       53,   53,   53,   53,    0,   34,   53,   53,   53,   53,
+
+       53,   53,   53,   53,   53,   51,   53,   53,   62,   62,
+       62,   62,   62,    0,    0,    0,   72,   62,   62,   62,
+        0,    0,    0,   18,   18,   19,   53,   53,   19,   19,
        19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   70,   60,   60,   60,   60,
-       60,   60,    0,   44,   44,   44,    0,    0,   43,   43,
-
-       43,   43,   43,   43,   43,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   51,   51,   51,   51,   47,
-       51,   51,   48,   60,   60,   60,   60,    0,    0,    0,
-        0,    0,   70,   60,   60,   60,   60,    0,    0,    0,
-        0,    0,   18,   18,   19,   19,   51,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       60,   60,   60,    0,    0,   44,   44,   44,    0,   43,
-       43,    0,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,    0,   27,   51,   51,   51,   51,    0,
-       34,   51,   51,   51,   51,   51,   51,   51,   49,   51,
-
-       51,   60,   60,   60,   60,   60,    0,    0,    0,   70,
-       60,   60,   60,    0,    0,    0,   18,   18,   19,   51,
-       51,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   60,   60,   60,   60,   60,    0,
-       44,    0,   43,   43,   43,    0,    0,    0,   43,   43,
+       19,   62,   62,   62,   62,   62,    0,   44,    0,   43,
+       43,   43,    0,    0,    0,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   55,   56,   57,   58,   62,    0,    0,
+       72,   62,   62,   62,    0,    0,    0,    0,    0,   19,
+
+       53,   53,   19,   19,   53,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   41,   41,   41,    0,    0,
+       43,   43,   43,   43,   43,   43,   43,    0,    0,    0,
+        0,    0,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,    0,   36,   53,   53,
+       53,    0,   26,   53,   53,   53,    0,   35,   53,   53,
+       53,   53,    0,   25,    0,   28,   46,   62,    0,    0,
+       72,   62,   62,   62,   41,   41,   41,   53,   53,   19,
+       53,   53,   19,   19,   19,   62,   41,   41,   41,   41,
+        0,   43,    0,   43,   43,   43,   43,   43,   43,   43,
+
+       43,   43,   43,   43,    0,    0,    0,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       53,   53,   53,   53,   53,   53,   53,   53,   48,   53,
+       59,    0,    0,   72,   62,   22,   54,    0,   41,   41,
+       41,   41,   53,   53,   19,   53,   53,   19,   19,   19,
+       42,   42,   42,   42,   43,    0,    0,    0,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   51,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   53,   54,   55,   56,   60,    0,
-        0,   70,   60,   60,   60,    0,    0,    0,    0,    0,
-       19,   51,   51,   19,   19,   51,   19,   19,   19,   19,
-
-       19,   19,   19,   19,   19,   19,   41,   41,   41,    0,
-        0,   43,   43,   43,   43,   43,   43,   43,    0,    0,
-        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,    0,   36,   51,
-       51,   51,    0,   26,   51,   51,   51,    0,   35,   51,
-       51,    0,   25,    0,   28,   46,   60,    0,    0,   70,
-       60,   60,   60,   41,   41,   41,   51,   51,   19,   51,
-       51,   19,   19,   19,   60,   41,   41,   41,   41,    0,
-       43,    0,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,    0,    0,    0,   43,   43,   43,   43,
-
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   51,
-       51,   51,   51,   51,   51,   51,   51,   57,    0,    0,
-       70,   60,   22,   52,    0,   41,   41,   41,   41,   51,
-       51,   19,   51,   51,   19,   19,   19,   42,   42,   42,
-       42,   43,    0,    0,    0,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,    0,    0,
-        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
-       43,   51,   51,   51,    0,   37,   51,   51,    0,   24,
-        0,   29,    0,   22,   70,   70,   60,    0,   60,   42,
-       42,   42,   42,   51,   51,   51,   51,   60,   60,   42,
-
-       42,   42,   42,    0,    0,    0,    0,    0,   43,   43,
+       43,    0,    0,    0,    0,    0,   43,   43,   43,   43,
+       43,   43,   43,   43,   53,   53,   53,    0,   37,   53,
+       53,    0,   24,    0,   29,   47,    0,   22,   72,   72,
+
+       62,    0,   62,   42,   42,   42,   42,   53,   53,   53,
+       53,   62,   62,   42,   42,   42,   42,    0,    0,    0,
+        0,    0,   43,   43,   43,   43,   43,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,   50,    0,
-       32,   51,   51,   51,    0,   70,   70,   20,   70,   23,
-       22,    0,    0,    0,    0,    0,   22,    0,    0,    0,
-       42,   42,   42,   42,   51,   51,   51,   60,   60,   60,
-        0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   52,    0,   32,   53,   53,   53,    0,   72,
+       72,   20,   72,   23,   22,    0,    0,    0,    0,    0,
+       22,    0,    0,    0,   42,   42,   42,   42,   53,   53,
+       53,   62,   62,   62,    0,    0,    0,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,    0,   30,   51,   51,   23,   70,    0,   22,    0,
-        0,    0,   51,   51,   60,   60,   60,   60,   60,    0,
-
-        0,    0,    0,    0,   43,   43,   43,   43,   43,   43,
-       43,   43,    0,   33,   51,   70,    0,    0,    0,    0,
-        0,   51,   60,   60,   60,   43,   43,   43,   43,   43,
-       43,    0,   31,   70,   70,   21,    0,    0,    0,   60,
-       60,   60,   60,   60,   43,   43,   43,   43,   43,    0,
-        0,    0,    0,    0,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,    0
+       43,   43,   43,   43,   43,    0,   30,   53,   53,   23,
+
+       72,    0,   22,    0,    0,    0,   53,   53,   62,   62,
+       62,   62,   62,    0,    0,    0,    0,    0,   43,   43,
+       43,   43,   43,   43,   43,   43,    0,   33,   53,   72,
+        0,    0,    0,    0,    0,   53,   62,   62,   62,   43,
+       43,   43,   43,   43,   43,    0,   31,   72,   72,   21,
+        0,    0,    0,   62,   62,   62,   62,   62,   43,   43,
+       43,   43,   43,    0,    0,    0,    0,    0,   41,   41,
+       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
+        0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -451,231 +453,235 @@ static yyconst int yy_meta[72] =
        21
     } ;
 
-static yyconst short int yy_base[985] =
+static yyconst short int yy_base[999] =
     {   0,
-        0,   70,   72,   80,   87,  126,  178,  248,  156,  200,
-      132,  140,  319,    0, 4881, 4827, 4873, 5615, 4868, 5615,
-      388,   95, 5615, 5615, 4816, 5615,  142,  400,  198,  155,
-     4842, 5615, 5615,  460, 4825,   37,   40,  516,   62, 4834,
-     4820,   49, 4818, 4822,   58,  575,  590,  125,  223,  613,
-       33,   45, 4788,   38, 4785,  121, 4839, 4846,  434, 4804,
-     4816,  136,    0, 5615, 4840, 5615,    0,  615,  674,  152,
-        0, 4782, 5615,  104, 5615,  112, 5615,  161, 4781,   73,
-      173, 5615,  189,  204,  651,  705,  749,  256,  245,  807,
-      857, 4789,   57,  157,  913, 4783, 4793, 4779, 4772, 4737,
-
-      960,    0,  128, 4713,  645, 4761, 4756, 4756, 5615,  266,
-      541,  614, 4737,  617,  718, 4692,  843,  947, 4690,  984,
-      997, 1035, 4716, 4727,  572,  719,  276, 4714,   96, 1080,
-     1125, 4699, 4704, 4690, 4683, 4686, 4682,  406, 4673, 4680,
-     4677, 4652, 4656, 4623,  391, 5615,  133,  171,  992, 4596,
-     4599, 4590, 4584, 4585,  397,  349,  385,  395,  383,  339,
-      154, 4647,  731, 4643, 1034, 4587, 1160,  547,    0, 4633,
-      256, 5615, 5615,  941,  267,    0, 4581,  654, 5615, 5615,
-     4580,  672, 4572, 4619,  401,  595,  296, 4617,  663,  676,
-     1187, 4563, 1193,    0, 1222, 1250, 1021, 1055, 1289, 4599,
-
-     1100, 1219,  840, 1339, 1395, 4572,    0, 4575, 4568, 4571,
-     4567,  963, 4550, 4548, 4535, 4529, 4581, 4580, 1249, 1264,
-     1442, 1274, 1065, 1482, 4561, 4548, 1527,  528, 1573, 1618,
-     1663, 4537, 4527, 4528, 4511, 4524, 4512, 4519, 4511, 4518,
-     4516, 4510, 4497, 4493, 4507, 4478, 4477, 4472, 1108,  384,
-     4438, 4443, 4433, 4435, 4441,  541,  586, 4444,  499,  342,
-      500, 1206,  633, 4410, 4397, 4396, 1710, 1720, 4395, 1765,
-        0, 4376, 4367, 4352, 4365, 4353, 4360, 4359, 4371, 4370,
-     4365, 4352, 4363,  447, 4329, 4392, 1810,  214,    0,    0,
-     1108,  529, 4368, 4367, 1848,  411, 4366, 4365,  702, 1309,
-
-     1861, 1415, 1157, 1907, 1954, 4364,  620, 4346, 4341,  641,
-      681, 4353, 4346, 4338, 4335, 4326, 4324, 4320, 4323,    0,
-     4326, 4324,    0,  832,  975,  668,  942, 4308, 4310, 4294,
-     4308, 4294,  564,  532, 1081,  419,  949, 1452, 4347, 4346,
-     4345, 1321, 1964, 2009,  776, 4315,  665,  820, 4323, 4316,
-     4318, 4315, 4306, 4303, 4299, 4294, 1013, 4311, 4317, 4274,
-     2056, 2068, 2080, 4306, 4305, 2090, 4305, 4272, 4195, 4183,
-      828, 1462, 1183, 1502, 1187, 2103,    0, 1549, 2150, 1593,
-     1425, 2196, 2243,  884, 5615, 4147, 4141, 4121, 4103,  965,
-     5615, 4107, 4087, 4061, 4063, 4033, 4033, 4020,    0, 4003,
-
-     4003,  635,  709,  704,  988,  896, 3980, 3962, 3963, 1150,
-      996,  982, 1152, 4017, 4006, 2255, 2265, 3981, 3945, 3941,
-     3923, 3904, 3888, 3867, 3863, 3856, 3867, 3867, 3834, 3856,
-     3836, 3837, 3838, 3786, 2310,  610, 2350, 2362, 1605, 3805,
-     3802, 3784, 3777, 2372, 1164, 3777, 3774, 2419, 1178, 1631,
-     1640, 1683, 1645, 2431,    0, 1742, 2478, 1785, 1472, 2524,
-     2571, 2596, 1509, 1274, 1062, 1227, 1529, 1810, 1341, 1506,
-     1723, 1366, 1421, 1665, 3728, 3720, 3688, 3664,  648, 3679,
-     3644,  947, 1192,  592,  781, 1821, 3669, 3649, 3624, 1560,
-     1422, 3581, 3565, 1507, 3557, 1173, 1508, 3541, 3548, 1666,
-
-     1688,    0,    0,    0,    0, 3519, 2653, 1881, 1753, 3534,
-     3514, 3490, 1927, 2693, 1984, 1797, 2738, 2785, 2029, 3501,
-     3486, 3477, 1838, 1646, 1834, 1836, 1943, 2123, 2045, 2797,
-        0, 2172, 2844, 2216, 1891, 2890, 2937, 1765, 5615, 2962,
-     1214,  992, 1887, 5615,  994, 1125, 2156, 1888, 5615, 1631,
-     2209, 1933, 5615, 1934, 5615, 3382, 1101, 3343, 3303, 1216,
-     2238,  708, 1283, 3357, 3334, 3019, 3297, 3291, 3034, 3238,
-     3207, 1714,  786, 3184, 3090, 1208, 3129,    0, 1931, 3210,
-     3158, 2286, 2069, 2320, 2332, 3169,    0, 2333, 3182, 2392,
-     1994, 3227, 3274, 3166, 3160, 3286, 2408, 2443, 2445, 2453,
-
-     3124, 2458, 3298,    0, 2500, 3345, 2544, 2133, 3392, 3417,
-      893, 1253, 2129, 1621, 1014, 2130, 2175, 3079, 2999, 2978,
-     1598, 1262, 2547, 2993, 2663, 2952, 2951, 2902, 2297, 2869,
-     2825, 3487, 2828, 2797, 1990, 1991,    0, 3545, 2673, 2713,
-     1512, 2766, 2774, 2770, 3585, 2739, 2334, 2351, 2758, 2456,
-     3597,    0, 2819, 3610, 2864, 2511, 3655, 3702, 2910, 2726,
-     2686, 2610, 2725, 2459, 2774, 2926, 1337, 1648, 3714,    0,
-     2876, 1448, 2197, 1524, 2035, 5615, 1661, 1667, 2036, 5615,
-     2223, 5615, 2553, 2396, 1790, 2358, 2453, 2845, 3114, 2587,
-     2538, 3726, 2685, 2268, 2576, 2551, 2479, 3736, 1075, 3776,
-
-        0, 2033, 2143, 3105, 2466, 2412, 2406, 3117, 2373, 2331,
-     2560, 2694, 3139, 2820, 3816,    0, 3152, 3829, 3202, 3212,
-     3874, 3921, 2304, 2235, 3932, 3150, 2228, 1976, 2014, 2481,
-     5615, 2822, 1666, 1987, 1949, 1958, 2200, 5615, 2127, 1881,
-     3272, 3332, 3337, 3342, 1902, 2962, 1835, 3417, 3247, 1847,
-     1833, 1805, 3476, 1797, 2764, 2917, 3208, 3944, 3956, 3968,
-     1780, 1752, 3980, 1722, 1691, 3034, 3183, 3555, 3275, 3992,
-        0, 3567, 4005, 3630, 3640, 4052, 1632, 1612, 1605, 3676,
-     1587, 2765, 5615, 2916, 2195, 5615, 2290, 3682, 3746, 1522,
-     1443, 4064, 2942, 3324, 4076, 2348, 4088, 4100, 3758, 3796,
-
-     1435, 1408, 1302, 3766, 1199, 1191, 3326, 1156, 1094, 4112,
-        0, 2453, 3061, 5615, 3325, 2353, 3849, 1031,  973,  927,
-     3788, 3115, 4124, 4136, 4148, 3894, 4025, 4158,  777,    0,
-      556, 3209, 5615,  542, 2416, 5615,  455,  382, 4170, 4182,
-     2733, 4194, 4206, 3906, 5615, 4216, 4226, 3806, 5615, 4236,
-      286,  194,  187, 3861, 4246, 4284, 4322, 4256, 4266, 4294,
-       53, 4360, 4038, 5615, 4304, 4276, 5615, 4413, 4434, 4455,
-     4476, 4497, 4518, 4539, 4560, 4581, 4590, 2187, 4610, 4631,
-     2551, 4652, 4673, 4694, 4715, 4736, 4757, 4778, 4799, 2235,
-     4820, 4829, 4837, 4846, 4866, 4887, 4908, 2822, 4929, 4950,
-
-     4971, 4992, 5013, 5022, 5041, 5050, 5059, 2774, 2925, 5067,
-     5075, 5083, 5092, 5100, 5107, 5115, 5123, 5132, 5142, 2926,
-     3129, 5150, 5158, 5166, 3164, 3168, 5175, 5185, 5205, 3262,
-     5214, 5222, 3268, 5231, 5241, 5261, 2512, 2592, 5270, 5282,
-     5291, 5301, 3370, 3371, 5310, 5320, 5329, 5349, 2692, 5358,
-     5370, 3375, 3376, 5379, 5389, 3380, 5398, 5408, 5428, 5449,
-     5470, 3381, 3385, 5490, 3386, 5497, 5507, 2709, 2813, 5516,
-     3579, 5536, 3488, 3583, 5545, 5555, 3584, 3626, 5563, 5573,
-     5593, 4335, 3651, 3671
+        0,   70,   72,   80,  126,  131,  183,  253,  161,  205,
+       86,   94,  324,    0, 4976, 4918, 4967, 5585, 4964, 5585,
+      393,   87, 5585, 5585, 4914, 5585,  172,  405,  174,  185,
+     4940, 5585, 5585,  465, 4925,   43,   37,  521,   62, 4934,
+     4913,   76, 4912, 4916,   71,  580,  595,   83,  228,  618,
+       39,   91, 4881,   30, 4878,   73, 4933, 4943,  439, 4901,
+     4900, 4895,   89,    0, 5585, 4919, 5585,    0,  620,  679,
+      108,    0, 4861, 5585,  117, 5585,  129, 5585,  159, 4855,
+      106,  122, 5585,  166,  209,  656,  710,  754,  261,  203,
+      812,  862, 4865,  223,  186,  918, 4861, 4872, 4858, 4866,
+
+     4858,  965,    0,   84, 4834,  650, 4882, 4877, 4877, 5585,
+      271,  546,  619, 4859,  622,  723, 4818,  848,  952, 4813,
+      989, 1002, 1040, 4837, 4846,  577,  724,  250, 4833,  249,
+     1085, 1130, 4811, 4816, 4805, 4801, 4803, 4800,  994, 4789,
+     4796, 4793, 4784, 4785, 4781,  396, 5585,  178,  125, 1000,
+     4759, 4763, 4751, 4746, 4747,  231,  354,  386,  159,  379,
+      245,  439, 4812,  736, 4803, 1038, 4751, 1165, 1042,  247,
+        0, 4795,  299, 5585, 5585,  946,  399,    0, 4743,  659,
+     5585, 5585, 4740,  401, 4739, 4767,  403,  404,  431, 4739,
+      627,  668, 1192, 4683, 1198,    0, 1227, 1255, 1211, 1105,
+
+     1294, 4719, 1224, 1254,  845, 1344, 1400, 4690,    0, 4695,
+     4680, 4679, 4675, 1246, 4666, 4664, 4655, 4651, 4705, 4697,
+     1277, 1314, 1447, 1420,  990, 1487, 4680, 4666, 1532,  427,
+     1578, 1623,    0, 4658, 4649, 4650, 4633, 4629, 4616, 4594,
+     4588, 4598, 4597, 4591,  438, 4578, 4570, 4581, 4576, 4573,
+     4570,  669,  160, 4537, 4535, 4525, 4523, 4527,  546,  397,
+     4528,  504,  418,  406, 1471,  505, 4580, 4565, 4564, 1670,
+     1680, 4563, 1725,    0, 4543, 4526, 4511, 4520, 4506, 4511,
+     4510, 4515, 4514, 4505, 4491, 4502,  687, 4468, 4531, 1770,
+      534,    0,    0, 1027,  246, 4507, 4506, 1808,  633, 4498,
+
+     4492,  653, 1468, 1821, 1507, 1115, 1867, 1914, 4490,  603,
+     4471, 4466,  646,  665, 4478, 4471, 4446, 4443, 4430, 4427,
+     4438, 4438, 4421, 4424,    0, 4427, 4339,    0,  837,  551,
+      574,  654, 4323, 4325, 4309, 4323, 4309,  763,  506, 1041,
+      424,  677, 1552, 4362, 4361, 4360, 1162, 1924, 1969,  781,
+     4330,  691,  889, 4338, 4331, 4334, 4331, 4322, 4320, 4316,
+     4323,  830, 4340, 4346, 4303, 2016, 2028, 2040, 4335, 4334,
+     2050, 4334, 4332, 4331, 4330,  977, 1598, 1054, 1643, 1064,
+     2063,    0, 1702, 2110, 1745, 1324, 2156, 2203,  970, 5585,
+     4294, 4299, 4300, 4293, 1010, 5585, 4308, 4299, 4284, 4297,
+
+     4290, 4301, 4287, 4298, 4299,    0, 4282, 4282,  640,  786,
+     1034,  986,  709, 4275, 4257, 4237,  641,  520, 1028,  901,
+     4291, 4289, 2215, 2225, 4276, 4251, 4226, 4143, 4147, 4127,
+     4101, 4083, 4065, 4065, 4054, 4026, 4043, 4029, 4019, 4009,
+     3961, 2270, 1000, 2310, 2322, 1655, 3986, 3954, 3941, 3929,
+     2332, 1142, 3929, 3917, 2379, 1169, 1188, 1192, 1780, 1195,
+     2391,    0, 1792, 2438, 1841, 1430, 2484, 2531, 2556, 1259,
+     1450, 1111, 1112, 1224, 1868, 1196, 1452, 1473, 1232, 1535,
+     1320, 1321, 1427, 3843, 3835, 3828, 3790,  663, 3806, 3753,
+      394, 1843,  960,  796, 1896, 3790, 3777, 3774, 1565, 1346,
+
+     3707, 3697, 1371, 3688, 1046, 1512, 3680, 3685, 1514, 1533,
+        0,    0,    0,    0, 3660, 2613, 1944, 1608, 3651, 3634,
+     3626, 1989, 2653, 2083, 1713, 2698, 2745, 2130, 3629, 3610,
+     3603, 1757, 2005, 2168, 2170, 2178, 2245, 2183, 2757,    0,
+     2282, 2804, 2293, 1954, 2850, 2897, 1534, 5585, 2922,  907,
+     1128, 1604, 5585, 1178, 1265, 1857, 1605, 5585, 1501, 2157,
+     1632, 1734, 1683, 5585, 1725, 5585, 3561, 1235, 3534, 3502,
+     1156, 2147, 1426, 1236, 3545, 3520, 2979, 3452, 3432, 2994,
+     3433, 3412, 1463,  791, 3381, 3050, 1305, 3089,    0, 1792,
+     3378, 3377, 2352, 2029, 2411, 2204, 3129,    0, 2460, 3142,
+
+     2504, 2093, 3187, 3234, 3375, 3345, 3246, 2368, 2520, 2625,
+     2627, 3319, 2629, 3258,    0, 2642, 3305, 2673, 2140, 3352,
+     3377, 1433,  898, 1927, 1823, 1603, 2089, 2090, 3263, 2270,
+     3256, 3242, 3216, 1817, 1671, 2414, 3171, 2718, 3200, 3165,
+     3070, 2256, 3030, 2974, 3447, 2881, 2850, 1847, 1848,    0,
+     3505, 2777, 2824, 1736, 2852, 2844, 2836, 3545, 2805, 2311,
+     2461, 2870, 2638, 3557,    0, 3062, 3570, 3073, 2629, 3615,
+     3662, 3099, 2797, 2738, 2734, 2685, 2639, 2734, 2886,  985,
+     1342, 3674,    0, 2789, 1822, 2439, 1861, 1993, 5585, 1379,
+     1860, 1995, 5585, 1996, 5585, 2695, 2670, 2356, 1819, 1478,
+
+     2252, 2849, 3125, 2686, 2570, 3686, 2185, 2252, 2464, 2511,
+     3100, 3696, 1963, 3736,    0, 2356, 1964, 3116, 2554, 2547,
+     2498, 3165, 2459, 2419, 2994, 3073, 3171, 3143, 3776,    0,
+     3209, 3789, 3278, 3220, 3834, 3881, 2424, 2371, 3892, 3316,
+     2264, 1936, 2204, 2418, 5585, 2534, 2115, 2159, 2136, 2160,
+     2249, 5585, 2416, 2084, 3302, 3352, 3532, 3544, 2104, 2922,
+     2037, 3720, 3327, 2009, 1982, 1938, 3436, 1889, 2536, 2830,
+     2831, 3904, 3916, 3928, 1855, 1834, 3940, 1699, 1681, 3235,
+     3327, 3590, 3353, 3952,    0, 3637, 3965, 3717, 3523, 4012,
+     1636, 1617, 1590, 3536, 1565, 2724, 5585, 2850, 2273, 5585,
+
+     2304, 3746, 3756, 1519, 1448, 4024, 2725, 3285, 4036, 2477,
+     4048, 4060, 3648, 3809, 1307, 1277, 1243, 3602, 1204, 1198,
+     3506, 1161, 1125, 4072,    0, 2509, 2901, 5585, 3284, 2435,
+     3854, 1079, 1071, 1030, 3821, 2902, 4084, 4096, 4108, 3985,
+     4118, 4128, 1005,    0,  768, 3021, 5585,  730, 2480, 5585,
+      596,  576, 4140, 4152, 2693, 4164, 4176, 3866, 5585, 4186,
+     4196, 3766, 5585, 4206,  456,  289,  134, 3997, 4216, 4254,
+     4292, 4226, 4236, 4264,   28, 4330, 4246, 5585, 4302, 4274,
+     5585, 4383, 4404, 4425, 4446, 4467, 4488, 4509, 4530, 4551,
+     4560, 2005, 4580, 4601, 2661, 4622, 4643, 4664, 4685, 4706,
+
+     4727, 4748, 4769, 2479, 4790, 4799, 4807, 4816, 4836, 4857,
+     4878, 2765, 4899, 4920, 4941, 4962, 4983, 4992, 5011, 5020,
+     5029, 2348, 2734, 5037, 5045, 5053, 5062, 5070, 5077, 5085,
+     5093, 5102, 5112, 2885, 2913, 5120, 5128, 5136, 3073, 3203,
+     5145, 5155, 5175, 3220, 5184, 5192, 3221, 5201, 5211, 5231,
+     2552, 2994, 5240, 5252, 5261, 5271, 3369, 3370, 5280, 5290,
+     5299, 5319, 3088, 5328, 5340, 3448, 3520, 5349, 5359, 3534,
+     5368, 5378, 5398, 5419, 5440, 3631, 3648, 5460, 3732, 5467,
+     5477, 3158, 3373, 5486, 3115, 5506, 3805, 3849, 5515, 5525,
+     3850, 3980, 5533, 5543, 5563, 4284, 3981, 4285
+
     } ;
 
-static yyconst short int yy_def[985] =
+static yyconst short int yy_def[999] =
     {   0,
-      867,    1,    1,    1,  868,  868,  869,  869,  870,  870,
-      871,  871,  867,   13,  867,  872,  867,  867,  867,  867,
-      873,  874,  867,  867,  875,  867,  876,  872,   28,   28,
-      877,  867,  867,  867,   34,   34,   34,   34,   38,   38,
-       38,   38,   38,   38,   38,  872,   28,  872,  867,  873,
-       34,   34,   38,   38,   38,  867,  878,  867,  879,   38,
-       38,  872,  880,  867,  880,  867,  880,  867,  873,  867,
-      881,  882,  867,  882,  867,  882,  867,  883,  884,  884,
-      884,  867,  867,  885,  886,  887,  867,   87,   87,   87,
-      867,   91,   91,   91,   91,   95,   95,   95,   95,   95,
-
-       87,   90,   90,  872,  872,  867,  867,  888,  867,  889,
-      867,  874,  890,  885,  874,  875,  875,  876,  891,  872,
-      872,   28,  892,  122,  122,  122,  122,  893,  894,   38,
-      130,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  872,  867,  872,  872,  867,  867,
-      867,  867,  867,  867,  888,  872,  122,  872,  872,  872,
-      867,  867,  867,  867,  895,  896,  872,  872,  897,  897,
-      867,  867,  867,  889,  867,  898,  899,  899,  867,  867,
-      899,  899,  900,  867,  900,  900,  867,  867,  885,  885,
-      885,  901,  902,   90,  901,  903,  867,  867,   87,  199,
-
-      199,  199,  199,  867,  204,  205,  904,  205,  205,  205,
-      205,  205,  205,  205,   90,   90,  888,  905,  867,  867,
-      872,  221,  221,  122,  224,  906,  867,  907,  867,  131,
-      230,  231,  231,  231,  231,  231,  231,  231,  231,  231,
-      231,  231,  231,  231,  231,  231,  231,  231,  872,  872,
-      867,  867,  867,  867,  867,  888,  872,  224,  872,  872,
-      872,  867,  872,  867,  908,  909,  867,   90,  268,  204,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,   90,   90,  905,  872,  872,  221,  221,
-      221,  872,  910,  911,  911,  295,  912,  911,  913,  229,
-
-      867,  301,  301,  867,  301,  231,  231,  231,  231,  231,
-      231,  231,  231,  231,  231,  231,  231,  231,  231,  231,
-      231,  231,  231,  872,  872,  872,  872,  867,  867,  867,
-      867,  867,  888,  872,  872,  872,  872,  867,  867,  908,
-      908,  867,  268,  204,  205,  205,  914,  205,  205,  205,
-      205,  205,  205,  205,  205,  205,   90,   90,   90,   90,
-      221,  221,  221,  867,  915,  915,  366,  915,  916,  917,
-      918,  867,  919,  304,  919,  867,  376,  919,  867,  379,
-      379,  867,  379,  867,  867,  231,  231,  231,  231,  867,
-      867,  231,  231,  231,  231,  231,  231,  231,  231,  231,
-
-      231,  872,  872,  872,  872,  872,  867,  867,  867,  888,
-      872,  872,  872,  920,  921,  867,   90,  344,  205,  914,
-      914,  205,  205,  205,  205,  205,  205,  205,  205,   90,
-       90,   90,   90,   90,  872,  872,  221,  221,  872,  922,
-      922,  923,  924,  867,  867,  925,  926,  867,  927,  927,
-      928,  382,  928,  867,  454,  928,  867,  457,  457,  867,
-      457,  867,  462,  462,  462,  462,  462,  462,  462,  462,
-      462,  462,  462,  462,  872,  872,  872,  872,  872,  867,
-      867,  929,  872,  872,  872,  867,  867,  930,  930,  867,
-      205,  914,  914,  205,  205,  914,  205,  205,  205,  205,
-
-      205,   90,   90,   90,   90,   90,  872,  507,  507,  867,
-      931,  932,  444,  867,  514,  514,  867,  514,  867,  867,
-      933,  933,  867,  867,  934,  934,  935,  460,  935,  867,
-      530,  935,  867,  533,  533,  867,  533,  867,  867,  867,
-      540,  540,  867,  867,  540,  540,  540,  867,  867,  540,
-      540,  867,  867,  867,  867,  540,  872,  867,  867,  936,
-      872,  872,  872,  937,  938,  867,  939,  939,  867,  939,
-      939,  569,  569,  940,  872,  872,  872,  577,  577,  867,
-      941,  867,  942,  517,  942,  942,  586,  942,  867,  589,
-      589,  867,  589,  943,  944,  867,  867,  945,  945,  946,
-
-      947,  946,  867,  603,  946,  867,  606,  606,  606,  867,
-      610,  610,  610,  610,  610,  610,  610,  872,  867,  867,
-      948,  872,  872,  872,  867,  867,  949,  949,  867,  950,
-      950,  867,  950,  950,  632,  632,  951,  872,  638,  638,
-      638,  867,  952,  953,  867,  954,  954,  955,  592,  955,
-      955,  651,  955,  867,  654,  654,  867,  654,  867,  867,
-      956,  956,  867,  867,  957,  957,  958,  958,  958,  669,
-      958,  610,  610,  610,  867,  867,  610,  610,  867,  867,
-      867,  867,  867,  867,  959,  948,  872,  960,  961,  962,
-      963,  867,  962,  964,  964,  964,  964,  872,  872,  872,
-
-      700,  700,  872,  867,  867,  965,  965,  867,  867,  966,
-      966,  967,  657,  967,  967,  715,  967,  867,  718,  718,
-      867,  718,  968,  969,  867,  867,  970,  970,  610,  867,
-      867,  610,  610,  610,  867,  959,  959,  867,  948,  872,
-      960,  960,  960,  960,  971,  960,  972,  972,  867,  867,
-      962,  962,  867,  867,  964,  964,  964,  700,  700,  700,
-      973,  974,  867,  867,  975,  975,  976,  721,  976,  976,
-      770,  976,  867,  773,  773,  773,  867,  968,  968,  867,
-      867,  867,  867,  610,  610,  867,  948,  867,  867,  977,
-      978,  867,  964,  964,  700,  872,  700,  700,  872,  867,
-
-      867,  973,  973,  867,  867,  979,  979,  980,  980,  980,
-      810,  810,  867,  867,  610,  981,  867,  867,  977,  977,
-      867,  964,  700,  700,  700,  867,  867,  867,  867,  982,
-      982,  867,  867,  981,  981,  867,  983,  984,  867,  700,
-      872,  700,  700,  872,  867,  867,  867,  867,  867,  867,
-      867,  983,  983,  867,  872,  872,  872,  867,  867,  867,
-      872,  872,  872,  867,  867,  867,    0,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867
+      881,    1,    1,    1,  882,  882,  883,  883,  884,  884,
+      885,  885,  881,   13,  881,  886,  881,  881,  881,  881,
+      887,  888,  881,  881,  889,  881,  890,  886,   28,   28,
+      891,  881,  881,  881,   34,   34,   34,   34,   38,   38,
+       38,   38,   38,   38,   38,  886,   28,  886,  881,  887,
+       34,   34,   38,   38,   38,  881,  892,  881,  893,   38,
+       38,   38,  886,  894,  881,  894,  881,  894,  881,  887,
+      881,  895,  896,  881,  896,  881,  896,  881,  897,  898,
+      898,  898,  881,  881,  899,  900,  901,  881,   88,   88,
+       88,  881,   92,   92,   92,   92,   96,   96,   96,   96,
+
+       96,   88,   91,   91,  886,  886,  881,  881,  902,  881,
+      903,  881,  888,  904,  899,  888,  889,  889,  890,  905,
+      886,  886,   28,  906,  123,  123,  123,  123,  907,  908,
+       38,  131,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  886,  881,  886,  886,  881,
+      881,  881,  881,  881,  881,  902,  886,  123,  886,  886,
+      886,  881,  881,  881,  881,  909,  910,  886,  132,  886,
+      911,  911,  881,  881,  881,  903,  881,  912,  913,  913,
+      881,  881,  913,  913,  914,  881,  914,  914,  881,  881,
+      899,  899,  899,  915,  916,   91,  915,  917,  881,  881,
+
+       88,  201,  201,  201,  201,  881,  206,  207,  918,  207,
+      207,  207,  207,  207,  207,  207,   91,   91,  902,  919,
+      881,  881,  886,  223,  223,  123,  226,  920,  881,  921,
+      881,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  886,  886,  881,  881,  881,  881,  881,  902,  886,
+      226,  886,  886,  886,  881,  886,  881,  922,  923,  881,
+       91,  271,  206,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,   91,   91,  919,  886,
+      886,  223,  223,  223,  886,  924,  925,  925,  298,  926,
+
+      925,  927,  231,  881,  304,  304,  881,  304,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  132,  886,  886,
+      886,  886,  881,  881,  881,  881,  881,  902,  886,  886,
+      886,  886,  881,  881,  922,  922,  881,  271,  206,  207,
+      207,  928,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,   91,   91,   91,   91,  223,  223,  223,  881,  929,
+      929,  371,  929,  930,  931,  932,  881,  933,  307,  933,
+      881,  381,  933,  881,  384,  384,  881,  384,  881,  881,
+      132,  132,  132,  132,  881,  881,  132,  132,  132,  132,
+
+      132,  132,  132,  132,  132,  132,  132,  132,  886,  886,
+      886,  886,  886,  881,  881,  881,  902,  886,  886,  886,
+      934,  935,  881,   91,  349,  207,  928,  928,  207,  207,
+      207,  207,  207,  207,  207,  207,   91,   91,   91,   91,
+       91,  886,  886,  223,  223,  886,  936,  936,  937,  938,
+      881,  881,  939,  940,  881,  941,  941,  942,  387,  942,
+      881,  461,  942,  881,  464,  464,  881,  464,  881,  469,
+      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
+      469,  469,  469,  886,  886,  886,  886,  886,  881,  881,
+      943,  886,  886,  886,  881,  881,  944,  944,  881,  207,
+
+      928,  928,  207,  207,  928,  207,  207,  207,  207,  207,
+       91,   91,   91,   91,   91,  886,  516,  516,  881,  945,
+      946,  451,  881,  523,  523,  881,  523,  881,  881,  947,
+      947,  881,  881,  948,  948,  949,  467,  949,  881,  539,
+      949,  881,  542,  542,  881,  542,  881,  881,  881,  549,
+      549,  881,  881,  549,  549,  549,  881,  881,  549,  549,
+      549,  549,  881,  881,  881,  881,  549,  886,  881,  881,
+      950,  886,  886,  886,  951,  952,  881,  953,  953,  881,
+      953,  953,  580,  580,  954,  886,  886,  886,  588,  588,
+      881,  955,  881,  956,  526,  956,  956,  597,  956,  881,
+
+      600,  600,  881,  600,  957,  958,  881,  881,  959,  959,
+      960,  961,  960,  881,  614,  960,  881,  617,  617,  617,
+      881,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      886,  881,  881,  962,  886,  886,  886,  881,  881,  963,
+      963,  881,  964,  964,  881,  964,  964,  645,  645,  965,
+      886,  651,  651,  651,  881,  966,  967,  881,  968,  968,
+      969,  603,  969,  969,  664,  969,  881,  667,  667,  881,
+      667,  881,  881,  970,  970,  881,  881,  971,  971,  972,
+      972,  972,  682,  972,  621,  621,  621,  881,  881,  621,
+      621,  881,  881,  881,  881,  621,  881,  881,  973,  962,
+
+      886,  974,  975,  976,  977,  881,  976,  978,  978,  978,
+      978,  886,  886,  886,  714,  714,  886,  881,  881,  979,
+      979,  881,  881,  980,  980,  981,  670,  981,  981,  729,
+      981,  881,  732,  732,  881,  732,  982,  983,  881,  881,
+      984,  984,  621,  881,  881,  621,  621,  621,  881,  973,
+      973,  881,  962,  886,  974,  974,  974,  974,  985,  974,
+      986,  986,  881,  881,  976,  976,  881,  881,  978,  978,
+      978,  714,  714,  714,  987,  988,  881,  881,  989,  989,
+      990,  735,  990,  990,  784,  990,  881,  787,  787,  787,
+      881,  982,  982,  881,  881,  881,  881,  621,  621,  881,
+
+      962,  881,  881,  991,  992,  881,  978,  978,  714,  886,
+      714,  714,  886,  881,  881,  987,  987,  881,  881,  993,
+      993,  994,  994,  994,  824,  824,  881,  881,  621,  995,
+      881,  881,  991,  991,  881,  978,  714,  714,  714,  881,
+      881,  881,  881,  996,  996,  881,  881,  995,  995,  881,
+      997,  998,  881,  714,  886,  714,  714,  886,  881,  881,
+      881,  881,  881,  881,  881,  997,  997,  881,  886,  886,
+      886,  881,  881,  881,  886,  886,  886,  881,  881,  881,
+        0,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881
+
     } ;
 
-static yyconst short int yy_nxt[5687] =
+static yyconst short int yy_nxt[5657] =
     {   0,
        16,   17,   18,   19,   20,   21,   22,   23,   24,   16,
        25,   26,   16,   16,   27,   28,   29,   30,   28,   28,
@@ -684,627 +690,624 @@ static yyconst short int yy_nxt[5687] =
        40,   41,   38,   42,   43,   44,   45,   38,   38,   38,
        38,   38,   46,   16,   47,   47,   47,   47,   47,   47,
        16,   16,   16,   16,   16,   16,   16,   16,   48,   16,
-       16,   49,  131,   56,  185,   50,  131,   57,  139,  131,
-      141,   56,  134,   58,  131,   57,   59,  133,   17,   64,
-       65,   58,   66,  140,   59,  143,  205,  156,   66,  135,
-
-      113,   51,   52,  157,  136,  105,   53,  208,  159,  144,
-      227,   60,   66,   67,   54,   61,   38,   55,   38,   60,
-      114,  229,  161,   61,   38,  184,   38,   17,   64,   65,
-      179,   66,  162,   80,   18,   81,   82,   66,  180,   68,
-       62,   80,   18,   81,   82,  119,  119,  115,   62,  119,
-      119,   66,   67,  175,  146,  161,  178,   17,   18,   19,
-       73,   69,  182,  146,  178,  162,   74,   75,   76,  119,
-      126,  126,  126,  126,  126,  127,  186,  105,   68,   17,
-       18,   19,   77,   69,   83,  105,  147,  249,  105,  215,
-      187,  188,   83,  183,  120,  148,  205,  147,  216,  209,
-
-      850,   17,   18,   19,   73,   69,  168,  850,   78,  113,
-       74,   75,   76,  125,  125,  125,  125,  125,  125,  125,
-      125,  125,  125,  105,  149,  184,   77,  287,  250,  190,
-       70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   71,   71,   71,   71,   71,   71,   17,
-       18,   19,   78,   69,  150,  151,  191,  175,  146,  152,
-      202,  202,  202,  202,  202,  203,  105,  153,  175,  146,
-      154,  201,  201,  201,  201,  201,  201,  201,  201,  201,
-      201,  111,  111,  111,  111,  111,  111,  111,  111,  111,
-      111,  225,  225,  225,  225,  225,  225,  187,  188,  850,
-
-       70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   71,   71,   71,   71,   71,   71,   33,
-       17,   18,   19,   33,   33,   84,   23,   24,   33,   85,
-       26,   33,   33,   86,   87,   88,   89,   87,   87,   87,
-       87,   87,   87,   87,   31,   90,   33,   33,   91,   92,
-       92,   92,   93,   94,   95,   95,   95,   95,   96,   97,
-       98,   95,   99,   95,  100,   95,   95,   95,   95,   95,
-       95,   70,   33,  101,  101,  101,  101,  101,  101,  102,
-      102,  102,  102,  102,  102,  102,  102,  103,  102,  102,
-      109,  105,  175,  146,  105,  850,  336,  261,  104,  109,
-
-      110,  105,  185,  111,  111,  111,  111,  111,  111,  111,
-      111,  111,  111,  121,  257,  122,  122,  122,  122,  122,
-      122,  122,  122,  122,  122,  123,  368,  368,  368,  124,
-      124,  124,  124,  124,  124,  105,  105,  166,  166,  237,
-      238,  166,  166,  105,  258,  239,  240,  105,  260,  241,
-      327,  242,  105,  184,  124,  124,  124,  124,  124,  124,
-      104,  166,  256,  259,  357,  358,  104,  359,  850,  104,
-      104,  105,  104,  104,  104,  130,  130,  130,  130,  130,
-      130,  130,  130,  130,  130,  123,  167,  334,  104,  130,
-      130,  130,  130,  130,  130,  131,  131,  131,  131,  132,
-
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  105,  131,  124,  124,  124,  124,  124,  124,
-      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  867,  227,  109,  836,  131,  131,  131,  131,  131,
-      131,  105,  105,  300,  123,  131,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  109,  334,  334,  582,
-      104,  104,  104,  104,  104,  104,  145,  146,  104,  104,
-      104,  105,  104,  104,  105,  411,  104,  225,  225,  225,
-      225,  225,  225,  225,  225,  225,  225,  333,  186,  105,
-
-      104,  104,  104,  104,  263,  124,  124,  124,  124,  124,
-      124,  124,  124,  124,  124,  109,  171,  146,  172,  867,
-      173,  384,  113,  435,  172,  110,  173,  410,  111,  111,
-      111,  111,  111,  111,  111,  111,  111,  111,  105,  867,
-      173,  173,  867,  334,  105,  385,  104,  184,  104,  104,
-      104,  192,  104,  104,  475,  177,  104,  192,  177,  177,
-      192,  562,  105,  192,  192,  177,  115,  173,  867,  191,
-      104,  104,  104,  175,  146,  155,  109,  194,  388,  192,
-      177,  113,  390,  389,  405,  105,  174,  105,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  337,
-
-      105,  867,  420,  195,  192,  119,  391,  421,  119,  119,
-      557,  119,  119,  119,  119,  191,  227,  119,  119,  112,
-      105,  112,  112,  477,  178,  112,  112,  300,  191,  112,
-      476,  194,  119,  119,  225,  225,  225,  225,  225,  225,
-      225,  225,  225,  225,  112,  112,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  105,  197,  119,  194,
-      105,  105,  198,  194,  199,  199,  199,  199,  199,  199,
-      199,  199,  199,  199,  123,  194,  623,  384,  200,  200,
-      200,  200,  200,  200,  194,  194,  194,  194,  194,  194,
-      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
-
-      194,  385,  768,  200,  200,  200,  200,  200,  200,  194,
-      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
-      867,  390,  194,  194,  194,  194,  194,  194,  194,  194,
-      194,  194,  867,  105,  636,  205,  194,  194,  194,  194,
-      194,  194,  227,  563,  116,  391,  116,  116,  116,  402,
-      116,  116,  403,  300,  116,  269,  269,  269,  269,  269,
-      269,  194,  194,  194,  194,  194,  194,  194,  116,  116,
-      116,  194,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  123,  194,  105,  384,  204,  204,  204,  204,
-      204,  204,  205,  205,  205,  205,  206,  205,  205,  205,
-
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  385,
-      207,  200,  200,  200,  200,  200,  200,  194,  194,  194,
-      194,  194,  194,  194,  194,  194,  194,  194,  205,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  867,  673,
-      817,  131,  205,  205,  205,  205,  205,  205,  105,  109,
-      119,  119,  205,  479,  119,  119,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  390,  194,  194,  194,
-      194,  194,  194,  867,  119,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  118,  817,  104,  104,  118,
-      391,  104,  104,  149,  105,  118,  276,  277,  404,  120,
-
-      406,  105,  278,  279,  560,  478,  280,  413,  281,  118,
-      118,  104,  221,  222,  223,  221,  221,  221,  221,  221,
-      221,  221,  119,  150,  151,  483,  119,  105,  152,  131,
-      430,  131,  119,  431,  105,  612,  153,  166,  166,  154,
-      105,  166,  166,  613,  817,  484,  119,  119,  105,  105,
-      224,  224,  224,  224,  224,  224,  224,  224,  224,  224,
-      678,  166,  131,  867,  224,  224,  224,  224,  224,  224,
-      265,  266,  267,  265,  265,  265,  265,  265,  265,  265,
-      290,  290,  290,  290,  290,  291,  167,  867,  698,  224,
-      224,  224,  224,  224,  224,  230,  230,  230,  230,  230,
-
-      230,  230,  230,  230,  230,  123,  123,  867,  542,  230,
-      230,  230,  230,  230,  230,  269,  269,  269,  269,  269,
-      269,  269,  269,  269,  269,  324,  325,  105,  326,  104,
-      104,  104,  104,  105,  224,  224,  224,  224,  224,  224,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      867,  412,  109,  105,  131,  131,  131,  131,  131,  131,
-      105,  165,  131,  104,  104,  165,  614,  104,  104,  582,
-      618,  165,  377,  377,  377,  377,  377,  378,  227,  104,
-      104,  104,  104,  104,  104,  165,  165,  104,  189,  300,
-      189,  189,  227,  192,  189,  189,  372,  227,  189,  192,
-
-      867,  227,  192,  374,  105,  192,  192,  166,  374,  485,
-      570,  166,  374,  189,  189,  571,  768,  166,  109,  194,
-      482,  192,  575,  192,  713,  192,  192,  192,  543,  192,
-      192,  166,  166,  192,  269,  269,  269,  269,  269,  269,
-      269,  269,  269,  269,  105,  195,  192,  192,  192,  192,
-      119,  131,  544,  119,  119,  561,  119,  119,  119,  119,
-      105,  611,  119,  119,  220,  220,  220,  220,  220,  220,
-      220,  220,  220,  220,  621,  867,  194,  119,  119,  220,
-      220,  220,  220,  220,  220,  220,  220,  220,  220,  289,
-      289,  289,  289,  289,  289,  289,  289,  289,  289,  867,
-
-      674,  131,  197,  119,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  105,  800,  687,  541,  268,  268,
-      268,  268,  268,  268,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  338,  105,  339,  339,  339,  339,
-      339,  339,  548,  268,  268,  268,  268,  268,  268,  194,
-      372,  227,  624,  194,  270,  270,  270,  270,  270,  270,
-      270,  270,  270,  270,  123,  194,  549,  552,  270,  270,
-      270,  270,  270,  270,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  553,  207,  268,  268,  268,  268,  268,  268,  194,
-
-      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      867,  800,  554,  538,  205,  205,  205,  205,  205,  205,
-      376,  376,  376,  376,  376,  376,  376,  376,  376,  376,
-      455,  455,  455,  455,  455,  456,  555,  539,  800,  194,
-      194,  194,  194,  194,  194,  287,  817,  288,  288,  288,
-      288,  288,  288,  288,  288,  288,  288,  414,  415,  416,
-      414,  414,  414,  414,  414,  414,  414,  446,  447,  448,
-      446,  446,  446,  446,  446,  446,  446,  531,  531,  531,
-      531,  531,  532,  729,  105,  104,  131,  292,  292,  292,
-
-      292,  292,  292,  292,  292,  292,  292,  867,  543,  548,
-      867,  292,  292,  292,  292,  292,  292,  383,  383,  383,
-      383,  383,  383,  383,  383,  383,  383,  703,  703,  703,
-      867,  867,  544,  549,  867,  817,  292,  292,  292,  292,
-      292,  292,  294,  295,  296,  296,  296,  296,  296,  296,
-      296,  296,  297,  540,  867,  550,  298,  298,  298,  298,
-      298,  298,  372,  227,  450,  450,  450,  450,  450,  450,
-      732,  545,  131,  486,  374,  487,  487,  487,  487,  487,
-      487,  298,  298,  298,  298,  298,  298,  227,  301,  302,
-      303,  301,  301,  301,  301,  301,  301,  301,  304,  685,
-
-      109,  227,  305,  305,  305,  305,  305,  305,  454,  454,
-      454,  454,  454,  454,  454,  454,  454,  454,  435,  227,
-      436,  436,  436,  436,  436,  436,  227,  305,  305,  305,
-      305,  305,  305,  306,  306,  306,  306,  306,  306,  306,
-      306,  306,  306,  123,  372,  227,  227,  306,  306,  306,
-      306,  306,  306,  372,  227,  686,  374,  105,  867,  227,
-      227,  867,  227,  616,  677,  452,  867,  552,  131,  131,
-      452,  374,  292,  292,  292,  292,  292,  292,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  131,  867,  554,
-      867,  553,  131,  131,  131,  131,  131,  131,  461,  461,
-
-      461,  461,  461,  461,  461,  461,  461,  461,  733,  131,
-      734,  556,  784,  555,  131,  131,  713,  104,  104,  104,
-      104,  104,  104,  338,  867,  341,  341,  341,  341,  341,
-      342,  339,  339,  339,  339,  343,  343,  343,  343,  343,
-      343,  343,  343,  343,  343,  123,  635,  649,  867,  343,
-      343,  343,  343,  343,  343,  372,  227,  526,  526,  526,
-      526,  526,  526,  205,  551,  800,  538,  452,  578,  578,
-      578,  578,  578,  579,  343,  343,  343,  343,  343,  343,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      539,  737,  738,  800,  344,  344,  344,  344,  344,  344,
-
-      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
-      749,  867,  587,  587,  587,  587,  587,  588,  749,  343,
-      343,  343,  343,  343,  343,  361,  362,  363,  361,  361,
-      361,  361,  361,  361,  361,  867,  564,  565,  566,  564,
-      564,  564,  564,  564,  564,  564,  749,  546,  227,  372,
-      227,  519,  547,  520,  520,  520,  520,  520,  520,  452,
-      749,  452,  105,  366,  366,  367,  368,  368,  368,  368,
-      368,  368,  368,  297,  372,  227,  373,  373,  373,  373,
-      373,  373,  373,  373,  373,  373,  374,  748,  543,  548,
-      375,  375,  375,  375,  375,  375,  577,  577,  577,  577,
-
-      577,  577,  577,  577,  577,  577,  604,  604,  604,  604,
-      604,  605,  544,  549,  788,  375,  375,  375,  375,  375,
-      375,  227,  379,  380,  381,  379,  379,  379,  379,  379,
-      379,  379,  382,  105,  552,  554,  383,  383,  383,  383,
-      383,  383,  518,  518,  518,  518,  518,  518,  518,  518,
-      518,  518,  104,  104,  104,  104,  372,  227,  553,  555,
-      738,  383,  383,  383,  383,  383,  383,  867,  528,  375,
-      375,  375,  375,  375,  375,  375,  375,  375,  375,  417,
-      417,  417,  417,  417,  417,  417,  417,  417,  417,  372,
-      227,  679,  681,  417,  417,  417,  417,  417,  417,  586,
-
-      586,  586,  586,  586,  586,  586,  586,  586,  586,  652,
-      652,  652,  652,  652,  653,  680,  682,  786,  417,  417,
-      417,  417,  417,  417,  418,  418,  418,  418,  418,  418,
-      418,  418,  418,  418,  785,  131,  675,  679,  418,  418,
-      418,  418,  418,  418,  594,  595,  596,  594,  594,  594,
-      594,  594,  594,  594,  104,  104,  104,  104,  867,  227,
-      676,  680,  131,  417,  417,  417,  417,  417,  417,  435,
-      528,  436,  436,  436,  436,  436,  436,  436,  436,  436,
-      436,  435,  582,  437,  437,  437,  437,  437,  437,  437,
-      437,  437,  437,  435,  584,  438,  438,  438,  438,  438,
-
-      439,  436,  436,  436,  436,  441,  441,  441,  441,  441,
-      441,  441,  441,  441,  441,  297,  372,  227,  450,  450,
-      450,  450,  450,  450,  450,  450,  450,  450,  374,  109,
-      675,  679,  449,  449,  449,  449,  449,  449,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  670,  670,
-      670,  670,  670,  671,  676,  680,  698,  449,  449,  449,
-      449,  449,  449,  372,  227,  451,  451,  451,  451,  451,
-      451,  451,  451,  451,  451,  452,  681,  131,  131,  453,
-      453,  453,  453,  453,  453,  372,  227,  599,  599,  599,
-      599,  599,  599,  131,  787,  105,  111,  528,  730,  111,
-
-      682,  737,  738,  615,  453,  453,  453,  453,  453,  453,
-      227,  457,  458,  459,  457,  457,  457,  457,  457,  457,
-      457,  460,  731,  131,  681,  461,  461,  461,  461,  461,
-      461,  603,  603,  603,  603,  603,  603,  603,  603,  603,
-      603,  815,  227,  131,  220,  131,  131,  220,  682,  227,
-      461,  461,  461,  461,  461,  461,  867,  617,  453,  453,
-      453,  453,  453,  453,  453,  453,  453,  453,  486,  730,
-      489,  489,  489,  489,  489,  490,  487,  487,  487,  487,
-      417,  417,  417,  417,  417,  417,  417,  417,  417,  417,
-      105,  816,  109,  731,  417,  417,  417,  417,  417,  417,
-
-      622,  643,  644,  645,  643,  643,  643,  643,  643,  643,
-      643,  625,  626,  626,  626,  626,  626,  626,  227,  417,
-      417,  417,  417,  417,  417,  507,  508,  509,  507,  507,
-      507,  507,  507,  507,  507,  593,  593,  593,  593,  593,
-      593,  593,  593,  593,  593,  867,  582,  582,  647,  647,
-      647,  647,  647,  647,  835,  836,  649,  584,  584,  584,
-      109,  795,  105,  435,  582,  436,  436,  436,  436,  436,
-      436,  436,  436,  436,  436,  435,  649,  436,  436,  436,
-      436,  436,  436,  436,  436,  436,  436,  514,  515,  516,
-      514,  514,  514,  514,  514,  514,  514,  517,  584,  688,
-
-      105,  518,  518,  518,  518,  518,  518,  651,  651,  651,
-      651,  651,  651,  651,  651,  651,  651,  835,  836,  704,
-      739,  688,  227,  688,  688,  704,  518,  518,  518,  518,
-      518,  518,  519,  452,  522,  522,  522,  522,  522,  523,
-      520,  520,  520,  520,  372,  227,  526,  526,  526,  526,
-      526,  526,  526,  526,  526,  526,  452,  227,  372,  227,
-      525,  525,  525,  525,  525,  525,  372,  227,  528,  867,
-      528,  867,  227,  227,  830,  830,  830,  830,  601,  704,
-      867,  649,  730,  601,  528,  525,  525,  525,  525,  525,
-      525,  372,  227,  527,  527,  527,  527,  527,  527,  527,
-
-      527,  527,  527,  528,  867,  105,  731,  529,  529,  529,
-      529,  529,  529,  372,  227,  666,  666,  666,  666,  666,
-      666,  740,  757,  626,  626,  601,  716,  716,  716,  716,
-      716,  717,  529,  529,  529,  529,  529,  529,  227,  533,
-      534,  535,  533,  533,  533,  533,  533,  533,  533,  536,
-      688,  749,  867,  537,  537,  537,  537,  537,  537,  669,
-      669,  669,  669,  669,  669,  669,  669,  669,  669,  176,
-      176,  176,  688,  582,  688,  689,  867,  867,  537,  537,
-      537,  537,  537,  537,  867,  649,  529,  529,  529,  529,
-      529,  529,  529,  529,  529,  529,  104,  538,  756,  105,
-
-      749,  867,  104,  627,  627,  104,  104,  735,  104,  104,
-      104,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  539,  755,  659,  104,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  131,  105,  131,
-      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  575,  576,  576,
-      576,  576,  576,  576,  576,  576,  576,  576,  690,  691,
-      692,  693,  690,  690,  690,  690,  690,  690,  700,  700,
-      700,  700,  700,  700,  700,  700,  700,  700,  749,  659,
-
-      754,  754,  754,  626,  626,  105,  582,  582,  583,  583,
-      583,  583,  583,  583,  583,  583,  583,  583,  584,  713,
-      777,  777,  585,  585,  585,  585,  585,  585,  701,  701,
-      701,  701,  701,  702,  703,  703,  703,  703,  659,  659,
-      660,  660,  660,  660,  660,  660,  840,  585,  585,  585,
-      585,  585,  585,  589,  590,  591,  589,  589,  589,  589,
-      589,  589,  589,  592,  584,  782,  782,  593,  593,  593,
-      593,  593,  593,  658,  658,  658,  658,  658,  658,  658,
-      658,  658,  658,  704,  339,  105,  339,  704,  227,  783,
-      783,  513,  593,  593,  593,  593,  593,  593,  867,  601,
-
-      585,  585,  585,  585,  585,  585,  585,  585,  585,  585,
-      372,  227,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  528,  782,  778,  778,  598,  598,  598,  598,
-      598,  598,  582,  867,  711,  711,  711,  711,  711,  711,
-      176,  176,  176,  697,  649,  713,  742,  783,  743,  744,
-      745,  598,  598,  598,  598,  598,  598,  372,  227,  600,
-      600,  600,  600,  600,  600,  600,  600,  600,  600,  601,
-      131,  696,  695,  602,  602,  602,  602,  602,  602,  715,
-      715,  715,  715,  715,  715,  715,  715,  715,  715,  372,
-      227,  728,  728,  728,  728,  728,  728,  746,  602,  602,
-
-      602,  602,  602,  602,  227,  606,  607,  608,  606,  606,
-      606,  606,  606,  606,  606,  694,  625,  813,  867,  609,
-      609,  609,  609,  609,  609,  723,  724,  725,  723,  723,
-      723,  723,  723,  723,  723,  340,  487,  340,  487,  372,
-      227,  814,  867,  813,  609,  609,  609,  609,  609,  609,
-      867,  601,  602,  602,  602,  602,  602,  602,  602,  602,
-      602,  602,  104,  793,  131,  625,  625,  814,  104,  741,
-      741,  104,  104,  741,  104,  104,  104,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  741,  741,  741,
-      104,  131,  131,  131,  131,  131,  131,  131,  131,  610,
+       16,   49,  142,   56,  162,   50,  132,   57,  132,  135,
+      106,   56,  132,   58,  163,   57,   59,   81,   18,   82,
+       83,   58,  114,  134,   59,   81,   18,   82,   83,  136,
+
+      160,   51,   52,  157,  137,  140,   53,  187,  144,  177,
+      147,   60,  115,   61,   54,   62,   38,   55,   38,   60,
+      141,   61,  145,   62,   38,  188,   38,   17,   65,   66,
+      132,   67,   17,   65,   66,  106,   67,   67,   84,  116,
+       63,  106,   67,  181,  148,  217,   84,  864,   63,  158,
+      148,   67,   68,  149,  218,  182,   67,   68,  186,  170,
+      184,  147,   17,   18,   19,   74,   70,  189,  190,  180,
+      185,   75,   76,   77,  186,  120,  120,  106,   69,  120,
+      120,  180,  253,   69,   17,   18,   19,   78,   70,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  126,  120,
+
+      127,  127,  127,  127,  127,  128,   17,   18,   19,   74,
+       70,  106,  106,   79,  114,   75,   76,   77,  204,  204,
+      204,  204,  204,  205,  121,  207,  332,  262,  211,  150,
+      106,   78,  252,  110,  192,   71,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   17,   18,   19,   79,   70,  151,
+      152,  193,  207,  229,  153,  227,  227,  227,  227,  227,
+      227,  124,  154,  210,  231,  155,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  112,  112,  112,  112,
+      112,  112,  112,  112,  112,  112,  259,  106,  106,  106,
 
+      177,  147,  864,  264,  266,   71,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   33,   17,   18,   19,   33,   33,
+       85,   23,   24,   33,   86,   26,   33,   33,   87,   88,
+       89,   90,   88,   88,   88,   88,   88,   88,   88,   31,
+       91,   33,   33,   92,   93,   93,   93,   94,   95,   96,
+       96,   96,   96,   97,   98,   99,   96,  100,   96,  101,
+       96,   96,   96,   96,   96,   96,   71,   33,  102,  102,
+      102,  102,  102,  102,  103,  103,  103,  103,  103,  103,
+      103,  103,  104,  103,  103,  110,  110,  177,  147,  105,
+
+      177,  147,  177,  147,  187,  111,  106,  188,  112,  112,
+      112,  112,  112,  112,  112,  112,  112,  112,  122,  260,
+      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+      124,  106,  189,  190,  125,  125,  125,  125,  125,  125,
+      162,  229,  167,  167,  263,  261,  167,  167,  106,  106,
+      163,  571,  303,  180,  339,  186,  186,  106,  106,  125,
+      125,  125,  125,  125,  125,  105,  167,  321,  322,  864,
+      106,  105,  341,  339,  105,  105,  106,  105,  105,  105,
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  105,  131,  104,  104,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  625,  628,  628,  628,  628,  628,  629,
-      626,  626,  626,  626,  194,  105,  684,  582,  194,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  713,
-      194,  683,  813,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,  632,  205,  205,  814,  207,  194,  194,
-      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
-
-      194,  194,  194,  194,  194,  638,  639,  640,  641,  638,
-      638,  638,  638,  638,  638,  742,  832,  743,  744,  745,
-      761,  762,  763,  761,  761,  761,  761,  761,  761,  761,
-      704,  105,  705,  705,  705,  705,  705,  705,  227,  488,
-      833,  488,  105,  575,  576,  576,  576,  576,  576,  576,
-      576,  576,  576,  576,  722,  722,  722,  722,  722,  722,
-      722,  722,  722,  722,  227,  582,  748,  766,  766,  766,
-      766,  766,  766,  659,  520,  601,  520,  713,  521,  659,
-      521,  105,  582,  513,  647,  647,  647,  647,  647,  647,
-      647,  647,  647,  647,  584,  582,  582,  648,  648,  648,
-
-      648,  648,  648,  648,  648,  648,  648,  649,  768,  867,
-      832,  650,  650,  650,  650,  650,  650,  770,  770,  770,
-      770,  770,  770,  770,  770,  770,  770,  771,  771,  771,
-      771,  771,  772,  867,  833,  370,  650,  650,  650,  650,
-      650,  650,  654,  655,  656,  654,  654,  654,  654,  654,
-      654,  654,  657,  637,  634,  794,  658,  658,  658,  658,
-      658,  658,  790,  791,  792,  790,  790,  790,  790,  790,
-      790,  790,  487,  867,  487,  867,  867,  867,  520,  633,
-      520,  658,  658,  658,  658,  658,  658,  867,  867,  650,
-      650,  650,  650,  650,  650,  650,  650,  650,  650,  659,
-
-      768,  662,  662,  662,  662,  662,  663,  660,  660,  660,
-      660,  372,  227,  666,  666,  666,  666,  666,  666,  666,
-      666,  666,  666,  601,  746,  867,  832,  665,  665,  665,
-      665,  665,  665,  742,  631,  743,  744,  745,  867,  582,
-      743,  744,  745,  867,  630,  867,  867,  745,  625,  867,
-      833,  768,  665,  665,  665,  665,  665,  665,  372,  227,
-      667,  667,  667,  667,  667,  667,  667,  667,  667,  667,
-      822,  625,  620,  131,  668,  668,  668,  668,  668,  668,
-      660,  661,  660,  661,  746,  705,  706,  705,  706,  746,
-      660,  750,  660,  750,  746,  751,  705,  751,  705,  668,
-
-      668,  668,  668,  668,  668,  867,  619,  668,  668,  668,
-      668,  668,  668,  668,  668,  668,  668,  104,  747,  131,
-      747,  747,  747,  104,  747,  747,  104,  104,  747,  104,
-      104,  104,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  747,  747,  747,  104,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  672,  131,  131,  131,  105,
-      131,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  104,  675,  749,
-      519,  750,  750,  750,  750,  750,  750,  194,  801,  519,
-
-      801,  194,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  676,  194,  519,  513,  205,  205,  205,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  370,
-      207,  194,  194,  194,  194,  194,  194,  194,  194,  194,
-      194,  194,  194,  194,  194,  194,  194,  194,  698,  297,
-      699,  699,  699,  699,  699,  699,  699,  699,  699,  699,
-      776,  776,  776,  776,  776,  776,  776,  776,  776,  776,
-      582,  574,  807,  807,  807,  807,  807,  807,  789,  573,
-      572,  789,  768,  802,  818,  802,  818,  105,  704,  569,
-
-      707,  707,  707,  707,  707,  708,  705,  705,  705,  705,
-      582,  568,  711,  711,  711,  711,  711,  711,  711,  711,
-      711,  711,  649,  582,  567,  712,  712,  712,  712,  712,
-      712,  712,  712,  712,  712,  713,  819,  486,  819,  714,
-      714,  714,  714,  714,  714,  810,  810,  810,  810,  810,
-      810,  810,  810,  810,  810,  811,  811,  811,  811,  811,
-      812,  851,  486,  851,  714,  714,  714,  714,  714,  714,
-      718,  719,  720,  718,  718,  718,  718,  718,  718,  718,
-      721,  852,  486,  852,  722,  722,  722,  722,  722,  722,
-      227,  777,  777,  777,  777,  777,  777,  789,  789,  789,
-
-      789,  789,  789,  789,  789,  789,  789,  559,  558,  722,
-      722,  722,  722,  722,  722,  867,  105,  714,  714,  714,
-      714,  714,  714,  714,  714,  714,  714,  372,  227,  728,
-      728,  728,  728,  728,  728,  728,  728,  728,  728,  749,
-      105,  752,  752,  752,  752,  752,  753,  754,  754,  754,
-      754,  758,  759,  760,  758,  758,  758,  758,  758,  758,
-      758,  789,  789,  789,  789,  789,  789,  789,  789,  789,
-      789,  795,  105,  796,  796,  796,  796,  796,  796,  800,
-      105,  801,  801,  801,  801,  801,  801,  519,  105,  698,
-      519,  699,  699,  699,  699,  699,  699,  699,  699,  699,
-
-      699,  817,  513,  818,  818,  818,  818,  818,  818,  370,
-      105,  826,  827,  828,  826,  826,  826,  826,  826,  826,
-      826,  845,  845,  845,  845,  845,  845,  297,  105,  582,
-      297,  766,  766,  766,  766,  766,  766,  766,  766,  766,
-      766,  713,  582,  506,  767,  767,  767,  767,  767,  767,
-      767,  767,  767,  767,  768,  505,  504,  503,  769,  769,
-      769,  769,  769,  769,  837,  838,  839,  837,  837,  837,
-      837,  837,  837,  837,  850,  502,  851,  851,  851,  851,
-      851,  851,  501,  769,  769,  769,  769,  769,  769,  773,
-      774,  775,  773,  773,  773,  773,  773,  773,  773,  500,
-
-      499,  498,  497,  776,  776,  776,  776,  776,  776,  845,
-      845,  845,  845,  845,  845,  845,  845,  845,  845,  840,
-      496,  841,  841,  841,  841,  841,  841,  495,  776,  776,
-      776,  776,  776,  776,  867,  494,  769,  769,  769,  769,
-      769,  769,  769,  769,  769,  769,  227,  779,  779,  779,
-      779,  779,  780,  777,  777,  777,  777,  795,  105,  796,
-      796,  796,  796,  796,  796,  796,  796,  796,  796,  795,
-      493,  797,  797,  797,  797,  797,  797,  797,  797,  797,
-      797,  795,  492,  798,  798,  798,  798,  798,  799,  796,
-      796,  796,  796,  800,  491,  803,  803,  803,  803,  803,
-
-      804,  801,  801,  801,  801,  582,  867,  807,  807,  807,
-      807,  807,  807,  807,  807,  807,  807,  768,  582,  486,
-      808,  808,  808,  808,  808,  808,  808,  808,  808,  808,
-      486,  407,  481,  480,  809,  809,  809,  809,  809,  809,
-      846,  846,  846,  846,  846,  846,  846,  846,  846,  846,
-      474,  473,  472,  861,  861,  861,  861,  861,  861,  809,
-      809,  809,  809,  809,  809,  867,  471,  809,  809,  809,
-      809,  809,  809,  809,  809,  809,  809,  817,  470,  820,
-      820,  820,  820,  820,  821,  818,  818,  818,  818,  104,
-      105,  823,  824,  825,  823,  823,  823,  823,  823,  823,
-
-      823,  795,  469,  796,  796,  796,  796,  796,  796,  796,
-      796,  796,  796,  795,  468,  796,  796,  796,  796,  796,
-      796,  796,  796,  796,  796,  582,  467,  831,  831,  831,
-      831,  831,  831,  831,  831,  831,  831,  840,  466,  841,
-      841,  841,  841,  841,  841,  841,  841,  841,  841,  840,
-      465,  842,  842,  842,  842,  842,  842,  842,  842,  842,
-      842,  840,  464,  843,  843,  843,  843,  843,  844,  841,
-      841,  841,  841,  847,  847,  847,  847,  847,  848,  845,
-      845,  845,  845,  850,  463,  853,  853,  853,  853,  853,
-      854,  851,  851,  851,  851,  104,  462,  855,  856,  857,
-
-      855,  855,  855,  855,  855,  855,  855,  840,  444,  841,
-      841,  841,  841,  841,  841,  841,  841,  841,  841,  840,
-      370,  841,  841,  841,  841,  841,  841,  841,  841,  841,
-      841,  845,  845,  845,  845,  845,  845,  845,  845,  845,
-      845,  845,  845,  845,  845,  845,  845,  845,  845,  845,
-      845,  858,  859,  860,  858,  858,  858,  858,  858,  858,
-      858,  861,  861,  861,  861,  861,  861,  861,  861,  861,
-      861,  864,  864,  864,  864,  864,  864,  864,  864,  864,
-      864,  858,  858,  858,  858,  858,  858,  858,  858,  858,
-      858,  864,  864,  864,  864,  864,  864,  297,  105,  855,
-
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  865,
-      865,  865,  865,  865,  866,  864,  864,  864,  864,  864,
-      864,  864,  864,  864,  864,  864,  864,  864,  864,  440,
-      297,  129,  434,  433,  432,  429,  105,  862,  862,  862,
-      862,  862,  863,  861,  861,  861,  861,  849,  428,  427,
-      849,  426,  425,  424,  849,  423,  422,  419,  338,  338,
-      338,  407,  409,  407,  408,  407,  401,  400,  399,  398,
-      397,  396,  395,  394,  105,  861,  861,  861,  861,  861,
-      861,  861,  861,  861,  861,  393,  392,  387,  386,  123,
-      297,  370,  297,  129,  109,  360,  356,  355,  354,  353,
-
-      352,  351,  350,  349,  348,  347,  346,  345,  198,  338,
-      338,  264,  105,   63,   63,   63,   63,   63,   63,   63,
-       63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
-       63,   63,   63,   63,   33,   33,   33,   33,   33,   33,
+      124,  168,  339,  105,  131,  131,  131,  131,  131,  131,
+
+      132,  132,  132,  132,  133,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  106,  132,  125,
+      125,  125,  125,  125,  125,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  881,  290,  110,  492,
+      132,  132,  132,  132,  132,  132,  106,  106,  106,  418,
+      132,  112,  112,  112,  112,  112,  112,  112,  112,  112,
+      112,  342,  106,  339,  411,  105,  105,  105,  105,  105,
+      105,  146,  147,  105,  105,  105,  106,  105,  105,  864,
+      412,  105,  227,  227,  227,  227,  227,  227,  227,  227,
+
+      227,  227,  338,  106,  389,  105,  105,  105,  105,  864,
+      125,  125,  125,  125,  125,  125,  125,  125,  125,  125,
+      110,  173,  147,  174,  881,  175,  106,  114,  390,  174,
+      111,  175,  881,  112,  112,  112,  112,  112,  112,  112,
+      112,  112,  112,  110,  881,  175,  175,  881,  373,  373,
+      373,  105,  881,  105,  105,  105,  194,  105,  105,  484,
+      179,  105,  194,  179,  179,  194,  395,  229,  194,  194,
+      179,  116,  175,  114,  193,  105,  105,  105,  303,  193,
+      156,  110,  196,  393,  194,  179,  329,  330,  394,  331,
+      396,  176,  106,  881,  881,  881,  881,  881,  881,  881,
+
+      881,  881,  881,  881,  362,  363,  106,  364,  197,  194,
+      120,  491,  413,  120,  120,  106,  120,  120,  120,  120,
+      193,  106,  120,  120,  113,  568,  113,  113,  427,  106,
+      113,  113,  850,  428,  113,  420,  196,  120,  120,  227,
+      227,  227,  227,  227,  227,  227,  227,  227,  227,  113,
+      113,  112,  112,  112,  112,  112,  112,  112,  112,  112,
+      112,  106,  199,  120,  196,  110,  488,  200,  196,  201,
+      201,  201,  201,  201,  201,  201,  201,  201,  201,  124,
+      196,  593,  389,  202,  202,  202,  202,  202,  202,  196,
+      196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
+
+      196,  196,  196,  196,  196,  196,  390,  485,  202,  202,
+      202,  202,  202,  202,  196,  196,  196,  196,  196,  196,
+      196,  196,  196,  196,  196,  881,  417,  196,  196,  196,
+      196,  196,  196,  196,  196,  196,  196,  881,  106,  649,
+      207,  196,  196,  196,  196,  196,  196,  437,  106,  117,
+      438,  117,  117,  117,  409,  117,  117,  410,  574,  117,
+      272,  272,  272,  272,  272,  272,  196,  196,  196,  196,
+      196,  196,  196,  117,  117,  117,  196,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  206,  124,  196,  106,
+      395,  206,  206,  206,  206,  206,  206,  207,  207,  207,
+
+      207,  208,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  396,  209,  202,  202,  202,  202,
+      202,  202,  196,  196,  196,  196,  196,  196,  196,  196,
+      196,  196,  196,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  881,  132,  687,  132,  207,  207,  207,
+      207,  207,  207,  106,  622,  120,  120,  207,  494,  120,
+      120,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  389,  196,  196,  196,  196,  196,  196,  881,  120,
+      202,  202,  202,  202,  202,  202,  202,  202,  202,  202,
+      119,  229,  105,  105,  119,  390,  105,  105,  377,  229,
+
+      119,  150,  303,  487,  121,  293,  293,  293,  293,  293,
+      294,  395,  106,  442,  119,  119,  105,  223,  224,  225,
+      223,  223,  223,  223,  223,  223,  223,  239,  240,  573,
+      782,  151,  152,  241,  242,  396,  153,  243,  106,  244,
+      245,  167,  167,  831,  154,  167,  167,  155,  105,  105,
+      105,  105,  106,  486,  106,  226,  226,  226,  226,  226,
+      226,  226,  226,  226,  226,  167,  124,  377,  229,  226,
+      226,  226,  226,  226,  226,  239,  240,  881,  229,  379,
+      106,  241,  242,  581,  831,  243,  106,  244,  582,  379,
+      168,  493,  831,  106,  226,  226,  226,  226,  226,  226,
+
+      232,  232,  232,  232,  232,  232,  232,  232,  232,  232,
+      124,  419,  881,  552,  232,  232,  232,  232,  232,  232,
+      268,  269,  270,  268,  268,  268,  268,  268,  268,  268,
+      382,  382,  382,  382,  382,  383,  881,  553,  881,  226,
+      226,  226,  226,  226,  226,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  881,  229,  551,  110,  132,
+      132,  132,  132,  132,  132,  132,  166,  303,  105,  105,
+      166,  623,  105,  105,  593,  343,  166,  344,  344,  344,
+      344,  344,  344,  229,  105,  105,  105,  105,  105,  105,
+      166,  166,  105,  191,  379,  191,  191,  557,  194,  191,
+
+      191,  377,  229,  191,  194,  377,  229,  194,  881,  229,
+      194,  194,  120,  379,  634,  132,  120,  459,  191,  191,
+      459,  558,  120,  782,  196,  881,  194,  624,  194,  727,
+      194,  194,  194,  881,  194,  194,  120,  120,  194,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  881,
+      197,  194,  194,  194,  194,  120,  814,  881,  120,  120,
+      881,  120,  120,  120,  120,  561,  554,  120,  120,  272,
+      272,  272,  272,  272,  272,  272,  272,  272,  272,  279,
+      280,  196,  120,  120,  881,  281,  282,  106,  106,  283,
+      814,  284,  222,  222,  222,  222,  222,  222,  222,  222,
+
+      222,  222,  132,  549,  631,  637,  625,  199,  120,  271,
+      271,  271,  271,  271,  271,  271,  271,  271,  271,  586,
+      814,  563,  565,  271,  271,  271,  271,  271,  271,  222,
+      222,  222,  222,  222,  222,  222,  222,  222,  222,  462,
+      462,  462,  462,  462,  463,  564,  566,  547,  271,  271,
+      271,  271,  271,  271,  196,  881,  229,  106,  196,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  124,
+      196,  548,  552,  273,  273,  273,  273,  273,  273,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  553,  209,  271,  271,
+
+      271,  271,  271,  271,  196,  196,  196,  196,  196,  196,
+      196,  196,  196,  196,  196,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  881,  747,  132,  881,  207,
+      207,  207,  207,  207,  207,  292,  292,  292,  292,  292,
+      292,  292,  292,  292,  292,  540,  540,  540,  540,  540,
+      541,  881,  881,  881,  196,  196,  196,  196,  196,  196,
+      290,  831,  291,  291,  291,  291,  291,  291,  291,  291,
+      291,  291,  167,  567,  881,  881,  167,  881,  106,  686,
+      110,  132,  167,  308,  308,  308,  308,  308,  308,  308,
+      308,  308,  308,  550,  636,  648,  167,  167,  881,  106,
+
+      105,  559,  295,  295,  295,  295,  295,  295,  295,  295,
+      295,  295,  207,  557,  560,  563,  295,  295,  295,  295,
+      295,  295,  381,  381,  381,  381,  381,  381,  381,  381,
+      381,  381,  831,  627,  565,  547,  881,  558,  132,  564,
+      753,  295,  295,  295,  295,  295,  295,  297,  298,  299,
+      299,  299,  299,  299,  299,  299,  299,  300,  566,  548,
+      881,  301,  301,  301,  301,  301,  301,  421,  422,  423,
+      421,  421,  421,  421,  421,  421,  421,  562,  495,  229,
+      496,  496,  496,  496,  496,  496,  301,  301,  301,  301,
+      301,  301,  229,  304,  305,  306,  304,  304,  304,  304,
+
+      304,  304,  304,  307,  229,  552,  557,  308,  308,  308,
+      308,  308,  308,  453,  454,  455,  453,  453,  453,  453,
+      453,  453,  453,  589,  589,  589,  589,  589,  590,  553,
+      558,  229,  308,  308,  308,  308,  308,  308,  309,  309,
+      309,  309,  309,  309,  309,  309,  309,  309,  124,  691,
+      229,  132,  309,  309,  309,  309,  309,  309,  388,  388,
+      388,  388,  388,  388,  388,  388,  388,  388,  442,  132,
+      443,  443,  443,  443,  443,  443,  629,  295,  295,  295,
+      295,  295,  295,  343,  563,  346,  346,  346,  346,  346,
+      347,  344,  344,  344,  344,  348,  348,  348,  348,  348,
+
+      348,  348,  348,  348,  348,  124,  727,  106,  564,  348,
+      348,  348,  348,  348,  348,  377,  229,  457,  457,  457,
+      457,  457,  457,  106,  662,  701,  565,  379,  598,  598,
+      598,  598,  598,  599,  348,  348,  348,  348,  348,  348,
+      349,  349,  349,  349,  349,  349,  349,  349,  349,  349,
+      566,  717,  717,  717,  349,  349,  349,  349,  349,  349,
+      461,  461,  461,  461,  461,  461,  461,  461,  461,  461,
+      528,  132,  529,  529,  529,  529,  529,  529,  630,  348,
+      348,  348,  348,  348,  348,  366,  367,  368,  366,  366,
+      366,  366,  366,  366,  366,  468,  468,  468,  468,  468,
+
+      468,  468,  468,  468,  468,  377,  229,  535,  535,  535,
+      535,  535,  535,  105,  105,  105,  105,  459,  699,  110,
+      751,  752,  106,  371,  371,  372,  373,  373,  373,  373,
+      373,  373,  373,  300,  377,  229,  378,  378,  378,  378,
+      378,  378,  378,  378,  378,  378,  379,  814,  692,  694,
+      380,  380,  380,  380,  380,  380,  539,  539,  539,  539,
+      539,  539,  539,  539,  539,  539,  690,  743,  814,  881,
+      132,  132,  693,  695,  700,  380,  380,  380,  380,  380,
+      380,  229,  384,  385,  386,  384,  384,  384,  384,  384,
+      384,  384,  387,  881,  132,  106,  388,  388,  388,  388,
+
+      388,  388,  763,  748,  626,  555,  572,  746,  132,  132,
+      556,  575,  576,  577,  575,  575,  575,  575,  575,  575,
+      575,  388,  388,  388,  388,  388,  388,  881,  688,  380,
+      380,  380,  380,  380,  380,  380,  380,  380,  380,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  377,
+      229,  763,  689,  424,  424,  424,  424,  424,  424,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  615,
+      615,  615,  615,  615,  616,  132,  712,  712,  424,  424,
+      424,  424,  424,  424,  425,  425,  425,  425,  425,  425,
+      425,  425,  425,  425,  688,  763,  692,  694,  425,  425,
+
+      425,  425,  425,  425,  527,  527,  527,  527,  527,  527,
+      527,  527,  527,  527,  112,  106,  106,  112,  689,  229,
+      693,  695,  763,  424,  424,  424,  424,  424,  424,  442,
+      379,  443,  443,  443,  443,  443,  443,  443,  443,  443,
+      443,  442,  593,  444,  444,  444,  444,  444,  444,  444,
+      444,  444,  444,  442,  595,  445,  445,  445,  445,  445,
+      446,  443,  443,  443,  443,  448,  448,  448,  448,  448,
+      448,  448,  448,  448,  448,  300,  377,  229,  457,  457,
+      457,  457,  457,  457,  457,  457,  457,  457,  379,  762,
+      692,  694,  456,  456,  456,  456,  456,  456,  597,  597,
+
+      597,  597,  597,  597,  597,  597,  597,  597,  665,  665,
+      665,  665,  665,  666,  693,  695,  802,  456,  456,  456,
+      456,  456,  456,  377,  229,  458,  458,  458,  458,  458,
+      458,  458,  458,  458,  458,  459,  106,  132,  132,  460,
+      460,  460,  460,  460,  460,  605,  606,  607,  605,  605,
+      605,  605,  605,  605,  605,  683,  683,  683,  683,  683,
+      684,  798,  752,  132,  460,  460,  460,  460,  460,  460,
+      229,  464,  465,  466,  464,  464,  464,  464,  464,  464,
+      464,  467,  229,  377,  229,  468,  468,  468,  468,  468,
+      468,  377,  229,  459,  132,  459,  881,  229,  763,  106,
+
+      768,  768,  768,  537,  800,  628,  799,  132,  537,  635,
+      468,  468,  468,  468,  468,  468,  881,  881,  460,  460,
+      460,  460,  460,  460,  460,  460,  460,  460,  495,  595,
+      498,  498,  498,  498,  498,  499,  496,  496,  496,  496,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      751,  752,  132,  744,  424,  424,  424,  424,  424,  424,
+      546,  546,  546,  546,  546,  546,  546,  546,  546,  546,
+      638,  639,  639,  639,  639,  639,  639,  745,  229,  424,
+      424,  424,  424,  424,  424,  516,  517,  518,  516,  516,
+      516,  516,  516,  516,  516,  377,  229,  610,  610,  610,
+
+      610,  610,  610,  696,  106,  830,  110,  537,  614,  614,
+      614,  614,  614,  614,  614,  614,  614,  614,  132,  829,
+      754,  132,  106,  442,  593,  443,  443,  443,  443,  443,
+      443,  443,  443,  443,  443,  442,  595,  443,  443,  443,
+      443,  443,  443,  443,  443,  443,  443,  523,  524,  525,
+      523,  523,  523,  523,  523,  523,  523,  526,  344,  702,
+      344,  527,  527,  527,  527,  527,  527,  656,  657,  658,
+      656,  656,  656,  656,  656,  656,  656,  105,  105,  105,
+      105,  702,  229,  702,  702,  229,  527,  527,  527,  527,
+      527,  527,  528,  459,  531,  531,  531,  531,  531,  532,
+
+      529,  529,  529,  529,  377,  229,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  459,  702,  110,  744,
+      534,  534,  534,  534,  534,  534,  604,  604,  604,  604,
+      604,  604,  604,  604,  604,  604,  849,  850,  229,  702,
+      744,  702,  703,  745,  662,  534,  534,  534,  534,  534,
+      534,  377,  229,  536,  536,  536,  536,  536,  536,  536,
+      536,  536,  536,  537,  745,  881,  106,  538,  538,  538,
+      538,  538,  538,  593,  593,  660,  660,  660,  660,  660,
+      660,  849,  850,  801,  595,  595,  662,  132,  222,  881,
+      809,  222,  538,  538,  538,  538,  538,  538,  229,  542,
+
+      543,  544,  542,  542,  542,  542,  542,  542,  542,  545,
+      769,  718,  881,  546,  546,  546,  546,  546,  546,  664,
+      664,  664,  664,  664,  664,  664,  664,  664,  664,  106,
+      844,  844,  844,  844,  229,  796,  881,  796,  546,  546,
+      546,  546,  546,  546,  881,  537,  538,  538,  538,  538,
+      538,  538,  538,  538,  538,  538,  105,  547,  770,  797,
+      718,  797,  105,  639,  639,  105,  105,  718,  105,  105,
+      105,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  548,  132,  763,  105,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+
+      132,  132,  132,  132,  132,  132,  132,  132,  106,  132,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  586,  587,  587,
+      587,  587,  587,  587,  587,  587,  587,  587,  377,  229,
+      377,  229,  881,  229,  730,  730,  730,  730,  730,  731,
+      537,  881,  612,  229,  612,  377,  229,  679,  679,  679,
+      679,  679,  679,  662,  537,  106,  593,  612,  594,  594,
+      594,  594,  594,  594,  594,  594,  594,  594,  595,  178,
+      178,  178,  596,  596,  596,  596,  596,  596,  682,  682,
+      682,  682,  682,  682,  682,  682,  682,  682,  672,  763,
+
+      673,  673,  673,  673,  673,  673,  854,  596,  596,  596,
+      596,  596,  596,  600,  601,  602,  600,  600,  600,  600,
+      600,  600,  600,  603,  749,  796,  827,  604,  604,  604,
+      604,  604,  604,  704,  705,  706,  707,  704,  704,  704,
+      704,  704,  704,  132,  345,  106,  345,  672,  229,  797,
+      828,  672,  604,  604,  604,  604,  604,  604,  881,  612,
+      596,  596,  596,  596,  596,  596,  596,  596,  596,  596,
+      377,  229,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  610,  537,  178,  178,  178,  609,  609,  609,  609,
+      609,  609,  714,  714,  714,  714,  714,  714,  714,  714,
+
+      714,  714,  377,  229,  742,  742,  742,  742,  742,  742,
+      672,  609,  609,  609,  609,  609,  609,  377,  229,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  612,
+      595,  881,  881,  613,  613,  613,  613,  613,  613,  715,
+      715,  715,  715,  715,  716,  717,  717,  717,  717,  718,
+      756,  827,  757,  758,  759,  881,  881,  718,  613,  613,
+      613,  613,  613,  613,  229,  617,  618,  619,  617,  617,
+      617,  617,  617,  617,  617,  828,  807,  522,  808,  620,
+      620,  620,  620,  620,  620,  671,  671,  671,  671,  671,
+      671,  671,  671,  671,  671,  496,  711,  496,  132,  377,
+
+      229,  760,  827,  846,  620,  620,  620,  620,  620,  620,
+      881,  612,  613,  613,  613,  613,  613,  613,  613,  613,
+      613,  613,  105,  497,  710,  497,  828,  847,  105,  755,
+      755,  105,  105,  755,  105,  105,  105,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  755,  755,  755,
+      105,  132,  132,  132,  132,  132,  132,  132,  132,  621,
+      132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  106,  132,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  638,  641,  641,  641,  641,  641,  642,
+
+      639,  639,  639,  639,  196,  640,  640,  593,  196,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  662,
+      196,  709,  846,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  645,  207,  207,  847,  209,  196,  196,
+      196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
+      196,  196,  196,  196,  196,  651,  652,  653,  654,  651,
+      651,  651,  651,  651,  651,  593,  708,  725,  725,  725,
+      725,  725,  725,  529,  638,  529,  593,  662,  729,  729,
+      729,  729,  729,  729,  729,  729,  729,  729,  727,  639,
+
+      639,  881,  106,  586,  587,  587,  587,  587,  587,  587,
+      587,  587,  587,  587,  737,  738,  739,  737,  737,  737,
+      737,  737,  737,  737,  803,  881,  756,  803,  757,  758,
+      759,  775,  776,  777,  775,  775,  775,  775,  775,  775,
+      775,  106,  593,  771,  660,  660,  660,  660,  660,  660,
+      660,  660,  660,  660,  595,  593,  881,  661,  661,  661,
+      661,  661,  661,  661,  661,  661,  661,  662,  727,  791,
+      791,  663,  663,  663,  663,  663,  663,  762,  718,  638,
+      719,  719,  719,  719,  719,  719,  736,  736,  736,  736,
+      736,  736,  736,  736,  736,  736,  663,  663,  663,  663,
+
+      663,  663,  667,  668,  669,  667,  667,  667,  667,  667,
+      667,  667,  670,  530,  638,  530,  671,  671,  671,  671,
+      671,  671,  593,  106,  780,  780,  780,  780,  780,  780,
+      496,  529,  496,  529,  727,  785,  785,  785,  785,  785,
+      786,  671,  671,  671,  671,  671,  671,  881,  593,  663,
+      663,  663,  663,  663,  663,  663,  663,  663,  663,  672,
+      727,  675,  675,  675,  675,  675,  676,  673,  673,  673,
+      673,  377,  229,  679,  679,  679,  679,  679,  679,  679,
+      679,  679,  679,  612,  698,  846,  881,  678,  678,  678,
+      678,  678,  678,  784,  784,  784,  784,  784,  784,  784,
+
+      784,  784,  784,  881,  697,  881,  881,  881,  106,  847,
+      881,  132,  678,  678,  678,  678,  678,  678,  377,  229,
+      680,  680,  680,  680,  680,  680,  680,  680,  680,  680,
+      229,  836,  132,  229,  681,  681,  681,  681,  681,  681,
+      593,  612,  804,  805,  806,  804,  804,  804,  804,  804,
+      804,  804,  782,  756,  760,  757,  758,  759,  672,  681,
+      681,  681,  681,  681,  681,  881,  881,  681,  681,  681,
+      681,  681,  681,  681,  681,  681,  681,  105,  782,  673,
+      674,  673,  674,  105,  792,  792,  105,  105,  672,  105,
+      105,  105,  132,  132,  132,  132,  132,  132,  132,  132,
+
+      132,  132,  522,  375,  760,  105,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  685,  132,  132,  132,  106,
+      132,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  688,  763,
+      650,  764,  764,  764,  764,  764,  764,  196,  719,  647,
+      719,  196,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  689,  196,  646,  644,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  643,
+
+      209,  196,  196,  196,  196,  196,  196,  196,  196,  196,
+      196,  196,  196,  196,  196,  196,  196,  196,  712,  593,
+      713,  713,  713,  713,  713,  713,  713,  713,  713,  713,
+      720,  782,  720,  881,  638,  757,  758,  759,  825,  825,
+      825,  825,  825,  826,  673,  881,  673,  881,  881,  759,
+      229,  791,  791,  791,  791,  791,  791,  106,  718,  638,
+      721,  721,  721,  721,  721,  722,  719,  719,  719,  719,
+      593,  633,  725,  725,  725,  725,  725,  725,  725,  725,
+      725,  725,  662,  593,  760,  726,  726,  726,  726,  726,
+      726,  726,  726,  726,  726,  727,  760,  632,  132,  728,
+
+      728,  728,  728,  728,  728,  790,  790,  790,  790,  790,
+      790,  790,  790,  790,  790,  814,  528,  815,  815,  815,
+      815,  815,  815,  528,  728,  728,  728,  728,  728,  728,
+      732,  733,  734,  732,  732,  732,  732,  732,  732,  732,
+      735,  764,  528,  764,  736,  736,  736,  736,  736,  736,
+      593,  522,  821,  821,  821,  821,  821,  821,  765,  375,
+      765,  809,  782,  810,  810,  810,  810,  810,  810,  736,
+      736,  736,  736,  736,  736,  881,  300,  728,  728,  728,
+      728,  728,  728,  728,  728,  728,  728,  377,  229,  742,
+      742,  742,  742,  742,  742,  742,  742,  742,  742,  763,
+
+      106,  766,  766,  766,  766,  766,  767,  768,  768,  768,
+      768,  772,  773,  774,  772,  772,  772,  772,  772,  772,
+      772,  761,  585,  761,  761,  761,  584,  761,  761,  583,
+      580,  761,  824,  824,  824,  824,  824,  824,  824,  824,
+      824,  824,  719,  579,  719,  761,  761,  761,  106,  712,
+      578,  713,  713,  713,  713,  713,  713,  713,  713,  713,
+      713,  803,  803,  803,  803,  803,  803,  803,  803,  803,
+      803,  803,  803,  803,  803,  803,  803,  803,  803,  803,
+      803,  859,  859,  859,  859,  859,  859,  495,  106,  593,
+      495,  780,  780,  780,  780,  780,  780,  780,  780,  780,
+
+      780,  727,  593,  495,  781,  781,  781,  781,  781,  781,
+      781,  781,  781,  781,  782,  815,  570,  815,  783,  783,
+      783,  783,  783,  783,  840,  841,  842,  840,  840,  840,
+      840,  840,  840,  840,  831,  569,  832,  832,  832,  832,
+      832,  832,  106,  783,  783,  783,  783,  783,  783,  787,
+      788,  789,  787,  787,  787,  787,  787,  787,  787,  816,
+      832,  816,  832,  790,  790,  790,  790,  790,  790,  851,
+      852,  853,  851,  851,  851,  851,  851,  851,  851,  854,
+      106,  855,  855,  855,  855,  855,  855,  106,  790,  790,
+      790,  790,  790,  790,  881,  106,  783,  783,  783,  783,
+
+      783,  783,  783,  783,  783,  783,  229,  793,  793,  793,
+      793,  793,  794,  791,  791,  791,  791,  809,  106,  810,
+      810,  810,  810,  810,  810,  810,  810,  810,  810,  809,
+      528,  811,  811,  811,  811,  811,  811,  811,  811,  811,
+      811,  809,  528,  812,  812,  812,  812,  812,  813,  810,
+      810,  810,  810,  814,  522,  817,  817,  817,  817,  817,
+      818,  815,  815,  815,  815,  593,  375,  821,  821,  821,
+      821,  821,  821,  821,  821,  821,  821,  782,  593,  300,
+      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
+      833,  865,  833,  865,  823,  823,  823,  823,  823,  823,
+
+      859,  859,  859,  859,  859,  859,  859,  859,  859,  859,
+      864,  300,  865,  865,  865,  865,  865,  865,  515,  823,
+      823,  823,  823,  823,  823,  881,  514,  823,  823,  823,
+      823,  823,  823,  823,  823,  823,  823,  831,  513,  834,
+      834,  834,  834,  834,  835,  832,  832,  832,  832,  105,
+      512,  837,  838,  839,  837,  837,  837,  837,  837,  837,
+      837,  809,  511,  810,  810,  810,  810,  810,  810,  810,
+      810,  810,  810,  809,  510,  810,  810,  810,  810,  810,
+      810,  810,  810,  810,  810,  593,  509,  845,  845,  845,
+      845,  845,  845,  845,  845,  845,  845,  854,  508,  855,
+
+      855,  855,  855,  855,  855,  855,  855,  855,  855,  854,
+      507,  856,  856,  856,  856,  856,  856,  856,  856,  856,
+      856,  854,  506,  857,  857,  857,  857,  857,  858,  855,
+      855,  855,  855,  860,  860,  860,  860,  860,  860,  860,
+      860,  860,  860,  861,  861,  861,  861,  861,  862,  859,
+      859,  859,  859,  864,  505,  867,  867,  867,  867,  867,
+      868,  865,  865,  865,  865,  105,  504,  869,  870,  871,
+      869,  869,  869,  869,  869,  869,  869,  854,  503,  855,
+      855,  855,  855,  855,  855,  855,  855,  855,  855,  854,
+      502,  855,  855,  855,  855,  855,  855,  855,  855,  855,
+
+      855,  859,  859,  859,  859,  859,  859,  859,  859,  859,
+      859,  859,  859,  859,  859,  859,  859,  859,  859,  859,
+      859,  872,  873,  874,  872,  872,  872,  872,  872,  872,
+      872,  875,  875,  875,  875,  875,  875,  875,  875,  875,
+      875,  878,  878,  878,  878,  878,  878,  878,  878,  878,
+      878,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  875,  875,  875,  875,  875,  875,  501,  106,  869,
+      869,  869,  869,  869,  869,  869,  869,  869,  869,  879,
+      879,  879,  879,  879,  880,  878,  878,  878,  878,  878,
+      878,  878,  878,  878,  878,  866,  863,  866,  106,  863,
+
+      500,  881,  495,  863,  495,  414,  106,  876,  876,  876,
+      876,  876,  877,  875,  875,  875,  875,  878,  878,  878,
+      878,  878,  878,  878,  878,  878,  878,  490,  489,  483,
+      482,  481,  480,  479,  478,  477,  476,  475,  474,  473,
+      472,  471,  470,  469,  106,  875,  875,  875,  875,  875,
+      875,  875,  875,  875,  875,  451,  375,  300,  447,  300,
+      130,  441,  440,  439,  436,  435,  434,  433,  432,  431,
+      430,  429,  426,  343,  343,  343,  414,  416,  414,  415,
+      414,  408,  106,   64,   64,   64,   64,   64,   64,   64,
+       64,   64,   64,   64,   64,   64,   64,   64,   64,   64,
+
+       64,   64,   64,   64,   33,   33,   33,   33,   33,   33,
        33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
-       33,   33,   33,   33,   33,   72,   72,   72,   72,   72,
-       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
-       72,   72,   72,   72,   72,   72,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,  104,  335,  332,
-
-      331,  330,  329,  328,  104,  323,  104,  104,  104,  104,
-      322,  321,  104,  104,  104,  104,  104,  104,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  112,
-      320,  319,  318,  317,  112,  316,  112,  315,  112,  112,
-      112,  112,  112,  314,  112,  112,  112,  112,  112,  112,
-      116,  313,  312,  311,  310,  309,  308,  116,  307,  116,
-      116,  116,  116,  129,  121,  116,  116,  116,  116,  116,
-      116,  118,  109,  109,  118,  118,  285,  118,  118,  284,
-      118,  118,  118,  118,  283,  282,  118,  118,  118,  118,
-
-      118,  118,  128,  128,  275,  128,  274,  273,  272,  128,
-      165,  271,  867,  165,  165,  195,  165,  165,  264,  165,
-      165,  165,  165,  183,  184,  165,  165,  165,  165,  165,
-      165,  169,  178,  178,  169,  169,  170,  169,  169,  262,
-      169,  169,  169,  169,  164,  169,  169,  169,  164,  169,
-      169,  169,  177,  255,  254,  177,  253,  252,  177,  177,
-      251,  177,  177,  177,  177,  177,  248,  177,  177,  177,
-      177,  177,  177,  181,  181,  181,  181,  181,  181,  181,
-      181,  181,  181,  181,  181,  181,  181,  181,  181,  181,
-      181,  181,  181,  181,  183,  183,  247,  183,  246,  183,
-
+       33,   33,   33,   33,   33,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,  105,  407,  406,
+      405,  404,  403,  402,  105,  401,  105,  105,  105,  105,
+      400,  399,  105,  105,  105,  105,  105,  105,  109,  109,
+      109,  109,  109,  109,  109,  109,  109,  109,  109,  109,
+
+      109,  109,  109,  109,  109,  109,  109,  109,  109,  113,
+      398,  397,  392,  391,  113,  124,  113,  300,  113,  113,
+      113,  113,  113,  375,  113,  113,  113,  113,  113,  113,
+      117,  300,  130,  110,  365,  361,  360,  117,  359,  117,
+      117,  117,  117,  358,  357,  117,  117,  117,  117,  117,
+      117,  119,  356,  355,  119,  119,  354,  119,  119,  353,
+      119,  119,  119,  119,  352,  351,  119,  119,  119,  119,
+      119,  119,  129,  129,  350,  129,  200,  343,  343,  129,
+      166,  267,  340,  166,  166,  337,  166,  166,  336,  166,
+      166,  166,  166,  335,  334,  166,  166,  166,  166,  166,
+
+      166,  171,  333,  328,  171,  171,  327,  171,  171,  326,
+      171,  171,  171,  171,  325,  171,  171,  171,  324,  171,
+      171,  171,  179,  323,  320,  179,  319,  318,  179,  179,
+      317,  179,  179,  179,  179,  179,  316,  179,  179,  179,
+      179,  179,  179,  183,  183,  183,  183,  183,  183,  183,
       183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
-      183,  183,  183,  183,  183,  189,  245,  244,  243,  236,
-      189,  235,  189,  234,  189,  189,  189,  189,  189,  233,
-      189,  189,  189,  189,  189,  189,  193,  232,  231,  129,
-      104,  129,  197,  193,  117,  193,  193,  193,  193,  219,
-      193,  193,  193,  193,  193,  193,  193,  196,  109,  107,
-      196,  196,  106,  196,  196,  105,  196,  196,  196,  196,
-      214,  196,  196,  196,  196,  196,  196,  196,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  218,
-
-      218,  213,  218,  218,  218,  218,  218,  218,  218,  218,
-      218,  218,  218,  218,  218,  218,  218,  218,  218,  218,
-      119,  212,  211,  119,  119,  210,  119,  119,  205,  119,
-      119,  119,  119,  184,  178,  119,  119,  119,  119,  119,
-      119,  128,  128,  170,  128,  139,  136,  164,  128,  226,
-      226,  163,  226,  160,  158,  142,  226,  228,  228,  228,
-      141,  228,  138,  137,  131,  228,  165,  129,  117,  165,
-      165,  107,  165,  165,  106,  165,  165,  165,  165,  105,
-      867,  165,  165,  165,  165,  165,  165,  166,  867,  867,
-      166,  166,  867,  166,  166,  867,  166,  166,  166,  166,
-
-      867,  867,  166,  166,  166,  166,  166,  166,  169,  867,
-      867,  169,  169,  867,  169,  169,  867,  169,  169,  169,
-      169,  867,  169,  169,  169,  867,  169,  169,  169,  177,
-      867,  867,  177,  867,  867,  177,  177,  867,  177,  177,
-      177,  177,  177,  867,  177,  177,  177,  177,  177,  177,
-      183,  183,  867,  183,  867,  183,  183,  183,  183,  183,
-      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
-      183,  192,  867,  867,  867,  867,  867,  867,  192,  867,
-      192,  192,  192,  192,  867,  867,  192,  192,  192,  192,
-      192,  192,  193,  867,  867,  867,  867,  867,  867,  193,
-
-      867,  193,  193,  193,  193,  867,  193,  193,  193,  193,
-      193,  193,  193,  196,  867,  867,  196,  196,  867,  196,
-      196,  867,  196,  196,  196,  196,  867,  196,  196,  196,
-      196,  196,  196,  196,  207,  867,  867,  207,  207,  867,
-      207,  286,  286,  286,  286,  286,  286,  286,  286,  286,
-      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
-      286,  286,  293,  293,  867,  293,  867,  867,  867,  293,
-      299,  299,  299,  867,  299,  867,  867,  867,  299,  364,
-      364,  867,  364,  867,  867,  867,  364,  365,  365,  867,
-      365,  867,  867,  867,  365,  369,  369,  867,  369,  867,
-
-      867,  867,  369,  371,  371,  371,  867,  371,  867,  867,
-      867,  371,  207,  867,  867,  207,  207,  867,  207,  440,
-      440,  867,  440,  867,  867,  867,  440,  442,  442,  867,
-      442,  867,  867,  867,  442,  443,  443,  867,  443,  867,
-      867,  867,  443,  445,  445,  445,  867,  445,  867,  867,
-      867,  445,  449,  449,  449,  449,  867,  449,  867,  867,
-      867,  449,  510,  510,  867,  510,  867,  867,  867,  510,
-      511,  511,  867,  511,  867,  867,  867,  511,  512,  512,
-      867,  512,  867,  867,  867,  512,  524,  524,  524,  867,
-      524,  867,  867,  867,  524,  525,  525,  525,  525,  867,
-
-      525,  867,  867,  867,  525,  217,  217,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  580,  580,  867,  580,
-      867,  867,  867,  580,  581,  581,  867,  581,  867,  867,
-      867,  581,  597,  597,  597,  867,  597,  867,  867,  867,
-      597,  598,  598,  598,  598,  867,  598,  867,  867,  867,
-      598,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  207,  867,  867,  207,  207,  867,  207,  194,
-      867,  867,  867,  194,  194,  867,  194,  194,  194,  867,
-
-      867,  194,  194,  642,  642,  867,  642,  867,  867,  867,
-      642,  646,  867,  646,  646,  867,  646,  867,  867,  867,
-      646,  664,  664,  664,  867,  664,  867,  867,  867,  664,
-      665,  665,  665,  665,  867,  665,  867,  867,  867,  665,
-      609,  609,  867,  867,  609,  867,  867,  867,  609,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-      207,  867,  867,  207,  207,  867,  207,  194,  867,  867,
-      867,  194,  194,  867,  194,  194,  194,  867,  867,  194,
-      194,  709,  709,  867,  709,  867,  867,  867,  709,  710,
-
-      867,  710,  710,  867,  710,  867,  867,  867,  710,  726,
-      726,  726,  867,  726,  867,  867,  867,  726,  727,  727,
-      727,  867,  867,  727,  867,  867,  867,  727,  736,  736,
-      736,  736,  736,  736,  736,  736,  736,  736,  736,  736,
-      736,  736,  736,  736,  736,  736,  736,  736,  736,  741,
-      741,  867,  741,  741,  741,  867,  741,  867,  741,  741,
-      741,  741,  867,  867,  741,  741,  741,  741,  741,  741,
-      747,  747,  867,  747,  747,  747,  867,  747,  867,  747,
-      747,  747,  747,  867,  867,  747,  747,  747,  747,  747,
-      747,  207,  867,  867,  867,  867,  867,  867,  867,  867,
-
-      867,  867,  207,  207,  867,  207,  207,  867,  207,  764,
-      764,  867,  764,  867,  867,  867,  764,  765,  867,  765,
-      765,  867,  765,  867,  867,  867,  765,  781,  781,  867,
-      867,  781,  867,  867,  867,  781,  747,  867,  867,  867,
-      867,  867,  867,  747,  867,  747,  747,  747,  747,  867,
-      867,  747,  747,  747,  747,  747,  747,  805,  805,  867,
-      805,  867,  867,  867,  805,  806,  867,  806,  806,  867,
-      806,  867,  867,  867,  806,  829,  829,  867,  829,  867,
-      867,  867,  829,  830,  867,  830,  867,  867,  830,  867,
-      867,  867,  830,  834,  834,  834,  834,  834,  834,  834,
-
-      834,  834,  834,  834,  834,  834,  834,  834,  834,  834,
-      834,  834,  834,  834,   15,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867
+      183,  183,  183,  183,  185,  185,  315,  185,  314,  185,
+      185,  185,  185,  185,  185,  185,  185,  185,  185,  185,
+      185,  185,  185,  185,  185,  191,  313,  312,  311,  310,
+      191,  130,  191,  122,  191,  191,  191,  191,  191,  110,
+
+      191,  191,  191,  191,  191,  191,  195,  110,  288,  287,
+      286,  285,  278,  195,  277,  195,  195,  195,  195,  276,
+      195,  195,  195,  195,  195,  195,  195,  198,  275,  274,
+      198,  198,  881,  198,  198,  197,  198,  198,  198,  198,
+      267,  198,  198,  198,  198,  198,  198,  198,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  220,
+      220,  185,  220,  220,  220,  220,  220,  220,  220,  220,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
+      120,  186,  180,  120,  120,  180,  120,  120,  172,  120,
+
+      120,  120,  120,  265,  165,  120,  120,  120,  120,  120,
+      120,  129,  129,  165,  129,  258,  257,  256,  129,  228,
+      228,  255,  228,  254,  251,  250,  228,  230,  230,  230,
+      249,  230,  248,  247,  246,  230,  166,  238,  237,  166,
+      166,  236,  166,  166,  235,  166,  166,  166,  166,  234,
+      233,  166,  166,  166,  166,  166,  166,  167,  130,  105,
+      167,  167,  130,  167,  167,  199,  167,  167,  167,  167,
+      118,  221,  167,  167,  167,  167,  167,  167,  171,  110,
+      108,  171,  171,  107,  171,  171,  106,  171,  171,  171,
+      171,  216,  171,  171,  171,  215,  171,  171,  171,  179,
+
+      214,  213,  179,  212,  207,  179,  179,  186,  179,  179,
+      179,  179,  179,  180,  179,  179,  179,  179,  179,  179,
+      185,  185,  172,  185,  140,  185,  185,  185,  185,  185,
+      185,  185,  185,  185,  185,  185,  185,  185,  185,  185,
+      185,  194,  169,  137,  165,  164,  161,  159,  194,  143,
+      194,  194,  194,  194,  142,  139,  194,  194,  194,  194,
+      194,  194,  195,  138,  132,  130,  118,  108,  107,  195,
+      106,  195,  195,  195,  195,  881,  195,  195,  195,  195,
+      195,  195,  195,  198,  881,  881,  198,  198,  881,  198,
+      198,  881,  198,  198,  198,  198,  881,  198,  198,  198,
+
+      198,  198,  198,  198,  209,  881,  881,  209,  209,  881,
+      209,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,  289,  296,  296,  881,  296,  881,  881,  881,  296,
+      302,  302,  302,  881,  302,  881,  881,  881,  302,  369,
+      369,  881,  369,  881,  881,  881,  369,  370,  370,  881,
+      370,  881,  881,  881,  370,  374,  374,  881,  374,  881,
+      881,  881,  374,  376,  376,  376,  881,  376,  881,  881,
+      881,  376,  209,  881,  881,  209,  209,  881,  209,  447,
+      447,  881,  447,  881,  881,  881,  447,  449,  449,  881,
+
+      449,  881,  881,  881,  449,  450,  450,  881,  450,  881,
+      881,  881,  450,  452,  452,  452,  881,  452,  881,  881,
+      881,  452,  456,  456,  456,  456,  881,  456,  881,  881,
+      881,  456,  519,  519,  881,  519,  881,  881,  881,  519,
+      520,  520,  881,  520,  881,  881,  881,  520,  521,  521,
+      881,  521,  881,  881,  881,  521,  533,  533,  533,  881,
+      533,  881,  881,  881,  533,  534,  534,  534,  534,  881,
+      534,  881,  881,  881,  534,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  591,  591,  881,  591,
+
+      881,  881,  881,  591,  592,  592,  881,  592,  881,  881,
+      881,  592,  608,  608,  608,  881,  608,  881,  881,  881,
+      608,  609,  609,  609,  609,  881,  609,  881,  881,  881,
+      609,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  209,  881,  881,  209,  209,  881,  209,  196,
+      881,  881,  881,  196,  196,  881,  196,  196,  196,  881,
+      881,  196,  196,  655,  655,  881,  655,  881,  881,  881,
+      655,  659,  881,  659,  659,  881,  659,  881,  881,  881,
+      659,  677,  677,  677,  881,  677,  881,  881,  881,  677,
+
+      678,  678,  678,  678,  881,  678,  881,  881,  881,  678,
+      620,  620,  881,  881,  620,  881,  881,  881,  620,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      209,  881,  881,  209,  209,  881,  209,  196,  881,  881,
+      881,  196,  196,  881,  196,  196,  196,  881,  881,  196,
+      196,  723,  723,  881,  723,  881,  881,  881,  723,  724,
+      881,  724,  724,  881,  724,  881,  881,  881,  724,  740,
+      740,  740,  881,  740,  881,  881,  881,  740,  741,  741,
+      741,  881,  881,  741,  881,  881,  881,  741,  750,  750,
+
+      750,  750,  750,  750,  750,  750,  750,  750,  750,  750,
+      750,  750,  750,  750,  750,  750,  750,  750,  750,  755,
+      755,  881,  755,  755,  755,  881,  755,  881,  755,  755,
+      755,  755,  881,  881,  755,  755,  755,  755,  755,  755,
+      761,  761,  881,  761,  761,  761,  881,  761,  881,  761,
+      761,  761,  761,  881,  881,  761,  761,  761,  761,  761,
+      761,  209,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  209,  209,  881,  209,  209,  881,  209,  778,
+      778,  881,  778,  881,  881,  881,  778,  779,  881,  779,
+      779,  881,  779,  881,  881,  881,  779,  795,  795,  881,
+
+      881,  795,  881,  881,  881,  795,  761,  881,  881,  881,
+      881,  881,  881,  761,  881,  761,  761,  761,  761,  881,
+      881,  761,  761,  761,  761,  761,  761,  819,  819,  881,
+      819,  881,  881,  881,  819,  820,  881,  820,  820,  881,
+      820,  881,  881,  881,  820,  843,  843,  881,  843,  881,
+      881,  881,  843,  844,  881,  844,  881,  881,  844,  881,
+      881,  881,  844,  848,  848,  848,  848,  848,  848,  848,
+      848,  848,  848,  848,  848,  848,  848,  848,  848,  848,
+      848,  848,  848,  848,   15,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881
     } ;
 
-static yyconst short int yy_chk[5687] =
+static yyconst short int yy_chk[5657] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1313,624 +1316,621 @@ static yyconst short int yy_chk[5687] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,   51,    3,   80,    2,   36,    3,   42,   37,
-       54,    4,   37,    3,   52,    4,    3,   36,    5,    5,
-        5,    4,    5,   42,    4,   45,   93,   51,    5,   39,
-
-       22,    2,    2,   52,   39,  861,    2,   93,   54,   45,
-      129,    3,    5,    5,    2,    3,    3,    2,    3,    4,
-       22,  129,   56,    4,    4,   80,    4,    6,    6,    6,
-       74,    6,   56,   11,   11,   11,   11,    6,   76,    5,
-        3,   12,   12,   12,   12,   27,   27,   22,    4,   27,
-       27,    6,    6,   70,   70,  161,   74,    9,    9,    9,
-        9,    9,   78,   78,   76,  161,    9,    9,    9,   27,
-       30,   30,   30,   30,   30,   30,   81,   48,    6,    7,
-        7,    7,    9,    7,   11,  147,   48,  147,   62,  103,
-       83,   83,   12,   83,   27,   48,   94,   62,  103,   94,
-
-      853,   10,   10,   10,   10,   10,   62,  852,    9,   84,
-       10,   10,   10,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,  148,   49,   81,   10,  288,  148,   84,
+        1,    2,   54,    3,   56,    2,   37,    3,   51,   37,
+      875,    4,   36,    3,   56,    4,    3,   11,   11,   11,
+       11,    4,   22,   36,    4,   12,   12,   12,   12,   39,
+
+       54,    2,    2,   51,   39,   42,    2,   81,   45,   71,
+       71,    3,   22,    3,    2,    3,    3,    2,    3,    4,
+       42,    4,   45,    4,    4,   82,    4,    5,    5,    5,
+       52,    5,    6,    6,    6,   48,    6,    5,   11,   22,
+        3,   63,    6,   75,   48,  104,   12,  867,    4,   52,
+       63,    5,    5,   48,  104,   77,    6,    6,   81,   63,
+       79,   79,    9,    9,    9,    9,    9,   84,   84,   75,
+       84,    9,    9,    9,   82,   27,   27,  149,    5,   27,
+       27,   77,  149,    6,    7,    7,    7,    9,    7,   29,
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   27,
+
+       30,   30,   30,   30,   30,   30,   10,   10,   10,   10,
+       10,  159,  253,    9,   85,   10,   10,   10,   90,   90,
+       90,   90,   90,   90,   27,   95,  253,  159,   95,   49,
+      148,   10,  148,  156,   85,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    7,    7,    7,    7,    7,    7,    7,    8,
-        8,    8,   10,    8,   49,   49,   84,  171,  171,   49,
-       89,   89,   89,   89,   89,   89,  288,   49,  175,  175,
-       49,   88,   88,   88,   88,   88,   88,   88,   88,   88,
-       88,  110,  110,  110,  110,  110,  110,  110,  110,  110,
-      110,  127,  127,  127,  127,  127,  127,  187,  187,  851,
+        7,    7,    7,    7,    8,    8,    8,   10,    8,   49,
+       49,   85,   94,  130,   49,  128,  128,  128,  128,  128,
+      128,  295,   49,   94,  130,   49,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  156,  161,  295,  170,
 
+      173,  173,  866,  161,  170,    8,    8,    8,    8,    8,
         8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,    8,    8,    8,    8,    8,   13,
-       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+        8,    8,    8,    8,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
-       21,  160,  145,  145,  260,  838,  260,  160,  157,  155,
-
-       21,  156,  185,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   28,  156,   28,   28,   28,   28,   28,
-       28,   28,   28,   28,   28,   28,  296,  296,  296,   28,
-       28,   28,   28,   28,   28,  159,  250,   59,   59,  138,
-      138,   59,   59,  145,  157,  138,  138,  158,  159,  138,
-      250,  138,   28,  185,   28,   28,   28,   28,   28,   28,
-       34,   59,  155,  158,  284,  284,   34,  284,  837,   34,
-       34,  336,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   34,   34,   34,   34,   59,  336,   34,   34,
+       13,   13,   13,   13,   13,   21,  491,  146,  146,  158,
+
+      177,  177,  184,  184,  187,   21,  157,  188,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   28,  157,
+       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,  160,  189,  189,   28,   28,   28,   28,   28,   28,
+      162,  230,   59,   59,  160,  158,   59,   59,  146,  260,
+      162,  491,  230,  184,  260,  187,  188,   28,  264,   28,
+       28,   28,   28,   28,   28,   34,   59,  245,  245,  865,
+      263,   34,  263,  264,   34,   34,  341,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   59,  341,   34,   34,   34,   34,   34,   34,   34,
 
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,  228,  256,  834,   38,   38,   38,   38,   38,
-       38,  259,  261,  228,  292,   38,  111,  111,  111,  111,
-      111,  111,  111,  111,  111,  111,  333,  261,  259,  831,
-       38,   38,   38,   38,   38,   38,   46,   46,   46,   46,
-       46,  292,   46,   46,  334,  334,   46,  125,  125,  125,
-      125,  125,  125,  125,  125,  125,  125,  256,  186,  168,
-
-       46,   46,   46,   47,  168,   47,   47,   47,   47,   47,
-       47,   47,   47,   47,   47,   50,   68,   68,   68,  112,
-       68,  307,  114,  436,   68,   50,   68,  333,   50,   50,
-       50,   50,   50,   50,   50,   50,   50,   50,  257,  112,
-       68,   68,  114,  257,  484,  307,  105,  186,  105,  105,
-      105,   85,  105,  105,  402,  178,  105,   85,  178,  178,
-       85,  484,  436,   85,   85,  178,  112,   68,  189,  114,
-      105,  105,  105,  182,  182,   50,   69,   85,  310,   85,
-      178,  190,  311,  310,  326,  263,   69,  402,  189,   69,
-       69,   69,   69,   69,   69,   69,   69,   69,   69,  263,
-
-      479,  190,  347,   85,   85,   86,  311,  347,   86,   86,
-      479,   86,   86,   86,   86,  189,  299,   86,   86,  115,
-      326,  115,  115,  404,  182,  115,  115,  299,  190,  115,
-      403,   86,   86,   86,  126,  126,  126,  126,  126,  126,
-      126,  126,  126,  126,  115,  115,  163,  163,  163,  163,
-      163,  163,  163,  163,  163,  163,  404,   86,   86,   87,
-      562,  403,   87,   87,   87,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,  562,  345,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-
-       87,  345,  829,   87,   87,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-       90,  348,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,  485,  573,  573,   90,   90,   90,   90,
-       90,   90,  371,  485,  117,  348,  117,  117,  117,  324,
-      117,  117,  324,  371,  117,  203,  203,  203,  203,  203,
-      203,   90,   90,   90,   90,   90,   90,   91,  117,  117,
-      117,   91,   91,   91,   91,   91,   91,   91,   91,   91,
-       91,   91,   91,   91,  324,  384,   91,   91,   91,   91,
-       91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
-
-       91,   91,   91,   91,   91,   91,   91,   91,   91,  384,
-       91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
-       91,   91,   91,   91,   91,   91,   91,   91,   95,   95,
-       95,   95,   95,   95,   95,   95,   95,   95,   95,  611,
-      820,  611,   95,   95,   95,   95,   95,   95,  406,  482,
-      118,  118,   95,  406,  118,  118,  174,  174,  174,  174,
-      174,  174,  174,  174,  174,  174,  390,   95,   95,   95,
-       95,   95,   95,  101,  118,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  120,  819,  120,  120,  120,
-      390,  120,  120,  149,  327,  120,  212,  212,  325,  118,
-
-      327,  337,  212,  212,  482,  405,  212,  337,  212,  120,
-      120,  120,  121,  121,  121,  121,  121,  121,  121,  121,
-      121,  121,  197,  149,  149,  411,  197,  325,  149,  542,
-      357,  545,  197,  357,  412,  542,  149,  165,  165,  149,
-      405,  165,  165,  545,  818,  412,  197,  197,  411,  121,
-      122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
-      615,  165,  615,  465,  122,  122,  122,  122,  122,  122,
-      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
-      223,  223,  223,  223,  223,  223,  165,  465,  699,  122,
-      122,  122,  122,  122,  122,  130,  130,  130,  130,  130,
-
-      130,  130,  130,  130,  130,  130,  335,  809,  465,  130,
-      130,  130,  130,  130,  130,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  249,  249,  699,  249,  291,
-      291,  291,  291,  335,  130,  130,  130,  130,  130,  130,
+       34,   34,   34,   34,   34,   34,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,  291,  259,  418,
+       38,   38,   38,   38,   38,   38,  262,  266,  339,  339,
+       38,  112,  112,  112,  112,  112,  112,  112,  112,  112,
+      112,  266,  418,  262,  330,   38,   38,   38,   38,   38,
+       38,   46,   46,   46,   46,   46,  291,   46,   46,  852,
+      331,   46,  126,  126,  126,  126,  126,  126,  126,  126,
+
+      126,  126,  259,  330,  310,   46,   46,   46,   47,  851,
+       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
+       50,   69,   69,   69,  113,   69,  331,  115,  310,   69,
+       50,   69,  191,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,  417,  113,   69,   69,  115,  299,  299,
+      299,  106,  191,  106,  106,  106,   86,  106,  106,  409,
+      180,  106,   86,  180,  180,   86,  314,  302,   86,   86,
+      180,  113,   69,  192,  115,  106,  106,  106,  302,  191,
+       50,   70,   86,  313,   86,  180,  252,  252,  313,  252,
+      314,   70,  409,  192,   70,   70,   70,   70,   70,   70,
+
+       70,   70,   70,   70,  287,  287,  332,  287,   86,   86,
+       87,  417,  332,   87,   87,  488,   87,   87,   87,   87,
+      192,  252,   87,   87,  116,  488,  116,  116,  352,  342,
+      116,  116,  848,  352,  116,  342,   87,   87,   87,  127,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  116,
+      116,  164,  164,  164,  164,  164,  164,  164,  164,  164,
+      164,  413,   87,   87,   88,  338,  413,   88,   88,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,  845,  350,   88,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+
+       88,   88,   88,   88,   88,   88,  350,  410,   88,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,   88,   91,  338,   91,   91,   91,
+       91,   91,   91,   91,   91,   91,   91,   91,  410,  584,
+      584,   91,   91,   91,   91,   91,   91,  362,  494,  118,
+      362,  118,  118,  118,  329,  118,  118,  329,  494,  118,
+      205,  205,  205,  205,  205,  205,   91,   91,   91,   91,
+       91,   91,   92,  118,  118,  118,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,  329,
+      353,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,  353,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   96,   96,   96,   96,   96,   96,   96,
+       96,   96,   96,   96,  550,  623,  623,   96,   96,   96,
+       96,   96,   96,  420,  550,  119,  119,   96,  420,  119,
+      119,  176,  176,  176,  176,  176,  176,  176,  176,  176,
+      176,  389,   96,   96,   96,   96,   96,   96,  102,  119,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      121,  376,  121,  121,  121,  389,  121,  121,  680,  680,
+
+      121,  150,  376,  412,  119,  225,  225,  225,  225,  225,
+      225,  395,  493,  443,  121,  121,  121,  122,  122,  122,
+      122,  122,  122,  122,  122,  122,  122,  139,  139,  493,
+      843,  150,  150,  139,  139,  395,  150,  139,  412,  139,
+      139,  166,  166,  834,  150,  166,  166,  150,  294,  294,
+      294,  294,  443,  411,  122,  123,  123,  123,  123,  123,
+      123,  123,  123,  123,  123,  166,  340,  378,  378,  123,
+      123,  123,  123,  123,  123,  169,  169,  380,  380,  378,
+      419,  169,  169,  505,  833,  169,  411,  169,  505,  380,
+      166,  419,  832,  340,  123,  123,  123,  123,  123,  123,
+
       131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  335,  410,  557,  131,  131,  131,  131,  131,  131,
-      249,  167,  546,  167,  167,  167,  546,  167,  167,  808,
-      557,  167,  303,  303,  303,  303,  303,  303,  445,  131,
-      131,  131,  131,  131,  131,  167,  167,  167,  191,  445,
-      191,  191,  449,  193,  191,  191,  373,  373,  191,  193,
-
-      375,  375,  193,  449,  413,  193,  193,  262,  373,  413,
-      496,  262,  375,  191,  191,  496,  806,  262,  560,  193,
-      410,  193,  576,  195,  805,  195,  195,  195,  466,  195,
-      195,  262,  262,  195,  202,  202,  202,  202,  202,  202,
-      202,  202,  202,  202,  483,  193,  193,  195,  195,  195,
-      196,  541,  466,  196,  196,  483,  196,  196,  196,  196,
-      576,  541,  196,  196,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  219,  560,  464,  196,  196,  196,  220,
-      220,  220,  220,  220,  220,  220,  220,  220,  220,  222,
-      222,  222,  222,  222,  222,  222,  222,  222,  222,  464,
-
-      612,  612,  196,  196,  199,  199,  199,  199,  199,  199,
-      199,  199,  199,  199,  622,  803,  622,  464,  199,  199,
-      199,  199,  199,  199,  300,  300,  300,  300,  300,  300,
-      300,  300,  300,  300,  342,  563,  342,  342,  342,  342,
-      342,  342,  469,  199,  199,  199,  199,  199,  199,  204,
-      667,  667,  563,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  204,  469,  472,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      204,  472,  204,  204,  204,  204,  204,  204,  204,  204,
-
-      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  802,  473,  491,  205,  205,  205,  205,  205,  205,
-      302,  302,  302,  302,  302,  302,  302,  302,  302,  302,
-      381,  381,  381,  381,  381,  381,  473,  491,  801,  205,
-      205,  205,  205,  205,  205,  221,  791,  221,  221,  221,
-      221,  221,  221,  221,  221,  221,  221,  338,  338,  338,
-      338,  338,  338,  338,  338,  338,  338,  372,  372,  372,
-      372,  372,  372,  372,  372,  372,  372,  459,  459,  459,
-      459,  459,  459,  672,  221,  224,  672,  224,  224,  224,
-
-      224,  224,  224,  224,  224,  224,  224,  470,  494,  497,
-      463,  224,  224,  224,  224,  224,  224,  374,  374,  374,
-      374,  374,  374,  374,  374,  374,  374,  641,  641,  641,
-      467,  470,  494,  497,  463,  790,  224,  224,  224,  224,
-      224,  224,  227,  227,  227,  227,  227,  227,  227,  227,
-      227,  227,  227,  463,  467,  470,  227,  227,  227,  227,
-      227,  227,  378,  378,  378,  378,  378,  378,  378,  378,
-      674,  467,  674,  490,  378,  490,  490,  490,  490,  490,
-      490,  227,  227,  227,  227,  227,  227,  229,  229,  229,
-      229,  229,  229,  229,  229,  229,  229,  229,  229,  621,
-
-      621,  781,  229,  229,  229,  229,  229,  229,  380,  380,
-      380,  380,  380,  380,  380,  380,  380,  380,  439,  779,
-      439,  439,  439,  439,  439,  439,  778,  229,  229,  229,
-      229,  229,  229,  230,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  450,  450,  777,  230,  230,  230,
-      230,  230,  230,  451,  451,  621,  450,  439,  453,  453,
-      524,  668,  668,  550,  614,  451,  474,  500,  550,  614,
-      453,  524,  230,  230,  230,  230,  230,  230,  231,  231,
-      231,  231,  231,  231,  231,  231,  231,  231,  231,  501,
-      474,  500,  231,  231,  231,  231,  231,  231,  452,  452,
-
-      452,  452,  452,  452,  452,  452,  452,  452,  677,  677,
-      678,  474,  733,  501,  733,  678,  765,  231,  231,  231,
-      231,  231,  231,  267,  471,  267,  267,  267,  267,  267,
-      267,  267,  267,  267,  267,  268,  268,  268,  268,  268,
-      268,  268,  268,  268,  268,  268,  572,  764,  471,  268,
-      268,  268,  268,  268,  268,  456,  456,  456,  456,  456,
-      456,  456,  456,  572,  471,  762,  538,  456,  509,  509,
-      509,  509,  509,  509,  268,  268,  268,  268,  268,  268,
-      270,  270,  270,  270,  270,  270,  270,  270,  270,  270,
-      538,  685,  685,  761,  270,  270,  270,  270,  270,  270,
-
-      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
-      754,  468,  516,  516,  516,  516,  516,  516,  752,  270,
-      270,  270,  270,  270,  270,  287,  287,  287,  287,  287,
-      287,  287,  287,  287,  287,  468,  486,  486,  486,  486,
-      486,  486,  486,  486,  486,  486,  751,  468,  525,  526,
-      526,  523,  468,  523,  523,  523,  523,  523,  523,  525,
-      750,  526,  287,  295,  295,  295,  295,  295,  295,  295,
-      295,  295,  295,  295,  301,  301,  301,  301,  301,  301,
-      301,  301,  301,  301,  301,  301,  301,  747,  543,  548,
-      301,  301,  301,  301,  301,  301,  508,  508,  508,  508,
-
-      508,  508,  508,  508,  508,  508,  535,  535,  535,  535,
-      535,  535,  543,  548,  745,  301,  301,  301,  301,  301,
-      301,  304,  304,  304,  304,  304,  304,  304,  304,  304,
-      304,  304,  304,  740,  552,  554,  304,  304,  304,  304,
-      304,  304,  513,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  579,  579,  579,  579,  527,  527,  552,  554,
-      736,  304,  304,  304,  304,  304,  304,  305,  527,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  343,
-      343,  343,  343,  343,  343,  343,  343,  343,  343,  728,
-      728,  635,  636,  343,  343,  343,  343,  343,  343,  515,
-
-      515,  515,  515,  515,  515,  515,  515,  515,  515,  591,
-      591,  591,  591,  591,  591,  635,  636,  735,  343,  343,
-      343,  343,  343,  343,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  734,  734,  675,  679,  344,  344,
-      344,  344,  344,  344,  519,  519,  519,  519,  519,  519,
-      519,  519,  519,  519,  702,  702,  702,  702,  529,  529,
-      675,  679,  729,  344,  344,  344,  344,  344,  344,  361,
-      529,  361,  361,  361,  361,  361,  361,  361,  361,  361,
-      361,  362,  583,  362,  362,  362,  362,  362,  362,  362,
-      362,  362,  362,  363,  583,  363,  363,  363,  363,  363,
-
-      363,  363,  363,  363,  363,  366,  366,  366,  366,  366,
-      366,  366,  366,  366,  366,  366,  376,  376,  376,  376,
-      376,  376,  376,  376,  376,  376,  376,  376,  376,  739,
-      613,  616,  376,  376,  376,  376,  376,  376,  528,  528,
-      528,  528,  528,  528,  528,  528,  528,  528,  608,  608,
-      608,  608,  608,  608,  613,  616,  703,  376,  376,  376,
-      376,  376,  376,  379,  379,  379,  379,  379,  379,  379,
-      379,  379,  379,  379,  379,  379,  617,  613,  616,  379,
-      379,  379,  379,  379,  379,  532,  532,  532,  532,  532,
-      532,  532,  532,  547,  739,  703,  878,  532,  673,  878,
-
-      617,  737,  737,  547,  379,  379,  379,  379,  379,  379,
-      382,  382,  382,  382,  382,  382,  382,  382,  382,  382,
-      382,  382,  673,  617,  681,  382,  382,  382,  382,  382,
-      382,  534,  534,  534,  534,  534,  534,  534,  534,  534,
-      534,  785,  727,  785,  890,  673,  551,  890,  681,  724,
-      382,  382,  382,  382,  382,  382,  383,  551,  383,  383,
-      383,  383,  383,  383,  383,  383,  383,  383,  416,  694,
-      416,  416,  416,  416,  416,  416,  416,  416,  416,  416,
-      417,  417,  417,  417,  417,  417,  417,  417,  417,  417,
-      561,  787,  787,  694,  417,  417,  417,  417,  417,  417,
-
-      561,  582,  582,  582,  582,  582,  582,  582,  582,  582,
-      582,  629,  629,  629,  629,  629,  629,  629,  723,  417,
-      417,  417,  417,  417,  417,  435,  435,  435,  435,  435,
-      435,  435,  435,  435,  435,  584,  584,  584,  584,  584,
-      584,  584,  584,  584,  584,  585,  588,  647,  588,  588,
-      588,  588,  588,  588,  816,  816,  710,  585,  588,  647,
-      686,  796,  435,  437,  648,  437,  437,  437,  437,  437,
-      437,  437,  437,  437,  437,  438,  648,  438,  438,  438,
-      438,  438,  438,  438,  438,  438,  438,  444,  444,  444,
-      444,  444,  444,  444,  444,  444,  444,  444,  709,  684,
-
-      796,  444,  444,  444,  444,  444,  444,  590,  590,  590,
-      590,  590,  590,  590,  590,  590,  590,  835,  835,  707,
-      686,  684,  597,  684,  684,  706,  444,  444,  444,  444,
-      444,  444,  448,  597,  448,  448,  448,  448,  448,  448,
-      448,  448,  448,  448,  454,  454,  454,  454,  454,  454,
-      454,  454,  454,  454,  454,  454,  454,  598,  599,  599,
-      454,  454,  454,  454,  454,  454,  600,  600,  598,  650,
-      599,  602,  602,  664,  812,  812,  812,  812,  600,  705,
-      697,  650,  730,  602,  664,  454,  454,  454,  454,  454,
-      454,  457,  457,  457,  457,  457,  457,  457,  457,  457,
-
-      457,  457,  457,  457,  697,  687,  730,  457,  457,  457,
-      457,  457,  457,  605,  605,  605,  605,  605,  605,  605,
-      605,  687,  697,  937,  937,  605,  656,  656,  656,  656,
-      656,  656,  457,  457,  457,  457,  457,  457,  460,  460,
-      460,  460,  460,  460,  460,  460,  460,  460,  460,  460,
-      623,  691,  696,  460,  460,  460,  460,  460,  460,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  881,
-      881,  881,  623,  711,  623,  623,  696,  695,  460,  460,
-      460,  460,  460,  460,  461,  711,  461,  461,  461,  461,
-      461,  461,  461,  461,  461,  461,  462,  462,  696,  623,
-
-      690,  695,  462,  938,  938,  462,  462,  683,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
-      462,  462,  695,  662,  462,  462,  462,  462,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  507,  507,  507,
-      507,  507,  507,  507,  507,  507,  507,  507,  625,  625,
-      625,  625,  625,  625,  625,  625,  625,  625,  639,  639,
-      639,  639,  639,  639,  639,  639,  639,  639,  693,  661,
-
-      693,  693,  693,  949,  949,  507,  514,  712,  514,  514,
-      514,  514,  514,  514,  514,  514,  514,  514,  514,  712,
-      968,  968,  514,  514,  514,  514,  514,  514,  640,  640,
-      640,  640,  640,  640,  640,  640,  640,  640,  663,  660,
-      663,  663,  663,  663,  663,  663,  841,  514,  514,  514,
-      514,  514,  514,  517,  517,  517,  517,  517,  517,  517,
-      517,  517,  517,  517,  646,  755,  782,  517,  517,  517,
-      517,  517,  517,  649,  649,  649,  649,  649,  649,  649,
-      649,  649,  649,  644,  908,  841,  908,  643,  665,  755,
-      782,  642,  517,  517,  517,  517,  517,  517,  518,  665,
-
-      518,  518,  518,  518,  518,  518,  518,  518,  518,  518,
-      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
-      530,  530,  530,  732,  969,  969,  530,  530,  530,  530,
-      530,  530,  653,  714,  653,  653,  653,  653,  653,  653,
-      898,  898,  898,  634,  653,  714,  688,  732,  688,  688,
-      688,  530,  530,  530,  530,  530,  530,  533,  533,  533,
-      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
-      732,  633,  631,  533,  533,  533,  533,  533,  533,  655,
-      655,  655,  655,  655,  655,  655,  655,  655,  655,  671,
-      671,  671,  671,  671,  671,  671,  671,  688,  533,  533,
-
-      533,  533,  533,  533,  536,  536,  536,  536,  536,  536,
-      536,  536,  536,  536,  536,  630,  628,  784,  756,  536,
-      536,  536,  536,  536,  536,  659,  659,  659,  659,  659,
-      659,  659,  659,  659,  659,  909,  920,  909,  920,  666,
-      666,  784,  756,  793,  536,  536,  536,  536,  536,  536,
-      537,  666,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  540,  756,  784,  627,  626,  793,  540,  746,
-      746,  540,  540,  746,  540,  540,  540,  540,  540,  540,
-      540,  540,  540,  540,  540,  540,  540,  746,  746,  746,
-      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
-
-      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
-      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
-      540,  540,  540,  540,  540,  540,  540,  540,  540,  540,
-      540,  540,  540,  566,  566,  566,  566,  566,  566,  566,
-      566,  566,  566,  566,  569,  624,  620,  766,  569,  569,
-      569,  569,  569,  569,  569,  569,  569,  569,  569,  766,
-      569,  619,  813,  569,  569,  569,  569,  569,  569,  569,
-      569,  569,  569,  569,  569,  569,  569,  569,  569,  569,
-      569,  569,  569,  569,  569,  569,  813,  569,  569,  569,
-      569,  569,  569,  569,  569,  569,  569,  569,  569,  569,
-
-      569,  569,  569,  569,  569,  575,  575,  575,  575,  575,
-      575,  575,  575,  575,  575,  689,  822,  689,  689,  689,
-      704,  704,  704,  704,  704,  704,  704,  704,  704,  704,
-      708,  618,  708,  708,  708,  708,  708,  708,  601,  921,
-      822,  921,  575,  577,  577,  577,  577,  577,  577,  577,
-      577,  577,  577,  577,  713,  713,  713,  713,  713,  713,
-      713,  713,  713,  713,  726,  717,  689,  717,  717,  717,
-      717,  717,  717,  595,  925,  726,  925,  717,  926,  594,
-      926,  577,  586,  581,  586,  586,  586,  586,  586,  586,
-      586,  586,  586,  586,  586,  589,  767,  589,  589,  589,
-
-      589,  589,  589,  589,  589,  589,  589,  589,  767,  757,
-      832,  589,  589,  589,  589,  589,  589,  719,  719,  719,
-      719,  719,  719,  719,  719,  719,  719,  720,  720,  720,
-      720,  720,  720,  757,  832,  580,  589,  589,  589,  589,
-      589,  589,  592,  592,  592,  592,  592,  592,  592,  592,
-      592,  592,  592,  574,  571,  757,  592,  592,  592,  592,
-      592,  592,  749,  749,  749,  749,  749,  749,  749,  749,
-      749,  749,  930,  741,  930,  741,  741,  741,  933,  570,
-      933,  592,  592,  592,  592,  592,  592,  593,  769,  593,
-      593,  593,  593,  593,  593,  593,  593,  593,  593,  596,
-
-      769,  596,  596,  596,  596,  596,  596,  596,  596,  596,
-      596,  603,  603,  603,  603,  603,  603,  603,  603,  603,
-      603,  603,  603,  603,  741,  794,  815,  603,  603,  603,
-      603,  603,  603,  742,  568,  742,  742,  742,  743,  807,
-      743,  743,  743,  744,  567,  744,  744,  744,  565,  794,
-      815,  807,  603,  603,  603,  603,  603,  603,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      794,  564,  559,  815,  606,  606,  606,  606,  606,  606,
-      943,  944,  943,  944,  742,  952,  953,  952,  953,  743,
-      956,  962,  956,  962,  744,  963,  965,  963,  965,  606,
-
-      606,  606,  606,  606,  606,  609,  558,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  610,  748,  556,
-      748,  748,  748,  610,  748,  748,  610,  610,  748,  610,
-      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
-      610,  610,  748,  748,  748,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  610,  610,  610,  632,  753,
-      522,  753,  753,  753,  753,  753,  753,  632,  973,  521,
-
-      973,  632,  632,  632,  632,  632,  632,  632,  632,  632,
-      632,  632,  632,  632,  520,  512,  632,  632,  632,  632,
-      632,  632,  632,  632,  632,  632,  632,  632,  632,  632,
-      632,  632,  632,  632,  632,  632,  632,  632,  632,  511,
-      632,  632,  632,  632,  632,  632,  632,  632,  632,  632,
-      632,  632,  632,  632,  632,  632,  632,  632,  638,  510,
-      638,  638,  638,  638,  638,  638,  638,  638,  638,  638,
-      768,  768,  768,  768,  768,  768,  768,  768,  768,  768,
-      772,  506,  772,  772,  772,  772,  772,  772,  971,  499,
-      498,  971,  772,  974,  977,  974,  977,  638,  645,  495,
+      131,  340,  472,  473,  131,  131,  131,  131,  131,  131,
+      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
+      306,  306,  306,  306,  306,  306,  472,  473,  823,  131,
+      131,  131,  131,  131,  131,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  132,  132,  452,  472,  571,  132,
+      132,  132,  132,  132,  132,  551,  168,  452,  168,  168,
+      168,  551,  168,  168,  822,  347,  168,  347,  347,  347,
+      347,  347,  347,  456,  132,  132,  132,  132,  132,  132,
+      168,  168,  168,  193,  456,  193,  193,  476,  195,  193,
+
+      193,  457,  457,  193,  195,  458,  458,  195,  460,  460,
+      195,  195,  199,  457,  571,  554,  199,  458,  193,  193,
+      460,  476,  199,  820,  195,  474,  195,  554,  197,  819,
+      197,  197,  197,  479,  197,  197,  199,  199,  197,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  474,
+      195,  195,  197,  197,  197,  198,  817,  479,  198,  198,
+      470,  198,  198,  198,  198,  479,  474,  198,  198,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  214,
+      214,  198,  198,  198,  470,  214,  214,  568,  574,  214,
+      816,  214,  221,  221,  221,  221,  221,  221,  221,  221,
+
+      221,  221,  555,  470,  568,  574,  555,  198,  198,  201,
+      201,  201,  201,  201,  201,  201,  201,  201,  201,  587,
+      815,  481,  482,  201,  201,  201,  201,  201,  201,  222,
+      222,  222,  222,  222,  222,  222,  222,  222,  222,  386,
+      386,  386,  386,  386,  386,  481,  482,  500,  201,  201,
+      201,  201,  201,  201,  206,  681,  681,  587,  206,  206,
+      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  500,  503,  206,  206,  206,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  503,  206,  206,  206,
+
+      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  690,  690,  483,  207,
+      207,  207,  207,  207,  207,  224,  224,  224,  224,  224,
+      224,  224,  224,  224,  224,  466,  466,  466,  466,  466,
+      466,  471,  483,  477,  207,  207,  207,  207,  207,  207,
+      223,  805,  223,  223,  223,  223,  223,  223,  223,  223,
+      223,  223,  265,  483,  478,  471,  265,  477,  573,  622,
+      700,  622,  265,  303,  303,  303,  303,  303,  303,  303,
+      303,  303,  303,  471,  573,  583,  265,  265,  478,  223,
+
+      226,  477,  226,  226,  226,  226,  226,  226,  226,  226,
+      226,  226,  583,  506,  478,  509,  226,  226,  226,  226,
+      226,  226,  305,  305,  305,  305,  305,  305,  305,  305,
+      305,  305,  804,  559,  510,  547,  480,  506,  559,  509,
+      700,  226,  226,  226,  226,  226,  226,  229,  229,  229,
+      229,  229,  229,  229,  229,  229,  229,  229,  510,  547,
+      480,  229,  229,  229,  229,  229,  229,  343,  343,  343,
+      343,  343,  343,  343,  343,  343,  343,  480,  499,  795,
+      499,  499,  499,  499,  499,  499,  229,  229,  229,  229,
+      229,  229,  231,  231,  231,  231,  231,  231,  231,  231,
+
+      231,  231,  231,  231,  793,  552,  557,  231,  231,  231,
+      231,  231,  231,  377,  377,  377,  377,  377,  377,  377,
+      377,  377,  377,  518,  518,  518,  518,  518,  518,  552,
+      557,  792,  231,  231,  231,  231,  231,  231,  232,  232,
+      232,  232,  232,  232,  232,  232,  232,  232,  232,  626,
+      791,  626,  232,  232,  232,  232,  232,  232,  379,  379,
+      379,  379,  379,  379,  379,  379,  379,  379,  446,  561,
+      446,  446,  446,  446,  446,  446,  561,  232,  232,  232,
+      232,  232,  232,  270,  563,  270,  270,  270,  270,  270,
+      270,  270,  270,  270,  270,  271,  271,  271,  271,  271,
+
+      271,  271,  271,  271,  271,  271,  779,  446,  563,  271,
+      271,  271,  271,  271,  271,  383,  383,  383,  383,  383,
+      383,  383,  383,  635,  778,  635,  565,  383,  525,  525,
+      525,  525,  525,  525,  271,  271,  271,  271,  271,  271,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      565,  654,  654,  654,  273,  273,  273,  273,  273,  273,
+      385,  385,  385,  385,  385,  385,  385,  385,  385,  385,
+      532,  562,  532,  532,  532,  532,  532,  532,  562,  273,
+      273,  273,  273,  273,  273,  290,  290,  290,  290,  290,
+      290,  290,  290,  290,  290,  459,  459,  459,  459,  459,
+
+      459,  459,  459,  459,  459,  463,  463,  463,  463,  463,
+      463,  463,  463,  590,  590,  590,  590,  463,  634,  634,
+      699,  699,  290,  298,  298,  298,  298,  298,  298,  298,
+      298,  298,  298,  298,  304,  304,  304,  304,  304,  304,
+      304,  304,  304,  304,  304,  304,  304,  776,  648,  649,
+      304,  304,  304,  304,  304,  304,  465,  465,  465,  465,
+      465,  465,  465,  465,  465,  465,  625,  685,  775,  475,
+      685,  625,  648,  649,  634,  304,  304,  304,  304,  304,
+      304,  307,  307,  307,  307,  307,  307,  307,  307,  307,
+      307,  307,  307,  475,  556,  492,  307,  307,  307,  307,
+
+      307,  307,  768,  691,  556,  475,  492,  687,  691,  687,
+      475,  495,  495,  495,  495,  495,  495,  495,  495,  495,
+      495,  307,  307,  307,  307,  307,  307,  308,  624,  308,
+      308,  308,  308,  308,  308,  308,  308,  308,  308,  348,
+      348,  348,  348,  348,  348,  348,  348,  348,  348,  742,
+      742,  766,  624,  348,  348,  348,  348,  348,  348,  517,
+      517,  517,  517,  517,  517,  517,  517,  517,  517,  544,
+      544,  544,  544,  544,  544,  624,  713,  717,  348,  348,
+      348,  348,  348,  348,  349,  349,  349,  349,  349,  349,
+      349,  349,  349,  349,  688,  765,  692,  694,  349,  349,
+
+      349,  349,  349,  349,  522,  522,  522,  522,  522,  522,
+      522,  522,  522,  522,  892,  713,  717,  892,  688,  533,
+      692,  694,  764,  349,  349,  349,  349,  349,  349,  366,
+      533,  366,  366,  366,  366,  366,  366,  366,  366,  366,
+      366,  367,  594,  367,  367,  367,  367,  367,  367,  367,
+      367,  367,  367,  368,  594,  368,  368,  368,  368,  368,
+      368,  368,  368,  368,  368,  371,  371,  371,  371,  371,
+      371,  371,  371,  371,  371,  371,  381,  381,  381,  381,
+      381,  381,  381,  381,  381,  381,  381,  381,  381,  761,
+      627,  628,  381,  381,  381,  381,  381,  381,  524,  524,
+
+      524,  524,  524,  524,  524,  524,  524,  524,  602,  602,
+      602,  602,  602,  602,  627,  628,  759,  381,  381,  381,
+      381,  381,  381,  384,  384,  384,  384,  384,  384,  384,
+      384,  384,  384,  384,  384,  384,  754,  627,  628,  384,
+      384,  384,  384,  384,  384,  528,  528,  528,  528,  528,
+      528,  528,  528,  528,  528,  619,  619,  619,  619,  619,
+      619,  747,  750,  747,  384,  384,  384,  384,  384,  384,
+      387,  387,  387,  387,  387,  387,  387,  387,  387,  387,
+      387,  387,  534,  535,  535,  387,  387,  387,  387,  387,
+      387,  536,  536,  534,  560,  535,  538,  538,  707,  572,
+
+      707,  707,  707,  536,  749,  560,  748,  748,  538,  572,
+      387,  387,  387,  387,  387,  387,  388,  596,  388,  388,
+      388,  388,  388,  388,  388,  388,  388,  388,  423,  596,
+      423,  423,  423,  423,  423,  423,  423,  423,  423,  423,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      751,  751,  743,  708,  424,  424,  424,  424,  424,  424,
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+      642,  642,  642,  642,  642,  642,  642,  708,  741,  424,
+      424,  424,  424,  424,  424,  442,  442,  442,  442,  442,
+      442,  442,  442,  442,  442,  541,  541,  541,  541,  541,
+
+      541,  541,  541,  630,  701,  801,  801,  541,  543,  543,
+      543,  543,  543,  543,  543,  543,  543,  543,  630,  799,
+      701,  799,  442,  444,  660,  444,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  445,  660,  445,  445,  445,
+      445,  445,  445,  445,  445,  445,  445,  451,  451,  451,
+      451,  451,  451,  451,  451,  451,  451,  451,  922,  698,
+      922,  451,  451,  451,  451,  451,  451,  593,  593,  593,
+      593,  593,  593,  593,  593,  593,  593,  716,  716,  716,
+      716,  698,  608,  698,  698,  738,  451,  451,  451,  451,
+      451,  451,  455,  608,  455,  455,  455,  455,  455,  455,
+
+      455,  455,  455,  455,  461,  461,  461,  461,  461,  461,
+      461,  461,  461,  461,  461,  461,  461,  636,  753,  744,
+      461,  461,  461,  461,  461,  461,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  830,  830,  737,  636,
+      686,  636,  636,  744,  724,  461,  461,  461,  461,  461,
+      461,  464,  464,  464,  464,  464,  464,  464,  464,  464,
+      464,  464,  464,  464,  686,  709,  636,  464,  464,  464,
+      464,  464,  464,  599,  661,  599,  599,  599,  599,  599,
+      599,  849,  849,  753,  723,  599,  661,  686,  904,  709,
+      810,  904,  464,  464,  464,  464,  464,  464,  467,  467,
+
+      467,  467,  467,  467,  467,  467,  467,  467,  467,  467,
+      709,  721,  710,  467,  467,  467,  467,  467,  467,  601,
+      601,  601,  601,  601,  601,  601,  601,  601,  601,  810,
+      826,  826,  826,  826,  609,  746,  710,  769,  467,  467,
+      467,  467,  467,  467,  468,  609,  468,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  469,  469,  710,  746,
+      720,  769,  469,  951,  951,  469,  469,  719,  469,  469,
+      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
+      469,  469,  746,  705,  469,  469,  469,  469,  469,  469,
+      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
+
+      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
+      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
+      469,  469,  469,  469,  469,  469,  469,  516,  516,  516,
+      516,  516,  516,  516,  516,  516,  516,  516,  610,  610,
+      611,  611,  613,  613,  669,  669,  669,  669,  669,  669,
+      610,  663,  611,  677,  613,  616,  616,  616,  616,  616,
+      616,  616,  616,  663,  677,  516,  523,  616,  523,  523,
+      523,  523,  523,  523,  523,  523,  523,  523,  523,  895,
+      895,  895,  523,  523,  523,  523,  523,  523,  618,  618,
+      618,  618,  618,  618,  618,  618,  618,  618,  676,  704,
+
+      676,  676,  676,  676,  676,  676,  855,  523,  523,  523,
+      523,  523,  523,  526,  526,  526,  526,  526,  526,  526,
+      526,  526,  526,  526,  697,  796,  807,  526,  526,  526,
+      526,  526,  526,  638,  638,  638,  638,  638,  638,  638,
+      638,  638,  638,  696,  923,  855,  923,  675,  678,  796,
+      807,  674,  526,  526,  526,  526,  526,  526,  527,  678,
+      527,  527,  527,  527,  527,  527,  527,  527,  527,  527,
+      539,  539,  539,  539,  539,  539,  539,  539,  539,  539,
+      539,  539,  539,  912,  912,  912,  539,  539,  539,  539,
+      539,  539,  652,  652,  652,  652,  652,  652,  652,  652,
+
+      652,  652,  684,  684,  684,  684,  684,  684,  684,  684,
+      673,  539,  539,  539,  539,  539,  539,  542,  542,  542,
+      542,  542,  542,  542,  542,  542,  542,  542,  542,  542,
+      659,  770,  771,  542,  542,  542,  542,  542,  542,  653,
+      653,  653,  653,  653,  653,  653,  653,  653,  653,  657,
+      702,  798,  702,  702,  702,  770,  771,  656,  542,  542,
+      542,  542,  542,  542,  545,  545,  545,  545,  545,  545,
+      545,  545,  545,  545,  545,  798,  770,  655,  771,  545,
+      545,  545,  545,  545,  545,  662,  662,  662,  662,  662,
+      662,  662,  662,  662,  662,  934,  647,  934,  798,  679,
+
+      679,  702,  827,  836,  545,  545,  545,  545,  545,  545,
+      546,  679,  546,  546,  546,  546,  546,  546,  546,  546,
+      546,  546,  549,  935,  646,  935,  827,  836,  549,  760,
+      760,  549,  549,  760,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  549,  549,  549,  549,  760,  760,  760,
+      549,  549,  549,  549,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  549,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  549,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  549,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  577,  577,  577,  577,  577,  577,  577,
+
+      577,  577,  577,  577,  580,  952,  952,  725,  580,  580,
+      580,  580,  580,  580,  580,  580,  580,  580,  580,  725,
+      580,  644,  846,  580,  580,  580,  580,  580,  580,  580,
+      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
+      580,  580,  580,  580,  580,  580,  846,  580,  580,  580,
+      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
+      580,  580,  580,  580,  580,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  666,  643,  666,  666,  666,
+      666,  666,  666,  939,  641,  939,  726,  666,  668,  668,
+      668,  668,  668,  668,  668,  668,  668,  668,  726,  963,
+
+      963,  711,  586,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  672,  672,  672,  672,  672,  672,
+      672,  672,  672,  672,  985,  711,  703,  985,  703,  703,
+      703,  718,  718,  718,  718,  718,  718,  718,  718,  718,
+      718,  588,  597,  711,  597,  597,  597,  597,  597,  597,
+      597,  597,  597,  597,  597,  600,  728,  600,  600,  600,
+      600,  600,  600,  600,  600,  600,  600,  600,  728,  982,
+      982,  600,  600,  600,  600,  600,  600,  703,  722,  640,
+      722,  722,  722,  722,  722,  722,  727,  727,  727,  727,
+      727,  727,  727,  727,  727,  727,  600,  600,  600,  600,
+
+      600,  600,  603,  603,  603,  603,  603,  603,  603,  603,
+      603,  603,  603,  940,  639,  940,  603,  603,  603,  603,
+      603,  603,  731,  637,  731,  731,  731,  731,  731,  731,
+      944,  947,  944,  947,  731,  734,  734,  734,  734,  734,
+      734,  603,  603,  603,  603,  603,  603,  604,  780,  604,
+      604,  604,  604,  604,  604,  604,  604,  604,  604,  607,
+      780,  607,  607,  607,  607,  607,  607,  607,  607,  607,
+      607,  614,  614,  614,  614,  614,  614,  614,  614,  614,
+      614,  614,  614,  614,  633,  829,  808,  614,  614,  614,
+      614,  614,  614,  733,  733,  733,  733,  733,  733,  733,
+
+      733,  733,  733,  755,  632,  755,  755,  755,  631,  829,
+      808,  629,  614,  614,  614,  614,  614,  614,  617,  617,
+      617,  617,  617,  617,  617,  617,  617,  617,  617,  617,
+      740,  808,  829,  612,  617,  617,  617,  617,  617,  617,
+      781,  740,  763,  763,  763,  763,  763,  763,  763,  763,
+      763,  763,  781,  756,  755,  756,  756,  756,  606,  617,
+      617,  617,  617,  617,  617,  620,  783,  620,  620,  620,
+      620,  620,  620,  620,  620,  620,  620,  621,  783,  957,
+      958,  957,  958,  621,  983,  983,  621,  621,  605,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+
+      621,  621,  592,  591,  756,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  645,  767,
+      585,  767,  767,  767,  767,  767,  767,  645,  966,  582,
+      966,  645,  645,  645,  645,  645,  645,  645,  645,  645,
+      645,  645,  645,  645,  581,  579,  645,  645,  645,  645,
+      645,  645,  645,  645,  645,  645,  645,  645,  645,  645,
+      645,  645,  645,  645,  645,  645,  645,  645,  645,  578,
 
       645,  645,  645,  645,  645,  645,  645,  645,  645,  645,
-      651,  493,  651,  651,  651,  651,  651,  651,  651,  651,
-      651,  651,  651,  654,  492,  654,  654,  654,  654,  654,
-      654,  654,  654,  654,  654,  654,  978,  489,  978,  654,
-      654,  654,  654,  654,  654,  774,  774,  774,  774,  774,
-      774,  774,  774,  774,  774,  775,  775,  775,  775,  775,
-      775,  983,  488,  983,  654,  654,  654,  654,  654,  654,
-      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
-      657,  984,  487,  984,  657,  657,  657,  657,  657,  657,
-      780,  780,  780,  780,  780,  780,  780,  788,  788,  788,
-
-      788,  788,  788,  788,  788,  788,  788,  481,  480,  657,
-      657,  657,  657,  657,  657,  658,  478,  658,  658,  658,
-      658,  658,  658,  658,  658,  658,  658,  669,  669,  669,
-      669,  669,  669,  669,  669,  669,  669,  669,  669,  692,
-      477,  692,  692,  692,  692,  692,  692,  692,  692,  692,
-      692,  698,  698,  698,  698,  698,  698,  698,  698,  698,
-      698,  789,  789,  789,  789,  789,  789,  789,  789,  789,
-      789,  799,  476,  799,  799,  799,  799,  799,  799,  804,
-      475,  804,  804,  804,  804,  804,  804,  447,  698,  700,
-      446,  700,  700,  700,  700,  700,  700,  700,  700,  700,
-
-      700,  821,  443,  821,  821,  821,  821,  821,  821,  442,
-      799,  800,  800,  800,  800,  800,  800,  800,  800,  800,
-      800,  848,  848,  848,  848,  848,  848,  441,  700,  715,
-      440,  715,  715,  715,  715,  715,  715,  715,  715,  715,
-      715,  715,  718,  434,  718,  718,  718,  718,  718,  718,
-      718,  718,  718,  718,  718,  433,  432,  431,  718,  718,
-      718,  718,  718,  718,  817,  817,  817,  817,  817,  817,
-      817,  817,  817,  817,  854,  430,  854,  854,  854,  854,
-      854,  854,  429,  718,  718,  718,  718,  718,  718,  721,
-      721,  721,  721,  721,  721,  721,  721,  721,  721,  428,
-
-      427,  426,  425,  721,  721,  721,  721,  721,  721,  826,
-      826,  826,  826,  826,  826,  826,  826,  826,  826,  844,
-      424,  844,  844,  844,  844,  844,  844,  423,  721,  721,
-      721,  721,  721,  721,  722,  422,  722,  722,  722,  722,
-      722,  722,  722,  722,  722,  722,  725,  725,  725,  725,
-      725,  725,  725,  725,  725,  725,  725,  758,  844,  758,
-      758,  758,  758,  758,  758,  758,  758,  758,  758,  759,
-      421,  759,  759,  759,  759,  759,  759,  759,  759,  759,
-      759,  760,  420,  760,  760,  760,  760,  760,  760,  760,
-      760,  760,  760,  763,  419,  763,  763,  763,  763,  763,
-
-      763,  763,  763,  763,  763,  770,  418,  770,  770,  770,
-      770,  770,  770,  770,  770,  770,  770,  770,  773,  415,
-      773,  773,  773,  773,  773,  773,  773,  773,  773,  773,
-      414,  409,  408,  407,  773,  773,  773,  773,  773,  773,
-      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
-      401,  400,  398,  863,  863,  863,  863,  863,  863,  773,
-      773,  773,  773,  773,  773,  776,  397,  776,  776,  776,
-      776,  776,  776,  776,  776,  776,  776,  792,  396,  792,
-      792,  792,  792,  792,  792,  792,  792,  792,  792,  795,
-      863,  795,  795,  795,  795,  795,  795,  795,  795,  795,
-
-      795,  797,  395,  797,  797,  797,  797,  797,  797,  797,
-      797,  797,  797,  798,  394,  798,  798,  798,  798,  798,
-      798,  798,  798,  798,  798,  810,  393,  810,  810,  810,
-      810,  810,  810,  810,  810,  810,  810,  823,  392,  823,
-      823,  823,  823,  823,  823,  823,  823,  823,  823,  824,
-      389,  824,  824,  824,  824,  824,  824,  824,  824,  824,
-      824,  825,  388,  825,  825,  825,  825,  825,  825,  825,
-      825,  825,  825,  828,  828,  828,  828,  828,  828,  828,
-      828,  828,  828,  839,  387,  839,  839,  839,  839,  839,
-      839,  839,  839,  839,  839,  840,  386,  840,  840,  840,
-
-      840,  840,  840,  840,  840,  840,  840,  842,  370,  842,
-      842,  842,  842,  842,  842,  842,  842,  842,  842,  843,
-      369,  843,  843,  843,  843,  843,  843,  843,  843,  843,
-      843,  846,  846,  846,  846,  846,  846,  846,  846,  846,
-      846,  847,  847,  847,  847,  847,  847,  847,  847,  847,
-      847,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  858,  858,  858,  858,  858,  858,  858,  858,  858,
-      858,  859,  859,  859,  859,  859,  859,  859,  859,  859,
-      859,  866,  866,  866,  866,  866,  866,  368,  855,  856,
-
-      856,  856,  856,  856,  856,  856,  856,  856,  856,  860,
-      860,  860,  860,  860,  860,  860,  860,  860,  860,  865,
-      865,  865,  865,  865,  865,  865,  865,  865,  865,  367,
-      365,  364,  360,  359,  358,  356,  856,  857,  857,  857,
-      857,  857,  857,  857,  857,  857,  857,  982,  355,  354,
-      982,  353,  352,  351,  982,  350,  349,  346,  341,  340,
-      339,  332,  331,  330,  329,  328,  322,  321,  319,  318,
-      317,  316,  315,  314,  857,  862,  862,  862,  862,  862,
-      862,  862,  862,  862,  862,  313,  312,  309,  308,  306,
-      298,  297,  294,  293,  286,  285,  283,  282,  281,  280,
-
-      279,  278,  277,  276,  275,  274,  273,  272,  269,  266,
-      265,  264,  862,  868,  868,  868,  868,  868,  868,  868,
-      868,  868,  868,  868,  868,  868,  868,  868,  868,  868,
-      868,  868,  868,  868,  869,  869,  869,  869,  869,  869,
-      869,  869,  869,  869,  869,  869,  869,  869,  869,  869,
-      869,  869,  869,  869,  869,  870,  870,  870,  870,  870,
-      870,  870,  870,  870,  870,  870,  870,  870,  870,  870,
-      870,  870,  870,  870,  870,  870,  871,  871,  871,  871,
-      871,  871,  871,  871,  871,  871,  871,  871,  871,  871,
-      871,  871,  871,  871,  871,  871,  871,  872,  258,  255,
-
-      254,  253,  252,  251,  872,  248,  872,  872,  872,  872,
-      247,  246,  872,  872,  872,  872,  872,  872,  873,  873,
-      873,  873,  873,  873,  873,  873,  873,  873,  873,  873,
-      873,  873,  873,  873,  873,  873,  873,  873,  873,  874,
-      245,  244,  243,  242,  874,  241,  874,  240,  874,  874,
-      874,  874,  874,  239,  874,  874,  874,  874,  874,  874,
-      875,  238,  237,  236,  235,  234,  233,  875,  232,  875,
-      875,  875,  875,  226,  225,  875,  875,  875,  875,  875,
-      875,  876,  218,  217,  876,  876,  216,  876,  876,  215,
-      876,  876,  876,  876,  214,  213,  876,  876,  876,  876,
-
-      876,  876,  877,  877,  211,  877,  210,  209,  208,  877,
-      879,  206,  200,  879,  879,  192,  879,  879,  188,  879,
-      879,  879,  879,  184,  183,  879,  879,  879,  879,  879,
-      879,  880,  181,  177,  880,  880,  170,  880,  880,  166,
-      880,  880,  880,  880,  164,  880,  880,  880,  162,  880,
-      880,  880,  882,  154,  153,  882,  152,  151,  882,  882,
-      150,  882,  882,  882,  882,  882,  144,  882,  882,  882,
-      882,  882,  882,  883,  883,  883,  883,  883,  883,  883,
+      645,  645,  645,  645,  645,  645,  645,  645,  651,  821,
+      651,  651,  651,  651,  651,  651,  651,  651,  651,  651,
+      967,  821,  967,  757,  576,  757,  757,  757,  789,  789,
+      789,  789,  789,  789,  970,  758,  970,  758,  758,  758,
+      794,  794,  794,  794,  794,  794,  794,  651,  658,  575,
+      658,  658,  658,  658,  658,  658,  658,  658,  658,  658,
+      664,  570,  664,  664,  664,  664,  664,  664,  664,  664,
+      664,  664,  664,  667,  757,  667,  667,  667,  667,  667,
+      667,  667,  667,  667,  667,  667,  758,  569,  567,  667,
+
+      667,  667,  667,  667,  667,  782,  782,  782,  782,  782,
+      782,  782,  782,  782,  782,  818,  531,  818,  818,  818,
+      818,  818,  818,  530,  667,  667,  667,  667,  667,  667,
+      670,  670,  670,  670,  670,  670,  670,  670,  670,  670,
+      670,  976,  529,  976,  670,  670,  670,  670,  670,  670,
+      786,  521,  786,  786,  786,  786,  786,  786,  977,  520,
+      977,  813,  786,  813,  813,  813,  813,  813,  813,  670,
+      670,  670,  670,  670,  670,  671,  519,  671,  671,  671,
+      671,  671,  671,  671,  671,  671,  671,  682,  682,  682,
+      682,  682,  682,  682,  682,  682,  682,  682,  682,  706,
+
+      813,  706,  706,  706,  706,  706,  706,  706,  706,  706,
+      706,  712,  712,  712,  712,  712,  712,  712,  712,  712,
+      712,  762,  515,  762,  762,  762,  508,  762,  762,  507,
+      504,  762,  788,  788,  788,  788,  788,  788,  788,  788,
+      788,  788,  979,  502,  979,  762,  762,  762,  712,  714,
+      501,  714,  714,  714,  714,  714,  714,  714,  714,  714,
+      714,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  803,  803,  803,  803,  803,  803,  803,  803,  803,
+      803,  862,  862,  862,  862,  862,  862,  498,  714,  729,
+      497,  729,  729,  729,  729,  729,  729,  729,  729,  729,
+
+      729,  729,  732,  496,  732,  732,  732,  732,  732,  732,
+      732,  732,  732,  732,  732,  987,  490,  987,  732,  732,
+      732,  732,  732,  732,  814,  814,  814,  814,  814,  814,
+      814,  814,  814,  814,  835,  489,  835,  835,  835,  835,
+      835,  835,  487,  732,  732,  732,  732,  732,  732,  735,
+      735,  735,  735,  735,  735,  735,  735,  735,  735,  988,
+      991,  988,  991,  735,  735,  735,  735,  735,  735,  831,
+      831,  831,  831,  831,  831,  831,  831,  831,  831,  858,
+      486,  858,  858,  858,  858,  858,  858,  485,  735,  735,
+      735,  735,  735,  735,  736,  484,  736,  736,  736,  736,
+
+      736,  736,  736,  736,  736,  736,  739,  739,  739,  739,
+      739,  739,  739,  739,  739,  739,  739,  772,  858,  772,
+      772,  772,  772,  772,  772,  772,  772,  772,  772,  773,
+      454,  773,  773,  773,  773,  773,  773,  773,  773,  773,
+      773,  774,  453,  774,  774,  774,  774,  774,  774,  774,
+      774,  774,  774,  777,  450,  777,  777,  777,  777,  777,
+      777,  777,  777,  777,  777,  784,  449,  784,  784,  784,
+      784,  784,  784,  784,  784,  784,  784,  784,  787,  448,
+      787,  787,  787,  787,  787,  787,  787,  787,  787,  787,
+      992,  997,  992,  997,  787,  787,  787,  787,  787,  787,
+
+      840,  840,  840,  840,  840,  840,  840,  840,  840,  840,
+      868,  447,  868,  868,  868,  868,  868,  868,  441,  787,
+      787,  787,  787,  787,  787,  790,  440,  790,  790,  790,
+      790,  790,  790,  790,  790,  790,  790,  806,  439,  806,
+      806,  806,  806,  806,  806,  806,  806,  806,  806,  809,
+      438,  809,  809,  809,  809,  809,  809,  809,  809,  809,
+      809,  811,  437,  811,  811,  811,  811,  811,  811,  811,
+      811,  811,  811,  812,  436,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  824,  435,  824,  824,  824,
+      824,  824,  824,  824,  824,  824,  824,  837,  434,  837,
+
+      837,  837,  837,  837,  837,  837,  837,  837,  837,  838,
+      433,  838,  838,  838,  838,  838,  838,  838,  838,  838,
+      838,  839,  432,  839,  839,  839,  839,  839,  839,  839,
+      839,  839,  839,  841,  841,  841,  841,  841,  841,  841,
+      841,  841,  841,  842,  842,  842,  842,  842,  842,  842,
+      842,  842,  842,  853,  431,  853,  853,  853,  853,  853,
+      853,  853,  853,  853,  853,  854,  430,  854,  854,  854,
+      854,  854,  854,  854,  854,  854,  854,  856,  429,  856,
+      856,  856,  856,  856,  856,  856,  856,  856,  856,  857,
+      428,  857,  857,  857,  857,  857,  857,  857,  857,  857,
+
+      857,  860,  860,  860,  860,  860,  860,  860,  860,  860,
+      860,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  864,  864,  864,  864,  864,  864,  864,  864,  864,
+      864,  869,  869,  869,  869,  869,  869,  869,  869,  869,
+      869,  872,  872,  872,  872,  872,  872,  872,  872,  872,
+      872,  873,  873,  873,  873,  873,  873,  873,  873,  873,
+      873,  877,  877,  877,  877,  877,  877,  427,  869,  870,
+      870,  870,  870,  870,  870,  870,  870,  870,  870,  874,
+      874,  874,  874,  874,  874,  874,  874,  874,  874,  880,
+      880,  880,  880,  880,  880,  998,  996,  998,  877,  996,
+
+      426,  425,  422,  996,  421,  416,  870,  871,  871,  871,
+      871,  871,  871,  871,  871,  871,  871,  879,  879,  879,
+      879,  879,  879,  879,  879,  879,  879,  415,  414,  408,
+      407,  405,  404,  403,  402,  401,  400,  399,  398,  397,
+      394,  393,  392,  391,  871,  876,  876,  876,  876,  876,
+      876,  876,  876,  876,  876,  375,  374,  373,  372,  370,
+      369,  365,  364,  363,  361,  360,  359,  358,  357,  356,
+      355,  354,  351,  346,  345,  344,  337,  336,  335,  334,
+      333,  327,  876,  882,  882,  882,  882,  882,  882,  882,
+      882,  882,  882,  882,  882,  882,  882,  882,  882,  882,
+
+      882,  882,  882,  882,  883,  883,  883,  883,  883,  883,
       883,  883,  883,  883,  883,  883,  883,  883,  883,  883,
-      883,  883,  883,  883,  884,  884,  143,  884,  142,  884,
-
+      883,  883,  883,  883,  883,  884,  884,  884,  884,  884,
       884,  884,  884,  884,  884,  884,  884,  884,  884,  884,
-      884,  884,  884,  884,  884,  885,  141,  140,  139,  137,
-      885,  136,  885,  135,  885,  885,  885,  885,  885,  134,
-      885,  885,  885,  885,  885,  885,  886,  133,  132,  128,
-      124,  123,  119,  886,  116,  886,  886,  886,  886,  113,
-      886,  886,  886,  886,  886,  886,  886,  887,  108,  107,
-      887,  887,  106,  887,  887,  104,  887,  887,  887,  887,
-      100,  887,  887,  887,  887,  887,  887,  887,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  889,
-
-      889,   99,  889,  889,  889,  889,  889,  889,  889,  889,
-      889,  889,  889,  889,  889,  889,  889,  889,  889,  889,
-      891,   98,   97,  891,  891,   96,  891,  891,   92,  891,
-      891,  891,  891,   79,   72,  891,  891,  891,  891,  891,
-      891,  892,  892,   65,  892,   61,   60,   58,  892,  893,
-      893,   57,  893,   55,   53,   44,  893,  894,  894,  894,
-       43,  894,   41,   40,   35,  894,  895,   31,   25,  895,
-      895,   19,  895,  895,   17,  895,  895,  895,  895,   16,
-       15,  895,  895,  895,  895,  895,  895,  896,    0,    0,
-      896,  896,    0,  896,  896,    0,  896,  896,  896,  896,
-
-        0,    0,  896,  896,  896,  896,  896,  896,  897,    0,
-        0,  897,  897,    0,  897,  897,    0,  897,  897,  897,
-      897,    0,  897,  897,  897,    0,  897,  897,  897,  899,
-        0,    0,  899,    0,    0,  899,  899,    0,  899,  899,
-      899,  899,  899,    0,  899,  899,  899,  899,  899,  899,
-      900,  900,    0,  900,    0,  900,  900,  900,  900,  900,
-      900,  900,  900,  900,  900,  900,  900,  900,  900,  900,
-      900,  901,    0,    0,    0,    0,    0,    0,  901,    0,
-      901,  901,  901,  901,    0,    0,  901,  901,  901,  901,
-      901,  901,  902,    0,    0,    0,    0,    0,    0,  902,
-
-        0,  902,  902,  902,  902,    0,  902,  902,  902,  902,
-      902,  902,  902,  903,    0,    0,  903,  903,    0,  903,
-      903,    0,  903,  903,  903,  903,    0,  903,  903,  903,
-      903,  903,  903,  903,  904,    0,    0,  904,  904,    0,
-      904,  905,  905,  905,  905,  905,  905,  905,  905,  905,
-      905,  905,  905,  905,  905,  905,  905,  905,  905,  905,
-      905,  905,  906,  906,    0,  906,    0,    0,    0,  906,
-      907,  907,  907,    0,  907,    0,    0,    0,  907,  910,
-      910,    0,  910,    0,    0,    0,  910,  911,  911,    0,
-      911,    0,    0,    0,  911,  912,  912,    0,  912,    0,
-
-        0,    0,  912,  913,  913,  913,    0,  913,    0,    0,
-        0,  913,  914,    0,    0,  914,  914,    0,  914,  915,
-      915,    0,  915,    0,    0,    0,  915,  916,  916,    0,
-      916,    0,    0,    0,  916,  917,  917,    0,  917,    0,
-        0,    0,  917,  918,  918,  918,    0,  918,    0,    0,
-        0,  918,  919,  919,  919,  919,    0,  919,    0,    0,
-        0,  919,  922,  922,    0,  922,    0,    0,    0,  922,
-      923,  923,    0,  923,    0,    0,    0,  923,  924,  924,
-        0,  924,    0,    0,    0,  924,  927,  927,  927,    0,
-      927,    0,    0,    0,  927,  928,  928,  928,  928,    0,
-
-      928,    0,    0,    0,  928,  929,  929,  929,  929,  929,
-      929,  929,  929,  929,  929,  929,  929,  929,  929,  929,
-      929,  929,  929,  929,  929,  929,  931,  931,    0,  931,
-        0,    0,    0,  931,  932,  932,    0,  932,    0,    0,
-        0,  932,  934,  934,  934,    0,  934,    0,    0,    0,
-      934,  935,  935,  935,  935,    0,  935,    0,    0,    0,
-      935,  936,  936,  936,  936,  936,  936,  936,  936,  936,
-      936,  936,  936,  936,  936,  936,  936,  936,  936,  936,
-      936,  936,  939,    0,    0,  939,  939,    0,  939,  940,
-        0,    0,    0,  940,  940,    0,  940,  940,  940,    0,
-
-        0,  940,  940,  941,  941,    0,  941,    0,    0,    0,
-      941,  942,    0,  942,  942,    0,  942,    0,    0,    0,
-      942,  945,  945,  945,    0,  945,    0,    0,    0,  945,
-      946,  946,  946,  946,    0,  946,    0,    0,    0,  946,
-      947,  947,    0,    0,  947,    0,    0,    0,  947,  948,
-      948,  948,  948,  948,  948,  948,  948,  948,  948,  948,
-      948,  948,  948,  948,  948,  948,  948,  948,  948,  948,
-      950,    0,    0,  950,  950,    0,  950,  951,    0,    0,
-        0,  951,  951,    0,  951,  951,  951,    0,    0,  951,
-      951,  954,  954,    0,  954,    0,    0,    0,  954,  955,
-
-        0,  955,  955,    0,  955,    0,    0,    0,  955,  957,
-      957,  957,    0,  957,    0,    0,    0,  957,  958,  958,
-      958,    0,    0,  958,    0,    0,    0,  958,  959,  959,
-      959,  959,  959,  959,  959,  959,  959,  959,  959,  959,
-      959,  959,  959,  959,  959,  959,  959,  959,  959,  960,
-      960,    0,  960,  960,  960,    0,  960,    0,  960,  960,
-      960,  960,    0,    0,  960,  960,  960,  960,  960,  960,
-      961,  961,    0,  961,  961,  961,    0,  961,    0,  961,
-      961,  961,  961,    0,    0,  961,  961,  961,  961,  961,
-      961,  964,    0,    0,    0,    0,    0,    0,    0,    0,
-
-        0,    0,  964,  964,    0,  964,  964,    0,  964,  966,
-      966,    0,  966,    0,    0,    0,  966,  967,    0,  967,
-      967,    0,  967,    0,    0,    0,  967,  970,  970,    0,
-        0,  970,    0,    0,    0,  970,  972,    0,    0,    0,
-        0,    0,    0,  972,    0,  972,  972,  972,  972,    0,
-        0,  972,  972,  972,  972,  972,  972,  975,  975,    0,
-      975,    0,    0,    0,  975,  976,    0,  976,  976,    0,
-      976,    0,    0,    0,  976,  979,  979,    0,  979,    0,
-        0,    0,  979,  980,    0,  980,    0,    0,  980,    0,
-        0,    0,  980,  981,  981,  981,  981,  981,  981,  981,
-
-      981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
-      981,  981,  981,  981,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
-      867,  867,  867,  867,  867,  867
+      884,  884,  884,  884,  884,  884,  885,  885,  885,  885,
+      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
+      885,  885,  885,  885,  885,  885,  885,  886,  326,  324,
+      323,  322,  321,  320,  886,  319,  886,  886,  886,  886,
+      318,  317,  886,  886,  886,  886,  886,  886,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  888,
+      316,  315,  312,  311,  888,  309,  888,  301,  888,  888,
+      888,  888,  888,  300,  888,  888,  888,  888,  888,  888,
+      889,  297,  296,  289,  288,  286,  285,  889,  284,  889,
+      889,  889,  889,  283,  282,  889,  889,  889,  889,  889,
+      889,  890,  281,  280,  890,  890,  279,  890,  890,  278,
+      890,  890,  890,  890,  277,  276,  890,  890,  890,  890,
+      890,  890,  891,  891,  275,  891,  272,  269,  268,  891,
+      893,  267,  261,  893,  893,  258,  893,  893,  257,  893,
+      893,  893,  893,  256,  255,  893,  893,  893,  893,  893,
+
+      893,  894,  254,  251,  894,  894,  250,  894,  894,  249,
+      894,  894,  894,  894,  248,  894,  894,  894,  247,  894,
+      894,  894,  896,  246,  244,  896,  243,  242,  896,  896,
+      241,  896,  896,  896,  896,  896,  240,  896,  896,  896,
+      896,  896,  896,  897,  897,  897,  897,  897,  897,  897,
+      897,  897,  897,  897,  897,  897,  897,  897,  897,  897,
+      897,  897,  897,  897,  898,  898,  239,  898,  238,  898,
+      898,  898,  898,  898,  898,  898,  898,  898,  898,  898,
+      898,  898,  898,  898,  898,  899,  237,  236,  235,  234,
+      899,  228,  899,  227,  899,  899,  899,  899,  899,  220,
+
+      899,  899,  899,  899,  899,  899,  900,  219,  218,  217,
+      216,  215,  213,  900,  212,  900,  900,  900,  900,  211,
+      900,  900,  900,  900,  900,  900,  900,  901,  210,  208,
+      901,  901,  202,  901,  901,  194,  901,  901,  901,  901,
+      190,  901,  901,  901,  901,  901,  901,  901,  902,  902,
+      902,  902,  902,  902,  902,  902,  902,  902,  902,  902,
+      902,  902,  902,  902,  902,  902,  902,  902,  902,  903,
+      903,  186,  903,  903,  903,  903,  903,  903,  903,  903,
+      903,  903,  903,  903,  903,  903,  903,  903,  903,  903,
+      905,  185,  183,  905,  905,  179,  905,  905,  172,  905,
+
+      905,  905,  905,  167,  165,  905,  905,  905,  905,  905,
+      905,  906,  906,  163,  906,  155,  154,  153,  906,  907,
+      907,  152,  907,  151,  145,  144,  907,  908,  908,  908,
+      143,  908,  142,  141,  140,  908,  909,  138,  137,  909,
+      909,  136,  909,  909,  135,  909,  909,  909,  909,  134,
+      133,  909,  909,  909,  909,  909,  909,  910,  129,  125,
+      910,  910,  124,  910,  910,  120,  910,  910,  910,  910,
+      117,  114,  910,  910,  910,  910,  910,  910,  911,  109,
+      108,  911,  911,  107,  911,  911,  105,  911,  911,  911,
+      911,  101,  911,  911,  911,  100,  911,  911,  911,  913,
+
+       99,   98,  913,   97,   93,  913,  913,   80,  913,  913,
+      913,  913,  913,   73,  913,  913,  913,  913,  913,  913,
+      914,  914,   66,  914,   62,  914,  914,  914,  914,  914,
+      914,  914,  914,  914,  914,  914,  914,  914,  914,  914,
+      914,  915,   61,   60,   58,   57,   55,   53,  915,   44,
+      915,  915,  915,  915,   43,   41,  915,  915,  915,  915,
+      915,  915,  916,   40,   35,   31,   25,   19,   17,  916,
+       16,  916,  916,  916,  916,   15,  916,  916,  916,  916,
+      916,  916,  916,  917,    0,    0,  917,  917,    0,  917,
+      917,    0,  917,  917,  917,  917,    0,  917,  917,  917,
+
+      917,  917,  917,  917,  918,    0,    0,  918,  918,    0,
+      918,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  920,  920,    0,  920,    0,    0,    0,  920,
+      921,  921,  921,    0,  921,    0,    0,    0,  921,  924,
+      924,    0,  924,    0,    0,    0,  924,  925,  925,    0,
+      925,    0,    0,    0,  925,  926,  926,    0,  926,    0,
+        0,    0,  926,  927,  927,  927,    0,  927,    0,    0,
+        0,  927,  928,    0,    0,  928,  928,    0,  928,  929,
+      929,    0,  929,    0,    0,    0,  929,  930,  930,    0,
+
+      930,    0,    0,    0,  930,  931,  931,    0,  931,    0,
+        0,    0,  931,  932,  932,  932,    0,  932,    0,    0,
+        0,  932,  933,  933,  933,  933,    0,  933,    0,    0,
+        0,  933,  936,  936,    0,  936,    0,    0,    0,  936,
+      937,  937,    0,  937,    0,    0,    0,  937,  938,  938,
+        0,  938,    0,    0,    0,  938,  941,  941,  941,    0,
+      941,    0,    0,    0,  941,  942,  942,  942,  942,    0,
+      942,    0,    0,    0,  942,  943,  943,  943,  943,  943,
+      943,  943,  943,  943,  943,  943,  943,  943,  943,  943,
+      943,  943,  943,  943,  943,  943,  945,  945,    0,  945,
+
+        0,    0,    0,  945,  946,  946,    0,  946,    0,    0,
+        0,  946,  948,  948,  948,    0,  948,    0,    0,    0,
+      948,  949,  949,  949,  949,    0,  949,    0,    0,    0,
+      949,  950,  950,  950,  950,  950,  950,  950,  950,  950,
+      950,  950,  950,  950,  950,  950,  950,  950,  950,  950,
+      950,  950,  953,    0,    0,  953,  953,    0,  953,  954,
+        0,    0,    0,  954,  954,    0,  954,  954,  954,    0,
+        0,  954,  954,  955,  955,    0,  955,    0,    0,    0,
+      955,  956,    0,  956,  956,    0,  956,    0,    0,    0,
+      956,  959,  959,  959,    0,  959,    0,    0,    0,  959,
+
+      960,  960,  960,  960,    0,  960,    0,    0,    0,  960,
+      961,  961,    0,    0,  961,    0,    0,    0,  961,  962,
+      962,  962,  962,  962,  962,  962,  962,  962,  962,  962,
+      962,  962,  962,  962,  962,  962,  962,  962,  962,  962,
+      964,    0,    0,  964,  964,    0,  964,  965,    0,    0,
+        0,  965,  965,    0,  965,  965,  965,    0,    0,  965,
+      965,  968,  968,    0,  968,    0,    0,    0,  968,  969,
+        0,  969,  969,    0,  969,    0,    0,    0,  969,  971,
+      971,  971,    0,  971,    0,    0,    0,  971,  972,  972,
+      972,    0,    0,  972,    0,    0,    0,  972,  973,  973,
+
+      973,  973,  973,  973,  973,  973,  973,  973,  973,  973,
+      973,  973,  973,  973,  973,  973,  973,  973,  973,  974,
+      974,    0,  974,  974,  974,    0,  974,    0,  974,  974,
+      974,  974,    0,    0,  974,  974,  974,  974,  974,  974,
+      975,  975,    0,  975,  975,  975,    0,  975,    0,  975,
+      975,  975,  975,    0,    0,  975,  975,  975,  975,  975,
+      975,  978,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  978,  978,    0,  978,  978,    0,  978,  980,
+      980,    0,  980,    0,    0,    0,  980,  981,    0,  981,
+      981,    0,  981,    0,    0,    0,  981,  984,  984,    0,
+
+        0,  984,    0,    0,    0,  984,  986,    0,    0,    0,
+        0,    0,    0,  986,    0,  986,  986,  986,  986,    0,
+        0,  986,  986,  986,  986,  986,  986,  989,  989,    0,
+      989,    0,    0,    0,  989,  990,    0,  990,  990,    0,
+      990,    0,    0,    0,  990,  993,  993,    0,  993,    0,
+        0,    0,  993,  994,    0,  994,    0,    0,  994,    0,
+        0,    0,  994,  995,  995,  995,  995,  995,  995,  995,
+      995,  995,  995,  995,  995,  995,  995,  995,  995,  995,
+      995,  995,  995,  995,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1948,7 +1948,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "toke.l"
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2016
+ * Copyright (c) 1996, 1998-2005, 2007-2017
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -2263,13 +2263,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 >= 868 )
+                               if ( yy_current_state >= 882 )
                                        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] != 5615 );
+               while ( yy_base[yy_current_state] != 5585 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2851,6 +2851,22 @@ YY_RULE_SETUP
 case 47:
 YY_RULE_SETUP
 #line 538 "toke.l"
+{
+                           LEXTRACE("NOTBEFORE ");
+                           LEXRETURN(NOTBEFORE);
+                       }
+       YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 543 "toke.l"
+{
+                           LEXTRACE("NOTAFTER ");
+                           LEXRETURN(NOTAFTER);
+                       }
+       YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 548 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
@@ -2860,9 +2876,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 547 "toke.l"
+#line 557 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("TYPE ");
@@ -2872,9 +2888,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 555 "toke.l"
+#line 565 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("PRIVS ");
@@ -2884,9 +2900,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 564 "toke.l"
+#line 574 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("LIMITPRIVS ");
@@ -2896,9 +2912,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 573 "toke.l"
+#line 583 "toke.l"
 {
                        got_alias:
                            if (!fill(sudoerstext, sudoersleng))
@@ -2907,9 +2923,9 @@ YY_RULE_SETUP
                            LEXRETURN(ALIAS);
                        }
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 581 "toke.l"
+#line 591 "toke.l"
 {
                            /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
@@ -2919,9 +2935,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMAND);
                        }
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 590 "toke.l"
+#line 600 "toke.l"
 {
                            digest_len = SHA224_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2929,9 +2945,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA224_TOK);
                        }
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 597 "toke.l"
+#line 607 "toke.l"
 {
                            digest_len = SHA256_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2939,9 +2955,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA256_TOK);
                        }
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 604 "toke.l"
+#line 614 "toke.l"
 {
                            digest_len = SHA384_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2949,9 +2965,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA384_TOK);
                        }
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 611 "toke.l"
+#line 621 "toke.l"
 {
                            digest_len = SHA512_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2959,9 +2975,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA512_TOK);
                        }
        YY_BREAK
-case 57:
+case 59:
 YY_RULE_SETUP
-#line 618 "toke.l"
+#line 628 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2969,9 +2985,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 58:
+case 60:
 YY_RULE_SETUP
-#line 625 "toke.l"
+#line 635 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -2987,9 +3003,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 59:
+case 61:
 YY_RULE_SETUP
-#line 640 "toke.l"
+#line 650 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -2997,9 +3013,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 60:
+case 62:
 YY_RULE_SETUP
-#line 647 "toke.l"
+#line 657 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -3008,49 +3024,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 61:
+case 63:
 YY_RULE_SETUP
-#line 655 "toke.l"
+#line 665 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 62:
+case 64:
 YY_RULE_SETUP
-#line 660 "toke.l"
+#line 670 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 63:
+case 65:
 YY_RULE_SETUP
-#line 665 "toke.l"
+#line 675 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 64:
+case 66:
 YY_RULE_SETUP
-#line 670 "toke.l"
+#line 680 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 65:
+case 67:
 YY_RULE_SETUP
-#line 675 "toke.l"
+#line 685 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 66:
+case 68:
 YY_RULE_SETUP
-#line 680 "toke.l"
+#line 690 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -3058,9 +3074,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 67:
+case 69:
 YY_RULE_SETUP
-#line 687 "toke.l"
+#line 697 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -3073,25 +3089,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 68:
+case 70:
 YY_RULE_SETUP
-#line 699 "toke.l"
+#line 709 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 69:
+case 71:
 YY_RULE_SETUP
-#line 703 "toke.l"
+#line 713 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 70:
+case 72:
 YY_RULE_SETUP
-#line 709 "toke.l"
+#line 719 "toke.l"
 {
                            if (sudoerstext[sudoersleng - 1] == '\n') {
                                /* comment ending in a newline */
@@ -3106,9 +3122,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 71:
+case 73:
 YY_RULE_SETUP
-#line 723 "toke.l"
+#line 733 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -3121,7 +3137,7 @@ case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
 case YY_STATE_EOF(WANTDIGEST):
-#line 728 "toke.l"
+#line 738 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -3132,12 +3148,12 @@ case YY_STATE_EOF(WANTDIGEST):
                                yyterminate();
                        }
        YY_BREAK
-case 72:
+case 74:
 YY_RULE_SETUP
-#line 738 "toke.l"
+#line 748 "toke.l"
 ECHO;
        YY_BREAK
-#line 3140 "lex.sudoers.c"
+#line 3156 "lex.sudoers.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -3428,7 +3444,7 @@ static yy_state_type yy_get_previous_state YY_PROTO(( 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 >= 868 )
+                       if ( yy_current_state >= 882 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3463,11 +3479,11 @@ yy_state_type yy_current_state;
        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 >= 868 )
+               if ( yy_current_state >= 882 )
                        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 == 867);
+       yy_is_jam = (yy_current_state == 881);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -4028,7 +4044,7 @@ int main()
        return 0;
        }
 #endif
-#line 738 "toke.l"
+#line 748 "toke.l"
 
 struct path_list {
     SLIST_ENTRY(path_list) entries;
index 12784b7ac7afc7ee2fd73678cd71a983e5b2f716..afb0080f24c08573e2a9a353cf97bd627c0b304e 100644 (file)
@@ -1,6 +1,6 @@
 %{
 /*
- * Copyright (c) 1996, 1998-2005, 2007-2016
+ * Copyright (c) 1996, 1998-2005, 2007-2017
  *     Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -535,6 +535,16 @@ ALL {
                            LEXRETURN(CMND_TIMEOUT);
                        }
 
+<INITIAL>NOTBEFORE {
+                           LEXTRACE("NOTBEFORE ");
+                           LEXRETURN(NOTBEFORE);
+                       }
+
+<INITIAL>NOTAFTER {
+                           LEXTRACE("NOTAFTER ");
+                           LEXRETURN(NOTAFTER);
+                       }
+
 <INITIAL>ROLE {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");