]> granicus.if.org Git - sudo/commitdiff
Merge in Solaris privilege support by Darren Moffat and John Zolnowsky
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 26 Jul 2012 17:49:21 +0000 (13:49 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 26 Jul 2012 17:49:21 +0000 (13:49 -0400)
25 files changed:
NEWS
configure.in
doc/CONTRIBUTORS
doc/Makefile.in
doc/contributors.pod
doc/sudoers.cat
doc/sudoers.man.in
doc/sudoers.man.pl
doc/sudoers.mdoc.in
doc/sudoers.pod
plugins/sudoers/def_data.c
plugins/sudoers/def_data.h
plugins/sudoers/def_data.in
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/parse.c
plugins/sudoers/parse.h
plugins/sudoers/sudoers.c
plugins/sudoers/sudoers.h
plugins/sudoers/testsudoers.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l
src/sudo.c
src/sudo.h

diff --git a/NEWS b/NEWS
index 1aa183abb7d73234476e006a37eb74bbc862eea3..d62f5943765db589501c46d3b345aa7ad13d03e3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,10 @@ What's new in Sudo 1.8.6?
  * The sudo manuals are now formatted in mdoc.  Versions using the
    legacy man macros are provided for systems that lack mdoc.
 
+ * New support for Solaris privilege sets.  This makes it possible
+   to specify fine-grained privileges in the sudoers file on Solaris
+   10 and above.
+
 What's new in Sudo 1.8.5p2?
 
  * Fixed use of the SUDO_ASKPASS environment variable which was
index 04586f97eb2192e6f7047af1e015d74fd7ee9791..422964105b69e382eeed325700e338516ef440f5 100644 (file)
@@ -48,6 +48,7 @@ AC_SUBST([SUDOERS_GID])
 AC_SUBST([DEVEL])
 AC_SUBST([BAMAN])
 AC_SUBST([LCMAN])
+AC_SUBST([PSMAN])
 AC_SUBST([SEMAN])
 AC_SUBST([devdir])
 AC_SUBST([mansectsu])
@@ -175,6 +176,7 @@ DEVEL=
 LDAP="#"
 BAMAN=0
 LCMAN=0
+PSMAN=0
 SEMAN=0
 LIBINTL=
 ZLIB=
@@ -1558,7 +1560,7 @@ case "$host" in
                : ${mansectform='4'}
                : ${with_rpath='yes'}
                test -z "$with_pam" && AUTH_EXCL_DEF="PAM"
-               AC_CHECK_FUNCS(priv_set)
+               AC_CHECK_FUNCS(priv_set, [PSMAN=1])
                ;;
     *-*-aix*)
                # To get all prototypes (so we pass -Wall)
index 65ff3274bb8d5ed3a5ac56eeefcabbebaa1b8415..880cfb8dc337b1e76b19b8c13b2269db5d54fc08 100644 (file)
@@ -96,6 +96,7 @@ you believe you should be listed, please send a note to sudo@sudo.ws.
     Michael Meskes
     Todd C. Miller
     Loic Minier
+    Darren Moffat
     Jan Thomas Moldung
     Charles Morris
     Andreas Mueller
@@ -163,3 +164,4 @@ you believe you should be listed, please send a note to sudo@sudo.ws.
     Marco van Wieringen
     David Wood
     Gustavo Zacarias
+    John Zolnowsky
index 3d430833bc1047e6b1c1faee4d4b9dd7f744c8ec..ef64a74c5a5991db25d1a2acacdb3b6cee855ba2 100644 (file)
@@ -95,7 +95,7 @@ Makefile: $(srcdir)/Makefile.in
 
 varsub: $(top_srcdir)/configure.in
        @if [ -n "$(DEVEL)" ]; then \
-           printf 's#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#/etc#g\ns#@%s@#/usr/local#g\ns#@%s@#5#g\ns#@%s@#8#g\ns#@%s@#%s#\n' SEMAN BAMAN LCMAN sysconfdir prefix mansectform mansectsu PACKAGE_VERSION $(VERSION) > $@; \
+           printf 's#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#/etc#g\ns#@%s@#/usr/local#g\ns#@%s@#5#g\ns#@%s@#8#g\ns#@%s@#%s#\n' SEMAN BAMAN LCMAN PSMAN sysconfdir prefix mansectform mansectsu PACKAGE_VERSION $(VERSION) > $@; \
            sed -n '/Begin initial values for man page substitution/,/End initial values for man page substitution/{;p;}' $(top_srcdir)/configure.in | sed -e '/^#/d' -e 's/^/s#@/' -e 's/=[\\"]*/@#/' -e 's/[\\"]*$$/#g/' >> $@; \
        fi
 
index a9464c7ba7f2c52c8dc32036e290b7f09d27040f..2189aad4ad4f416eee6a4fee35836ab89a21119f 100644 (file)
@@ -99,6 +99,7 @@ you believe you should be listed, please send a note to sudo@sudo.ws.
     Michael Meskes
     Todd C. Miller
     Loic Minier
+    Darren Moffat
     Jan Thomas Moldung
     Charles Morris
     Andreas Mueller
@@ -166,3 +167,4 @@ you believe you should be listed, please send a note to sudo@sudo.ws.
     Marco van Wieringen
     David Wood
     Gustavo Zacarias
+    John Zolnowsky
index 39bf9f9605858e40c05ded0ed619b32c0294e454..f45565acaae58aaf08a775d6296df5698beccdd3 100644 (file)
@@ -339,12 +339,14 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
      Cmnd_Spec_List ::= Cmnd_Spec |
                         Cmnd_Spec ',' Cmnd_Spec_List
 
-     Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd
+     Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
 
      Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
      SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
+     Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
+
      Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
                    'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
                    'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
@@ -432,6 +434,12 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
      in _\bs_\bu_\bd_\bo_\be_\br_\bs.  A role or type specified on the command line, however, will
      supercede the values in _\bs_\bu_\bd_\bo_\be_\br_\bs.
 
+   S\bSo\bol\bla\bar\bri\bis\bs_\b_P\bPr\bri\biv\bv_\b_S\bSp\bpe\bec\bc
+     On Solaris systems, _\bs_\bu_\bd_\bo_\be_\br_\bs entries may optionally specify Solaris
+     privilege set and/or limit privilege set associated with a command.  If
+     privileges or limit privileges are specified with the command it will
+     override any default values specified in _\bs_\bu_\bd_\bo_\be_\br_\bs.
+
    T\bTa\bag\bg_\b_S\bSp\bpe\bec\bc
      A command may have zero or more tags associated with it.  There are ten
      possible tag values: NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV,
@@ -1108,6 +1116,13 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        unique combination of digits and letters, similar to
                        the mktemp(3) function.
 
+     limitprivs        The default Solaris limit privileges to use when
+                       constructing a new privilege set for a command.  This
+                       bounds all privileges of the executing process.  The
+                       default limit privileges may be overridden on a per-
+                       command basis in _\bs_\bu_\bd_\bo_\be_\br_\bs.  This option is only
+                       available if s\bsu\bud\bdo\boe\ber\brs\bs is built on Solaris 10 or higher.
+
      mailsub           Subject of the mail sent to the _\bm_\ba_\bi_\bl_\bt_\bo user.  The
                        escape %h will expand to the host name of the machine.
                        Default is ``*** SECURITY information for %h ***''.
@@ -1142,11 +1157,21 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
 
                        The default value is ``Password:''.
 
+     privs             The default Solaris privileges to use when constructing
+                       a new privilege set for a command.  This is passed to
+                       the executing process via the inherited privilege set,
+                       but is bounded by the limit privileges.  If the _\bp_\br_\bi_\bv_\bs
+                       option is specified but the _\bl_\bi_\bm_\bi_\bt_\bp_\br_\bi_\bv_\bs option is not,
+                       the limit privileges of the executing process is set to
+                       _\bp_\br_\bi_\bv_\bs.  The default privileges may be overridden on a
+                       per-command basis in _\bs_\bu_\bd_\bo_\be_\br_\bs.  This option is only
+                       available if s\bsu\bud\bdo\boe\ber\brs\bs is built on Solaris 10 or higher.
+
      role              The default SELinux role to use when constructing a new
                        security context to run the command.  The default role
                        may be overridden on a per-command basis in _\bs_\bu_\bd_\bo_\be_\br_\bs or
                        via command line options.  This option is only
-                       available whe s\bsu\bud\bdo\bo is built with SELinux support.
+                       available when s\bsu\bud\bdo\bo is built with SELinux support.
 
      runas_default     The default user to run commands as if the -\b-u\bu option is
                        not specified on the command line.  This defaults to
index e494a34d99b53bc5f9390e1f5bcf0a7f4dcca01e..633b668852ff39edd45cc88221f054d21f75ebb4 100644 (file)
@@ -742,12 +742,14 @@ User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \e
 Cmnd_Spec_List ::= Cmnd_Spec |
                    Cmnd_Spec ',' Cmnd_Spec_List
 
-Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd
+Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
+Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
+
 Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
               'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
               'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
@@ -951,6 +953,14 @@ specified in
 A role or type specified on the command line,
 however, will supercede the values in
 \fIsudoers\fR.
+.SS "Solaris_Priv_Spec"
+On Solaris systems,
+\fIsudoers\fR
+entries may optionally specify Solaris privilege set and/or limit
+privilege set associated with a command.
+If privileges or limit privileges are specified with the command
+it will override any default values specified in
+\fIsudoers\fR.
 .SS "Tag_Spec"
 A command may have zero or more tags associated with it.
 There are
@@ -2398,6 +2408,16 @@ mktemp(3)
 function.
 .PD
 .TP 18n
+limitprivs
+The default Solaris limit privileges to use when constructing a new
+privilege set for a command.
+This bounds all privileges of the executing process.
+The default limit privileges may be overridden on a per-command basis in
+\fIsudoers\fR.
+This option is only available if
+\fBsudoers\fR
+is built on Solaris 10 or higher.
+.TP 18n
 mailsub
 Subject of the mail sent to the
 \fImailto\fR
@@ -2463,16 +2483,33 @@ The default value is
 .RE
 .PD 0
 .TP 18n
+privs
+The default Solaris privileges to use when constructing a new
+privilege set for a command.
+This is passed to the executing process via the inherited privilege set,
+but is bounded by the limit privileges.
+If the
+\fIprivs\fR
+option is specified but the
+\fIlimitprivs\fR
+option is not, the limit privileges of the executing process is set to
+\fIprivs\fR.
+The default privileges may be overridden on a per-command basis in
+\fIsudoers\fR.
+This option is only available if
+\fBsudoers\fR
+is built on Solaris 10 or higher.
+.PD
+.TP 18n
 role
 The default SELinux role to use when constructing a new security
 context to run the command.
 The default role may be overridden on a per-command basis in
 \fIsudoers\fR
 or via command line options.
-This option is only available whe
+This option is only available when
 \fBsudo\fR
 is built with SELinux support.
-.PD
 .TP 18n
 runas_default
 The default user to run commands as if the
index 6e5da2c2896787d25fc676e5f68cfeef6c037fa0..92dccaa2c76ccb0f864823877759424086924a0a 100644 (file)
@@ -4,33 +4,54 @@ BEGIN {
     $cond = -1;
 }
 
-# Initialize the numeric register we use for conditionals
+# Initialize the numeric registers we use for conditionals
 if ($cond == -1) {
-    $_ = ".nr SL \@SEMAN\@\n.nr BA \@BAMAN\@\n.nr LC \@LCMAN\@\n.\\\"\n$_";
+    $prefix = "";
+    $prefix = "$prefix.nr BA \@BAMAN\@\n";
+    $prefix = "$prefix.nr LC \@LCMAN\@\n";
+    $prefix = "$prefix.nr PS \@PSMAN\@\n";
+    $prefix = "$prefix.nr SL \@SEMAN\@\n";
+    $_ = "$prefix.\\\"\n$_";
     $cond = 0;
 }
 
-# Make SELinux_Spec conditional
-if (/(.*)SELinux_Spec\? (.*)$/) {
-    $_ = ".ie \\n(SL $_.el $1$2\n";
+# Make SELinux_Spec and Solaris_Priv_Spec conditional
+if (/(.*) SELinux_Spec\? Solaris_Priv_Spec(.*)$/) {
+    $_ = "$1\\*(S+$2\n";
+    $prefix = "";
+    $prefix = "$prefix.ds S+\n";
+    $prefix = "$prefix.if \\n(SL .as S+ \" SELinux_Spec?\n";
+    $prefix = "$prefix.if \\n(PS .as S+ \" Solaris_Priv_Spec?\n";
+    $_ = "$prefix$_";
 } elsif (/^(.*SELinux_Spec ::=)/) {
     $_ = ".if \\n(SL \\{\\\n$_";
+} elsif (/^(.*Solaris_Priv_Spec ::=)/) {
+    $_ = "\\}\n.if \\n(PS \\{\\\n$_";
 } elsif (/^(.*Tag_Spec ::=)/) {
     $_ = "\\}\n$_";
 }
 
+if (/^\.(Sh|SS|IP|PP)/) {
+    $prefix = $cond ? "\\}\n" : "";
+    $cond = 0;
+}
 if (/^\.S[Sh] "SELinux_Spec"/) {
-    $_ = ".if \\n(SL \\{\\\n$_";
+    $_ = "$prefix.if \\n(SL \\{\\\n$_";
     $cond = 1;
 } elsif (/^\.IP "(role|type)"/) {
-    $_ = ".if \\n(SL \\{\\\n$_";
+    $_ = "$prefix.if \\n(SL \\{\\\n$_";
+    $cond = 1;
+} elsif (/^\.S[Sh] "Solaris_Priv_Spec"/) {
+    $_ = "$prefix.if \\n(PS \\{\\\n$_";
+    $cond = 1;
+} elsif (/^\.IP "(privs|limitprivs)"/) {
+    $_ = "$prefix.if \\n(PS \\{\\\n$_";
     $cond = 1;
 } elsif (/^\.IP "use_loginclass"/) {
-    $_ = ".if \\n(LC \\{\\\n$_";
+    $_ = "$prefix.if \\n(LC \\{\\\n$_";
     $cond = 1;
-} elsif ($cond && /^\.(Sh|SS|IP|PP)/) {
-    $_ = "\\}\n$_";
-    $cond = 0;
+} elsif (/^\.(Sh|SS|IP|PP)/) {
+    $_ = "$prefix$_";
 }
 
 # Fix up broken pod2man formatting of F<@foo@/bar>
index 5d8dbd1f50ccb380ad6cbe8e81ba0dc9a56be8af..16cee4cbcb772bc88a5b29c18f90c0b4596fad95 100644 (file)
@@ -714,12 +714,14 @@ User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \e
 Cmnd_Spec_List ::= Cmnd_Spec |
                    Cmnd_Spec ',' Cmnd_Spec_List
 
-Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd
+Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
 
 Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
 SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
+Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
+
 Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
               'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
               'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
@@ -898,6 +900,14 @@ specified in
 A role or type specified on the command line,
 however, will supercede the values in
 .Em sudoers .
+.Ss Solaris_Priv_Spec
+On Solaris systems,
+.Em sudoers
+entries may optionally specify Solaris privilege set and/or limit
+privilege set associated with a command.
+If privileges or limit privileges are specified with the command
+it will override any default values specified in
+.Em sudoers .
 .Ss Tag_Spec
 A command may have zero or more tags associated with it.
 There are
@@ -2266,6 +2276,15 @@ will have the
 replaced with a unique combination of digits and letters, similar to the
 .Xr mktemp 3
 function.
+.It limitprivs
+The default Solaris limit privileges to use when constructing a new
+privilege set for a command.
+This bounds all privileges of the executing process.
+The default limit privileges may be overridden on a per-command basis in
+.Em sudoers .
+This option is only available if
+.Nm
+is built on Solaris 10 or higher.
 .It mailsub
 Subject of the mail sent to the
 .Em mailto
@@ -2320,13 +2339,29 @@ character
 .Pp
 The default value is
 .Dq Li @passprompt@ .
+.It privs
+The default Solaris privileges to use when constructing a new
+privilege set for a command.
+This is passed to the executing process via the inherited privilege set,
+but is bounded by the limit privileges.
+If the
+.Em privs
+option is specified but the
+.Em limitprivs
+option is not, the limit privileges of the executing process is set to
+.Em privs .
+The default privileges may be overridden on a per-command basis in
+.Em sudoers .
+This option is only available if
+.Nm
+is built on Solaris 10 or higher.
 .It role
 The default SELinux role to use when constructing a new security
 context to run the command.
 The default role may be overridden on a per-command basis in
 .Em sudoers
 or via command line options.
-This option is only available whe
+This option is only available when
 .Nm sudo
 is built with SELinux support.
 .It runas_default
index 28eb216f13cec67436be59add7830992d8f436a6..7c457338278ff5ebfdbe7a96d79f83787feb2bf9 100644 (file)
@@ -402,12 +402,14 @@ See L<"SUDOERS OPTIONS"> for a list of supported Defaults parameters.
  Cmnd_Spec_List ::= Cmnd_Spec |
                    Cmnd_Spec ',' Cmnd_Spec_List
 
- Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd
+ Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
 
  Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
  SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
+ Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
+
  Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
               'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
                'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
@@ -499,6 +501,13 @@ type is specified with the command it will override any default values
 specified in I<sudoers>.  A role or type specified on the command line,
 however, will supercede the values in I<sudoers>.
 
+=head2 Solaris_Priv_Spec
+
+On Solaris systems, I<sudoers> entries may optionally specify
+a Solaris privilege set and/or limit privilege set associated with a command.
+If privileges or limit privileges are specified with the command
+it will override any default values specified in I<sudoers>.
+
 =head2 Tag_Spec
 
 A command may have zero or more tags associated with it.  There are
@@ -1279,6 +1288,16 @@ In addition to the escape sequences, path names that end in six or
 more C<X>s will have the C<X>s replaced with a unique combination
 of digits and letters, similar to the mktemp() function.
 
+=item limitprivs
+
+The default Solaris limit privileges to use
+when constructing a new privilege set for a command.
+This bounds all privileges of the executing process.
+The default limit privileges may be overridden
+on a per-command basis in I<sudoers>.
+This option is only available when B<sudo> is built on
+Solaris 10 or higher.
+
 =item mailsub
 
 Subject of the mail sent to the I<mailto> user. The escape C<%h>
@@ -1330,12 +1349,24 @@ two consecutive C<%> characters are collapsed into a single C<%> character
 
 The default value is "C<@passprompt@>".
 
+=item privs
+
+The default Solaris privileges to use
+when constructing a new privilege set to run the command.
+This is passed to the executing process via the inherited privilege set,
+but is bounded by the limit privileges.
+If the I<privs> option is specified but the I<limitprivs> option is not,
+the limit privileges of the executing process is set to I<privs>.
+The default privileges may be overridden on a per-command basis in I<sudoers>.
+This option is only available when B<sudo> is built on
+Solaris 10 or higher.
+
 =item role
 
 The default SELinux role to use when constructing a new security
 context to run the command.  The default role may be overridden on
 a per-command basis in I<sudoers> or via command line options.
-This option is only available whe B<sudo> is built with SELinux support.
+This option is only available when B<sudo> is built with SELinux support.
 
 =item runas_default
 
index 3119df8e5e5cf7661427b4394ef2519b1a090b5f..ff8f21fd7c0d844a89e97425bdce536babe52c88 100644 (file)
@@ -342,6 +342,14 @@ struct sudo_defs_types sudo_defs_table[] = {
        "utmp_runas", T_FLAG,
        N_("Set the user in utmp to the runas user, not the invoking user"),
        NULL,
+    }, {
+       "privs", T_STR,
+       N_("Set of permitted privileges"),
+       NULL,
+    }, {
+       "limitprivs", T_STR,
+       N_("Set of limit privileges"),
+       NULL,
     }, {
        NULL, 0, NULL
     }
index 43c2b96a656b5cbfc5e6acc0dcbb23e41ea78d03..774b3999426be397861d4e1f2520b83d67f67461 100644 (file)
 #define I_SET_UTMP              78
 #define def_utmp_runas          (sudo_defs_table[79].sd_un.flag)
 #define I_UTMP_RUNAS            79
+#define def_privs               (sudo_defs_table[80].sd_un.str)
+#define I_PRIVS                 80
+#define def_limitprivs          (sudo_defs_table[81].sd_un.str)
+#define I_LIMITPRIVS            81
 
 enum def_tuple {
        never,
index 7b9d4e4b9d576a98b1b5b7cf573e2c28431a7f5d..430f235bc012a9fb24f8714ff375030079051dcc 100644 (file)
@@ -253,3 +253,9 @@ set_utmp
 utmp_runas
        T_FLAG
        "Set the user in utmp to the runas user, not the invoking user"
+privs
+       T_STR
+       "Set of permitted privileges"
+limitprivs
+       T_STR
+       "Set of limit privileges"
index 49c45c97f54a207a412cac87537ddf7e43794c6a..4cec3a2321cfa8c1f2ee1df5b925050c39e70e69 100644 (file)
@@ -136,11 +136,12 @@ typedef union {
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
+    struct solaris_privs_info privinfo;
     char *string;
     int tok;
 } YYSTYPE;
 #endif /* YYSTYPE_DEFINED */
-#line 143 "gram.c"
+#line 144 "gram.c"
 #define COMMAND 257
 #define ALIAS 258
 #define DEFVAR 259
@@ -172,6 +173,8 @@ typedef union {
 #define ERROR 285
 #define TYPE 286
 #define ROLE 287
+#define PRIVS 288
+#define LIMITPRIVS 289
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylhs[] =
@@ -179,16 +182,17 @@ const short yylhs[] =
 short yylhs[] =
 #endif
        {                                        -1,
-    0,    0,   25,   25,   26,   26,   26,   26,   26,   26,
-   26,   26,   26,   26,   26,   26,    4,    4,    3,    3,
+    0,    0,   28,   28,   29,   29,   29,   29,   29,   29,
+   29,   29,   29,   29,   29,   29,    4,    4,    3,    3,
     3,    3,    3,   20,   20,   19,   10,   10,    8,    8,
     8,    8,    8,    2,    2,    1,    6,    6,   23,   24,
-   22,   22,   22,   22,   22,   17,   17,   18,   18,   18,
-   21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-   21,    5,    5,    5,   28,   28,   31,    9,    9,   29,
-   29,   32,    7,    7,   30,   30,   33,   27,   27,   34,
-   13,   13,   11,   11,   12,   12,   12,   12,   12,   16,
-   16,   14,   14,   15,   15,   15,
+   22,   22,   22,   22,   22,   26,   27,   25,   25,   25,
+   25,   25,   17,   17,   18,   18,   18,   21,   21,   21,
+   21,   21,   21,   21,   21,   21,   21,   21,    5,    5,
+    5,   31,   31,   34,    9,    9,   32,   32,   35,    7,
+    7,   33,   33,   36,   30,   30,   37,   13,   13,   11,
+   11,   12,   12,   12,   12,   12,   16,   16,   14,   14,
+   15,   15,   15,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylen[] =
@@ -199,13 +203,14 @@ short yylen[] =
     0,    1,    1,    2,    1,    2,    2,    2,    2,    2,
     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,    1,    2,    3,    3,
-    0,    1,    1,    2,    2,    0,    3,    1,    3,    2,
-    0,    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,    1,    1,    1,    3,    5,    1,    2,    3,    3,
+    0,    1,    1,    2,    2,    3,    3,    0,    1,    1,
+    2,    2,    0,    3,    1,    3,    2,    0,    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 yydefred[] =
@@ -213,21 +218,22 @@ const short yydefred[] =
 short yydefred[] =
 #endif
        {                                      0,
-    0,   85,   87,   88,   89,    0,    0,    0,    0,    0,
-   86,    5,    0,    0,    0,    0,    0,    0,   81,   83,
+    0,   92,   94,   95,   96,    0,    0,    0,    0,    0,
+   93,    5,    0,    0,    0,    0,    0,    0,   88,   90,
     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
-   31,   33,   30,    0,   27,    0,   68,    0,    0,   64,
-   63,   62,    0,   37,   73,    0,    0,    0,   65,    0,
-    0,   70,    0,    0,   78,    0,    0,   75,   84,    0,
+   31,   33,   30,    0,   27,    0,   75,    0,    0,   71,
+   70,   69,    0,   37,   80,    0,    0,    0,   72,    0,
+    0,   77,    0,    0,   85,    0,    0,   82,   91,    0,
     0,   24,    0,    4,    0,    0,    0,   20,    0,   28,
     0,    0,    0,    0,   38,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   82,    0,    0,   21,   22,
-   23,   18,   69,   74,    0,   66,    0,   71,    0,   79,
-    0,   76,    0,   34,    0,    0,   25,    0,    0,    0,
-    0,    0,    0,   51,    0,    0,   94,   96,   95,    0,
-   90,   92,    0,    0,   47,   35,    0,    0,    0,   44,
-   45,   93,    0,    0,   40,   39,   52,   53,   54,   55,
-   56,   57,   58,   59,   60,   61,   36,   91,
+    0,    0,    0,    0,    0,   89,    0,    0,   21,   22,
+   23,   18,   76,   81,    0,   73,    0,   78,    0,   86,
+    0,   83,    0,   34,    0,    0,   25,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  101,  103,  102,    0,
+   97,   99,    0,    0,   54,   35,    0,    0,    0,    0,
+   58,    0,    0,   44,   45,  100,    0,    0,   40,   39,
+    0,    0,    0,   51,   52,   98,   46,   47,   59,   60,
+   61,   62,   63,   64,   65,   66,   67,   68,   36,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yydgoto[] =
@@ -237,110 +243,112 @@ short yydgoto[] =
        {                                      18,
   104,  105,   27,   28,   44,   45,   46,   35,   61,   37,
    19,   20,   21,  121,  122,  123,  106,  110,   62,   63,
-  129,  114,  115,  116,   22,   23,   54,   48,   51,   57,
-   49,   52,   58,   55,
+  143,  114,  115,  116,  131,  132,  133,   22,   23,   54,
+   48,   51,   57,   49,   52,   58,   55,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yysindex[] =
 #else
 short yysindex[] =
 #endif
-       {                                    475,
- -270,    0,    0,    0,    0,  -29,  567,  594,  594,   -2,
-    0,    0, -240, -222, -216, -212, -241,    0,    0,    0,
-  -25,  475,    0,    0,  -10, -207,    0,    9,    0,    0,
-    0,    0,    0, -235,    0,  -33,    0,  -31,  -31,    0,
-    0,    0, -242,    0,    0,  -30,   -7,    3,    0,   -6,
-    4,    0,   -5,    6,    0,   -1,    8,    0,    0,  594,
-  -20,    0,   10,    0, -205, -196, -194,    0,  -29,    0,
-  567,    9,    9,    9,    0,   -2,    9,  567, -240,   -2,
- -222,  594, -216,  594, -212,    0,   31,  567,    0,    0,
-    0,    0,    0,    0,   26,    0,   28,    0,   29,    0,
-   29,    0,  541,    0,   32, -247,    0,   86,  -15,   33,
-   31,   14,   16,    0, -208, -204,    0,    0,    0, -231,
-    0,    0,   38,   86,    0,    0, -179, -178,  491,    0,
-    0,    0,   86,   38,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,};
+       {                                    541,
+ -270,    0,    0,    0,    0,  -21,   -5,  553,  553,   20,
+    0,    0, -242, -229, -216, -214, -240,    0,    0,    0,
+  -27,  541,    0,    0,  -18, -227,    0,    2,    0,    0,
+    0,    0,    0, -223,    0,  -33,    0,  -31,  -31,    0,
+    0,    0, -243,    0,    0,  -24,  -12,   -6,    0,    3,
+    4,    0,    5,    7,    0,    6,   10,    0,    0,  553,
+  -20,    0,   11,    0, -206, -193, -191,    0,  -21,    0,
+   -5,    2,    2,    2,    0,   20,    2,   -5, -242,   20,
+ -229,  553, -216,  553, -214,    0,   33,   -5,    0,    0,
+    0,    0,    0,    0,   31,    0,   32,    0,   34,    0,
+   34,    0,  513,    0,   35, -226,    0,   86,  -25,   36,
+   33,   19,   21, -234, -202, -201,    0,    0,    0, -232,
+    0,    0,   41,   86,    0,    0, -176, -173,   37,   38,
+    0, -198, -195,    0,    0,    0,   86,   41,    0,    0,
+ -169, -168,  569,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short yyrindex[] =
 #else
 short yyrindex[] =
 #endif
-       {                                     87,
+       {                                     96,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   90,    0,    0,    1,    0,    0,  177,    0,    0,
+    0,   97,    0,    0,    1,    0,    0,  177,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,  207,    0,    0,
   237,    0,    0,  271,    0,    0,  300,    0,    0,    0,
     0,    0,  329,    0,    0,    0,    0,    0,    0,    0,
     0,  358,  387,  417,    0,    0,  446,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  -26,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  463,    0,    0,    0,
     0,    0,    0,    0,   30,    0,   59,    0,   89,    0,
-  118,    0,    0,    0,  148,  514,    0,    0,   45,    0,
-  -26,    0,    0,    0,  537,  565,    0,    0,    0,    0,
-    0,    0,   50,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   52,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,};
+  118,    0,    0,    0,  148,  -28,    0,    0,   60,    0,
+  463,    0,    0,  594,  489,  512,    0,    0,    0,    0,
+    0,    0,   62,    0,    0,    0,    0,    0,    0,    0,
+    0,  623,  653,    0,    0,    0,    0,   63,    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 yygindex[] =
 #else
 short yygindex[] =
 #endif
        {                                      0,
-  -17,    0,   27,   11,   54,  -64,   15,   64,    2,   34,
-   39,   84,   -3,  -27,  -18,  -21,    0,    0,   19,    0,
-    0,    0,  -12,   -4,    0,   88,    0,    0,    0,    0,
-   35,   40,   23,   37,
+  -11,    0,   39,   12,   64,  -72,   25,   72,   -4,   40,
+   49,   93,   -1,  -23,   -8,   -9,    0,    0,   28,    0,
+    0,    0,   -3,    8,    0,  -13,   -7,    0,   99,    0,
+    0,    0,    0,   45,   46,   43,   47,
 };
-#define YYTABLESIZE 873
+#define YYTABLESIZE 932
 #if defined(__cplusplus) || defined(__STDC__)
 const short yytable[] =
 #else
 short yytable[] =
 #endif
        {                                      26,
-   19,   26,   26,   26,   38,   39,   46,   34,   36,   24,
-   71,   94,   60,   76,   40,   41,    2,   47,   60,    3,
-    4,    5,   29,   71,   30,   31,  117,   32,   60,   67,
-   43,  118,   66,   19,   67,   50,   42,   11,  112,  113,
-   87,   53,  124,   33,   19,   56,   72,  119,   73,   74,
-   65,   68,   69,   78,   80,   82,   77,   89,   72,   84,
-   79,   81,   67,   83,  147,   85,   90,   88,   91,   71,
-  103,   76,   60,  125,  127,  111,  128,  112,   99,   95,
-  101,  133,  113,  135,  136,   48,    1,   67,   80,    2,
-   50,   72,   49,  126,   97,   92,   75,   70,   86,  109,
-   59,  132,  134,  131,   93,  148,  107,  102,    0,   64,
-  130,    0,    0,   96,    0,    0,   72,   77,  120,  100,
-   98,   80,    0,    0,    0,    0,    0,    0,    0,    0,
+   19,   26,   36,   94,   41,   34,   38,   39,   26,   24,
+   71,   26,   60,   40,   41,   47,   60,    2,   60,   76,
+    3,    4,    5,   71,   66,  117,   67,   34,   50,   74,
+  118,   68,  124,   19,   29,   42,   30,   31,   11,   32,
+   87,   53,   65,   56,   19,   69,  119,   72,   78,   73,
+   74,   79,   43,  129,  130,   33,   89,   77,   79,  112,
+  113,   81,   74,   80,   83,   82,   84,   85,   88,   90,
+  159,   91,  103,   95,   71,   76,  125,   60,  111,  127,
+   99,  128,  101,  112,  137,  113,  139,   74,   87,  140,
+  130,   79,  129,  147,  148,    1,    2,  141,  142,  126,
+   55,  109,   57,   56,   97,   70,   75,   92,   86,   59,
+   93,  136,  135,  146,  138,  107,   79,   84,  120,  145,
+   64,   87,  134,   96,  144,    0,   98,  102,    0,  100,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   80,   26,    0,    0,
-   77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   87,   26,    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,   77,   12,    0,    0,    0,
+    0,    0,    0,    0,    0,   84,   12,    0,    0,    0,
    26,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,   26,    9,    0,    0,   12,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   25,    0,   25,   25,   25,
-   46,   46,   29,    0,   30,   31,   10,   32,    0,    9,
-    0,    0,   46,   46,   46,   46,   46,   46,   46,   46,
-   46,   46,   46,   33,   40,   41,   19,    0,   19,   46,
-   46,   19,   19,   19,   19,   19,   19,   19,   19,   10,
-    8,    0,    0,    0,    0,    0,   42,    0,    0,   19,
-   19,   19,   19,   19,   19,   67,    0,   67,    0,    0,
-   67,   67,   67,   67,   67,   67,   67,   67,    0,   11,
-    0,    0,    0,    8,    0,    0,    0,    0,   67,   67,
-   67,   67,   67,   67,   72,    0,   72,    0,    0,   72,
-   72,   72,   72,   72,   72,   72,   72,    0,    7,    0,
-    0,    0,   11,    0,    0,    0,    0,   72,   72,   72,
-   72,   72,   72,  117,   80,    0,   80,    0,  118,   80,
-   80,   80,   80,   80,   80,   80,   80,   15,    0,    0,
-    0,    7,    0,    0,  119,    0,    0,   80,   80,   80,
-   80,   80,   80,   77,    0,   77,    0,    0,   77,   77,
-   77,   77,   77,   77,   77,   77,   13,    0,    0,    0,
-   15,    0,    0,    0,    0,    0,   77,   77,   77,   77,
-   77,   77,    0,   26,    0,   26,    0,    0,   26,   26,
+    0,    0,    0,    0,    0,   25,    0,   25,   41,   41,
+   29,    0,   30,   31,   25,   32,   10,   25,    0,    9,
+   41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
+   41,   33,   29,    0,   30,   31,   19,   32,   19,   41,
+   41,   19,   19,   19,   19,   19,   19,   19,   19,   10,
+    8,    0,    0,   33,    0,    0,   40,   41,    0,   19,
+   19,   19,   19,   19,   19,   74,    0,   74,    0,    0,
+   74,   74,   74,   74,   74,   74,   74,   74,   42,   11,
+    0,    0,    0,    8,    0,    0,    0,    0,   74,   74,
+   74,   74,   74,   74,   79,    0,   79,    0,    0,   79,
+   79,   79,   79,   79,   79,   79,   79,    0,    7,    0,
+    0,    0,   11,    0,    0,    0,    0,   79,   79,   79,
+   79,   79,   79,  117,   87,    0,   87,    0,  118,   87,
+   87,   87,   87,   87,   87,   87,   87,   15,    0,    0,
+    0,    7,    0,    0,  119,    0,    0,   87,   87,   87,
+   87,   87,   87,   84,    0,   84,    0,    0,   84,   84,
+   84,   84,   84,   84,   84,   84,   13,    0,    0,    0,
+   15,    0,    0,    0,    0,    0,   84,   84,   84,   84,
+   84,   84,    0,   26,    0,   26,    0,    0,   26,   26,
    26,   26,   26,   26,   26,   26,   14,    0,    0,   13,
     0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
    26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
@@ -349,45 +357,51 @@ short yytable[] =
    12,    0,    9,    0,    9,    0,    0,    9,    9,    9,
     9,    9,    9,    9,    9,    0,    0,    0,   16,    0,
     0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
-    9,    0,   10,    0,   10,    0,    0,   10,   10,   10,
-   10,   10,   10,   10,   10,    0,    0,   17,    0,    0,
+    9,    0,   10,    0,   10,   53,    0,   10,   10,   10,
+   10,   10,   10,   10,   10,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,   10,   10,   10,   10,   10,
-   10,    0,    0,   43,    0,    0,    8,    0,    8,    0,
+   10,   42,    0,    0,    0,    0,    8,    0,    8,    0,
     0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
-    0,    0,    0,    0,    0,    0,   41,    0,    0,    8,
+    0,    0,    0,    0,   43,   17,    0,    0,    0,    8,
     8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
-   11,   11,   11,   11,   11,   11,   11,   11,    0,   42,
-    0,    0,    0,   17,    0,    0,    0,    0,   11,   11,
-   11,   11,   11,   11,    7,    0,    7,    0,    0,    7,
-    7,    7,    7,    7,    7,    7,    7,   43,  108,   34,
-    0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
+   11,   11,   11,   11,   11,   11,   11,   11,    0,    0,
+  108,    0,    0,   17,    0,    0,    0,    0,   11,   11,
+   11,   11,   11,   11,    7,   17,    7,    0,    0,    7,
+    7,    7,    7,    7,    7,    7,    7,    0,    0,    0,
+    0,   43,    0,    0,    0,    0,    0,    7,    7,    7,
     7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
-   15,   15,   15,   15,   15,   15,   17,    0,    0,    0,
+   15,   15,   15,   15,   15,   15,   48,    0,    0,    0,
     0,    0,    0,    0,    0,    0,   15,   15,   15,   15,
    15,   15,   13,    0,   13,    0,    0,   13,   13,   13,
-   13,   13,   13,   13,   13,    0,    0,    0,    0,    0,
+   13,   13,   13,   13,   13,   49,    0,    0,    0,    0,
     0,    0,    0,    0,    0,   13,   13,   13,   13,   13,
    13,    0,   14,    0,   14,    0,    0,   14,   14,   14,
-   14,   14,   14,   14,   14,    0,    0,    0,    0,    0,
+   14,   14,   14,   14,   14,   50,    0,    0,    0,    0,
     0,    0,    0,    0,    0,   14,   14,   14,   14,   14,
    14,   16,    0,   16,    0,    0,   16,   16,   16,   16,
-   16,   16,   16,   16,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
-    1,    0,    2,    0,    0,    3,    4,    5,    6,    7,
-    8,    9,   10,    0,    0,    0,    0,   40,   41,    0,
-    0,    0,    0,   11,   12,   13,   14,   15,   16,  137,
-  138,  139,  140,  141,  142,  143,  144,  145,  146,   42,
-   41,   41,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   41,   41,   41,   41,   41,   41,   41,   41,
-   41,   41,   41,   42,   42,    0,    0,    0,    2,    0,
-    0,    3,    4,    5,    0,   42,   42,   42,   42,   42,
-   42,   42,   42,   42,   42,   42,    0,    0,    0,   11,
-    0,   43,   43,    0,   29,    0,   30,   31,    0,   32,
-    0,    0,    0,   43,   43,   43,   43,   43,   43,   43,
-   43,   43,   43,   43,    0,   33,    0,    0,    0,    0,
-    0,    2,    0,    0,    3,    4,    5,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   11,
+   16,   16,   16,   16,    0,    0,    0,    0,    0,   53,
+   53,    0,    0,    0,   16,   16,   16,   16,   16,   16,
+    0,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+   53,   53,    0,    0,    0,   42,   42,    0,   53,   53,
+   53,   53,    0,    0,    0,    0,    0,   42,   42,   42,
+   42,   42,   42,   42,   42,   42,   42,   42,   43,   43,
+    2,    0,    0,    3,    4,    5,   42,   42,    0,    0,
+   43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+   43,   11,    0,    0,    0,    0,    1,    0,    2,   43,
+   43,    3,    4,    5,    6,    7,    8,    9,   10,    0,
+    2,    0,    0,    3,    4,    5,    0,    0,    0,   11,
+   12,   13,   14,   15,   16,   40,   41,    0,    0,    0,
+    0,   11,    0,    0,    0,    0,    0,  149,  150,  151,
+  152,  153,  154,  155,  156,  157,  158,   42,    0,    0,
+   48,   48,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   48,   48,   48,   48,   48,   48,   48,   48,
+   48,   48,   48,    0,    0,    0,    0,    0,    0,   49,
+   49,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+   49,   49,    0,    0,    0,    0,    0,    0,    0,   50,
+   50,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+   50,   50,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yycheck[] =
@@ -395,19 +409,19 @@ const short yycheck[] =
 short yycheck[] =
 #endif
        {                                      33,
-    0,   33,   33,   33,    8,    9,   33,   33,    7,  280,
-   44,   76,   44,   44,  257,  258,  258,  258,   44,  261,
-  262,  263,  258,   44,  260,  261,  258,  263,   44,    0,
-   33,  263,   43,   33,   45,  258,  279,  279,  286,  287,
-   61,  258,   58,  279,   44,  258,   36,  279,   38,   39,
-   61,  259,   44,   61,   61,   61,   46,  263,    0,   61,
-   58,   58,   33,   58,  129,   58,  263,   58,  263,   44,
-   40,   44,   44,   41,   61,   44,   61,  286,   82,   78,
-   84,   44,  287,  263,  263,   41,    0,   58,    0,    0,
-   41,   33,   41,  111,   80,   69,   43,   34,   60,  103,
-   17,  120,  124,  116,   71,  133,   88,   85,   -1,   22,
-  115,   -1,   -1,   79,   -1,   -1,   58,    0,   33,   83,
-   81,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+    0,   33,    7,   76,   33,   33,    8,    9,   33,  280,
+   44,   33,   44,  257,  258,  258,   44,  258,   44,   44,
+  261,  262,  263,   44,   43,  258,   45,   33,  258,    0,
+  263,  259,   58,   33,  258,  279,  260,  261,  279,  263,
+   61,  258,   61,  258,   44,   44,  279,   36,   61,   38,
+   39,   58,   33,  288,  289,  279,  263,   46,    0,  286,
+  287,   58,   33,   61,   58,   61,   61,   58,   58,  263,
+  143,  263,   40,   78,   44,   44,   41,   44,   44,   61,
+   82,   61,   84,  286,   44,  287,  263,   58,    0,  263,
+  289,   33,  288,  263,  263,    0,    0,   61,   61,  111,
+   41,  103,   41,   41,   80,   34,   43,   69,   60,   17,
+   71,  120,  116,  137,  124,   88,   58,    0,   33,  133,
+   22,   33,  115,   79,  132,   -1,   81,   85,   -1,   83,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,
    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
@@ -417,14 +431,14 @@ short yycheck[] =
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   33,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  259,   -1,  259,  259,  259,
-  257,  258,  258,   -1,  260,  261,    0,  263,   -1,   33,
-   -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
-  277,  278,  279,  279,  257,  258,  256,   -1,  258,  286,
-  287,  261,  262,  263,  264,  265,  266,  267,  268,   33,
-    0,   -1,   -1,   -1,   -1,   -1,  279,   -1,   -1,  279,
+   -1,   -1,   -1,   -1,   -1,  259,   -1,  259,  257,  258,
+  258,   -1,  260,  261,  259,  263,    0,  259,   -1,   33,
+  269,  270,  271,  272,  273,  274,  275,  276,  277,  278,
+  279,  279,  258,   -1,  260,  261,  256,  263,  258,  288,
+  289,  261,  262,  263,  264,  265,  266,  267,  268,   33,
+    0,   -1,   -1,  279,   -1,   -1,  257,  258,   -1,  279,
   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,   -1,    0,
+  261,  262,  263,  264,  265,  266,  267,  268,  279,    0,
    -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
   281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
   262,  263,  264,  265,  266,  267,  268,   -1,    0,   -1,
@@ -444,51 +458,57 @@ short yycheck[] =
   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
   264,  265,  266,  267,  268,   -1,   -1,   -1,   33,   -1,
    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   33,   -1,   -1,
+  284,   -1,  256,   -1,  258,   33,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,   -1,   33,   -1,   -1,  256,   -1,  258,   -1,
+  284,   33,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,
    -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,  279,
+   -1,   -1,   -1,   -1,   33,   33,   -1,   -1,   -1,  279,
   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,   -1,   33,
-   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
-  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,  268,   33,   58,   33,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
+  261,  262,  263,  264,  265,  266,  267,  268,   -1,   -1,
+   58,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
+  281,  282,  283,  284,  256,   33,  258,   -1,   -1,  261,
+  262,  263,  264,  265,  266,  267,  268,   -1,   -1,   -1,
+   -1,   33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
   282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
   263,  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
   283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
+  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
   284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
+  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
   284,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,
-  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
-  266,  267,  268,   -1,   -1,   -1,   -1,  257,  258,   -1,
-   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,  269,
-  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
+  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,  257,
+  258,   -1,   -1,   -1,  279,  280,  281,  282,  283,  284,
+   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,   -1,   -1,   -1,  257,  258,   -1,  286,  287,
+  288,  289,   -1,   -1,   -1,   -1,   -1,  269,  270,  271,
+  272,  273,  274,  275,  276,  277,  278,  279,  257,  258,
+  258,   -1,   -1,  261,  262,  263,  288,  289,   -1,   -1,
+  269,  270,  271,  272,  273,  274,  275,  276,  277,  278,
+  279,  279,   -1,   -1,   -1,   -1,  256,   -1,  258,  288,
+  289,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
+  258,   -1,   -1,  261,  262,  263,   -1,   -1,   -1,  279,
+  280,  281,  282,  283,  284,  257,  258,   -1,   -1,   -1,
+   -1,  279,   -1,   -1,   -1,   -1,   -1,  269,  270,  271,
+  272,  273,  274,  275,  276,  277,  278,  279,   -1,   -1,
   257,  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
-  277,  278,  279,  257,  258,   -1,   -1,   -1,  258,   -1,
-   -1,  261,  262,  263,   -1,  269,  270,  271,  272,  273,
-  274,  275,  276,  277,  278,  279,   -1,   -1,   -1,  279,
-   -1,  257,  258,   -1,  258,   -1,  260,  261,   -1,  263,
-   -1,   -1,   -1,  269,  270,  271,  272,  273,  274,  275,
-  276,  277,  278,  279,   -1,  279,   -1,   -1,   -1,   -1,
-   -1,  258,   -1,   -1,  261,  262,  263,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  279,
+  277,  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,  257,
+  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
+  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 287
+#define YYMAXTOKEN 289
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyname[] =
@@ -507,7 +527,7 @@ char *yyname[] =
 "DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD",
 "PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT",
 "LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
-"RUNASALIAS","ERROR","TYPE","ROLE",
+"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyrule[] =
@@ -550,7 +570,7 @@ char *yyrule[] =
 "host : WORD",
 "cmndspeclist : cmndspec",
 "cmndspeclist : cmndspeclist ',' cmndspec",
-"cmndspec : runasspec selinux cmndtag opcmnd",
+"cmndspec : runasspec selinux solarisprivs cmndtag opcmnd",
 "opcmnd : cmnd",
 "opcmnd : '!' cmnd",
 "rolespec : ROLE '=' WORD",
@@ -560,6 +580,13 @@ char *yyrule[] =
 "selinux : typespec",
 "selinux : rolespec typespec",
 "selinux : typespec rolespec",
+"privsspec : PRIVS '=' WORD",
+"limitprivsspec : LIMITPRIVS '=' WORD",
+"solarisprivs :",
+"solarisprivs : privsspec",
+"solarisprivs : limitprivsspec",
+"solarisprivs : privsspec limitprivsspec",
+"solarisprivs : limitprivsspec privsspec",
 "runasspec :",
 "runasspec : '(' runaslist ')'",
 "runaslist : userlist",
@@ -638,7 +665,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 611 "gram.y"
+#line 658 "gram.y"
 static struct defaults *
 new_default(char *var, char *val, int op)
 {
@@ -747,6 +774,9 @@ init_parser(const char *path, int quiet)
 #ifdef HAVE_SELINUX
            char *role = NULL, *type = NULL;
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+           char *privs = NULL, *limitprivs = NULL;
+#endif /* HAVE_PRIV_SET */
 
            while ((m = tq_pop(&priv->hostlist)) != NULL) {
                efree(m->name);
@@ -764,6 +794,17 @@ init_parser(const char *path, int quiet)
                    efree(cs->type);
                }
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+               /* Only free the first instance of privs/limitprivs. */
+               if (cs->privs != privs) {
+                   privs = cs->privs;
+                   efree(cs->privs);
+               }
+               if (cs->limitprivs != limitprivs) {
+                   limitprivs = cs->limitprivs;
+                   efree(cs->limitprivs);
+               }
+#endif /* HAVE_PRIV_SET */
                if (tq_last(&cs->runasuserlist) != runasuser) {
                    runasuser = tq_last(&cs->runasuserlist);
                    while ((m = tq_pop(&cs->runasuserlist)) != NULL) {
@@ -827,7 +868,7 @@ init_parser(const char *path, int quiet)
 
     debug_return;
 }
-#line 778 "gram.c"
+#line 819 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -845,22 +886,20 @@ static int yygrowstack()
         return -1;
     else if ((newsize *= 2) > YYMAXDEPTH)
         newsize = YYMAXDEPTH;
-    i = yyssp - yyss;
 #ifdef SIZE_MAX
 #define YY_SIZE_MAX SIZE_MAX
 #else
 #define YY_SIZE_MAX 0x7fffffff
 #endif
-    if (!newsize || YY_SIZE_MAX / newsize < sizeof *newss)
+    if (YY_SIZE_MAX / newsize < sizeof *newss)
         goto bail;
+    i = yyssp - yyss;
     newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
       (short *)malloc(newsize * sizeof *newss); /* overflow check above */
     if (newss == NULL)
         goto bail;
     yyss = newss;
     yyssp = newss + i;
-    if (!newsize || YY_SIZE_MAX / newsize < sizeof *newvs)
-        goto bail;
     newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
       (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */
     if (newvs == NULL)
@@ -1033,127 +1072,127 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 192 "gram.y"
+#line 198 "gram.y"
 { ; }
 break;
 case 5:
-#line 200 "gram.y"
+#line 206 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 203 "gram.y"
+#line 209 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 206 "gram.y"
+#line 212 "gram.y"
 {
                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                        }
 break;
 case 8:
-#line 209 "gram.y"
+#line 215 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 212 "gram.y"
+#line 218 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 215 "gram.y"
+#line 221 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 218 "gram.y"
+#line 224 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 221 "gram.y"
+#line 227 "gram.y"
 {
                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                        }
 break;
 case 13:
-#line 224 "gram.y"
+#line 230 "gram.y"
 {
                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 14:
-#line 227 "gram.y"
+#line 233 "gram.y"
 {
                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 15:
-#line 230 "gram.y"
+#line 236 "gram.y"
 {
                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 16:
-#line 233 "gram.y"
+#line 239 "gram.y"
 {
                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 18:
-#line 239 "gram.y"
+#line 245 "gram.y"
 {
                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 245 "gram.y"
+#line 251 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                        }
 break;
 case 20:
-#line 248 "gram.y"
+#line 254 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                        }
 break;
 case 21:
-#line 251 "gram.y"
+#line 257 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                        }
 break;
 case 22:
-#line 254 "gram.y"
+#line 260 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                        }
 break;
 case 23:
-#line 257 "gram.y"
+#line 263 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                        }
 break;
 case 25:
-#line 263 "gram.y"
+#line 269 "gram.y"
 {
                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 269 "gram.y"
+#line 275 "gram.y"
 {
                            struct privilege *p = ecalloc(1, sizeof(*p));
                            list2tq(&p->hostlist, yyvsp[-2].member);
@@ -1164,51 +1203,51 @@ case 26:
                        }
 break;
 case 27:
-#line 279 "gram.y"
+#line 285 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 283 "gram.y"
+#line 289 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 289 "gram.y"
+#line 295 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 30:
-#line 292 "gram.y"
+#line 298 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 31:
-#line 295 "gram.y"
+#line 301 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
 case 32:
-#line 298 "gram.y"
+#line 304 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                        }
 break;
 case 33:
-#line 301 "gram.y"
+#line 307 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
 case 35:
-#line 307 "gram.y"
+#line 313 "gram.y"
 {
                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
 #ifdef HAVE_SELINUX
@@ -1218,6 +1257,13 @@ case 35:
                            if (yyvsp[0].cmndspec->type == NULL)
                                yyvsp[0].cmndspec->type = yyvsp[0].cmndspec->prev->type;
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+                           /* propagate privs & limitprivs */
+                           if (yyvsp[0].cmndspec->privs == NULL)
+                               yyvsp[0].cmndspec->privs = yyvsp[0].cmndspec->prev->privs;
+                           if (yyvsp[0].cmndspec->limitprivs == NULL)
+                               yyvsp[0].cmndspec->limitprivs = yyvsp[0].cmndspec->prev->limitprivs;
+#endif /* HAVE_PRIV_SET */
                            /* propagate tags and runas list */
                            if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC)
                                yyvsp[0].cmndspec->tags.nopasswd = yyvsp[0].cmndspec->prev->tags.nopasswd;
@@ -1241,20 +1287,24 @@ case 35:
                        }
 break;
 case 36:
-#line 339 "gram.y"
+#line 352 "gram.y"
 {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
-                           if (yyvsp[-3].runas != NULL) {
-                               list2tq(&cs->runasuserlist, yyvsp[-3].runas->runasusers);
-                               list2tq(&cs->runasgrouplist, yyvsp[-3].runas->runasgroups);
-                               efree(yyvsp[-3].runas);
+                           if (yyvsp[-4].runas != NULL) {
+                               list2tq(&cs->runasuserlist, yyvsp[-4].runas->runasusers);
+                               list2tq(&cs->runasgrouplist, yyvsp[-4].runas->runasgroups);
+                               efree(yyvsp[-4].runas);
                            } else {
                                tq_init(&cs->runasuserlist);
                                tq_init(&cs->runasgrouplist);
                            }
 #ifdef HAVE_SELINUX
-                           cs->role = yyvsp[-2].seinfo.role;
-                           cs->type = yyvsp[-2].seinfo.type;
+                           cs->role = yyvsp[-3].seinfo.role;
+                           cs->type = yyvsp[-3].seinfo.type;
+#endif
+#ifdef HAVE_PRIV_SET
+                           cs->privs = yyvsp[-2].privinfo.privs;
+                           cs->limitprivs = yyvsp[-2].privinfo.limitprivs;
 #endif
                            cs->tags = yyvsp[-1].tag;
                            cs->cmnd = yyvsp[0].member;
@@ -1268,183 +1318,230 @@ case 36:
                        }
 break;
 case 37:
-#line 365 "gram.y"
+#line 382 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 38:
-#line 369 "gram.y"
+#line 386 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 39:
-#line 375 "gram.y"
+#line 392 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 40:
-#line 380 "gram.y"
+#line 397 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 41:
-#line 385 "gram.y"
+#line 402 "gram.y"
 {
                            yyval.seinfo.role = NULL;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 42:
-#line 389 "gram.y"
+#line 406 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[0].string;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 43:
-#line 393 "gram.y"
+#line 410 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[0].string;
                            yyval.seinfo.role = NULL;
                        }
 break;
 case 44:
-#line 397 "gram.y"
+#line 414 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[-1].string;
                            yyval.seinfo.type = yyvsp[0].string;
                        }
 break;
 case 45:
-#line 401 "gram.y"
+#line 418 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[-1].string;
                            yyval.seinfo.role = yyvsp[0].string;
                        }
 break;
 case 46:
-#line 407 "gram.y"
+#line 424 "gram.y"
 {
-                           yyval.runas = NULL;
+                           yyval.string = yyvsp[0].string;
                        }
 break;
 case 47:
-#line 410 "gram.y"
+#line 428 "gram.y"
 {
-                           yyval.runas = yyvsp[-1].runas;
+                           yyval.string = yyvsp[0].string;
                        }
 break;
 case 48:
-#line 415 "gram.y"
+#line 433 "gram.y"
+{
+                           yyval.privinfo.privs = NULL;
+                           yyval.privinfo.limitprivs = NULL;
+                       }
+break;
+case 49:
+#line 437 "gram.y"
+{
+                           yyval.privinfo.privs = yyvsp[0].string;
+                           yyval.privinfo.limitprivs = NULL;
+                       }
+break;
+case 50:
+#line 441 "gram.y"
+{
+                           yyval.privinfo.privs = NULL;
+                           yyval.privinfo.limitprivs = yyvsp[0].string;
+                       }
+break;
+case 51:
+#line 445 "gram.y"
+{
+                           yyval.privinfo.privs = yyvsp[-1].string;
+                           yyval.privinfo.limitprivs = yyvsp[0].string;
+                       }
+break;
+case 52:
+#line 449 "gram.y"
+{
+                           yyval.privinfo.limitprivs = yyvsp[-1].string;
+                           yyval.privinfo.privs = yyvsp[0].string;
+                       }
+break;
+case 53:
+#line 454 "gram.y"
+{
+                           yyval.runas = NULL;
+                       }
+break;
+case 54:
+#line 457 "gram.y"
+{
+                           yyval.runas = yyvsp[-1].runas;
+                       }
+break;
+case 55:
+#line 462 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[0].member;
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 49:
-#line 420 "gram.y"
+case 56:
+#line 467 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[-2].member;
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 50:
-#line 425 "gram.y"
+case 57:
+#line 472 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            /* $$->runasusers = NULL; */
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 51:
-#line 432 "gram.y"
+case 58:
+#line 479 "gram.y"
 {
                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
                        }
 break;
-case 52:
-#line 436 "gram.y"
+case 59:
+#line 483 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
-case 53:
-#line 439 "gram.y"
+case 60:
+#line 486 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
-case 54:
-#line 442 "gram.y"
+case 61:
+#line 489 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
-case 55:
-#line 445 "gram.y"
+case 62:
+#line 492 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
-case 56:
-#line 448 "gram.y"
+case 63:
+#line 495 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
-case 57:
-#line 451 "gram.y"
+case 64:
+#line 498 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
-case 58:
-#line 454 "gram.y"
+case 65:
+#line 501 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
-case 59:
-#line 457 "gram.y"
+case 66:
+#line 504 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
-case 60:
-#line 460 "gram.y"
+case 67:
+#line 507 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
-case 61:
-#line 463 "gram.y"
+case 68:
+#line 510 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
-case 62:
-#line 468 "gram.y"
+case 69:
+#line 515 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 63:
-#line 471 "gram.y"
+case 70:
+#line 518 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 64:
-#line 474 "gram.y"
+case 71:
+#line 521 "gram.y"
 {
                            struct sudo_command *c = ecalloc(1, sizeof(*c));
                            c->cmnd = yyvsp[0].command.cmnd;
@@ -1452,8 +1549,8 @@ case 64:
                            yyval.member = new_member((char *)c, COMMAND);
                        }
 break;
-case 67:
-#line 486 "gram.y"
+case 74:
+#line 533 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
@@ -1462,15 +1559,15 @@ case 67:
                            }
                        }
 break;
-case 69:
-#line 496 "gram.y"
+case 76:
+#line 543 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 72:
-#line 506 "gram.y"
+case 79:
+#line 553 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
@@ -1479,15 +1576,15 @@ case 72:
                            }
                        }
 break;
-case 74:
-#line 516 "gram.y"
+case 81:
+#line 563 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 77:
-#line 526 "gram.y"
+case 84:
+#line 573 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
@@ -1496,8 +1593,8 @@ case 77:
                            }
                        }
 break;
-case 80:
-#line 539 "gram.y"
+case 87:
+#line 586 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
@@ -1506,97 +1603,97 @@ case 80:
                            }
                        }
 break;
-case 82:
-#line 549 "gram.y"
+case 89:
+#line 596 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 83:
-#line 555 "gram.y"
+case 90:
+#line 602 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 84:
-#line 559 "gram.y"
+case 91:
+#line 606 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 85:
-#line 565 "gram.y"
+case 92:
+#line 612 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 86:
-#line 568 "gram.y"
+case 93:
+#line 615 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 87:
-#line 571 "gram.y"
+case 94:
+#line 618 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
-case 88:
-#line 574 "gram.y"
+case 95:
+#line 621 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                        }
 break;
-case 89:
-#line 577 "gram.y"
+case 96:
+#line 624 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-case 91:
-#line 583 "gram.y"
+case 98:
+#line 630 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 92:
-#line 589 "gram.y"
+case 99:
+#line 636 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 93:
-#line 593 "gram.y"
+case 100:
+#line 640 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 94:
-#line 599 "gram.y"
+case 101:
+#line 646 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 95:
-#line 602 "gram.y"
+case 102:
+#line 649 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 96:
-#line 605 "gram.y"
+case 103:
+#line 652 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-#line 1547 "gram.c"
+#line 1644 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 2bec420543b137625617894d715d6127e9cbc906..05cd90d1fca392ffb985085b49f1256449969cac 100644 (file)
@@ -29,6 +29,8 @@
 #define ERROR 285
 #define TYPE 286
 #define ROLE 287
+#define PRIVS 288
+#define LIMITPRIVS 289
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -40,6 +42,7 @@ typedef union {
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
+    struct solaris_privs_info privinfo;
     char *string;
     int tok;
 } YYSTYPE;
index 0315f243751caa4e62f1996677cf5d4db7cc18c9..51e61c7835c2946499cdf9dabdbbfd63d922547c 100644 (file)
@@ -123,6 +123,7 @@ yyerror(const char *s)
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
+    struct solaris_privs_info privinfo;
     char *string;
     int tok;
 }
@@ -161,6 +162,8 @@ yyerror(const char *s)
 %token <tok>    ERROR
 %token <tok>    TYPE                   /* SELinux type */
 %token <tok>    ROLE                   /* SELinux role */
+%token <tok>    PRIVS                  /* Solaris privileges */
+%token <tok>    LIMITPRIVS             /* Solaris limit privileges */
 
 %type <cmndspec>  cmndspec
 %type <cmndspec>  cmndspeclist
@@ -186,6 +189,9 @@ yyerror(const char *s)
 %type <seinfo>   selinux
 %type <string>   rolespec
 %type <string>   typespec
+%type <privinfo>  solarisprivs
+%type <string>   privsspec
+%type <string>   limitprivsspec
 
 %%
 
@@ -313,6 +319,13 @@ cmndspeclist       :       cmndspec
                            if ($3->type == NULL)
                                $3->type = $3->prev->type;
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+                           /* propagate privs & limitprivs */
+                           if ($3->privs == NULL)
+                               $3->privs = $3->prev->privs;
+                           if ($3->limitprivs == NULL)
+                               $3->limitprivs = $3->prev->limitprivs;
+#endif /* HAVE_PRIV_SET */
                            /* propagate tags and runas list */
                            if ($3->tags.nopasswd == UNSPEC)
                                $3->tags.nopasswd = $3->prev->tags.nopasswd;
@@ -336,7 +349,7 @@ cmndspeclist        :       cmndspec
                        }
                ;
 
-cmndspec       :       runasspec selinux cmndtag opcmnd {
+cmndspec       :       runasspec selinux solarisprivs cmndtag opcmnd {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
                            if ($1 != NULL) {
                                list2tq(&cs->runasuserlist, $1->runasusers);
@@ -350,8 +363,12 @@ cmndspec   :       runasspec selinux cmndtag opcmnd {
                            cs->role = $2.role;
                            cs->type = $2.type;
 #endif
-                           cs->tags = $3;
-                           cs->cmnd = $4;
+#ifdef HAVE_PRIV_SET
+                           cs->privs = $3.privs;
+                           cs->limitprivs = $3.limitprivs;
+#endif
+                           cs->tags = $4;
+                           cs->cmnd = $5;
                            cs->prev = cs;
                            cs->next = NULL;
                            /* sudo "ALL" implies the SETENV tag */
@@ -404,6 +421,36 @@ selinux            :       /* empty */ {
                        }
                ;
 
+privsspec      :       PRIVS '=' WORD {
+                           $$ = $3;
+                       }
+               ;
+limitprivsspec :       LIMITPRIVS '=' WORD {
+                           $$ = $3;
+                       }
+               ;
+
+solarisprivs   :       /* empty */ {
+                           $$.privs = NULL;
+                           $$.limitprivs = NULL;
+                       }
+               |       privsspec {
+                           $$.privs = $1;
+                           $$.limitprivs = NULL;
+                       }       
+               |       limitprivsspec {
+                           $$.privs = NULL;
+                           $$.limitprivs = $1;
+                       }       
+               |       privsspec limitprivsspec {
+                           $$.privs = $1;
+                           $$.limitprivs = $2;
+                       }       
+               |       limitprivsspec privsspec {
+                           $$.limitprivs = $1;
+                           $$.privs = $2;
+                       }       
+
 runasspec      :       /* empty */ {
                            $$ = NULL;
                        }
@@ -716,6 +763,9 @@ init_parser(const char *path, int quiet)
 #ifdef HAVE_SELINUX
            char *role = NULL, *type = NULL;
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+           char *privs = NULL, *limitprivs = NULL;
+#endif /* HAVE_PRIV_SET */
 
            while ((m = tq_pop(&priv->hostlist)) != NULL) {
                efree(m->name);
@@ -733,6 +783,17 @@ init_parser(const char *path, int quiet)
                    efree(cs->type);
                }
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+               /* Only free the first instance of privs/limitprivs. */
+               if (cs->privs != privs) {
+                   privs = cs->privs;
+                   efree(cs->privs);
+               }
+               if (cs->limitprivs != limitprivs) {
+                   limitprivs = cs->limitprivs;
+                   efree(cs->limitprivs);
+               }
+#endif /* HAVE_PRIV_SET */
                if (tq_last(&cs->runasuserlist) != runasuser) {
                    runasuser = tq_last(&cs->runasuserlist);
                    while ((m = tq_pop(&cs->runasuserlist)) != NULL) {
index 4937145f5aafa2eef2927a689502c3b9e3e826cf..544c2a62cac8aa80d0f5d4013d0c22aea1ed0be3 100644 (file)
@@ -239,6 +239,13 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
                        if (user_type == NULL)
                            user_type = cs->type ? estrdup(cs->type) : def_type;
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+                       /* Set Solaris privilege sets */
+                       if (runas_privs == NULL)
+                           runas_privs = cs->privs ? estrdup(cs->privs) : def_privs;
+                       if (runas_limitprivs == NULL)
+                           runas_limitprivs = cs->limitprivs ? estrdup(cs->limitprivs) : def_limitprivs;
+#endif /* HAVE_PRIV_SET */
                        goto matched2;
                    }
                }
@@ -281,6 +288,12 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags,
     struct member *m;
     debug_decl(sudo_file_append_cmnd, SUDO_DEBUG_NSS)
 
+#ifdef HAVE_PRIV_SET
+    if (cs->privs)
+       lbuf_append(lbuf, "PRIVS=\"%s\" ", cs->privs);
+    if (cs->limitprivs)
+       lbuf_append(lbuf, "LIMITPRIVS=\"%s\" ", cs->limitprivs);
+#endif /* HAVE_PRIV_SET */
 #ifdef HAVE_SELINUX
     if (cs->role)
        lbuf_append(lbuf, "ROLE=%s ", cs->role);
index 3b1a5b50dd2a265b420853751f7e91a71b7953d7..9c53fb82fb17f00ea54a08a8d5bc26a9779b4795 100644 (file)
@@ -57,7 +57,17 @@ struct selinux_info {
 };
 
 /*
- * The parses sudoers file is stored as a collection of linked lists,
+ * Solaris privileges container struct
+ * Currently just contains permitted and limit privileges.
+ * It could have PFEXEC and PRIV_AWARE flags added in the future.
+ */
+struct solaris_privs_info {
+    char *privs;
+    char *limitprivs;
+};
+
+/*
+ * The parsed sudoers file is stored as a collection of linked lists,
  * modelled after the yacc grammar.
  *
  * Other than the alias struct, which is stored in a red-black tree,
@@ -111,6 +121,9 @@ struct cmndspec {
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
 #endif
+#ifdef HAVE_PRIV_SET
+    char *privs, *limitprivs;          /* Solaris privilege sets */
+#endif
 };
 
 /*
index b0a18e8dd4d10c36ffc2e3fc178ebcf5e61af639..14db320f3b437553254a989997c58c8c65e7fb6f 100644 (file)
@@ -697,6 +697,12 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
     if (user_type != NULL)
        command_info[info_len++] = fmt_string("selinux_type", user_type);
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+    if (runas_privs != NULL)
+       command_info[info_len++] = fmt_string("runas_privs", runas_privs);
+    if (runas_limitprivs != NULL)
+       command_info[info_len++] = fmt_string("runas_limitprivs", runas_limitprivs);
+#endif /* HAVE_SELINUX */
 
     /* Must audit before uid change. */
     audit_success(NewArgv);
@@ -1312,6 +1318,16 @@ deserialize_info(char * const args[], char * const settings[], char * const user
            def_use_loginclass = true;
            continue;
        }
+#ifdef HAVE_PRIV_SET
+       if (MATCHES(*cur, "runas_privs=")) {
+           def_privs = *cur + sizeof("runas_privs=") - 1;
+           continue;
+       }
+       if (MATCHES(*cur, "runas_limitprivs=")) {
+           def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1;
+           continue;
+       }
+#endif /* HAVE_PRIV_SET */
 #ifdef HAVE_SELINUX
        if (MATCHES(*cur, "selinux_role=")) {
            user_role = *cur + sizeof("selinux_role=") - 1;
index 8a4bad76601d2772f574a982f5094da44ba93e04..c573fb22c1f15d36d1f7635d21cadc4ac3958871 100644 (file)
@@ -80,6 +80,10 @@ struct sudo_user {
 #ifdef HAVE_SELINUX
     char *role;
     char *type;
+#endif
+#ifdef HAVE_PRIV_SET
+    char *privs;
+    char *limitprivs;
 #endif
     char *cwd;
     char *iolog_file;
@@ -185,6 +189,8 @@ struct sudo_user {
 #define user_role              (sudo_user.role)
 #define user_type              (sudo_user.type)
 #define user_closefrom         (sudo_user.closefrom)
+#define        runas_privs             (sudo_user.privs)
+#define        runas_limitprivs        (sudo_user.limitprivs)
 
 #ifdef __TANDEM
 # define ROOT_UID       65535
index f71eb83492219dae565ed73ccce883a22c9b29a2..cbca1671d803da29e089f7ad535466521262ef57 100644 (file)
@@ -636,6 +636,12 @@ print_privilege(struct privilege *priv)
            if (cs->type)
                printf("TYPE=%s ", cs->type);
 #endif /* HAVE_SELINUX */
+#ifdef HAVE_PRIV_SET
+           if (cs->privs)
+               printf("PRIVS=%s ", cs->privs);
+           if (cs->limitprivs)
+               printf("LIMITPRIVS=%s ", cs->limitprivs);
+#endif /* HAVE_PRIV_SET */
            if (cs->tags.nopasswd != UNSPEC && cs->tags.nopasswd != tags.nopasswd)
                printf("%sPASSWD: ", cs->tags.nopasswd ? "NO" : "");
            if (cs->tags.noexec != UNSPEC && cs->tags.noexec != tags.noexec)
index 40bc1472f693e3eed7002bd5acae8c37648c2160..219f8b584efd4bfe8d07c301f5a0bc21376cc74d 100644 (file)
@@ -289,77 +289,79 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 59
-#define YY_END_OF_BUFFER 60
-static yyconst short int yy_accept[607] =
+#define YY_NUM_RULES 61
+#define YY_END_OF_BUFFER 62
+static yyconst short int yy_accept[622] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   60,   47,   55,   54,   53,   46,   58,   32,
-       48,   49,   32,   50,   47,   47,   47,   47,   52,   51,
-       58,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   58,   47,   47,   55,   58,   42,   42,   42,   42,
-       42,    2,   58,    1,   47,   47,   17,   16,   17,   16,
-       16,   58,   58,   58,    3,    9,    8,    9,    4,    9,
-        5,   58,   13,   13,   13,   11,   12,   47,    0,   55,
-       53,    0,   57,    0,   47,   34,    0,   32,    0,   33,
-        0,   45,   45,    0,   47,   47,    0,   47,   47,   47,
-
-       47,    0,   37,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   47,   56,   47,   55,    0,    0,    0,
-        0,    0,    0,   47,   47,   47,   47,   47,    2,    1,
-        0,    1,   43,   43,    0,   47,   17,   17,   15,   14,
-       15,    0,    0,    3,    9,    0,    6,    7,    9,    9,
-       13,    0,   13,   13,    0,   10,    0,    0,    0,   34,
-       34,    0,    0,   47,   47,   47,   47,   47,    0,    0,
-       37,   37,   42,   39,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,   47,    0,    0,    0,    0,    0,
-        0,   47,   47,   47,   47,   47,    0,   47,   10,    0,
-
-       47,   47,   47,   47,   47,   47,    0,   38,   38,   38,
-        0,    0,   37,   37,   37,   37,   37,   37,   37,   42,
-       42,   42,   42,   42,   42,   42,   42,   40,   42,   41,
-       47,    0,    0,    0,    0,    0,    0,   47,   47,   47,
-       47,   47,   47,   47,    0,    0,   38,   38,   38,    0,
-       37,   37,    0,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,    0,   25,   42,   42,   42,   42,
-       42,   42,   42,   42,   47,    0,    0,    0,    0,   47,
-       47,   47,   47,   47,   47,   47,   47,    0,   38,    0,
-       37,   37,   37,    0,    0,    0,   37,   37,   37,   37,
-
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   42,
-       42,   42,   42,   42,   42,   42,   42,   47,    0,    0,
-        0,   47,   47,   47,   35,   35,   35,    0,    0,   37,
-       37,   37,   37,   37,   37,   37,    0,    0,    0,    0,
+        0,    0,   62,   49,   57,   56,   55,   48,   60,   32,
+       50,   51,   32,   52,   49,   49,   49,   49,   54,   53,
+       60,   44,   44,   44,   44,   44,   44,   44,   44,   44,
+       44,   60,   49,   49,   57,   60,   44,   44,   44,   44,
+       44,    2,   60,    1,   49,   44,   44,   49,   17,   16,
+       17,   16,   16,   60,   60,   60,    3,    9,    8,    9,
+        4,    9,    5,   60,   13,   13,   13,   11,   12,   49,
+        0,   57,   55,    0,   59,    0,   49,   34,    0,   32,
+        0,   33,    0,   47,   47,    0,   49,   49,    0,   49,
+
+       49,   49,   49,    0,   37,   44,   44,   44,   44,   44,
+       44,   44,   44,   44,   44,   44,   44,   49,   58,   49,
+       57,    0,    0,    0,    0,    0,    0,   49,   49,   49,
+       49,   49,    2,    1,    0,    1,   45,   45,    0,   49,
+       17,   17,   15,   14,   15,    0,    0,    3,    9,    0,
+        6,    7,    9,    9,   13,    0,   13,   13,    0,   10,
+        0,    0,    0,   34,   34,    0,    0,   49,   49,   49,
+       49,   49,    0,    0,   37,   37,   44,   39,   44,   44,
+       44,   44,   44,   44,   44,   44,   44,   44,   44,   44,
+       49,    0,    0,    0,    0,    0,    0,   49,   49,   49,
+
+       49,   49,    0,   49,   10,    0,   49,   49,   49,   49,
+       49,   49,    0,   38,   38,   38,    0,    0,   37,   37,
+       37,   37,   37,   37,   37,   44,   44,   44,   44,   44,
+       44,   44,   44,   44,   44,   40,   44,   41,   49,    0,
+        0,    0,    0,    0,    0,   49,   49,   49,   49,   49,
+       49,   49,    0,    0,   38,   38,   38,    0,   37,   37,
         0,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   42,   42,    0,   24,   42,
-       42,   42,   42,    0,   23,    0,   26,   47,    0,    0,
-        0,   47,   47,   47,   47,   35,   35,   35,   35,    0,
-       37,    0,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,    0,    0,    0,   37,   37,   37,   37,
+       37,   37,    0,   25,   44,   44,   44,   44,   44,   44,
+       44,   44,   42,   44,   49,    0,    0,    0,    0,   49,
+       49,   49,   49,   49,   49,   49,   49,    0,   38,    0,
 
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   42,
-       42,   42,   42,   42,   42,   44,    0,    0,    0,   47,
-       20,   43,   36,   36,   36,   36,   37,    0,    0,    0,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,    0,    0,    0,    0,    0,   37,   37,
-       37,   37,   37,   37,   37,   37,   42,   42,   42,   42,
-        0,   22,    0,   27,    0,   20,    0,    0,   47,    0,
-       47,   47,   47,   36,   36,   36,   36,    0,    0,    0,
+       37,   37,   37,    0,    0,    0,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,   37,   37,   44,
+       44,   44,   44,   44,   44,   44,   44,   44,   49,    0,
+        0,    0,   49,   49,   49,   35,   35,   35,    0,    0,
+       37,   37,   37,   37,   37,   37,   37,    0,    0,    0,
         0,    0,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   44,   44,   44,    0,
+       24,   44,   44,   44,   44,    0,   23,    0,   26,   49,
+        0,    0,    0,   49,   49,   49,   49,   35,   35,   35,
+       35,    0,   37,    0,   37,   37,   37,   37,   37,   37,
 
-       37,   37,    0,   30,   42,   42,   42,    0,    0,    0,
-       18,    0,   21,   20,    0,    0,    0,    0,    0,   20,
-        0,   47,   47,   47,    0,    0,    0,   37,   37,   37,
+       37,   37,   37,   37,   37,    0,    0,    0,   37,   37,
        37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,    0,   28,   42,   42,   21,
-        0,    0,   20,   47,   47,   47,   47,   47,    0,    0,
+       37,   44,   44,   44,   44,   44,   44,   44,   46,    0,
+        0,    0,   49,   20,   45,   36,   36,   36,   36,   37,
         0,    0,    0,   37,   37,   37,   37,   37,   37,   37,
-       37,    0,   31,   42,    0,   47,   47,   47,   37,   37,
-       37,   37,   37,   37,    0,   29,    0,    0,   19,   47,
-       47,   47,   47,   47,   37,   37,   37,   37,   37,   35,
+       37,   37,   37,   37,   37,   37,    0,    0,    0,    0,
+        0,   37,   37,   37,   37,   37,   37,   37,   37,   44,
+       44,   44,   44,   44,    0,   22,    0,   27,    0,   20,
+        0,    0,   49,    0,   49,   49,   49,   36,   36,   36,
+       36,    0,    0,    0,    0,    0,   37,   37,   37,   37,
 
-       35,   35,   35,   35,   35,    0
+       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   43,    0,   30,   44,
+       44,   44,    0,    0,    0,   18,    0,   21,   20,    0,
+        0,    0,    0,    0,   20,    0,   49,   49,   49,    0,
+        0,    0,   37,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
+        0,   28,   44,   44,   21,    0,    0,   20,   49,   49,
+       49,   49,   49,    0,    0,    0,    0,    0,   37,   37,
+       37,   37,   37,   37,   37,   37,    0,   31,   44,    0,
+       49,   49,   49,   37,   37,   37,   37,   37,   37,    0,
+
+       29,    0,    0,   19,   49,   49,   49,   49,   49,   37,
+       37,   37,   37,   37,   35,   35,   35,   35,   35,   35,
+        0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -371,13 +373,13 @@ static yyconst int yy_ec[256] =
         9,   10,   11,   12,   13,   14,   15,   16,   17,   18,
        19,   20,   21,   22,   22,   22,   23,   24,    1,    1,
        25,   26,   10,   27,   28,   29,   30,   31,   32,   29,
-       33,   34,   35,   36,   36,   37,   36,   38,   39,   40,
-       36,   41,   42,   43,   44,   45,   46,   47,   48,   36,
-       10,   49,   10,    1,   50,    1,   51,   52,   53,   54,
+       33,   34,   35,   36,   36,   37,   38,   39,   40,   41,
+       36,   42,   43,   44,   45,   46,   47,   48,   49,   36,
+       10,   50,   10,    1,   51,    1,   52,   53,   54,   55,
 
-       55,   56,   57,   57,   58,   57,   57,   59,   60,   61,
-       62,   57,   57,   63,   64,   65,   66,   57,   57,   57,
-       57,   57,    1,    1,    1,    1,    1,    1,    1,    1,
+       56,   57,   58,   58,   59,   58,   58,   60,   61,   62,
+       63,   58,   58,   64,   65,   66,   67,   58,   58,   58,
+       58,   58,    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,    1,    1,    1,    1,    1,    1,    1,
@@ -394,587 +396,583 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[67] =
+static yyconst int yy_meta[68] =
     {   0,
         1,    2,    3,    4,    5,    6,    1,    7,    7,    1,
         1,    8,    1,    9,   10,   11,   11,   11,   11,   11,
        11,   11,   11,   12,   13,    7,    1,   11,   11,   11,
        11,   11,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,   14,   15,
-       16,   16,   16,   16,   16,   16,   15,   15,   15,   15,
-       15,   15,   15,   15,   15,   15
+        1,    1,    1,    1,    1,    1,    1,    1,    1,   14,
+       15,   16,   16,   16,   16,   16,   16,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   15
     } ;
 
-static yyconst short int yy_base[671] =
+static yyconst short int yy_base[686] =
     {   0,
-        0,   65,   67,   72,   99,  114,  162,  227,  292,  340,
-       86,  125, 2840, 2790, 2836, 3665, 2833, 3665,  387,   70,
-     3665, 3665, 2771, 3665,  136,  397,  133,  159, 2795, 3665,
-     3665,  453, 2781,   33,  504, 2770, 2767, 2777, 2765, 2771,
-     2754,  559,  170,   19,  165,  583,   38,   49, 2739,   68,
-     2727,   81,  219, 2771,  305,   48,    0, 3665, 2761, 3665,
-        0,  250,  639,  119,    0, 2709, 3665,  108, 3665,  112,
-     3665,  140, 2699,   98,  121, 3665,  195, 2693,  661, 2739,
-     2736, 2736, 3665,  227,  247,  300,  316,  152,  354, 2681,
-      686,  373, 2670,  711,  352,  722, 2692, 2669,  375,  414,
-
-      302, 2656,   57,  763,    0, 2628, 2625, 2614,  505, 2602,
-     2606, 2599, 2601,  202, 3665,  153,  546, 2572, 2565, 2549,
-     2537, 2524,  200,  110,  244,   28,  111,  252,  171, 2578,
-      422, 2577,  565, 2529,  818,  262,    0, 2573,  179, 3665,
-     3665,  599,  269,    0, 2513,  453, 3665, 3665, 2512,  548,
-     2490, 2533,  206,  253,  323, 2535, 2524, 2513,  607,  615,
-      306,  722,  586,  831,  867,  903,  939, 2499, 2456,  980,
-      333, 1022, 1063,    0, 2430, 2394, 2363, 2364, 2374, 2369,
-     2327, 2330, 2329, 2328,  266, 2289, 2283, 2272, 2274, 2279,
-      409,  334, 2279,  145,  335,   83,  672,  278, 2327, 2325,
-
-      627,  259, 1106, 1142,  741,  210, 2293, 2279,  683,  513,
-     2275, 2271,  352,  747, 1178,  780,  788, 1220,  815, 2270,
-      400,  325, 2261, 2258, 2248, 2246, 2242,    0, 2240,    0,
-      489, 2223, 2213, 2198, 2211, 2198,  420,  407,  529,  490,
-      491, 1263, 1299, 1335, 2235, 2234,  839, 2234, 2232, 2228,
-     2226,  528,  848,  657,  856,  665, 1371,    0,  877, 1382,
-      886,  894, 1424,  913,  570, 3665, 2208, 2197, 2201, 2178,
-     2185, 2194, 2194, 2176,  558, 2169, 2152, 2150,  648,  626,
-      530,  559,  923,  336, 1467, 1503,  964, 2171, 2140, 2139,
-     2138, 1537,  551, 1000, 1041, 1082,  653,  694,  797, 1049,
-
-      923, 1580,    0, 1116, 1591, 1090, 1008, 1633, 1125, 2121,
-     2082,  747,  686, 2064, 2071,  786,  926,  905, 2080, 2033,
-      679,  634,  544,  915, 1675, 1710, 1745, 2052, 2043, 2033,
-     1150, 1781, 1158, 1133, 1822, 1197, 1166, 2028, 1239, 1273,
-     1207,  950,  951,  962,  991, 1247, 1073, 1865,    0, 1283,
-     1876, 1307, 1315, 1918, 1323, 1987, 1968, 1188, 3665, 1967,
-     1951, 1929, 1913, 1286, 3665, 1336, 3665,  707, 1897, 1889,
-      786,  930,  764, 1298, 1358, 1041, 1960, 1995, 1400, 1927,
-     1879, 1348,  708, 1406, 1348, 2031,    0,  559, 2042, 1441,
-     1449, 2083, 1477, 1487, 1513, 1523, 1230, 1290, 1458, 1548,
-
-     1557, 1602, 2126,    0, 1613, 2137, 1650, 1565, 1660, 1806,
-     1779, 1680, 1675, 1359, 1406, 1626, 1601, 1577,  897,  938,
-     1695, 1589, 2180, 2216, 2252, 2288, 1611, 1686, 1720, 1731,
-     1563, 1478, 1504, 1694, 1524, 2324,    0,  617, 2335, 1753,
-     1761, 2376, 1769, 1798, 1550, 1808, 1841, 1851, 1335, 1358,
-     1887,  714,  825, 2419,    0,  926, 1407, 1468, 1430, 1431,
-     1547, 3665, 1616, 3665, 1381, 1731, 1045, 1512, 1575, 1908,
-     1913, 1970, 1498, 2429, 2465, 1947, 1611, 1981, 1264, 2006,
-     2016, 2061, 1198, 1181, 1732, 1782, 2067, 1842, 2501,    0,
-     1181, 2512, 2100, 1904, 2553, 2110, 2155, 2164, 2189, 1769,
-
-     1142, 1232, 1634, 3665, 1699, 1095, 1077, 1025, 1046, 1306,
-     3665,  384,  981, 2211, 2218, 2238, 2243, 2263, 2288, 2249,
-     2307, 2596, 2632, 2668, 2304, 2354, 2395,  983,  894, 1902,
-     1928, 2362, 1929, 2704,    0, 1428, 2715, 2403, 2437, 2445,
-      867, 2454, 2474, 2483,  831, 1982, 3665, 1983,  782, 3665,
-     1511, 2489, 2529, 2537, 1895, 2758, 2794, 2573, 2579,  650,
-     2607, 2617, 2642,  629,  525, 1931,  447,  347, 2650,    0,
-     1528, 2019, 3665, 2044, 1805, 2830, 2866, 2902, 2676, 2684,
-     2692,  323,    0,  316, 2067, 3665,  166, 1845, 3665, 2733,
-     1945, 2938, 2974, 2743, 3665, 2767, 2777, 2658, 3665, 2805,
-
-     2813, 2847,   63, 2855, 2881, 3665, 3023, 3039, 3055, 3071,
-     3087, 3103, 3119, 3135, 3151, 3157, 3173, 3189, 2025, 3205,
-     3221, 3237, 3253, 3269, 3285, 3301, 3307, 3314, 3330, 3346,
-     3352, 3359, 3365, 3371, 3377, 3384, 3390, 3396, 3402, 3409,
-     3417, 3423, 3429, 3435, 3442, 3450, 3456, 3462, 3469, 3477,
-     3483, 3491, 3498, 3506, 3512, 3520, 3527, 3535, 3551, 3567,
-     3583, 3589, 3597, 3604, 3610, 3618, 3624, 3632, 3648, 1295
+        0,   66,   68,   76,  119,  124,  173,  239,  148,  197,
+       82,   90, 2937, 2886, 2933, 3595, 2929, 3595,  165,   65,
+     3595, 3595, 2882, 3595,  130,  293,  173,  146, 2907, 3595,
+     3595,  350, 2893,   42,  402,   41, 2889,   74, 2888, 2895,
+     2876,  458,  197,   57,  219,  482,   38,  207, 2854,   37,
+     2851,  117,  249, 2880,  326, 2841, 2852,  105,    0, 3595,
+     2875, 3595,    0,  469,  424,  143,    0, 2828, 3595,   48,
+     3595,  223, 3595,  155, 2827,  202,   97, 3595,  252, 2817,
+      504, 2855, 2852, 2852, 3595,  258,  504,  312,  526,  201,
+      548, 2796,  557,  528, 2795,  582,  579,  614, 2820, 2829,
+
+      593,  601,  266, 2818,  182,  656,    0, 2796, 2791, 2766,
+     2761,  296, 2727, 2725, 2713, 2696, 2691,  426, 3595,   87,
+      659, 2659, 2663, 2655, 2650, 2651,  257,  196,  318,  276,
+      258,  288,  436, 2694,  631, 2693,  655, 2644,  690,  303,
+        0, 2681,  168, 3595, 3595,  701,  352,    0, 2634,  723,
+     3595, 3595, 2633,  447, 2632, 2676,  467,  461,  433, 2670,
+     2659, 2600,  720,  733,  206,  755,  759,  771,  781,  791,
+      828, 2581, 2570,  870,  453,  913,  955,    0, 2563, 2557,
+     2540, 2523, 2530, 2541, 2536, 2516, 2502, 2496, 2475, 2473,
+      277, 2442, 2436, 2402, 2404, 2407,  477,  436, 2405,  424,
+
+      401,  292,  813,  488, 2454, 2450,  845,  438,  855,  890,
+      756,  465, 2428, 2418,  930,  554, 2409, 2408,  463,  898,
+      999,  939,  972, 1042,  980, 2403,  490, 2378,  500, 2380,
+     2338, 2327, 2325, 2321, 2310,    0, 2305,    0,  508, 2274,
+     2238, 2212, 2211, 2176,  515,  517,  615,  527,  529, 1018,
+     1061, 1086, 2212, 2210, 1026, 2209, 2203, 2171, 2166,  565,
+     1069,  754, 1096,  802, 1123,    0, 1106, 1134, 1151, 1159,
+     1177, 1196,  601, 3595, 2136, 2137, 2127, 2131, 2090, 2090,
+     2084, 2078,    0, 2062,  607, 2056, 2024, 2025,  573,  576,
+      578,  676, 1204,  591, 1221, 1239, 1231, 2064, 2031, 2006,
+
+     2004, 1274,  676, 1256, 1293, 1318,  682,  808,  815, 1301,
+      819, 1328,    0, 1339, 1350, 1367, 1247, 1393, 1377, 1955,
+     1915, 1888,  742,  692, 1884, 1891,  794,  980,  777, 1889,
+     1856,  652,  945,  680,  820, 1411, 1420, 1436, 1842, 1824,
+     1800, 1446, 1473, 1455, 1266, 1515, 1492, 1500, 1809, 1534,
+     1559, 1544, 1009, 1052, 1569, 1571, 1580, 1590, 1601,    0,
+     1612, 1623, 1590, 1463, 1666, 1642, 1762, 1737, 1740, 1108,
+     3595, 1696, 1672, 1662, 1628, 1157, 3595, 1158, 3595,  774,
+     1514, 1500,  730, 1152,  697,  913, 1650,  805, 1686, 1709,
+     1695, 1516, 1500, 1721, 1222, 1730, 1474, 1744,    0,  830,
+
+     1755, 1772, 1571, 1797, 1782, 1816, 1841, 1851, 1284, 1377,
+     1832, 1861, 1861, 1872, 1883,    0, 1894, 1905, 1872, 1824,
+     1924, 1414, 1400, 1375, 1336, 1331, 1159, 1483, 1312, 1274,
+     1260, 1539,  606, 1730, 1238, 1949, 1959, 1969, 1984, 1256,
+     1994, 2004, 2019, 1245, 1535, 1915, 1932, 1950, 2029,    0,
+      874, 2040, 2057, 2065, 2082, 2101, 2109, 1214, 2126, 2136,
+     2146, 1633, 1675, 2154,  924,  966, 2165,    0, 1003, 1092,
+     1731, 1087, 1056, 1052, 2042, 3595, 2063, 3595, 1017, 2147,
+     1126,  624, 1311, 2187, 2192, 2183, 1756, 2193, 2203, 2230,
+     1979, 2238,  992, 2248, 2265, 2275,  830,  811, 1970, 2194,
+
+     2281, 2214, 2291,    0, 1111, 2302, 2319, 2256, 2344, 2329,
+     2362, 2371, 2387, 1807,  813, 1170,    0, 2065, 3595, 2228,
+      738,  713,  680,  731, 1201, 3595,  900,  653, 2409, 2414,
+     2419, 2424, 2418, 2436, 2445, 2446, 2459, 2469, 2480, 2494,
+     2504, 2515,  569,  531, 2215, 2217, 2523, 2221, 2533,    0,
+     1278, 2544, 2561, 2569, 2588,  519, 2597, 2606, 2615,  492,
+     2304, 3595, 2393,  452, 3595, 1416, 2621, 2629, 2637, 1981,
+     2647, 2657, 2672, 2682,  345, 2692, 2707, 2717,  305,  264,
+     2303,  245,  191, 2725,    0, 1477, 2441, 3595, 2444, 1632,
+     2735, 2745, 2755, 2770, 2780, 2790,   90,    0,   92, 2482,
+
+     3595,  100, 1647, 3595, 2798, 1982, 2808, 2818, 2833, 3595,
+     2843, 2853, 2763, 3595, 2868, 2876, 2884,   19, 2892, 2903,
+     3595, 2953, 2969, 2985, 3001, 3017, 3033, 3049, 3065, 3081,
+     3087, 3103, 3119, 1676, 3135, 3151, 3167, 3183, 3199, 3215,
+     3231, 3237, 3244, 3260, 3276, 3282, 3289, 3295, 3301, 3307,
+     3314, 3320, 3326, 3332, 3339, 3347, 3353, 3359, 3365, 3372,
+     3380, 3386, 3392, 3399, 3407, 3413, 3421, 3428, 3436, 3442,
+     3450, 3457, 3465, 3481, 3497, 3513, 3519, 3527, 3534, 3540,
+     3548, 3554, 3562, 3578, 2159
     } ;
 
-static yyconst short int yy_def[671] =
+static yyconst short int yy_def[686] =
     {   0,
-      606,    1,    1,    1,  607,  607,  608,  608,  609,  609,
-      610,  610,  606,  611,  606,  606,  606,  606,  612,  613,
-      606,  606,  614,  606,  615,  611,   26,   26,  616,  606,
-      606,  606,   32,   32,   32,   35,   35,   35,   35,   35,
-       35,  611,   26,  611,  606,  612,   32,   32,   35,   35,
-       35,  606,  606,  606,  617,  611,  618,  606,  618,  606,
-      618,  606,  612,  606,  619,  620,  606,  620,  606,  620,
-      606,  621,  622,  622,  622,  606,  606,  611,  611,  606,
-      606,  623,  606,  624,  606,  613,  606,  625,  613,  614,
-      614,  615,  626,  611,  611,   26,  616,   96,   96,   96,
-
-       96,  627,  628,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,  611,  606,  611,  606,  606,  606,  606,
-      606,  606,  623,  611,   96,  611,  611,  611,  606,  606,
-      606,  606,  617,  629,  611,  611,  618,  618,  606,  606,
-      606,  624,  606,  619,  620,  620,  606,  606,  620,  620,
-      622,  606,  622,  622,  606,  606,  623,  630,  606,  606,
-      625,  625,  606,  611,  611,  611,   96,  167,  631,  606,
-      632,  606,  104,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,  611,  606,  606,  606,  606,  606,
-      623,  611,  167,  611,  611,  611,  606,  611,  606,  630,
-
-      611,  611,  611,  611,  611,  611,  633,  634,  634,  209,
-      635,  634,  636,  172,  606,  215,  215,  606,  215,   35,
+      621,    1,    1,    1,  622,  622,  623,  623,  624,  624,
+      625,  625,  621,  626,  621,  621,  621,  621,  627,  628,
+      621,  621,  629,  621,  630,  626,   26,   26,  631,  621,
+      621,  621,   32,   32,   32,   35,   35,   35,   35,   35,
+       35,  626,   26,  626,  621,  627,   32,   32,   35,   35,
+       35,  621,  621,  621,  632,   35,   35,  626,  633,  621,
+      633,  621,  633,  621,  627,  621,  634,  635,  621,  635,
+      621,  635,  621,  636,  637,  637,  637,  621,  621,  626,
+      626,  621,  621,  638,  621,  639,  621,  628,  621,  640,
+      628,  629,  629,  630,  641,  626,  626,   26,  631,   98,
+
+       98,   98,   98,  642,  643,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,  626,  621,  626,
+      621,  621,  621,  621,  621,  621,  638,  626,   98,  626,
+      626,  626,  621,  621,  621,  621,  632,  644,  626,  626,
+      633,  633,  621,  621,  621,  639,  621,  634,  635,  635,
+      621,  621,  635,  635,  637,  621,  637,  637,  621,  621,
+      638,  645,  621,  621,  640,  640,  621,  626,  626,  626,
+       98,  171,  646,  621,  647,  621,  106,   35,   35,   35,
        35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-      611,  606,  606,  606,  606,  606,  623,  611,  611,  611,
-      611,  611,  611,  611,  606,  637,  637,  247,  637,  638,
-      639,  640,  606,  641,  218,  641,  641,  257,  641,  606,
-      260,  260,  606,  260,  606,  606,   35,   35,   35,   35,
-       35,   35,   35,   35,  611,  606,  606,  606,  623,  611,
-      611,  611,  611,  611,  611,  611,  611,  642,  642,  643,
-      644,  606,  606,  606,  606,  606,  645,  645,  646,  263,
-
-      646,  646,  302,  646,  606,  305,  305,  606,  305,   35,
-       35,   35,   35,   35,   35,   35,   35,  611,  606,  606,
-      623,  611,  611,  611,  611,  611,  611,  606,  647,  648,
-      292,  606,  332,  332,  606,  332,  606,  606,  606,  606,
-      606,  606,  649,  649,  650,  308,  650,  650,  348,  650,
-      606,  351,  351,  606,  351,   35,   35,  606,  606,   35,
-       35,   35,   35,  606,  606,  606,  606,  611,  606,  606,
-      623,  611,  611,  611,  611,  611,  611,  611,  611,  606,
-      651,  606,  652,  335,  652,  652,  386,  386,  606,  389,
-      389,  606,  389,  606,  606,  606,  606,  653,  653,  654,
-
-      354,  654,  654,  403,  654,  606,  406,  406,  406,   35,
-       35,   35,   35,   35,   35,  611,  606,  606,  623,  611,
-      611,  611,  611,  611,  611,  611,  606,  606,  606,  606,
-      655,  655,  656,  392,  656,  656,  436,  436,  606,  439,
-      439,  606,  439,  606,  606,  606,  606,  606,  606,  657,
-      657,  658,  658,  658,  454,  454,   35,   35,   35,   35,
-      606,  606,  606,  606,  606,  606,  659,  623,  611,  660,
-      661,  611,  611,  611,  611,  611,  611,  606,  606,  606,
-      606,  606,  606,  662,  662,  663,  442,  663,  663,  489,
-      489,  606,  492,  492,  606,  492,  606,  606,  606,  606,
-
-      664,  664,  606,  606,   35,   35,   35,  606,  659,  659,
-      606,  623,  611,  660,  660,  660,  660,  606,  660,  661,
-      661,  611,  611,  611,  606,  606,  606,  606,  665,  665,
-      666,  495,  666,  666,  534,  534,  606,  537,  537,  537,
-      606,  606,  606,  606,  606,  606,  606,   35,   35,  606,
-      623,  606,  606,  611,  611,  611,  611,  611,  606,  606,
-      606,  606,  606,  606,  667,  667,  668,  668,  668,  569,
-      569,  606,  606,   35,  669,  611,  611,  611,  606,  606,
-      606,  606,  670,  670,  606,  606,  669,  669,  606,  611,
-      611,  611,  611,  611,  606,  606,  606,  606,  606,  611,
-
-      611,  611,  611,  611,  611,    0,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606
+      626,  621,  621,  621,  621,  621,  638,  626,  171,  626,
+
+      626,  626,  621,  626,  621,  645,  626,  626,  626,  626,
+      626,  626,  648,  649,  649,  215,  650,  649,  651,  176,
+      621,  221,  221,  621,  221,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,  626,  621,
+      621,  621,  621,  621,  638,  626,  626,  626,  626,  626,
+      626,  626,  621,  652,  652,  255,  652,  653,  654,  655,
+      621,  656,  224,  656,  656,  265,  656,  621,  268,  268,
+      621,  268,  621,  621,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,  626,  621,  621,  621,  638,  626,
+      626,  626,  626,  626,  626,  626,  626,  657,  657,  658,
+
+      659,  621,  621,  621,  621,  621,  660,  660,  661,  271,
+      661,  661,  312,  661,  621,  315,  315,  621,  315,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,  626,  621,
+      621,  638,  626,  626,  626,  626,  626,  626,  621,  662,
+      663,  302,  621,  343,  343,  621,  343,  621,  621,  621,
+      621,  621,  621,  664,  664,  665,  318,  665,  665,  359,
+      665,  621,  362,  362,  621,  362,   35,   35,   35,  621,
+      621,   35,   35,   35,   35,  621,  621,  621,  621,  626,
+      621,  621,  638,  626,  626,  626,  626,  626,  626,  626,
+      626,  621,  666,  621,  667,  346,  667,  667,  398,  398,
+
+      621,  401,  401,  621,  401,  621,  621,  621,  621,  668,
+      668,  669,  365,  669,  669,  415,  669,  621,  418,  418,
+      418,   35,   35,   35,   35,   35,   35,   35,  626,  621,
+      621,  638,  626,  626,  626,  626,  626,  626,  626,  621,
+      621,  621,  621,  670,  670,  671,  404,  671,  671,  449,
+      449,  621,  452,  452,  621,  452,  621,  621,  621,  621,
+      621,  621,  672,  672,  673,  673,  673,  467,  467,   35,
+       35,   35,   35,   35,  621,  621,  621,  621,  621,  621,
+      674,  638,  626,  675,  676,  626,  626,  626,  626,  626,
+      626,  621,  621,  621,  621,  621,  621,  677,  677,  678,
+
+      455,  678,  678,  503,  503,  621,  506,  506,  621,  506,
+      621,  621,  621,  621,  679,  679,   35,  621,  621,   35,
+       35,   35,  621,  674,  674,  621,  638,  626,  675,  675,
+      675,  675,  621,  675,  676,  676,  626,  626,  626,  621,
+      621,  621,  621,  680,  680,  681,  509,  681,  681,  549,
+      549,  621,  552,  552,  552,  621,  621,  621,  621,  621,
+      621,  621,   35,   35,  621,  638,  621,  621,  626,  626,
+      626,  626,  626,  621,  621,  621,  621,  621,  621,  682,
+      682,  683,  683,  683,  584,  584,  621,  621,   35,  684,
+      626,  626,  626,  621,  621,  621,  621,  685,  685,  621,
+
+      621,  684,  684,  621,  626,  626,  626,  626,  626,  621,
+      621,  621,  621,  621,  626,  626,  626,  626,  626,  626,
+        0,  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,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621
     } ;
 
-static yyconst short int yy_nxt[3732] =
+static yyconst short int yy_nxt[3663] =
     {   0,
        14,   15,   16,   17,   18,   19,   20,   21,   22,   14,
        23,   24,   14,   14,   25,   26,   27,   28,   26,   26,
        26,   26,   26,   29,   30,   31,   14,   32,   33,   33,
-       33,   34,   35,   35,   35,   35,   36,   37,   35,   38,
-       39,   40,   41,   35,   35,   35,   35,   35,   42,   14,
-       43,   43,   43,   43,   43,   43,   14,   14,   14,   14,
-       14,   14,   14,   44,   14,   14,   45,   79,   52,  105,
-       46,  170,   53,   52,  105,   87,   79,   53,   54,  107,
-      172,   55,  129,   54,  116,  105,   55,   74,   16,   75,
-       76,  194,  130,   88,   47,   48,   79,  124,   49,  153,
-
-       15,   58,   59,  125,   60,   50,  111,   35,   51,   35,
-       60,   79,   35,  136,   35,   15,   58,   59,   89,   60,
-      143,  115,   60,   61,  154,   60,   74,   16,   75,   76,
-       56,   79,  147,  127,   77,   56,  148,   60,   61,   93,
-       93,  150,  115,   93,   93,  238,  152,   62,   99,   99,
-       99,   99,   99,   99,   99,   99,  146,   87,   79,   79,
-      146,   93,   62,   15,   16,   17,  117,   63,  589,  152,
-      192,  195,  129,   77,  100,  100,  100,  100,  100,  101,
-      143,  115,  130,   78,   94,   98,   98,   98,   98,   98,
-       98,   98,   98,   79,  118,  119,  155,  156,  120,  151,
-
-      162,   79,   83,  143,  115,  121,  185,  153,  122,  238,
-       64,   65,   65,   65,   65,   65,   65,   65,   65,   65,
-       65,   65,   65,   65,   65,   65,   65,   65,   15,   16,
-       17,  131,   63,   97,   85,   85,   85,   85,   85,   85,
-       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
-       79,  139,  115,  140,  152,  141,  154,   78,   79,  140,
-      191,  141,   85,   85,   85,   85,   85,   85,   85,   85,
-      143,  115,  201,  141,  141,   64,   65,   65,   65,   65,
-       65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
-       65,   65,   65,   15,   16,   17,   67,   63,  141,  193,
-
-       79,  152,   68,   69,   70,  606,  196,   79,  134,  134,
-       79,  606,  134,  134,   79,  198,   71,  168,  168,  168,
-      168,  168,  168,  606,  155,  156,   79,  231,  159,  382,
-      134,  160,  160,  160,  160,  160,  160,  160,  160,  241,
-       72,   15,   16,   17,   67,   63,  532,  170,   89,  283,
-       68,   69,   70,  135,  162,   86,  214,   86,   86,  267,
-      606,   86,   86,  268,   71,   86,  170,  164,  165,  166,
-      164,  164,  164,  164,  164,  214,   93,   93,   86,   86,
-       93,   93,   79,   79,   79,  240,   83,  238,   72,   83,
-      168,  168,  168,  168,  168,  168,  168,  168,   93,   84,
-
-       79,  265,   85,   85,   85,   85,   85,   85,   85,   85,
-       95,   83,   96,   96,   96,   96,   96,   96,   96,   96,
-       97,   94,   83,  266,   98,   98,   98,   98,   98,  168,
-      168,  168,  168,  168,  168,  168,  168,   85,   85,   85,
-       85,   85,   85,   85,   85,   79,  551,   98,   98,   98,
-       98,   98,   98,   78,  145,   79,  280,  145,  145,   78,
-      382,  237,   78,   78,  145,   78,   78,   78,  104,  104,
-      104,  104,  104,  104,  104,  104,   97,  145,  279,   78,
-      104,  104,  104,  104,  104,  105,  105,  105,  105,  106,
-      105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
-
-      105,   79,  105,   98,   98,   98,   98,   98,   98,   78,
-       78,   78,   78,   78,   78,   78,   78,   78,   78,  105,
-      105,  105,  105,  105,  105,  105,  105,  606,  249,  249,
-      249,  105,  105,  105,  105,  105,  177,   79,   79,   79,
-      105,  178,  170,  275,  179,  282,  180,  117,  532,  143,
-      115,  214,   97,  238,   78,   78,   78,   78,   78,   78,
-      114,  115,   78,   78,   78,  170,   78,   78,  134,  134,
-       78,  265,  134,  134,  214,  118,  119,   79,   79,  120,
-      431,  431,   78,   78,   78,   83,  121,   93,  323,  122,
-      134,   93,   79,  266,  281,   84,  146,   93,   85,   85,
-
-       85,   85,   85,   85,   85,   85,   79,   79,  373,   93,
-       93,  318,  324,  135,  606,  606,  606,  606,  606,  606,
-      606,  606,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  484,  484,
-      123,   83,  242,  243,  244,  242,  242,  242,  242,  242,
-       83,  142,  487,  322,  606,  606,  606,  606,  606,  606,
-      606,  606,   78,  559,   78,   78,   78,  170,   78,   78,
-      253,  170,   78,  134,   79,   79,  255,  134,  606,  170,
-      255,   83,   79,  134,   78,   78,   78,   90,  255,   90,
-       90,   90,  372,   90,   90,  134,  134,   90,  247,  247,
-
-      248,  249,  249,  249,  249,  249,  211,  253,  170,   90,
-       90,   90,   92,  321,   78,   78,   92,  255,   78,   78,
-      360,  382,   92,  161,  361,  161,  161,  253,  170,  161,
-      161,  384,  371,  161,   92,   92,   78,  167,  167,  167,
-      167,  167,  167,  167,  167,  161,  161,  161,  358,  167,
-      167,  167,  167,  167,  201,   79,  202,  202,  202,  202,
-      202,  202,  219,  219,  219,  219,  219,  219,  219,  219,
-      359,  416,  167,  167,  167,  167,  167,  167,  173,  173,
-      173,  173,  173,  173,  173,  173,   97,  364,   83,   79,
-      173,  173,  173,  173,  173,  257,  257,  257,  257,  257,
-
-      257,  257,  257,  258,  258,  258,  258,  258,  259,  365,
-      253,  170,   79,  167,  167,  167,  167,  167,  167,  133,
-      300,   78,   78,  133,  574,   78,   78,  421,  606,  133,
-      256,  256,  256,  256,  256,  256,  256,  256,  606,  170,
-      419,  133,  133,   78,  201,  170,  202,  202,  202,  202,
-      202,  202,  202,  202,  289,  289,  289,  289,  289,  289,
-      289,  289,  211,  294,  295,  296,  294,  294,  294,  294,
-      294,  264,  264,  264,  264,  264,  264,  264,  264,   79,
-      201,  170,  203,  203,  203,  203,  203,  203,  203,  203,
-      253,  170,  298,  298,  298,  298,  298,  298,  467,   83,
-
-      255,  302,  302,  302,  302,  302,  302,  302,  302,  303,
-      303,  303,  303,  303,  304,   79,  201,  487,  204,  204,
-      204,  204,  204,  205,  202,  202,  606,  366,  301,  301,
-      301,  301,  301,  301,  301,  301,  606,  170,  325,  326,
-      327,  325,  325,  325,  325,  325,  300,  501,  501,  367,
-      468,   79,   78,   79,  206,  206,  206,  206,  206,  206,
-      206,  206,  368,   79,  170,  170,  206,  206,  206,  206,
-      206,   79,  374,  255,  300,  253,  170,  283,   79,  284,
-      284,  284,  284,  284,  284,  300,   79,  420,  469,  206,
-      206,  206,  206,  206,  206,  208,  209,  210,  210,  210,
-
-      210,  210,  210,  211,  253,  170,  434,  212,  212,  212,
-      212,  212,   79,  337,  346,  338,  338,  338,  338,  338,
-      338,  338,  338,  349,  349,  349,  349,  349,  350,   79,
-      212,  212,  212,  212,  212,  212,  170,  215,  216,  217,
-      215,  215,  215,  215,  215,  218,  510,  511,  511,  219,
-      219,  219,  219,  219,  337,  375,  339,  339,  339,  339,
-      339,  339,  339,  339,  309,  309,  309,  309,  309,  309,
-      309,  309,  219,  219,  219,  219,  219,  219,  220,  220,
-      220,  220,  220,  220,  220,  220,  606,  170,  550,   79,
-      220,  220,  220,  220,  220,  337,  346,  340,  340,  340,
-
-      340,  340,  341,  338,  338,  348,  348,  348,  348,  348,
-      348,  348,  348,  206,  206,  206,  206,  206,  206,  201,
-      549,  202,  202,  202,  202,  202,  202,  202,  202,  253,
-      170,  344,  344,  344,  344,  344,  344,  548,  606,  300,
-      347,  347,  347,  347,  347,  347,  347,  347,  387,  387,
-      387,  387,  387,  388,   79,  201,  170,  202,  202,  202,
-      202,  202,  202,  202,  202,  336,  336,  336,  336,  336,
-      336,  336,  336,  386,  386,  386,  386,  386,  386,  386,
-      386,  394,  395,  396,  394,  394,  394,  394,  394,  358,
-       79,  253,  170,  254,  254,  254,  254,  254,  254,  254,
-
-      254,  255,  529,  529,  434,  256,  256,  256,  256,  256,
-      606,  359,  385,  385,  385,  385,  385,  385,  385,  385,
-      337,  384,  338,  338,  338,  338,  338,  338,  256,  256,
-      256,  256,  256,  256,  170,  260,  261,  262,  260,  260,
-      260,  260,  260,  263,  170,  253,  170,  264,  264,  264,
-      264,  264,  337,  300,  338,  338,  338,  338,  338,  338,
-      338,  338,  355,  355,  355,  355,  355,  355,  355,  355,
-      264,  264,  264,  264,  264,  264,  283,  478,  284,  284,
-      284,  284,  284,  284,  284,  284,  337,  364,  338,  338,
-      338,  338,  338,  338,  338,  338,  253,  170,  399,  399,
-
-      399,  399,  399,  399,  170,  599,  346,  510,  511,  365,
-      599,   79,  283,  346,  285,  285,  285,  285,  285,  285,
-      285,  285,  403,  403,  403,  403,  403,  403,  403,  403,
-      404,  404,  404,  404,  404,  405,  606,  366,  402,  402,
-      402,  402,  402,  402,  402,  402,   79,   79,  283,  170,
-      286,  286,  286,  286,  286,  287,  284,  284,  346,  367,
-      461,  606,  422,  428,  429,  430,  428,  428,  428,  428,
-      428,  384,  170,  423,  424,  425,  426,  423,  423,  423,
-      423,  401,  462,   79,  253,  170,  298,  298,  298,  298,
-      298,  298,  298,  298,  255,  253,  170,  299,  299,  299,
-
-      299,  299,  299,  299,  299,  300,   79,  463,  503,  301,
-      301,  301,  301,  301,  375,  376,  376,  376,  376,  376,
-      376,  393,  393,  393,  393,  393,  393,  393,  393,  464,
-      504,  508,  301,  301,  301,  301,  301,  301,  170,  305,
-      306,  307,  305,  305,  305,  305,  305,  308,   79,  565,
-      565,  309,  309,  309,  309,  309,  436,  436,  436,  436,
-      436,  436,  436,  436,  437,  437,  437,  437,  437,  438,
-      507,  253,  170,  506,  309,  309,  309,  309,  309,  309,
-      283,  346,  284,  284,  284,  284,  284,  284,  284,  284,
-      606,  382,  435,  435,  435,  435,  435,  435,  435,  435,
-
-      444,  384,  445,  445,  445,  445,  445,  445,  445,  445,
-      505,  472,  575,   83,   83,   79,  283,  382,  284,  284,
-      284,  284,  284,  284,  284,  284,  444,  434,  446,  446,
-      446,  446,  446,  446,  446,  446,  444,  606,  447,  447,
-      447,  447,  447,  448,  445,  445,   79,  434,  461,  583,
-      583,   79,  332,  333,  334,  332,  332,  332,  332,  332,
-      335,  253,  170,  444,  336,  336,  336,  336,  336,  512,
-      462,  401,  409,  409,  409,  409,  409,  409,  409,  409,
-      455,  455,  455,  455,  455,  456,  384,  336,  336,  336,
-      336,  336,  336,  253,  170,  344,  344,  344,  344,  344,
-
-      344,  344,  344,  300,  253,  170,  345,  345,  345,  345,
-      345,  345,  345,  345,  346,  606,  170,  463,  347,  347,
-      347,  347,  347,   79,  472,  401,  253,  170,  451,  451,
-      451,  451,  451,  451,  331,  503,  401,   79,  513,  464,
-      466,  347,  347,  347,  347,  347,  347,  170,  351,  352,
-      353,  351,  351,  351,  351,  351,  354,  504,  465,   79,
-      355,  355,  355,  355,  355,  454,  454,  454,  454,  454,
-      454,  454,  454,  606,   79,  453,  453,  453,  453,  453,
-      453,  453,  453,  355,  355,  355,  355,  355,  355,  375,
-      376,  376,  376,  376,  376,  376,  376,  376,  470,  478,
-
-      546,  479,  479,  479,  479,  479,  479,  479,  479,  443,
-      443,  443,  443,  443,  443,  443,  443,  460,  470,  459,
-      470,  471,  547,   79,  375,  377,  377,  377,  377,  377,
-      377,  377,  377,  478,  470,  480,  480,  480,  480,  480,
-      480,  480,  480,   79,  478,  382,  481,  481,  481,  481,
-      481,  482,  479,  479,  470,  434,  470,  470,   79,  375,
-      378,  378,  378,  378,  378,  379,  376,  376,  489,  489,
-      489,  489,  489,  489,  489,  489,  490,  490,  490,  490,
-      490,  491,  606,  170,  488,  488,  488,  488,  488,  488,
-      488,  488,  401,   79,  382,  382,  383,  383,  383,  383,
-
-      383,  383,  383,  383,  384,  487,  588,  589,  385,  385,
-      385,  385,  385,  497,  498,  499,  497,  497,  497,  497,
-      497,  444,  458,  445,  445,  445,  445,  445,  445,  445,
-      445,  385,  385,  385,  385,  385,  385,  389,  390,  391,
-      389,  389,  389,  389,  389,  392,  588,  589,  457,  393,
-      393,  393,  393,  393,  444,  606,  445,  445,  445,  445,
-      445,  445,  445,  445,  444,  487,  445,  445,  445,  445,
-      445,  445,  393,  393,  393,  393,  393,  393,  253,  170,
-      399,  399,  399,  399,  399,  399,  399,  399,  346,  253,
-      170,  400,  400,  400,  400,  400,  400,  400,  400,  401,
-
-      253,  170,  331,  402,  402,  402,  402,  402,  554,  515,
-      401,  516,  517,  518,  515,  382,  516,  517,  518,  535,
-      535,  535,  535,  535,  536,  487,  402,  402,  402,  402,
-      402,  402,  170,  406,  407,  408,  406,  406,  406,  406,
-      406,  382,  606,   79,  382,  409,  409,  409,  409,  409,
-      251,  532,  532,  418,  532,  417,  519,  415,  590,  414,
-      472,  521,  473,  473,  473,  473,  473,  473,  409,  409,
-      409,  409,  409,  409,  375,  376,  376,  376,  376,  376,
-      376,  376,  376,  546,  572,  522,  523,  524,  522,  522,
-      522,  522,  522,   79,  413,   79,  525,  526,  527,  525,
-
-      525,  525,  525,  525,  412,  547,  573,  411,   79,  375,
-      376,  376,  376,  376,  376,  376,  376,  376,   79,  478,
-      572,  479,  479,  479,  479,  479,  479,  479,  479,  478,
-      410,  479,  479,  479,  479,  479,  479,  479,  479,  144,
-      144,  337,  573,   79,  382,  585,  432,  432,  432,  432,
-      432,  432,  432,  432,  384,  382,  331,  433,  433,  433,
-      433,  433,  433,  433,  433,  434,  251,  586,  585,  435,
-      435,  435,  435,  435,  478,  211,  479,  479,  479,  479,
-      479,  479,  496,  496,  496,  496,  496,  496,  496,  496,
-      586,  370,  435,  435,  435,  435,  435,  435,  439,  440,
-
-      441,  439,  439,  439,  439,  439,  442,  369,  363,  362,
-      443,  443,  443,  443,  443,  534,  534,  534,  534,  534,
-      534,  534,  534,  606,  357,  533,  533,  533,  533,  533,
-      533,  533,  533,  443,  443,  443,  443,  443,  443,  253,
-      170,  451,  451,  451,  451,  451,  451,  451,  451,  401,
-      253,  170,  452,  452,  452,  452,  452,  452,  452,  452,
-      356,  331,  251,  211,  453,  453,  453,  453,  453,  170,
-      541,  541,  541,  541,  541,  541,  541,  541,  170,  542,
-      542,  542,  542,  542,  542,  542,  542,  453,  453,  453,
-      453,  453,  453,  472,  211,  473,  473,  473,  473,  473,
-
-      473,  473,  473,  170,  543,  543,  543,  543,  543,  544,
-      541,  541,  606,  276,  606,  606,  606,  320,  319,  515,
-      317,  516,  517,  518,  316,  315,  314,  313,   79,  472,
-      312,  474,  474,  474,  474,  474,  474,  474,  474,  606,
-      311,  516,  517,  518,  606,  310,  606,  606,  518,  292,
-      606,  251,  606,  606,  606,  211,  288,  211,  103,  519,
-      276,  278,  276,  277,   79,  472,  519,  475,  475,  475,
-      475,  475,  476,  477,  477,  552,  276,  274,  553,  553,
-      553,  553,  553,  553,  553,  553,  519,  273,  272,  271,
-      270,  519,  269,   97,  211,  514,  514,  521,  251,  514,
-
-       79,  472,  211,  477,  477,  477,  473,  473,  473,  473,
-      473,  514,  514,  514,  520,  520,  103,  559,  520,  560,
-      560,  560,  560,  560,  560,  560,  560,   83,  199,  239,
-      520,  520,  520,  236,  235,  234,   79,  382,  233,  485,
-      485,  485,  485,  485,  485,  485,  485,  434,  382,  232,
-      486,  486,  486,  486,  486,  486,  486,  486,  487,  230,
-      229,  228,  488,  488,  488,  488,  488,  559,  227,  561,
-      561,  561,  561,  561,  561,  561,  561,  540,  540,  540,
-      540,  540,  540,  540,  540,  488,  488,  488,  488,  488,
-      488,  492,  493,  494,  492,  492,  492,  492,  492,  495,
-
-      226,  225,  224,  496,  496,  496,  496,  496,  559,  223,
-      562,  562,  562,  562,  562,  563,  560,  560,  569,  569,
-      569,  569,  569,  569,  569,  569,  496,  496,  496,  496,
-      496,  496,  253,  170,  502,  502,  502,  502,  502,  502,
-      502,  502,  472,  222,  473,  473,  473,  473,  473,  473,
-      473,  473,  570,  570,  570,  570,  570,  571,  606,  221,
-      568,  568,  568,  568,  568,  568,  568,  568,  170,  541,
-      541,  541,  541,  541,  541,  541,  541,   79,  472,  103,
-      473,  473,  473,  473,  473,  473,  473,  473,  170,  541,
-      541,  541,  541,  541,  541,  541,  541,  170,  541,  541,
-
-      541,  541,  541,  541,  553,  553,  553,  553,  553,  553,
-      553,  553,   95,   79,  382,   83,  530,  530,  530,  530,
-      530,  530,  530,  530,  487,  382,   83,  531,  531,  531,
-      531,  531,  531,  531,  531,  532,  199,  151,  152,  533,
-      533,  533,  533,  533,  553,  553,  553,  553,  553,  553,
-      553,  553,  576,  577,  578,  576,  576,  576,  576,  576,
-      146,  146,  533,  533,  533,  533,  533,  533,  537,  538,
-      539,  537,  537,  537,  537,  537,  138,  197,  132,  132,
-      540,  540,  540,  540,  540,   79,  554,  190,  555,  555,
-      555,  555,  555,  555,  579,  580,  581,  579,  579,  579,
-
-      579,  579,  189,  540,  540,  540,  540,  540,  540,  554,
-      188,  555,  555,  555,  555,  555,  555,  555,  555,  187,
-      559,   79,  560,  560,  560,  560,  560,  560,  560,  560,
-      559,  186,  560,  560,  560,  560,  560,  560,  560,  560,
-      184,  183,  182,  181,   79,  554,  176,  556,  556,  556,
-      556,  556,  556,  556,  556,  559,  175,  560,  560,  560,
-      560,  560,  560,  382,  174,  584,  584,  584,  584,  584,
-      584,  584,  584,  595,  595,  595,  595,  595,  595,  103,
-       79,  554,   78,  557,  557,  557,  557,  557,  558,  555,
-      555,  595,  595,  595,  595,  595,  595,  595,  595,  596,
-
-      596,  596,  596,  596,  596,  596,  596,  597,  597,  597,
-      597,  597,  598,  595,  595,  103,   79,  382,  163,  566,
-      566,  566,  566,  566,  566,  566,  566,  532,  382,   91,
-      567,  567,  567,  567,  567,  567,  567,  567,   83,   81,
-       80,   79,  568,  568,  568,  568,  568,  152,  600,  601,
-      602,  600,  600,  600,  600,  600,  590,  146,  591,  591,
-      591,  591,  591,  591,  138,  568,  568,  568,  568,  568,
-      568,  554,  132,  555,  555,  555,  555,  555,  555,  555,
-      555,   79,  595,  595,  595,  595,  595,  595,  595,  595,
-      128,   79,  595,  595,  595,  595,  595,  595,  595,  595,
-
-      126,  113,  112,  111,  110,  109,   79,  554,  108,  555,
-      555,  555,  555,  555,  555,  555,  555,  105,  103,   91,
-      603,  603,  603,  603,  603,  603,  603,  603,  600,  600,
-      600,  600,  600,  600,  600,  600,   81,   80,   79,  606,
-      606,  606,   79,  590,  606,  591,  591,  591,  591,  591,
-      591,  591,  591,   79,  606,  606,  606,  606,  606,  606,
-      606,   79,  604,  604,  604,  604,  604,  605,  603,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,   79,  590,
-      606,  592,  592,  592,  592,  592,  592,  592,  592,  606,
-      606,  606,  606,  606,  606,   79,  603,  603,  603,  603,
-
-      603,  603,  606,   79,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,   79,  590,  606,  593,  593,  593,
-      593,  593,  594,  591,  591,  606,  606,  606,  606,   79,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-       79,  590,  606,  591,  591,  591,  591,  591,  591,  591,
-      591,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,   79,  590,  606,  591,
-      591,  591,  591,  591,  591,  591,  591,  606,  606,  606,
-
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,   79,   57,   57,   57,   57,   57,   57,   57,
-       57,   57,   57,   57,   57,   57,   57,   57,   57,   31,
+       33,   34,   35,   35,   35,   35,   36,   35,   37,   35,
+       38,   39,   40,   41,   35,   35,   35,   35,   35,   42,
+       14,   43,   43,   43,   43,   43,   43,   14,   14,   14,
+       14,   14,   14,   14,   44,   14,   14,   45,   81,   52,
+       89,   46,  151,   53,  107,  110,  115,   52,  107,   54,
+      111,   53,   55,   76,   16,   77,   78,   54,   90,  109,
+       55,   76,   16,   77,   78,   47,   48,  150,  128,   49,
+
+      158,  113,  604,  131,   56,  394,   81,   50,   57,   35,
+       51,   35,   56,  547,   91,  114,   57,   35,  133,   35,
+       15,   60,   61,  120,   62,   15,   60,   61,  134,   62,
+       62,   79,   58,   95,   95,   62,   81,   95,   95,   79,
+       58,  191,   62,   63,  147,  119,  156,   62,   63,   15,
+       16,   17,   69,   65,   81,   95,  154,  119,   70,   71,
+       72,  102,  102,  102,  102,  102,  103,   85,   64,  147,
+      119,  140,   73,   64,   15,   16,   17,   86,   65,   96,
+       87,   87,   87,   87,   87,   87,   87,   87,  101,  101,
+      101,  101,  101,  101,  101,  101,  174,   74,   15,   16,
+
+       17,   69,   65,  157,  621,  176,   89,   70,   71,   72,
+       80,  621,  100,  100,  100,  100,  100,  100,  100,  100,
+      121,   73,   66,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       15,   16,   17,  107,   65,   81,   74,  152,  122,  123,
+      166,  156,  124,  159,  160,  166,  155,  198,  394,   85,
+      125,  135,  129,  126,   87,   87,   87,   87,   87,   87,
+       87,   87,  150,   87,   87,   87,   87,   87,   87,   87,
+       87,  172,  172,  172,  172,  172,  172,  547,   66,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+
+       67,   67,   67,   67,   67,   67,   97,   81,   98,   98,
+       98,   98,   98,   98,   98,   98,   99,  621,  197,  201,
+      100,  100,  100,  100,  100,   81,   81,  182,  501,  138,
+      138,   80,  183,  138,  138,  621,  184,   81,  185,  239,
+      200,   81,   81,  202,  100,  100,  100,  100,  100,  100,
+       80,  138,   81,  147,  119,  246,   80,  204,  574,   80,
+       80,   91,   80,   80,   80,  106,  106,  106,  106,  106,
+      106,  106,  106,   99,  199,  139,   80,  106,  106,  106,
+      106,  106,  107,  107,  107,  107,  108,  107,  107,  107,
+      107,  107,  107,  107,  107,  107,  107,  107,  107,   81,
+
+      107,  100,  100,  100,  100,  100,  100,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,  107,  107,  107,
+      107,  107,  107,  107,  107,  621,   85,  147,  119,  107,
+      107,  107,  107,  107,  159,  160,  146,  133,  107,  621,
+      621,  621,  621,  621,  621,  621,  621,  134,  147,  119,
+       81,  207,  248,   80,   80,   80,   80,   80,   80,  118,
+      119,   80,   80,   80,  158,   80,   80,  174,  157,   80,
+      143,  119,  144,   81,  145,   81,  220,  174,  144,   85,
+      145,   80,   80,   80,   85,   81,  220,   81,   99,  246,
+      246,  273,  145,  145,   86,  589,  150,   87,   87,   87,
+
+       87,   87,   87,   87,   87,   80,  174,   80,   80,   80,
+      156,   80,   80,  274,   81,   80,  156,   85,  145,   87,
+       87,   87,   87,   87,   87,   87,   87,   80,   80,   80,
+      245,   95,   95,  174,  276,   95,   95,   81,  163,  277,
+      127,  164,  164,  164,  164,  164,  164,  164,  164,   88,
+      249,   88,   88,   95,  501,   88,   88,   81,   92,   88,
+       92,   92,   92,  285,   92,   92,   81,  290,   92,  257,
+      257,  257,   88,   88,  289,   85,   81,   96,   81,  174,
+       92,   92,   92,   94,  292,   80,   80,   94,  220,   80,
+       80,  246,  447,   94,  168,  169,  170,  168,  168,  168,
+
+      168,  168,  273,  333,  293,   94,   94,   80,  172,  172,
+      172,  172,  172,  172,  172,  172,  172,  172,  172,  172,
+      172,  172,  172,  172,  274,   81,   85,   81,   81,  171,
+      171,  171,  171,  171,  171,  171,  171,  334,   99,  332,
+       81,  171,  171,  171,  171,  171,   87,   87,   87,   87,
+       87,   87,   87,   87,   85,   81,   81,  483,  138,  138,
+      121,  329,  138,  138,   81,  171,  171,  171,  171,  171,
+      171,  177,  177,  177,  177,  177,  177,  177,  177,   99,
+      138,  291,  527,  177,  177,  177,  177,  177,  122,  123,
+      174,  137,  124,   80,   80,  137,  174,   80,   80,  220,
+
+      125,  137,   81,  126,  139,  263,  383,  171,  171,  171,
+      171,  171,  171,  137,  137,   80,  621,  621,  621,  621,
+      621,  621,  621,  621,  149,   81,  372,  149,  149,   81,
+      335,  373,   85,  526,  149,  164,  164,  164,  164,  164,
+      164,  164,  164,  370,  565,  385,   81,  149,  164,  164,
+      164,  164,  164,  164,  164,  164,  165,  564,  165,  165,
+       95,  434,  165,  165,   95,  371,  165,  261,  174,  207,
+       95,  208,  208,  208,  208,  208,  208,  263,  165,  165,
+      165,  563,   95,   95,  207,  432,  208,  208,  208,  208,
+      208,  208,  208,  208,  207,  376,  209,  209,  209,  209,
+
+      209,  209,  209,  209,  207,   81,  210,  210,  210,  210,
+      210,  211,  208,  208,  138,  621,  174,  377,  138,  387,
+       81,  261,  174,   81,  138,  263,   81,  174,  261,  174,
+       81,  263,  621,  174,  447,  380,  138,  138,  310,  429,
+       81,   80,  310,  212,  212,  212,  212,  212,  212,  212,
+      212,  444,  444,  396,   81,  212,  212,  212,  212,  212,
+      250,  251,  252,  250,  250,  250,  250,  250,  207,   81,
+      208,  208,  208,  208,  208,  208,  208,  208,  386,  212,
+      212,  212,  212,  212,  212,  214,  215,  216,  216,  216,
+      216,  216,  216,  217,   81,  498,  498,  218,  218,  218,
+
+      218,  218,   85,  207,   81,  208,  208,  208,  208,  208,
+      208,  208,  208,  225,  225,  225,  225,  225,  225,  225,
+      225,  218,  218,  218,  218,  218,  218,  174,  221,  222,
+      223,  221,  221,  221,  221,  221,  224,  261,  174,   81,
+      225,  225,  225,  225,  225,  255,  255,  256,  257,  257,
+      257,  257,  257,  217,  265,  265,  265,  265,  265,  265,
+      265,  265,   81,  566,  225,  225,  225,  225,  225,  225,
+      226,  226,  226,  226,  226,  226,  226,  226,  435,  621,
+      174,  378,  226,  226,  226,  226,  226,  266,  266,  266,
+      266,  266,  267,  621,   81,  264,  264,  264,  264,  264,
+
+      264,  264,  264,  379,  384,  492,  212,  212,  212,  212,
+      212,  212,  261,  174,  262,  262,  262,  262,  262,  262,
+      262,  262,  263,  174,  515,  515,  264,  264,  264,  264,
+      264,  293,  263,  294,  294,  294,  294,  294,  294,  294,
+      294,  299,  299,  299,  299,  299,  299,  299,  299,  217,
+      264,  264,  264,  264,  264,  264,  174,  268,  269,  270,
+      268,  268,  268,  268,  268,  271,  174,   81,  523,  272,
+      272,  272,  272,  272,  293,  310,  295,  295,  295,  295,
+      295,  295,  295,  295,  304,  305,  306,  304,  304,  304,
+      304,  304,  522,  272,  272,  272,  272,  272,  272,  293,
+
+      521,  296,  296,  296,  296,  296,  297,  294,  294,  370,
+       81,  272,  272,  272,  272,  272,  272,  272,  272,  261,
+      174,  308,  308,  308,  308,  308,  308,  525,  526,  263,
+      520,  371,  544,  544,  517,   81,  261,  174,  308,  308,
+      308,  308,  308,  308,  308,  308,  263,  261,  174,  309,
+      309,  309,  309,  309,  309,  309,  309,  310,  376,  378,
+      475,  311,  311,  311,  311,  311,  312,  312,  312,  312,
+      312,  312,  312,  312,  313,  313,  313,  313,  313,  314,
+      377,  379,  476,  261,  174,  311,  311,  311,  311,  311,
+      311,  174,  315,  316,  317,  315,  315,  315,  315,  315,
+
+      318,   81,  525,  526,  319,  319,  319,  319,  319,  621,
+      433,  311,  311,  311,  311,  311,  311,  311,  311,  336,
+      337,  338,  336,  336,  336,  336,  336,  457,  319,  319,
+      319,  319,  319,  319,  293,  394,  294,  294,  294,  294,
+      294,  294,  294,  294,  293,  396,  294,  294,  294,  294,
+      294,  294,  293,   81,  294,  294,  294,  294,  294,  294,
+      294,  294,  360,  360,  360,  360,  360,  361,  396,  348,
+       81,  349,  349,  349,  349,  349,  349,  349,  349,  342,
+       81,  399,  399,  399,  399,  399,  400,   81,   81,  343,
+      344,  345,  343,  343,  343,  343,  343,  346,  174,  580,
+
+      580,  347,  347,  347,  347,  347,  348,  310,  350,  350,
+      350,  350,  350,  350,  350,  350,  319,  319,  319,  319,
+      319,  319,  319,  319,  480,  347,  347,  347,  347,  347,
+      347,  348,  479,  351,  351,  351,  351,  351,  352,  349,
+      349,  261,  174,  355,  355,  355,  355,  355,  355,  355,
+      355,  310,  261,  174,  355,  355,  355,  355,  355,  355,
+       81,   81,  310,  261,  174,  356,  356,  356,  356,  356,
+      356,  356,  356,  357,  474,  528,  473,  358,  358,  358,
+      358,  358,  359,  359,  359,  359,  359,  359,  359,  359,
+      621,  174,  358,  358,  358,  358,  358,  358,  358,  358,
+
+      357,  358,  358,  358,  358,  358,  358,  174,  362,  363,
+      364,  362,  362,  362,  362,  362,  365,  590,   85,  472,
+      366,  366,  366,  366,  366,  387,  388,  388,  388,  388,
+      388,  388,  388,  388,  387,  389,  389,  389,  389,  389,
+      389,  389,  389,  471,  366,  366,  366,  366,  366,  366,
+      387,  390,  390,  390,  390,  390,  391,  388,  388,  470,
+       81,  347,  347,  347,  347,  347,  347,  347,  347,   81,
+      398,  398,  398,  398,  398,  398,  398,  398,  416,  416,
+      416,  416,  416,  417,  477,   81,  394,  621,  395,  395,
+      395,  395,  395,  395,  395,  395,  396,  396,  598,  598,
+
+      397,  397,  397,  397,  397,  621,  478,  397,  397,  397,
+      397,  397,  397,  397,  397,  406,  407,  408,  406,  406,
+      406,  406,  406,  342,  397,  397,  397,  397,  397,  397,
+      401,  402,  403,  401,  401,  401,  401,  401,  404,  259,
+      481,   85,  405,  405,  405,  405,  405,  348,  394,  349,
+      349,  349,  349,  349,  349,  349,  349,  348,  396,  349,
+      349,  349,  349,  349,  349,  431,  405,  405,  405,  405,
+      405,  405,  348,  430,  349,  349,  349,  349,  349,  349,
+      349,  349,  261,  174,  261,  174,  450,  450,  450,  450,
+      450,  451,  310,  482,  357,  366,  366,  366,  366,  366,
+
+      366,  366,  366,  621,  174,  415,  415,  415,  415,  415,
+      415,  415,  415,  357,  261,  174,  411,  411,  411,  411,
+      411,  411,  411,  411,  357,  261,  174,  411,  411,  411,
+      411,  411,  411,  603,  604,  357,  261,  174,  412,  412,
+      412,  412,  412,  412,  412,  412,  413,  174,  603,  604,
+      414,  414,  414,  414,  414,  621,  357,  414,  414,  414,
+      414,  414,  414,  414,  414,  436,  437,  438,  439,  436,
+      436,  436,  436,  428,  414,  414,  414,  414,  414,  414,
+      174,  418,  419,  420,  418,  418,  418,  418,  418,  174,
+      148,  148,  427,  421,  421,  421,  421,  421,  413,   81,
+
+      387,  388,  388,  388,  388,  388,  388,  388,  388,  387,
+      388,  388,  388,  388,  388,  388,  426,  421,  421,  421,
+      421,  421,  421,  387,  388,  388,  388,  388,  388,  388,
+      388,  388,  518,  484,  425,   81,  441,  442,  443,  441,
+      441,  441,  441,  441,   81,  405,  405,  405,  405,  405,
+      405,  405,  405,  484,  519,  484,  485,  394,   81,  445,
+      445,  445,  445,  445,  445,  445,  445,  396,  394,  486,
+      446,  446,  446,  446,  446,  446,  446,  446,  447,   81,
+      424,  423,  448,  448,  448,  448,  448,  449,  449,  449,
+      449,  449,  449,  449,  449,  621,  422,  448,  448,  448,
+
+      448,  448,  448,  448,  448,   81,  448,  448,  448,  448,
+      448,  448,  452,  453,  454,  452,  452,  452,  452,  452,
+      455,  174,  348,  342,  456,  456,  456,  456,  456,  457,
+      413,  458,  458,  458,  458,  458,  458,  458,  458,  468,
+      468,  468,  468,  468,  469,  261,  174,  259,  456,  456,
+      456,  456,  456,  456,  457,  357,  459,  459,  459,  459,
+      459,  459,  459,  459,  457,  217,  460,  460,  460,  460,
+      460,  461,  458,  458,  261,  174,  421,  421,  421,  421,
+      421,  421,  421,  421,  413,  621,  174,  467,  467,  467,
+      467,  467,  467,  467,  467,  413,  261,  174,  464,  464,
+
+      464,  464,  464,  464,  464,  464,  413,  261,  174,  464,
+      464,  464,  464,  464,  464,  382,  381,  413,  261,  174,
+      465,  465,  465,  465,  465,  465,  465,  465,  394,  375,
+      374,  369,  466,  466,  466,  466,  466,  621,  447,  466,
+      466,  466,  466,  466,  466,  466,  466,  456,  456,  456,
+      456,  456,  456,  456,  456,  368,  466,  466,  466,  466,
+      466,  466,  486,  621,  487,  487,  487,  487,  487,  487,
+      487,  487,  486,  447,  488,  488,  488,  488,  488,  488,
+      488,  488,  486,  394,  489,  489,  489,  489,  489,  490,
+      491,  491,  486,  447,  569,  605,  367,  486,   81,  491,
+
+      491,  491,  487,  487,  487,  487,  487,  492,   81,  493,
+      493,  493,  493,  493,  493,  493,  493,  492,   81,  494,
+      494,  494,  494,  494,  494,  494,  494,  342,   81,  259,
+       81,   81,  492,   81,  495,  495,  495,  495,  495,  496,
+      493,  493,  394,  475,  499,  499,  499,  499,  499,  499,
+      499,  499,  447,  394,  217,  500,  500,  500,  500,  500,
+      500,  500,  500,  501,  477,  476,  518,  502,  502,  502,
+      502,  502,  503,  503,  503,  503,  503,  503,  503,  503,
+      504,  504,  504,  504,  504,  505,  478,  217,  519,  286,
+      331,  502,  502,  502,  502,  502,  502,  506,  507,  508,
+
+      506,  506,  506,  506,  506,  509,  330,  328,  327,  510,
+      510,  510,  510,  510,  621,  326,  502,  502,  502,  502,
+      502,  502,  502,  502,  511,  512,  513,  511,  511,  511,
+      511,  511,  325,  510,  510,  510,  510,  510,  510,  457,
+      324,  458,  458,  458,  458,  458,  458,  458,  458,  457,
+      484,  458,  458,  458,  458,  458,  458,  458,  458,  457,
+      323,  458,  458,  458,  458,  458,  458,  261,  174,  614,
+      484,  322,  484,  484,  614,  321,  320,  413,  261,  174,
+      516,  516,  516,  516,  516,  516,  516,  516,  530,  302,
+      531,  532,  533,  530,  259,  531,  532,  533,  537,  538,
+
+      539,  537,  537,  537,  537,  537,  486,  394,  487,  487,
+      487,  487,  487,  487,  487,  487,  486,  501,  487,  487,
+      487,  487,  487,  487,  487,  487,  217,  621,  394,  561,
+      394,  298,   81,  217,  621,  105,  534,  501,  501,  286,
+      547,  536,   81,  486,  547,  487,  487,  487,  487,  487,
+      487,  562,   81,  540,  541,  542,  540,  540,  540,  540,
+      540,  492,  288,  493,  493,  493,  493,  493,  493,  493,
+      493,  550,  550,  550,  550,  550,  551,  286,  492,   81,
+      493,  493,  493,  493,  493,  493,  493,  493,  492,  287,
+      493,  493,  493,  493,  493,  493,  510,  510,  510,  510,
+
+      510,  510,  510,  510,  394,  561,  545,  545,  545,  545,
+      545,  545,  545,  545,  501,  394,  394,  546,  546,  546,
+      546,  546,  546,  546,  546,  547,  547,  562,  286,  548,
+      548,  548,  548,  548,  549,  549,  549,  549,  549,  549,
+      549,  549,  621,  284,  548,  548,  548,  548,  548,  548,
+      548,  548,  283,  548,  548,  548,  548,  548,  548,  552,
+      553,  554,  552,  552,  552,  552,  552,  282,  281,  280,
+      279,  555,  555,  555,  555,  555,  174,  556,  556,  556,
+      556,  556,  556,  556,  556,  174,  557,  557,  557,  557,
+      557,  557,  557,  557,  587,  555,  555,  555,  555,  555,
+
+      555,  174,  558,  558,  558,  558,  558,  559,  556,  556,
+      621,  278,  621,  621,  621,  530,  588,  531,  532,  533,
+      621,  275,  531,  532,  533,  621,   99,  621,  621,  533,
+      567,  217,  259,  568,  568,  568,  568,  568,  568,  568,
+      568,  217,  587,  529,  529,  600,  621,  529,  621,  621,
+      621,  105,   85,  535,  535,  205,  247,  535,  534,  529,
+      529,  529,  244,  534,  588,  243,  242,  601,  534,  535,
+      535,  535,  569,  534,  570,  570,  570,  570,  570,  570,
+      570,  570,  569,  600,  571,  571,  571,  571,  571,  571,
+      571,  571,  241,  569,  536,  572,  572,  572,  572,  572,
+
+      573,  570,  570,  240,  238,  601,  237,  574,   81,  575,
+      575,  575,  575,  575,  575,  575,  575,  574,   81,  576,
+      576,  576,  576,  576,  576,  576,  576,  236,  574,   81,
+      577,  577,  577,  577,  577,  578,  575,  575,  555,  555,
+      555,  555,  555,  555,  555,  555,  394,  235,  581,  581,
+      581,  581,  581,  581,  581,  581,  547,  394,  234,  582,
+      582,  582,  582,  582,  582,  582,  582,  233,  232,  231,
+      230,  583,  583,  583,  583,  583,  584,  584,  584,  584,
+      584,  584,  584,  584,  585,  585,  585,  585,  585,  586,
+      229,  228,  227,  105,   97,  583,  583,  583,  583,  583,
+
+      583,  621,   85,  583,  583,  583,  583,  583,  583,  583,
+      583,  174,  556,  556,  556,  556,  556,  556,  556,  556,
+      174,  556,  556,  556,  556,  556,  556,  556,  556,  174,
+      556,  556,  556,  556,  556,  556,  568,  568,  568,  568,
+      568,  568,  568,  568,  568,  568,  568,  568,  568,  568,
+      568,  568,  591,  592,  593,  591,  591,  591,  591,  591,
+      569,   85,  570,  570,  570,  570,  570,  570,  570,  570,
+      569,  205,  570,  570,  570,  570,  570,  570,  570,  570,
+      155,  156,  150,  150,  142,  569,   81,  570,  570,  570,
+      570,  570,  570,  203,  136,  136,   81,  594,  595,  596,
+
+      594,  594,  594,  594,  594,  574,   81,  575,  575,  575,
+      575,  575,  575,  575,  575,  196,  195,  194,  193,  192,
+      574,   81,  575,  575,  575,  575,  575,  575,  575,  575,
+      574,  190,  575,  575,  575,  575,  575,  575,  394,  189,
+      599,  599,  599,  599,  599,  599,  599,  599,  605,  188,
+      606,  606,  606,  606,  606,  606,  606,  606,  605,  187,
+      607,  607,  607,  607,  607,  607,  607,  607,  605,  186,
+      608,  608,  608,  608,  608,  609,  606,  606,  610,  610,
+      610,  610,  610,  610,   81,  610,  610,  610,  610,  610,
+      610,  610,  610,  181,   81,  611,  611,  611,  611,  611,
+
+      611,  611,  611,  180,   81,  612,  612,  612,  612,  612,
+      613,  610,  610,  615,  616,  617,  615,  615,  615,  615,
+      615,  605,  179,  606,  606,  606,  606,  606,  606,  606,
+      606,  605,  178,  606,  606,  606,  606,  606,  606,  606,
+      606,  105,   80,  105,  167,   93,  605,   81,  606,  606,
+      606,  606,  606,  606,   85,   83,   82,   81,  610,  610,
+      610,  610,  610,  610,  610,  610,   81,   81,  610,  610,
+      610,  610,  610,  610,  610,  610,  156,  150,  142,  113,
+      111,  136,   81,  618,  618,  618,  618,  618,  618,  618,
+      618,  615,  615,  615,  615,  615,  615,  615,  615,  619,
+
+      619,  619,  619,  619,  620,  618,  618,  618,  618,  618,
+      618,  618,  618,  618,  618,  132,  130,   81,  618,  618,
+      618,  618,  618,  618,  117,   81,  116,  115,  112,  107,
+      105,   93,   83,   81,   82,   81,  621,  621,  621,  621,
+      621,   81,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,   81,   59,   59,   59,   59,   59,   59,   59,
+       59,   59,   59,   59,   59,   59,   59,   59,   59,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   66,   66,   66,   66,   66,
-       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   73,   73,   73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73,   78,  606,  606,
-      606,  606,  606,  606,  606,   78,   78,   78,  606,  606,
-
-       78,   78,   78,   82,   82,   82,   82,   82,   82,   82,
-       82,   82,   82,   82,   82,   82,   82,   82,   82,   86,
-      606,  606,  606,  606,   86,  606,  606,   86,   86,   86,
-       86,  606,   86,   86,   86,   90,  606,  606,  606,  606,
-      606,  606,  606,   90,   90,   90,  606,  606,   90,   90,
-       90,   92,  606,  606,   92,   92,  606,   92,  606,   92,
-       92,   92,  606,  606,   92,   92,   92,  102,  102,  606,
-      606,  606,  102,  133,  606,  606,  133,  133,  606,  133,
-      606,  133,  133,  133,  606,  606,  133,  133,  133,  137,
-      606,  606,  137,  137,  606,  137,  606,  137,  137,  137,
-
-      606,  137,  606,  137,  137,  145,  606,  606,  145,  606,
-      606,  145,  606,  145,  145,  145,  145,  606,  145,  145,
-      145,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  151,  151,  606,
-      151,  606,  151,  151,  151,  151,  151,  151,  151,  151,
-      151,  151,  151,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  158,
-      158,  606,  158,  158,  158,  158,  158,  158,  158,  158,
-      158,  158,  158,  158,  158,  161,  606,  606,  606,  606,
-      161,  606,  606,  161,  161,  161,  606,  606,  161,  161,
-
-      161,   93,  606,  606,   93,   93,  606,   93,  606,   93,
-       93,   93,  606,  606,   93,   93,   93,  169,  169,  606,
-      606,  606,  169,  171,  171,  171,  606,  606,  606,  171,
-      134,  606,  606,  134,  134,  606,  134,  606,  134,  134,
-      134,  606,  606,  134,  134,  134,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  207,  207,  606,  606,  606,  207,  213,  213,
-      213,  606,  606,  606,  213,  245,  245,  606,  606,  606,
-      245,  246,  246,  606,  606,  606,  246,  250,  250,  606,
-      606,  606,  250,  252,  252,  252,  606,  606,  606,  252,
-
-      288,  288,  606,  606,  606,  288,  290,  290,  606,  606,
-      606,  290,  291,  291,  606,  606,  606,  291,  293,  293,
-      293,  606,  606,  606,  293,  297,  297,  297,  297,  606,
-      606,  606,  297,  328,  328,  606,  606,  606,  328,  329,
-      329,  606,  606,  606,  329,  330,  330,  606,  606,  606,
-      330,  342,  342,  342,  606,  606,  606,  342,  343,  343,
-      343,  343,  606,  606,  606,  343,  380,  380,  606,  606,
-      606,  380,  381,  381,  606,  606,  606,  381,  397,  397,
-      397,  606,  606,  606,  397,  398,  398,  398,  398,  606,
-      606,  606,  398,  427,  427,  606,  606,  606,  427,  431,
-
-      606,  431,  431,  606,  606,  606,  431,  449,  449,  449,
-      606,  606,  606,  449,  450,  450,  450,  450,  606,  606,
-      606,  450,  483,  483,  606,  606,  606,  483,  484,  606,
-      484,  484,  606,  606,  606,  484,  500,  500,  500,  606,
-      606,  606,  500,  501,  501,  501,  606,  606,  606,  606,
-      501,  509,  509,  509,  509,  509,  509,  509,  509,  509,
-      509,  509,  509,  509,  509,  509,  509,  514,  514,  606,
-      514,  514,  514,  606,  606,  514,  514,  514,  606,  606,
-      514,  514,  514,  520,  520,  606,  520,  520,  520,  606,
-      606,  520,  520,  520,  606,  606,  520,  520,  520,  528,
-
-      528,  606,  606,  606,  528,  529,  606,  529,  529,  606,
-      606,  606,  529,  545,  545,  606,  606,  606,  606,  545,
-      564,  564,  606,  606,  606,  564,  565,  606,  565,  565,
-      606,  606,  606,  565,  582,  582,  606,  606,  606,  582,
-      583,  606,  583,  606,  606,  606,  606,  583,  587,  587,
-      587,  587,  587,  587,  587,  587,  587,  587,  587,  587,
-      587,  587,  587,  587,   13,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606
+       31,   31,   31,   31,   31,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+
+       68,   75,   75,   75,   75,   75,   75,   75,   75,   75,
+       75,   75,   75,   75,   75,   75,   75,   80,  621,  621,
+      621,  621,  621,  621,  621,   80,   80,   80,  621,  621,
+       80,   80,   80,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   88,
+      621,  621,  621,  621,   88,  621,  621,   88,   88,   88,
+       88,  621,   88,   88,   88,   92,  621,  621,  621,  621,
+      621,  621,  621,   92,   92,   92,  621,  621,   92,   92,
+       92,   94,  621,  621,   94,   94,  621,   94,  621,   94,
+       94,   94,  621,  621,   94,   94,   94,  104,  104,  621,
+
+      621,  621,  104,  137,  621,  621,  137,  137,  621,  137,
+      621,  137,  137,  137,  621,  621,  137,  137,  137,  141,
+      621,  621,  141,  141,  621,  141,  621,  141,  141,  141,
+      621,  141,  621,  141,  141,  149,  621,  621,  149,  621,
+      621,  149,  621,  149,  149,  149,  149,  621,  149,  149,
+      149,  153,  153,  153,  153,  153,  153,  153,  153,  153,
+      153,  153,  153,  153,  153,  153,  153,  155,  155,  621,
+      155,  621,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161,  161,  162,
+
+      162,  621,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  165,  621,  621,  621,  621,
+      165,  621,  621,  165,  165,  165,  621,  621,  165,  165,
+      165,   95,  621,  621,   95,   95,  621,   95,  621,   95,
+       95,   95,  621,  621,   95,   95,   95,  173,  173,  621,
+      621,  621,  173,  175,  175,  175,  621,  621,  621,  175,
+      138,  621,  621,  138,  138,  621,  138,  621,  138,  138,
+      138,  621,  621,  138,  138,  138,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  206,  213,  213,  621,  621,  621,  213,  219,  219,
+
+      219,  621,  621,  621,  219,  253,  253,  621,  621,  621,
+      253,  254,  254,  621,  621,  621,  254,  258,  258,  621,
+      621,  621,  258,  260,  260,  260,  621,  621,  621,  260,
+      298,  298,  621,  621,  621,  298,  300,  300,  621,  621,
+      621,  300,  301,  301,  621,  621,  621,  301,  303,  303,
+      303,  621,  621,  621,  303,  307,  307,  307,  307,  621,
+      621,  621,  307,  339,  339,  621,  621,  621,  339,  340,
+      340,  621,  621,  621,  340,  341,  341,  621,  621,  621,
+      341,  353,  353,  353,  621,  621,  621,  353,  354,  354,
+      354,  354,  621,  621,  621,  354,  392,  392,  621,  621,
+
+      621,  392,  393,  393,  621,  621,  621,  393,  409,  409,
+      409,  621,  621,  621,  409,  410,  410,  410,  410,  621,
+      621,  621,  410,  440,  440,  621,  621,  621,  440,  444,
+      621,  444,  444,  621,  621,  621,  444,  462,  462,  462,
+      621,  621,  621,  462,  463,  463,  463,  463,  621,  621,
+      621,  463,  497,  497,  621,  621,  621,  497,  498,  621,
+      498,  498,  621,  621,  621,  498,  514,  514,  514,  621,
+      621,  621,  514,  515,  515,  515,  621,  621,  621,  621,
+      515,  524,  524,  524,  524,  524,  524,  524,  524,  524,
+      524,  524,  524,  524,  524,  524,  524,  529,  529,  621,
+
+      529,  529,  529,  621,  621,  529,  529,  529,  621,  621,
+      529,  529,  529,  535,  535,  621,  535,  535,  535,  621,
+      621,  535,  535,  535,  621,  621,  535,  535,  535,  543,
+      543,  621,  621,  621,  543,  544,  621,  544,  544,  621,
+      621,  621,  544,  560,  560,  621,  621,  621,  621,  560,
+      579,  579,  621,  621,  621,  579,  580,  621,  580,  580,
+      621,  621,  621,  580,  597,  597,  621,  621,  621,  597,
+      598,  621,  598,  621,  621,  621,  621,  598,  602,  602,
+      602,  602,  602,  602,  602,  602,  602,  602,  602,  602,
+      602,  602,  602,  602,   13,  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,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  621,  621,  621,  621,
+      621,  621
     } ;
 
-static yyconst short int yy_chk[3732] =
+static yyconst short int yy_chk[3663] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -982,411 +980,403 @@ static yyconst short int yy_chk[3732] =
         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,    1,    1,    1,    1,    1,    2,   44,    3,   34,
-        2,  103,    3,    4,   47,   20,  126,    4,    3,   34,
-      103,    3,   52,    4,   44,   48,    4,   11,   11,   11,
-       11,  126,   52,   20,    2,    2,   56,   47,    2,   74,
-
-        5,    5,    5,   48,    5,    2,   50,    3,    2,    3,
-        5,  603,    4,   56,    4,    6,    6,    6,   20,    6,
-       64,   64,    5,    5,   75,    6,   12,   12,   12,   12,
-        3,  196,   68,   50,   11,    4,   70,    6,    6,   25,
-       25,   72,   72,   25,   25,  196,   74,    5,   27,   27,
-       27,   27,   27,   27,   27,   27,   68,   88,  124,  127,
-       70,   25,    6,    7,    7,    7,   45,    7,  587,   75,
-      124,  127,  129,   12,   28,   28,   28,   28,   28,   28,
-      139,  139,  129,   43,   25,   43,   43,   43,   43,   43,
-       43,   43,   43,  194,   45,   45,   77,   77,   45,   77,
-
-       88,  116,  123,  114,  114,   45,  116,  153,   45,  194,
+        1,    1,    1,    1,    1,    1,    1,    2,  618,    3,
+       20,    2,   70,    3,   47,   36,   50,    4,   34,    3,
+       36,    4,    3,   11,   11,   11,   11,    4,   20,   34,
+        4,   12,   12,   12,   12,    2,    2,   70,   47,    2,
+
+       77,   38,  602,   50,    3,  599,   44,    2,    3,    3,
+        2,    3,    4,  597,   20,   38,    4,    4,   52,    4,
+        5,    5,    5,   44,    5,    6,    6,    6,   52,    6,
+        5,   11,    3,   25,   25,    6,  120,   25,   25,   12,
+        4,  120,    5,    5,   66,   66,   77,    6,    6,    9,
+        9,    9,    9,    9,   58,   25,   74,   74,    9,    9,
+        9,   28,   28,   28,   28,   28,   28,   19,    5,  143,
+      143,   58,    9,    6,    7,    7,    7,   19,    7,   25,
+       19,   19,   19,   19,   19,   19,   19,   19,   27,   27,
+       27,   27,   27,   27,   27,   27,  105,    9,   10,   10,
+
+       10,   10,   10,   76,  583,  105,   90,   10,   10,   10,
+       43,  165,   43,   43,   43,   43,   43,   43,   43,   43,
+       45,   10,    7,    7,    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,   53,    8,  206,   53,   53,   53,   53,   53,   53,
-       53,   53,   84,   84,   84,   84,   84,   84,   84,   84,
-      114,   62,   62,   62,  153,   62,  154,  125,  206,   62,
-      123,   62,   85,   85,   85,   85,   85,   85,   85,   85,
-      143,  143,  202,   62,   62,    8,    8,    8,    8,    8,
+        8,    8,    8,   48,    8,  128,   10,   72,   45,   45,
+       90,   76,   45,   79,   79,  165,   79,  128,  582,  127,
+       45,   53,   48,   45,   53,   53,   53,   53,   53,   53,
+       53,   53,   72,   86,   86,   86,   86,   86,   86,   86,
+       86,  103,  103,  103,  103,  103,  103,  580,    8,    8,
         8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    9,    9,    9,    9,    9,   62,  125,
-
-      128,  154,    9,    9,    9,   86,  128,  202,   55,   55,
-      136,  161,   55,   55,  185,  136,    9,  101,  101,  101,
-      101,  101,  101,   86,  155,  155,  198,  185,   87,  584,
-       55,   87,   87,   87,   87,   87,   87,   87,   87,  198,
-        9,   10,   10,   10,   10,   10,  582,  171,   86,  284,
-       10,   10,   10,   55,  161,   89,  171,   89,   89,  222,
-      568,   89,   89,  222,   10,   89,  213,   95,   95,   95,
-       95,   95,   95,   95,   95,  213,   92,   92,   89,   89,
-       92,   92,  192,  195,  284,  195,  512,  192,   10,   19,
-       99,   99,   99,   99,   99,   99,   99,   99,   92,   19,
-
-       95,  221,   19,   19,   19,   19,   19,   19,   19,   19,
-       26,  191,   26,   26,   26,   26,   26,   26,   26,   26,
-       26,   92,  237,  221,   26,   26,   26,   26,   26,  100,
-      100,  100,  100,  100,  100,  100,  100,  131,  131,  131,
-      131,  131,  131,  131,  131,   26,  512,   26,   26,   26,
-       26,   26,   26,   32,  146,  238,  238,  146,  146,   32,
-      567,  191,   32,   32,  146,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,  146,  237,   32,
+
+        8,    8,    8,    8,    8,    8,   26,  131,   26,   26,
+       26,   26,   26,   26,   26,   26,   26,   88,  127,  131,
+       26,   26,   26,   26,   26,  130,  191,  112,  579,   55,
+       55,  129,  112,   55,   55,   88,  112,  132,  112,  191,
+      130,  202,   26,  132,   26,   26,   26,   26,   26,   26,
+       32,   55,  140,  147,  147,  202,   32,  140,  575,   32,
+       32,   88,   32,   32,   32,   32,   32,   32,   32,   32,
+       32,   32,   32,   32,  129,   55,   32,   32,   32,   32,
        32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
        32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
 
        32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,  210,  210,
-      210,   35,   35,   35,   35,   35,  109,  231,  240,  241,
-       35,  109,  252,  231,  109,  241,  109,  117,  565,  150,
-      150,  252,  239,  240,   35,   35,   35,   35,   35,   35,
-       42,   42,   42,   42,   42,  293,   42,   42,  133,  133,
-       42,  265,  133,  133,  293,  117,  117,  239,  281,  117,
-      388,  388,   42,   42,   42,   46,  117,  163,  281,  117,
-      133,  163,  323,  265,  239,   46,  150,  163,   46,   46,
-
-       46,   46,   46,   46,   46,   46,  275,  282,  323,  163,
-      163,  275,  282,  133,  142,  142,  142,  142,  142,  142,
-      142,  142,  159,  159,  159,  159,  159,  159,  159,  159,
-      160,  160,  160,  160,  160,  160,  160,  160,  438,  438,
-       46,   63,  201,  201,  201,  201,  201,  201,  201,  201,
-      279,   63,  564,  280,   63,   63,   63,   63,   63,   63,
-       63,   63,   79,  560,   79,   79,   79,  297,   79,   79,
-      254,  254,   79,  197,  280,  201,  297,  197,  256,  256,
-      254,  321,  322,  197,   79,   79,   79,   91,  256,   91,
-       91,   91,  322,   91,   91,  197,  197,   91,  209,  209,
-
-      209,  209,  209,  209,  209,  209,  209,  298,  298,   91,
-       91,   91,   94,  279,   94,   94,   94,  298,   94,   94,
-      313,  383,   94,  162,  313,  162,  162,  452,  452,  162,
-      162,  383,  321,  162,   94,   94,   94,   96,   96,   96,
-       96,   96,   96,   96,   96,  162,  162,  162,  312,   96,
-       96,   96,   96,   96,  205,  368,  205,  205,  205,  205,
-      205,  205,  214,  214,  214,  214,  214,  214,  214,  214,
-      312,  368,   96,   96,   96,   96,   96,   96,  104,  104,
-      104,  104,  104,  104,  104,  104,  104,  316,  371,  205,
-      104,  104,  104,  104,  104,  216,  216,  216,  216,  216,
-
-      216,  216,  216,  217,  217,  217,  217,  217,  217,  316,
-      299,  299,  373,  104,  104,  104,  104,  104,  104,  135,
-      299,  135,  135,  135,  549,  135,  135,  373,  219,  135,
-      219,  219,  219,  219,  219,  219,  219,  219,  453,  453,
-      371,  135,  135,  135,  164,  545,  164,  164,  164,  164,
-      164,  164,  164,  164,  247,  247,  247,  247,  247,  247,
-      247,  247,  247,  253,  253,  253,  253,  253,  253,  253,
-      253,  255,  255,  255,  255,  255,  255,  255,  255,  164,
-      165,  541,  165,  165,  165,  165,  165,  165,  165,  165,
-      259,  259,  259,  259,  259,  259,  259,  259,  419,  419,
-
-      259,  261,  261,  261,  261,  261,  261,  261,  261,  262,
-      262,  262,  262,  262,  262,  165,  166,  529,  166,  166,
-      166,  166,  166,  166,  166,  166,  264,  317,  264,  264,
-      264,  264,  264,  264,  264,  264,  301,  301,  283,  283,
-      283,  283,  283,  283,  283,  283,  301,  456,  456,  317,
-      419,  166,  167,  318,  167,  167,  167,  167,  167,  167,
-      167,  167,  318,  324,  342,  343,  167,  167,  167,  167,
-      167,  283,  324,  342,  343,  344,  344,  287,  372,  287,
-      287,  287,  287,  287,  287,  344,  420,  372,  420,  167,
-      167,  167,  167,  167,  167,  170,  170,  170,  170,  170,
-
-      170,  170,  170,  170,  345,  345,  528,  170,  170,  170,
-      170,  170,  287,  294,  345,  294,  294,  294,  294,  294,
-      294,  294,  294,  307,  307,  307,  307,  307,  307,  513,
-      170,  170,  170,  170,  170,  170,  172,  172,  172,  172,
-      172,  172,  172,  172,  172,  172,  467,  467,  509,  172,
-      172,  172,  172,  172,  295,  376,  295,  295,  295,  295,
-      295,  295,  295,  295,  300,  300,  300,  300,  300,  300,
-      300,  300,  172,  172,  172,  172,  172,  172,  173,  173,
-      173,  173,  173,  173,  173,  173,  347,  347,  508,  376,
-      173,  173,  173,  173,  173,  296,  347,  296,  296,  296,
-
-      296,  296,  296,  296,  296,  306,  306,  306,  306,  306,
-      306,  306,  306,  173,  173,  173,  173,  173,  173,  203,
-      507,  203,  203,  203,  203,  203,  203,  203,  203,  304,
-      304,  304,  304,  304,  304,  304,  304,  506,  309,  304,
-      309,  309,  309,  309,  309,  309,  309,  309,  334,  334,
-      334,  334,  334,  334,  203,  204,  501,  204,  204,  204,
-      204,  204,  204,  204,  204,  331,  331,  331,  331,  331,
-      331,  331,  331,  333,  333,  333,  333,  333,  333,  333,
-      333,  337,  337,  337,  337,  337,  337,  337,  337,  358,
-      204,  215,  215,  215,  215,  215,  215,  215,  215,  215,
-
-      215,  215,  491,  491,  484,  215,  215,  215,  215,  215,
-      336,  358,  336,  336,  336,  336,  336,  336,  336,  336,
-      341,  483,  341,  341,  341,  341,  341,  341,  215,  215,
-      215,  215,  215,  215,  218,  218,  218,  218,  218,  218,
-      218,  218,  218,  218,  397,  502,  502,  218,  218,  218,
-      218,  218,  339,  397,  339,  339,  339,  339,  339,  339,
-      339,  339,  346,  346,  346,  346,  346,  346,  346,  346,
-      218,  218,  218,  218,  218,  218,  242,  479,  242,  242,
-      242,  242,  242,  242,  242,  242,  340,  364,  340,  340,
-      340,  340,  340,  340,  340,  340,  350,  350,  350,  350,
-
-      350,  350,  350,  350,  398,  670,  350,  510,  510,  364,
-      670,  242,  243,  398,  243,  243,  243,  243,  243,  243,
-      243,  243,  352,  352,  352,  352,  352,  352,  352,  352,
-      353,  353,  353,  353,  353,  353,  355,  366,  355,  355,
-      355,  355,  355,  355,  355,  355,  374,  243,  244,  449,
-      244,  244,  244,  244,  244,  244,  244,  244,  449,  366,
-      414,  385,  374,  382,  382,  382,  382,  382,  382,  382,
-      382,  385,  450,  375,  375,  375,  375,  375,  375,  375,
-      375,  450,  414,  244,  257,  257,  257,  257,  257,  257,
-      257,  257,  257,  257,  257,  260,  260,  260,  260,  260,
-
-      260,  260,  260,  260,  260,  260,  375,  415,  457,  260,
-      260,  260,  260,  260,  379,  379,  379,  379,  379,  379,
-      379,  384,  384,  384,  384,  384,  384,  384,  384,  415,
-      457,  465,  260,  260,  260,  260,  260,  260,  263,  263,
-      263,  263,  263,  263,  263,  263,  263,  263,  379,  536,
-      536,  263,  263,  263,  263,  263,  390,  390,  390,  390,
-      390,  390,  390,  390,  391,  391,  391,  391,  391,  391,
-      460,  399,  399,  459,  263,  263,  263,  263,  263,  263,
-      285,  399,  285,  285,  285,  285,  285,  285,  285,  285,
-      393,  432,  393,  393,  393,  393,  393,  393,  393,  393,
-
-      394,  432,  394,  394,  394,  394,  394,  394,  394,  394,
-      458,  473,  551,  551,  468,  285,  286,  433,  286,  286,
-      286,  286,  286,  286,  286,  286,  395,  433,  395,  395,
-      395,  395,  395,  395,  395,  395,  396,  435,  396,  396,
-      396,  396,  396,  396,  396,  396,  473,  435,  461,  571,
-      571,  286,  292,  292,  292,  292,  292,  292,  292,  292,
-      292,  400,  400,  445,  292,  292,  292,  292,  292,  468,
-      461,  400,  401,  401,  401,  401,  401,  401,  401,  401,
-      408,  408,  408,  408,  408,  408,  431,  292,  292,  292,
-      292,  292,  292,  302,  302,  302,  302,  302,  302,  302,
-
-      302,  302,  302,  302,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  402,  402,  463,  305,  305,
-      305,  305,  305,  469,  477,  402,  405,  405,  405,  405,
-      405,  405,  405,  405,  427,  503,  405,  422,  469,  463,
-      418,  305,  305,  305,  305,  305,  305,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  503,  417,  477,
-      308,  308,  308,  308,  308,  407,  407,  407,  407,  407,
-      407,  407,  407,  409,  416,  409,  409,  409,  409,  409,
-      409,  409,  409,  308,  308,  308,  308,  308,  308,  325,
-      325,  325,  325,  325,  325,  325,  325,  325,  421,  428,
-
-      505,  428,  428,  428,  428,  428,  428,  428,  428,  434,
-      434,  434,  434,  434,  434,  434,  434,  413,  421,  412,
-      421,  421,  505,  325,  326,  326,  326,  326,  326,  326,
-      326,  326,  326,  429,  466,  429,  429,  429,  429,  429,
-      429,  429,  429,  421,  430,  485,  430,  430,  430,  430,
-      430,  430,  430,  430,  466,  485,  466,  466,  326,  327,
-      327,  327,  327,  327,  327,  327,  327,  327,  440,  440,
-      440,  440,  440,  440,  440,  440,  441,  441,  441,  441,
-      441,  441,  443,  500,  443,  443,  443,  443,  443,  443,
-      443,  443,  500,  327,  332,  486,  332,  332,  332,  332,
-
-      332,  332,  332,  332,  332,  486,  575,  575,  332,  332,
-      332,  332,  332,  444,  444,  444,  444,  444,  444,  444,
-      444,  446,  411,  446,  446,  446,  446,  446,  446,  446,
-      446,  332,  332,  332,  332,  332,  332,  335,  335,  335,
-      335,  335,  335,  335,  335,  335,  588,  588,  410,  335,
-      335,  335,  335,  335,  447,  488,  447,  447,  447,  447,
-      447,  447,  447,  447,  448,  488,  448,  448,  448,  448,
-      448,  448,  335,  335,  335,  335,  335,  335,  348,  348,
-      348,  348,  348,  348,  348,  348,  348,  348,  348,  351,
-      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
-
-      451,  451,  381,  351,  351,  351,  351,  351,  555,  470,
-      451,  470,  470,  470,  471,  530,  471,  471,  471,  494,
-      494,  494,  494,  494,  494,  530,  351,  351,  351,  351,
-      351,  351,  354,  354,  354,  354,  354,  354,  354,  354,
-      354,  531,  533,  555,  566,  354,  354,  354,  354,  354,
-      380,  531,  533,  370,  566,  369,  470,  363,  591,  362,
-      476,  471,  476,  476,  476,  476,  476,  476,  354,  354,
-      354,  354,  354,  354,  377,  377,  377,  377,  377,  377,
-      377,  377,  377,  546,  548,  472,  472,  472,  472,  472,
-      472,  472,  472,  591,  361,  476,  478,  478,  478,  478,
-
-      478,  478,  478,  478,  360,  546,  548,  357,  377,  378,
-      378,  378,  378,  378,  378,  378,  378,  378,  472,  480,
-      572,  480,  480,  480,  480,  480,  480,  480,  480,  481,
-      356,  481,  481,  481,  481,  481,  481,  481,  481,  619,
-      619,  338,  572,  378,  386,  574,  386,  386,  386,  386,
-      386,  386,  386,  386,  386,  389,  330,  389,  389,  389,
-      389,  389,  389,  389,  389,  389,  329,  574,  585,  389,
-      389,  389,  389,  389,  482,  328,  482,  482,  482,  482,
-      482,  482,  487,  487,  487,  487,  487,  487,  487,  487,
-      585,  320,  389,  389,  389,  389,  389,  389,  392,  392,
-
-      392,  392,  392,  392,  392,  392,  392,  319,  315,  314,
-      392,  392,  392,  392,  392,  493,  493,  493,  493,  493,
-      493,  493,  493,  496,  311,  496,  496,  496,  496,  496,
-      496,  496,  496,  392,  392,  392,  392,  392,  392,  403,
-      403,  403,  403,  403,  403,  403,  403,  403,  403,  403,
-      406,  406,  406,  406,  406,  406,  406,  406,  406,  406,
-      310,  291,  290,  289,  406,  406,  406,  406,  406,  497,
-      497,  497,  497,  497,  497,  497,  497,  497,  498,  498,
-      498,  498,  498,  498,  498,  498,  498,  406,  406,  406,
-      406,  406,  406,  423,  288,  423,  423,  423,  423,  423,
-
-      423,  423,  423,  499,  499,  499,  499,  499,  499,  499,
-      499,  499,  514,  278,  514,  514,  514,  277,  276,  515,
-      274,  515,  515,  515,  273,  272,  271,  270,  423,  424,
-      269,  424,  424,  424,  424,  424,  424,  424,  424,  516,
-      268,  516,  516,  516,  517,  267,  517,  517,  517,  251,
-      520,  250,  520,  520,  520,  249,  248,  246,  245,  514,
-      236,  235,  234,  233,  424,  425,  515,  425,  425,  425,
-      425,  425,  425,  425,  425,  518,  232,  229,  518,  518,
-      518,  518,  518,  518,  518,  518,  516,  227,  226,  225,
-      224,  517,  223,  220,  212,  519,  519,  520,  211,  519,
-
-      425,  426,  208,  426,  426,  426,  426,  426,  426,  426,
-      426,  519,  519,  519,  521,  521,  207,  525,  521,  525,
-      525,  525,  525,  525,  525,  525,  525,  200,  199,  193,
-      521,  521,  521,  190,  189,  188,  426,  436,  187,  436,
-      436,  436,  436,  436,  436,  436,  436,  436,  439,  186,
-      439,  439,  439,  439,  439,  439,  439,  439,  439,  184,
-      183,  182,  439,  439,  439,  439,  439,  526,  181,  526,
-      526,  526,  526,  526,  526,  526,  526,  532,  532,  532,
-      532,  532,  532,  532,  532,  439,  439,  439,  439,  439,
-      439,  442,  442,  442,  442,  442,  442,  442,  442,  442,
-
-      180,  179,  178,  442,  442,  442,  442,  442,  527,  177,
-      527,  527,  527,  527,  527,  527,  527,  527,  538,  538,
-      538,  538,  538,  538,  538,  538,  442,  442,  442,  442,
-      442,  442,  454,  454,  454,  454,  454,  454,  454,  454,
-      454,  454,  474,  176,  474,  474,  474,  474,  474,  474,
-      474,  474,  539,  539,  539,  539,  539,  539,  540,  175,
-      540,  540,  540,  540,  540,  540,  540,  540,  542,  542,
-      542,  542,  542,  542,  542,  542,  542,  474,  475,  169,
-      475,  475,  475,  475,  475,  475,  475,  475,  543,  543,
-      543,  543,  543,  543,  543,  543,  543,  544,  544,  544,
-
-      544,  544,  544,  544,  552,  552,  552,  552,  552,  552,
-      552,  552,  168,  475,  489,  158,  489,  489,  489,  489,
-      489,  489,  489,  489,  489,  492,  157,  492,  492,  492,
-      492,  492,  492,  492,  492,  492,  156,  152,  151,  492,
-      492,  492,  492,  492,  553,  553,  553,  553,  553,  553,
-      553,  553,  554,  554,  554,  554,  554,  554,  554,  554,
-      149,  145,  492,  492,  492,  492,  492,  492,  495,  495,
-      495,  495,  495,  495,  495,  495,  138,  134,  132,  130,
-      495,  495,  495,  495,  495,  554,  558,  122,  558,  558,
-      558,  558,  558,  558,  559,  559,  559,  559,  559,  559,
-
-      559,  559,  121,  495,  495,  495,  495,  495,  495,  522,
-      120,  522,  522,  522,  522,  522,  522,  522,  522,  119,
-      561,  558,  561,  561,  561,  561,  561,  561,  561,  561,
-      562,  118,  562,  562,  562,  562,  562,  562,  562,  562,
-      113,  112,  111,  110,  522,  523,  108,  523,  523,  523,
-      523,  523,  523,  523,  523,  563,  107,  563,  563,  563,
-      563,  563,  563,  569,  106,  569,  569,  569,  569,  569,
-      569,  569,  569,  598,  598,  598,  598,  598,  598,  102,
-      523,  524,   98,  524,  524,  524,  524,  524,  524,  524,
-      524,  579,  579,  579,  579,  579,  579,  579,  579,  580,
-
-      580,  580,  580,  580,  580,  580,  580,  581,  581,  581,
-      581,  581,  581,  581,  581,   97,  524,  534,   93,  534,
-      534,  534,  534,  534,  534,  534,  534,  534,  537,   90,
-      537,  537,  537,  537,  537,  537,  537,  537,   82,   81,
-       80,   78,  537,  537,  537,  537,  537,   73,  590,  590,
-      590,  590,  590,  590,  590,  590,  594,   66,  594,  594,
-      594,  594,  594,  594,   59,  537,  537,  537,  537,  537,
-      537,  556,   54,  556,  556,  556,  556,  556,  556,  556,
-      556,  590,  596,  596,  596,  596,  596,  596,  596,  596,
-       51,  594,  597,  597,  597,  597,  597,  597,  597,  597,
-
-       49,   41,   40,   39,   38,   37,  556,  557,   36,  557,
-      557,  557,  557,  557,  557,  557,  557,   33,   29,   23,
-      600,  600,  600,  600,  600,  600,  600,  600,  601,  601,
-      601,  601,  601,  601,  601,  601,   17,   15,   14,   13,
-        0,    0,  557,  576,    0,  576,  576,  576,  576,  576,
-      576,  576,  576,  600,    0,    0,    0,    0,    0,    0,
-        0,  601,  602,  602,  602,  602,  602,  602,  602,  602,
-      604,  604,  604,  604,  604,  604,  604,  604,  576,  577,
-        0,  577,  577,  577,  577,  577,  577,  577,  577,    0,
-        0,    0,    0,    0,    0,  602,  605,  605,  605,  605,
-
-      605,  605,    0,  604,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  577,  578,    0,  578,  578,  578,
-      578,  578,  578,  578,  578,    0,    0,    0,    0,  605,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      578,  592,    0,  592,  592,  592,  592,  592,  592,  592,
-      592,    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,  592,  593,    0,  593,
-      593,  593,  593,  593,  593,  593,  593,    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,  593,  607,  607,  607,  607,  607,  607,  607,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  608,
-      608,  608,  608,  608,  608,  608,  608,  608,  608,  608,
-      608,  608,  608,  608,  608,  609,  609,  609,  609,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      609,  610,  610,  610,  610,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  610,  610,  610,  611,    0,    0,
-        0,    0,    0,    0,    0,  611,  611,  611,    0,    0,
-
-      611,  611,  611,  612,  612,  612,  612,  612,  612,  612,
-      612,  612,  612,  612,  612,  612,  612,  612,  612,  613,
-        0,    0,    0,    0,  613,    0,    0,  613,  613,  613,
-      613,    0,  613,  613,  613,  614,    0,    0,    0,    0,
-        0,    0,    0,  614,  614,  614,    0,    0,  614,  614,
-      614,  615,    0,    0,  615,  615,    0,  615,    0,  615,
-      615,  615,    0,    0,  615,  615,  615,  616,  616,    0,
-        0,    0,  616,  617,    0,    0,  617,  617,    0,  617,
-        0,  617,  617,  617,    0,    0,  617,  617,  617,  618,
-        0,    0,  618,  618,    0,  618,    0,  618,  618,  618,
-
-        0,  618,    0,  618,  618,  620,    0,    0,  620,    0,
-        0,  620,    0,  620,  620,  620,  620,    0,  620,  620,
-      620,  621,  621,  621,  621,  621,  621,  621,  621,  621,
-      621,  621,  621,  621,  621,  621,  621,  622,  622,    0,
-      622,    0,  622,  622,  622,  622,  622,  622,  622,  622,
-      622,  622,  622,  623,  623,  623,  623,  623,  623,  623,
-      623,  623,  623,  623,  623,  623,  623,  623,  623,  624,
-      624,    0,  624,  624,  624,  624,  624,  624,  624,  624,
-      624,  624,  624,  624,  624,  625,    0,    0,    0,    0,
-      625,    0,    0,  625,  625,  625,    0,    0,  625,  625,
-
-      625,  626,    0,    0,  626,  626,    0,  626,    0,  626,
-      626,  626,    0,    0,  626,  626,  626,  627,  627,    0,
-        0,    0,  627,  628,  628,  628,    0,    0,    0,  628,
-      629,    0,    0,  629,  629,    0,  629,    0,  629,  629,
-      629,    0,    0,  629,  629,  629,  630,  630,  630,  630,
-      630,  630,  630,  630,  630,  630,  630,  630,  630,  630,
-      630,  630,  631,  631,    0,    0,    0,  631,  632,  632,
-      632,    0,    0,    0,  632,  633,  633,    0,    0,    0,
-      633,  634,  634,    0,    0,    0,  634,  635,  635,    0,
-        0,    0,  635,  636,  636,  636,    0,    0,    0,  636,
-
-      637,  637,    0,    0,    0,  637,  638,  638,    0,    0,
-        0,  638,  639,  639,    0,    0,    0,  639,  640,  640,
-      640,    0,    0,    0,  640,  641,  641,  641,  641,    0,
-        0,    0,  641,  642,  642,    0,    0,    0,  642,  643,
-      643,    0,    0,    0,  643,  644,  644,    0,    0,    0,
-      644,  645,  645,  645,    0,    0,    0,  645,  646,  646,
-      646,  646,    0,    0,    0,  646,  647,  647,    0,    0,
-        0,  647,  648,  648,    0,    0,    0,  648,  649,  649,
-      649,    0,    0,    0,  649,  650,  650,  650,  650,    0,
-        0,    0,  650,  651,  651,    0,    0,    0,  651,  652,
-
-        0,  652,  652,    0,    0,    0,  652,  653,  653,  653,
-        0,    0,    0,  653,  654,  654,  654,  654,    0,    0,
-        0,  654,  655,  655,    0,    0,    0,  655,  656,    0,
-      656,  656,    0,    0,    0,  656,  657,  657,  657,    0,
-        0,    0,  657,  658,  658,  658,    0,    0,    0,    0,
-      658,  659,  659,  659,  659,  659,  659,  659,  659,  659,
-      659,  659,  659,  659,  659,  659,  659,  660,  660,    0,
-      660,  660,  660,    0,    0,  660,  660,  660,    0,    0,
-      660,  660,  660,  661,  661,    0,  661,  661,  661,    0,
-        0,  661,  661,  661,    0,    0,  661,  661,  661,  662,
-
-      662,    0,    0,    0,  662,  663,    0,  663,  663,    0,
-        0,    0,  663,  664,  664,    0,    0,    0,    0,  664,
-      665,  665,    0,    0,    0,  665,  666,    0,  666,  666,
-        0,    0,    0,  666,  667,  667,    0,    0,    0,  667,
-      668,    0,  668,    0,    0,    0,    0,  668,  669,  669,
-      669,  669,  669,  669,  669,  669,  669,  669,  669,  669,
-      669,  669,  669,  669,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606
+       32,   32,   32,   32,   32,   32,   32,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   65,  118,  118,   35,
+       35,   35,   35,   35,  159,  159,   65,  133,   35,   65,
+       65,   65,   65,   65,   65,   65,   65,  133,  154,  154,
+      201,  208,  201,   35,   35,   35,   35,   35,   35,   42,
+       42,   42,   42,   42,  158,   42,   42,  175,  157,   42,
+       64,   64,   64,  200,   64,  118,  175,  219,   64,  197,
+       64,   42,   42,   42,   46,  198,  219,  208,  212,  200,
+      198,  227,   64,   64,   46,  564,  154,   46,   46,   46,
+
+       46,   46,   46,   46,   46,   81,  560,   81,   81,   81,
+      158,   81,   81,  227,  212,   81,  157,  245,   64,   87,
+       87,   87,   87,   87,   87,   87,   87,   81,   81,   81,
+      197,   94,   94,  556,  229,   94,   94,  204,   89,  229,
+       46,   89,   89,   89,   89,   89,   89,   89,   89,   91,
+      204,   91,   91,   94,  544,   91,   91,  239,   93,   91,
+       93,   93,   93,  239,   93,   93,  246,  246,   93,  216,
+      216,  216,   91,   91,  245,  289,  248,   94,  249,  260,
+       93,   93,   93,   96,  249,   96,   96,   96,  260,   96,
+       96,  248,  543,   96,   97,   97,   97,   97,   97,   97,
+
+       97,   97,  273,  290,  294,   96,   96,   96,  101,  101,
+      101,  101,  101,  101,  101,  101,  102,  102,  102,  102,
+      102,  102,  102,  102,  273,  290,  482,  291,   97,   98,
+       98,   98,   98,   98,   98,   98,   98,  291,  247,  289,
+      294,   98,   98,   98,   98,   98,  135,  135,  135,  135,
+      135,  135,  135,  135,  332,  433,  285,  433,  137,  137,
+      121,  285,  137,  137,  247,   98,   98,   98,   98,   98,
+       98,  106,  106,  106,  106,  106,  106,  106,  106,  106,
+      137,  247,  482,  106,  106,  106,  106,  106,  121,  121,
+      303,  139,  121,  139,  139,  139,  307,  139,  139,  303,
+
+      121,  139,  528,  121,  137,  307,  332,  106,  106,  106,
+      106,  106,  106,  139,  139,  139,  146,  146,  146,  146,
+      146,  146,  146,  146,  150,  292,  324,  150,  150,  334,
+      292,  324,  383,  524,  150,  163,  163,  163,  163,  163,
+      163,  163,  163,  323,  523,  334,  385,  150,  164,  164,
+      164,  164,  164,  164,  164,  164,  166,  522,  166,  166,
+      167,  385,  166,  166,  167,  323,  166,  262,  262,  211,
+      167,  211,  211,  211,  211,  211,  211,  262,  166,  166,
+      166,  521,  167,  167,  168,  383,  168,  168,  168,  168,
+      168,  168,  168,  168,  169,  327,  169,  169,  169,  169,
+
+      169,  169,  169,  169,  170,  211,  170,  170,  170,  170,
+      170,  170,  170,  170,  203,  264,  264,  327,  203,  388,
+      168,  308,  308,  380,  203,  264,  329,  515,  309,  309,
+      169,  308,  311,  311,  498,  329,  203,  203,  309,  380,
+      170,  171,  311,  171,  171,  171,  171,  171,  171,  171,
+      171,  400,  400,  497,  388,  171,  171,  171,  171,  171,
+      207,  207,  207,  207,  207,  207,  207,  207,  209,  335,
+      209,  209,  209,  209,  209,  209,  209,  209,  335,  171,
+      171,  171,  171,  171,  171,  174,  174,  174,  174,  174,
+      174,  174,  174,  174,  207,  451,  451,  174,  174,  174,
+
+      174,  174,  527,  210,  209,  210,  210,  210,  210,  210,
+      210,  210,  210,  220,  220,  220,  220,  220,  220,  220,
+      220,  174,  174,  174,  174,  174,  174,  176,  176,  176,
+      176,  176,  176,  176,  176,  176,  176,  465,  465,  210,
+      176,  176,  176,  176,  176,  215,  215,  215,  215,  215,
+      215,  215,  215,  215,  222,  222,  222,  222,  222,  222,
+      222,  222,  386,  527,  176,  176,  176,  176,  176,  176,
+      177,  177,  177,  177,  177,  177,  177,  177,  386,  466,
+      466,  328,  177,  177,  177,  177,  177,  223,  223,  223,
+      223,  223,  223,  225,  333,  225,  225,  225,  225,  225,
+
+      225,  225,  225,  328,  333,  493,  177,  177,  177,  177,
+      177,  177,  221,  221,  221,  221,  221,  221,  221,  221,
+      221,  221,  221,  353,  469,  469,  221,  221,  221,  221,
+      221,  250,  353,  250,  250,  250,  250,  250,  250,  250,
+      250,  255,  255,  255,  255,  255,  255,  255,  255,  255,
+      221,  221,  221,  221,  221,  221,  224,  224,  224,  224,
+      224,  224,  224,  224,  224,  224,  354,  250,  479,  224,
+      224,  224,  224,  224,  251,  354,  251,  251,  251,  251,
+      251,  251,  251,  251,  261,  261,  261,  261,  261,  261,
+      261,  261,  474,  224,  224,  224,  224,  224,  224,  252,
+
+      473,  252,  252,  252,  252,  252,  252,  252,  252,  370,
+      251,  263,  263,  263,  263,  263,  263,  263,  263,  267,
+      267,  267,  267,  267,  267,  267,  267,  481,  481,  267,
+      472,  370,  505,  505,  470,  252,  265,  265,  265,  265,
+      265,  265,  265,  265,  265,  265,  265,  268,  268,  268,
+      268,  268,  268,  268,  268,  268,  268,  268,  376,  378,
+      427,  268,  268,  268,  268,  268,  269,  269,  269,  269,
+      269,  269,  269,  269,  270,  270,  270,  270,  270,  270,
+      376,  378,  427,  516,  516,  268,  268,  268,  268,  268,
+      268,  271,  271,  271,  271,  271,  271,  271,  271,  271,
+
+      271,  384,  525,  525,  271,  271,  271,  271,  271,  272,
+      384,  272,  272,  272,  272,  272,  272,  272,  272,  293,
+      293,  293,  293,  293,  293,  293,  293,  458,  271,  271,
+      271,  271,  271,  271,  295,  395,  295,  295,  295,  295,
+      295,  295,  295,  295,  297,  395,  297,  297,  297,  297,
+      297,  297,  296,  293,  296,  296,  296,  296,  296,  296,
+      296,  296,  317,  317,  317,  317,  317,  317,  444,  304,
+      295,  304,  304,  304,  304,  304,  304,  304,  304,  440,
+      297,  345,  345,  345,  345,  345,  345,  435,  296,  302,
+      302,  302,  302,  302,  302,  302,  302,  302,  409,  551,
+
+      551,  302,  302,  302,  302,  302,  305,  409,  305,  305,
+      305,  305,  305,  305,  305,  305,  310,  310,  310,  310,
+      310,  310,  310,  310,  431,  302,  302,  302,  302,  302,
+      302,  306,  430,  306,  306,  306,  306,  306,  306,  306,
+      306,  312,  312,  312,  312,  312,  312,  312,  312,  312,
+      312,  312,  314,  314,  314,  314,  314,  314,  314,  314,
+      483,  429,  314,  315,  315,  315,  315,  315,  315,  315,
+      315,  315,  315,  315,  426,  483,  425,  315,  315,  315,
+      315,  315,  316,  316,  316,  316,  316,  316,  316,  316,
+      319,  410,  319,  319,  319,  319,  319,  319,  319,  319,
+
+      410,  315,  315,  315,  315,  315,  315,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  566,  566,  424,
+      318,  318,  318,  318,  318,  336,  336,  336,  336,  336,
+      336,  336,  336,  336,  337,  337,  337,  337,  337,  337,
+      337,  337,  337,  423,  318,  318,  318,  318,  318,  318,
+      338,  338,  338,  338,  338,  338,  338,  338,  338,  422,
+      336,  342,  342,  342,  342,  342,  342,  342,  342,  337,
+      344,  344,  344,  344,  344,  344,  344,  344,  364,  364,
+      364,  364,  364,  364,  428,  338,  343,  397,  343,  343,
+      343,  343,  343,  343,  343,  343,  343,  397,  586,  586,
+
+      343,  343,  343,  343,  343,  347,  428,  347,  347,  347,
+      347,  347,  347,  347,  347,  348,  348,  348,  348,  348,
+      348,  348,  348,  393,  343,  343,  343,  343,  343,  343,
+      346,  346,  346,  346,  346,  346,  346,  346,  346,  392,
+      432,  432,  346,  346,  346,  346,  346,  350,  445,  350,
+      350,  350,  350,  350,  350,  350,  350,  352,  445,  352,
+      352,  352,  352,  352,  352,  382,  346,  346,  346,  346,
+      346,  346,  351,  381,  351,  351,  351,  351,  351,  351,
+      351,  351,  355,  355,  356,  356,  403,  403,  403,  403,
+      403,  403,  355,  432,  356,  357,  357,  357,  357,  357,
+
+      357,  357,  357,  358,  358,  363,  363,  363,  363,  363,
+      363,  363,  363,  358,  359,  359,  359,  359,  359,  359,
+      359,  359,  359,  359,  359,  361,  361,  361,  361,  361,
+      361,  361,  361,  590,  590,  361,  362,  362,  362,  362,
+      362,  362,  362,  362,  362,  362,  362,  462,  603,  603,
+      362,  362,  362,  362,  362,  366,  462,  366,  366,  366,
+      366,  366,  366,  366,  366,  387,  387,  387,  387,  387,
+      387,  387,  387,  375,  362,  362,  362,  362,  362,  362,
+      365,  365,  365,  365,  365,  365,  365,  365,  365,  463,
+      634,  634,  374,  365,  365,  365,  365,  365,  463,  387,
+
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  391,
+      391,  391,  391,  391,  391,  391,  373,  365,  365,  365,
+      365,  365,  365,  390,  390,  390,  390,  390,  390,  390,
+      390,  390,  471,  434,  372,  389,  394,  394,  394,  394,
+      394,  394,  394,  394,  391,  396,  396,  396,  396,  396,
+      396,  396,  396,  434,  471,  434,  434,  398,  390,  398,
+      398,  398,  398,  398,  398,  398,  398,  398,  401,  487,
+      401,  401,  401,  401,  401,  401,  401,  401,  401,  434,
+      369,  368,  401,  401,  401,  401,  401,  402,  402,  402,
+      402,  402,  402,  402,  402,  405,  367,  405,  405,  405,
+
+      405,  405,  405,  405,  405,  487,  401,  401,  401,  401,
+      401,  401,  404,  404,  404,  404,  404,  404,  404,  404,
+      404,  514,  349,  341,  404,  404,  404,  404,  404,  406,
+      514,  406,  406,  406,  406,  406,  406,  406,  406,  420,
+      420,  420,  420,  420,  420,  411,  411,  340,  404,  404,
+      404,  404,  404,  404,  407,  411,  407,  407,  407,  407,
+      407,  407,  407,  407,  408,  339,  408,  408,  408,  408,
+      408,  408,  408,  408,  412,  412,  413,  413,  413,  413,
+      413,  413,  413,  413,  412,  414,  414,  419,  419,  419,
+      419,  419,  419,  419,  419,  414,  415,  415,  415,  415,
+
+      415,  415,  415,  415,  415,  415,  415,  417,  417,  417,
+      417,  417,  417,  417,  417,  331,  330,  417,  418,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  446,  326,
+      325,  322,  418,  418,  418,  418,  418,  421,  446,  421,
+      421,  421,  421,  421,  421,  421,  421,  447,  447,  447,
+      447,  447,  447,  447,  447,  321,  418,  418,  418,  418,
+      418,  418,  436,  448,  436,  436,  436,  436,  436,  436,
+      436,  436,  437,  448,  437,  437,  437,  437,  437,  437,
+      437,  437,  438,  499,  438,  438,  438,  438,  438,  438,
+      438,  438,  491,  499,  570,  606,  320,  439,  436,  439,
+
+      439,  439,  439,  439,  439,  439,  439,  441,  437,  441,
+      441,  441,  441,  441,  441,  441,  441,  442,  438,  442,
+      442,  442,  442,  442,  442,  442,  442,  301,  491,  300,
+      570,  606,  443,  439,  443,  443,  443,  443,  443,  443,
+      443,  443,  449,  475,  449,  449,  449,  449,  449,  449,
+      449,  449,  449,  452,  299,  452,  452,  452,  452,  452,
+      452,  452,  452,  452,  477,  475,  518,  452,  452,  452,
+      452,  452,  453,  453,  453,  453,  453,  453,  453,  453,
+      454,  454,  454,  454,  454,  454,  477,  298,  518,  288,
+      287,  452,  452,  452,  452,  452,  452,  455,  455,  455,
+
+      455,  455,  455,  455,  455,  455,  286,  284,  282,  455,
+      455,  455,  455,  455,  456,  281,  456,  456,  456,  456,
+      456,  456,  456,  456,  457,  457,  457,  457,  457,  457,
+      457,  457,  280,  455,  455,  455,  455,  455,  455,  459,
+      279,  459,  459,  459,  459,  459,  459,  459,  459,  460,
+      480,  460,  460,  460,  460,  460,  460,  460,  460,  461,
+      278,  461,  461,  461,  461,  461,  461,  464,  464,  685,
+      480,  277,  480,  480,  685,  276,  275,  464,  467,  467,
+      467,  467,  467,  467,  467,  467,  467,  467,  484,  259,
+      484,  484,  484,  485,  258,  485,  485,  485,  486,  486,
+
+      486,  486,  486,  486,  486,  486,  488,  500,  488,  488,
+      488,  488,  488,  488,  488,  488,  489,  500,  489,  489,
+      489,  489,  489,  489,  489,  489,  257,  502,  545,  520,
+      546,  256,  486,  254,  548,  253,  484,  502,  545,  244,
+      546,  485,  488,  490,  548,  490,  490,  490,  490,  490,
+      490,  520,  489,  492,  492,  492,  492,  492,  492,  492,
+      492,  494,  243,  494,  494,  494,  494,  494,  494,  494,
+      494,  508,  508,  508,  508,  508,  508,  242,  495,  490,
+      495,  495,  495,  495,  495,  495,  495,  495,  496,  241,
+      496,  496,  496,  496,  496,  496,  501,  501,  501,  501,
+
+      501,  501,  501,  501,  503,  561,  503,  503,  503,  503,
+      503,  503,  503,  503,  503,  506,  581,  506,  506,  506,
+      506,  506,  506,  506,  506,  506,  581,  561,  240,  506,
+      506,  506,  506,  506,  507,  507,  507,  507,  507,  507,
+      507,  507,  510,  237,  510,  510,  510,  510,  510,  510,
+      510,  510,  235,  506,  506,  506,  506,  506,  506,  509,
+      509,  509,  509,  509,  509,  509,  509,  234,  233,  232,
+      231,  509,  509,  509,  509,  509,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  512,  512,  512,  512,  512,
+      512,  512,  512,  512,  563,  509,  509,  509,  509,  509,
+
+      509,  513,  513,  513,  513,  513,  513,  513,  513,  513,
+      529,  230,  529,  529,  529,  530,  563,  530,  530,  530,
+      531,  228,  531,  531,  531,  532,  226,  532,  532,  532,
+      533,  218,  217,  533,  533,  533,  533,  533,  533,  533,
+      533,  214,  587,  534,  534,  589,  535,  534,  535,  535,
+      535,  213,  206,  536,  536,  205,  199,  536,  529,  534,
+      534,  534,  196,  530,  587,  195,  194,  589,  531,  536,
+      536,  536,  537,  532,  537,  537,  537,  537,  537,  537,
+      537,  537,  538,  600,  538,  538,  538,  538,  538,  538,
+      538,  538,  193,  539,  535,  539,  539,  539,  539,  539,
+
+      539,  539,  539,  192,  190,  600,  189,  540,  537,  540,
+      540,  540,  540,  540,  540,  540,  540,  541,  538,  541,
+      541,  541,  541,  541,  541,  541,  541,  188,  542,  539,
+      542,  542,  542,  542,  542,  542,  542,  542,  547,  547,
+      547,  547,  547,  547,  547,  547,  549,  187,  549,  549,
+      549,  549,  549,  549,  549,  549,  549,  552,  186,  552,
+      552,  552,  552,  552,  552,  552,  552,  185,  184,  183,
+      182,  552,  552,  552,  552,  552,  553,  553,  553,  553,
+      553,  553,  553,  553,  554,  554,  554,  554,  554,  554,
+      181,  180,  179,  173,  172,  552,  552,  552,  552,  552,
+
+      552,  555,  162,  555,  555,  555,  555,  555,  555,  555,
+      555,  557,  557,  557,  557,  557,  557,  557,  557,  557,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  559,
+      559,  559,  559,  559,  559,  559,  567,  567,  567,  567,
+      567,  567,  567,  567,  568,  568,  568,  568,  568,  568,
+      568,  568,  569,  569,  569,  569,  569,  569,  569,  569,
+      571,  161,  571,  571,  571,  571,  571,  571,  571,  571,
+      572,  160,  572,  572,  572,  572,  572,  572,  572,  572,
+      156,  155,  153,  149,  142,  573,  569,  573,  573,  573,
+      573,  573,  573,  138,  136,  134,  571,  574,  574,  574,
+
+      574,  574,  574,  574,  574,  576,  572,  576,  576,  576,
+      576,  576,  576,  576,  576,  126,  125,  124,  123,  122,
+      577,  573,  577,  577,  577,  577,  577,  577,  577,  577,
+      578,  117,  578,  578,  578,  578,  578,  578,  584,  116,
+      584,  584,  584,  584,  584,  584,  584,  584,  591,  115,
+      591,  591,  591,  591,  591,  591,  591,  591,  592,  114,
+      592,  592,  592,  592,  592,  592,  592,  592,  593,  113,
+      593,  593,  593,  593,  593,  593,  593,  593,  613,  613,
+      613,  613,  613,  613,  591,  594,  594,  594,  594,  594,
+      594,  594,  594,  111,  592,  595,  595,  595,  595,  595,
+
+      595,  595,  595,  110,  593,  596,  596,  596,  596,  596,
+      596,  596,  596,  605,  605,  605,  605,  605,  605,  605,
+      605,  607,  109,  607,  607,  607,  607,  607,  607,  607,
+      607,  608,  108,  608,  608,  608,  608,  608,  608,  608,
+      608,  104,  100,   99,   95,   92,  609,  605,  609,  609,
+      609,  609,  609,  609,   84,   83,   82,  607,  611,  611,
+      611,  611,  611,  611,  611,  611,   80,  608,  612,  612,
+      612,  612,  612,  612,  612,  612,   75,   68,   61,   57,
+       56,   54,  609,  615,  615,  615,  615,  615,  615,  615,
+      615,  616,  616,  616,  616,  616,  616,  616,  616,  617,
+
+      617,  617,  617,  617,  617,  617,  617,  619,  619,  619,
+      619,  619,  619,  619,  619,   51,   49,  615,  620,  620,
+      620,  620,  620,  620,   41,  616,   40,   39,   37,   33,
+       29,   23,   17,  617,   15,   14,   13,    0,    0,    0,
+        0,  619,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  620,  622,  622,  622,  622,  622,  622,  622,
+      622,  622,  622,  622,  622,  622,  622,  622,  622,  623,
+      623,  623,  623,  623,  623,  623,  623,  623,  623,  623,
+      623,  623,  623,  623,  623,  624,  624,  624,  624,  624,
+      624,  624,  624,  624,  624,  624,  624,  624,  624,  624,
+
+      624,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  626,    0,    0,
+        0,    0,    0,    0,    0,  626,  626,  626,    0,    0,
+      626,  626,  626,  627,  627,  627,  627,  627,  627,  627,
+      627,  627,  627,  627,  627,  627,  627,  627,  627,  628,
+        0,    0,    0,    0,  628,    0,    0,  628,  628,  628,
+      628,    0,  628,  628,  628,  629,    0,    0,    0,    0,
+        0,    0,    0,  629,  629,  629,    0,    0,  629,  629,
+      629,  630,    0,    0,  630,  630,    0,  630,    0,  630,
+      630,  630,    0,    0,  630,  630,  630,  631,  631,    0,
+
+        0,    0,  631,  632,    0,    0,  632,  632,    0,  632,
+        0,  632,  632,  632,    0,    0,  632,  632,  632,  633,
+        0,    0,  633,  633,    0,  633,    0,  633,  633,  633,
+        0,  633,    0,  633,  633,  635,    0,    0,  635,    0,
+        0,  635,    0,  635,  635,  635,  635,    0,  635,  635,
+      635,  636,  636,  636,  636,  636,  636,  636,  636,  636,
+      636,  636,  636,  636,  636,  636,  636,  637,  637,    0,
+      637,    0,  637,  637,  637,  637,  637,  637,  637,  637,
+      637,  637,  637,  638,  638,  638,  638,  638,  638,  638,
+      638,  638,  638,  638,  638,  638,  638,  638,  638,  639,
+
+      639,    0,  639,  639,  639,  639,  639,  639,  639,  639,
+      639,  639,  639,  639,  639,  640,    0,    0,    0,    0,
+      640,    0,    0,  640,  640,  640,    0,    0,  640,  640,
+      640,  641,    0,    0,  641,  641,    0,  641,    0,  641,
+      641,  641,    0,    0,  641,  641,  641,  642,  642,    0,
+        0,    0,  642,  643,  643,  643,    0,    0,    0,  643,
+      644,    0,    0,  644,  644,    0,  644,    0,  644,  644,
+      644,    0,    0,  644,  644,  644,  645,  645,  645,  645,
+      645,  645,  645,  645,  645,  645,  645,  645,  645,  645,
+      645,  645,  646,  646,    0,    0,    0,  646,  647,  647,
+
+      647,    0,    0,    0,  647,  648,  648,    0,    0,    0,
+      648,  649,  649,    0,    0,    0,  649,  650,  650,    0,
+        0,    0,  650,  651,  651,  651,    0,    0,    0,  651,
+      652,  652,    0,    0,    0,  652,  653,  653,    0,    0,
+        0,  653,  654,  654,    0,    0,    0,  654,  655,  655,
+      655,    0,    0,    0,  655,  656,  656,  656,  656,    0,
+        0,    0,  656,  657,  657,    0,    0,    0,  657,  658,
+      658,    0,    0,    0,  658,  659,  659,    0,    0,    0,
+      659,  660,  660,  660,    0,    0,    0,  660,  661,  661,
+      661,  661,    0,    0,    0,  661,  662,  662,    0,    0,
+
+        0,  662,  663,  663,    0,    0,    0,  663,  664,  664,
+      664,    0,    0,    0,  664,  665,  665,  665,  665,    0,
+        0,    0,  665,  666,  666,    0,    0,    0,  666,  667,
+        0,  667,  667,    0,    0,    0,  667,  668,  668,  668,
+        0,    0,    0,  668,  669,  669,  669,  669,    0,    0,
+        0,  669,  670,  670,    0,    0,    0,  670,  671,    0,
+      671,  671,    0,    0,    0,  671,  672,  672,  672,    0,
+        0,    0,  672,  673,  673,  673,    0,    0,    0,    0,
+      673,  674,  674,  674,  674,  674,  674,  674,  674,  674,
+      674,  674,  674,  674,  674,  674,  674,  675,  675,    0,
+
+      675,  675,  675,    0,    0,  675,  675,  675,    0,    0,
+      675,  675,  675,  676,  676,    0,  676,  676,  676,    0,
+        0,  676,  676,  676,    0,    0,  676,  676,  676,  677,
+      677,    0,    0,    0,  677,  678,    0,  678,  678,    0,
+        0,    0,  678,  679,  679,    0,    0,    0,    0,  679,
+      680,  680,    0,    0,    0,  680,  681,    0,  681,  681,
+        0,    0,    0,  681,  682,  682,    0,    0,    0,  682,
+      683,    0,  683,    0,    0,    0,    0,  683,  684,  684,
+      684,  684,  684,  684,  684,  684,  684,  684,  684,  684,
+      684,  684,  684,  684,  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,  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
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1522,7 +1512,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 #define INSTR 5
 
-#line 1525 "lex.yy.c"
+#line 1515 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1678,7 +1668,7 @@ YY_DECL
 
 #line 133 "toke.l"
 
-#line 1681 "lex.yy.c"
+#line 1671 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -1730,13 +1720,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 >= 607 )
+                               if ( yy_current_state >= 622 )
                                        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] != 3665 );
+               while ( yy_base[yy_current_state] != 3595 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2261,7 +2251,31 @@ YY_RULE_SETUP
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 508 "toke.l"
+#line 507 "toke.l"
+{
+#ifdef HAVE_PRIV_SET
+                           LEXTRACE("PRIVS ");
+                           LEXRETURN(PRIVS);
+#else
+                           goto got_alias;
+#endif
+                       }
+       YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 516 "toke.l"
+{
+#ifdef HAVE_PRIV_SET
+                           LEXTRACE("LIMITPRIVS ");
+                           LEXRETURN(LIMITPRIVS);
+#else
+                           goto got_alias;
+#endif
+                       }
+       YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 525 "toke.l"
 {
 #ifndef HAVE_SELINUX
                        got_alias:
@@ -2272,9 +2286,9 @@ YY_RULE_SETUP
                            LEXRETURN(ALIAS);
                        }
        YY_BREAK
-case 43:
+case 45:
 YY_RULE_SETUP
-#line 518 "toke.l"
+#line 535 "toke.l"
 {
                            /* no command args allowed for Defaults!/path */
                            if (!fill_cmnd(yytext, yyleng))
@@ -2283,9 +2297,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMAND);
                        }
        YY_BREAK
-case 44:
+case 46:
 YY_RULE_SETUP
-#line 526 "toke.l"
+#line 543 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2293,9 +2307,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 45:
+case 47:
 YY_RULE_SETUP
-#line 533 "toke.l"
+#line 550 "toke.l"
 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
@@ -2311,9 +2325,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 46:
+case 48:
 YY_RULE_SETUP
-#line 548 "toke.l"
+#line 565 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            yylval.string = NULL;
@@ -2321,9 +2335,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 47:
+case 49:
 YY_RULE_SETUP
-#line 555 "toke.l"
+#line 572 "toke.l"
 {
                            /* a word */
                            if (!fill(yytext, yyleng))
@@ -2332,49 +2346,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 563 "toke.l"
+#line 580 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 568 "toke.l"
+#line 585 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 573 "toke.l"
+#line 590 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 578 "toke.l"
+#line 595 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 583 "toke.l"
+#line 600 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 588 "toke.l"
+#line 605 "toke.l"
 {
                            if (yyleng & 1) {
                                LEXTRACE("!");
@@ -2382,9 +2396,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 595 "toke.l"
+#line 612 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -2397,25 +2411,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 607 "toke.l"
+#line 624 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 611 "toke.l"
+#line 628 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 57:
+case 59:
 YY_RULE_SETUP
-#line 617 "toke.l"
+#line 634 "toke.l"
 {
                            BEGIN INITIAL;
                            sudolineno++;
@@ -2424,9 +2438,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 58:
+case 60:
 YY_RULE_SETUP
-#line 625 "toke.l"
+#line 642 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -2438,7 +2452,7 @@ case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
-#line 630 "toke.l"
+#line 647 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -2449,12 +2463,12 @@ case YY_STATE_EOF(INSTR):
                                yyterminate();
                        }
        YY_BREAK
-case 59:
+case 61:
 YY_RULE_SETUP
-#line 640 "toke.l"
+#line 657 "toke.l"
 ECHO;
        YY_BREAK
-#line 2457 "lex.yy.c"
+#line 2471 "lex.yy.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2745,7 +2759,7 @@ static yy_state_type yy_get_previous_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 >= 607 )
+                       if ( yy_current_state >= 622 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2780,11 +2794,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 >= 607 )
+               if ( yy_current_state >= 622 )
                        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 == 606);
+       yy_is_jam = (yy_current_state == 621);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -3345,7 +3359,7 @@ int main()
        return 0;
        }
 #endif
-#line 640 "toke.l"
+#line 657 "toke.l"
 
 struct path_list {
     char *path;
index 84e8de62dd9819a98b876a6a25eb47813c5a12e6..36f2f283b117716845bd1f2547b5a516dd945ec7 100644 (file)
@@ -504,6 +504,23 @@ ALL {
                            goto got_alias;
 #endif
                        }
+<INITIAL>PRIVS {
+#ifdef HAVE_PRIV_SET
+                           LEXTRACE("PRIVS ");
+                           LEXRETURN(PRIVS);
+#else
+                           goto got_alias;
+#endif
+                       }
+
+<INITIAL>LIMITPRIVS {
+#ifdef HAVE_PRIV_SET
+                           LEXTRACE("LIMITPRIVS ");
+                           LEXRETURN(LIMITPRIVS);
+#else
+                           goto got_alias;
+#endif
+                       }
 
 [[:upper:]][[:upper:][:digit:]_]* {
 #ifndef HAVE_SELINUX
index e4b6ea787611b850db5bf35f3c64b2e316cf4bd4..e4771f020da68910c27b92d55c8087b611a8e7f9 100644 (file)
@@ -670,6 +670,28 @@ command_info_to_details(char * const info[], struct command_details *details)
                    }
                    break;
                }
+#ifdef HAVE_PRIV_SET
+               if (strncmp("runas_privs=", info[i], sizeof("runas_privs=") - 1) == 0) {
+                    const char *endp;
+                   cp = info[i] + sizeof("runas_privs=") - 1;
+                   if (*cp == '\0')
+                       break;
+                   errno = 0;
+                   details->privs = priv_str_to_set(cp, ",", &endp);
+                   if (details->privs == NULL)
+                           warning("invalid runas_privs %s", endp);
+               }
+               if (strncmp("runas_limitprivs=", info[i], sizeof("runas_limitprivs=") - 1) == 0) {
+                    const char *endp;
+                   cp = info[i] + sizeof("runas_limitprivs=") - 1;
+                   if (*cp == '\0')
+                       break;
+                   errno = 0;
+                   details->limitprivs = priv_str_to_set(cp, ",", &endp);
+                   if (details->limitprivs == NULL)
+                           warning("invalid runas_limitprivs %s", endp);
+               }
+#endif /* HAVE_PRIV_SET */
                break;
            case 's':
                SET_STRING("selinux_role=", selinux_role)
@@ -900,6 +922,26 @@ exec_setup(struct command_details *details, const char *ptyname, int ptyfd)
 #ifdef HAVE_PROJECT_H
        set_project(details->pw);
 #endif
+#ifdef HAVE_PRIV_SET
+    if (details->privs != NULL) {
+       if (setppriv(PRIV_SET, PRIV_INHERITABLE, details->privs) != 0) {
+           warning("unable to set privileges");
+           goto done;
+       }
+    }
+    if (details->limitprivs != NULL) {
+        if (setppriv(PRIV_SET, PRIV_LIMIT, details->limitprivs) != 0) {
+           warning("unable to set limit privileges");
+           goto done;
+       }
+    } else if (details->privs != NULL) {
+       if (setppriv(PRIV_SET, PRIV_LIMIT, details->privs) != 0) {
+           warning("unable to set limit privileges");
+           goto done;
+       }
+    }
+#endif /* HAVE_PRIV_SET */
+
 #ifdef HAVE_GETUSERATTR
        aix_prep_user(details->pw->pw_name, ptyname ? ptyname : user_details.tty);
 #endif
index c50f1e1d6dd66b8f95ea853ad065efc0b3b7025c..178062f4df5bdd1fd05913294dd0d05a909cfeea 100644 (file)
 #include "sudo_debug.h"
 #include "gettext.h"
 
+#ifdef HAVE_PRIV_SET
+# include <priv.h>
+#endif
+
 #ifdef __TANDEM
 # define ROOT_UID       65535
 #else
@@ -149,6 +153,10 @@ struct command_details {
     const char *utmp_user;
     char **argv;
     char **envp;
+#ifdef HAVE_PRIV_SET
+    priv_set_t *privs;
+    priv_set_t *limitprivs;
+#endif
 };
 
 /* Status passed between parent and child via socketpair */