Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ Jenkinsfile	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -5,10 +5,14 @@
 //===========================================================================================================
 //Compilation script is done here but environnement set-up and error handling is done in main loop
-def cfa_build() {
+def cfa_build(boolean full_build) {
 	build_stage 'Checkout'
 		def install_dir = pwd tmp: true
 		//checkout the source code and clean the repo
 		checkout scm
+
+		//Clean all temporary files to make sure no artifacts of the previous build remain
 		sh 'git clean -fdqx'
+
+		//Reset the git repo so no local changes persist
 		sh 'git reset --hard'
 
@@ -26,7 +30,12 @@
 	build_stage 'Test'
 
-		//Run the tests from the example directory
+		//Run the tests from the tests directory
 		dir ('src/tests') {
-			sh './runTests.sh'
+			if (full_build) {
+				sh 'make all-tests'
+			}
+			else {
+				sh 'make'
+			}
 		}
 
@@ -35,4 +44,41 @@
 		//do a maintainer-clean to make sure we need to remake from scratch
 		sh 'make maintainer-clean > /dev/null'
+}
+
+def make_doc() {
+	def err = null
+
+	try {
+		sh 'make clean > /dev/null'
+		sh 'make > /dev/null 2>&1'
+	}
+
+	catch (Exception caughtError) {
+		//rethrow error later
+		err = caughtError
+
+		sh 'cat *.log'
+	}
+
+	finally {
+		/* Must re-throw exception to propagate error */
+		if (err) {
+			throw err
+		}
+	}
+}
+
+def doc_build() {
+	stage 'Documentation'
+
+		status_prefix = 'Documentation'
+
+		dir ('doc/user') {
+			make_doc()
+		}
+
+		dir ('doc/refrat') {
+			make_doc()
+		}
 }
 
@@ -117,5 +163,5 @@
 	try {
 		//Prevent the build from exceeding 30 minutes
-		timeout(30) {
+		timeout(60) {
 
 			//Wrap build to add timestamp to command line
@@ -140,15 +186,19 @@
 				//Compile using gcc-4.9
 				currentCC = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
-				cfa_build()
-
-				//Compile using gcc-5
-				currentCC = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
-				cfa_build()
-
-				//Compile using gcc-4.9
-				currentCC = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
-				cfa_build()
+				cfa_build(doPromoteBuild2DoLang)
+
+				//Compile latex documentation
+				doc_build()
 
 				if( doPromoteBuild2DoLang ) {
+					//Compile using gcc-5
+					currentCC = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
+					cfa_build(true)
+
+					//Compile using gcc-4.9
+					currentCC = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
+					cfa_build(true)
+
+					//Push latest changes to do-lang repo
 					push_build()
 				}
@@ -185,4 +235,5 @@
 //===========================================================================================================
 def notify_result(boolean promote, Exception err, String status, boolean log) {
+	echo 'Build completed, sending result notification'
 	if(promote)	{
 		if( err ) {
@@ -224,9 +275,16 @@
 	def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase()
 
-	sh "git rev-list --format=short ${gitRefOldValue}...${gitRefNewValue} > GIT_LOG"
-	def gitLog = readFile('GIT_LOG')
-
-	sh "git diff --stat ${gitRefNewValue} ${gitRefOldValue} > GIT_DIFF"
-	def gitDiff = readFile('GIT_DIFF')
+	def gitLog = 'Error retrieving git logs'
+	def gitDiff = 'Error retrieving git diff'
+
+	try {
+
+		sh "git rev-list --format=short ${gitRefOldValue}...${gitRefNewValue} > GIT_LOG"
+		gitLog = readFile('GIT_LOG')
+
+		sh "git diff --stat ${gitRefNewValue} ${gitRefOldValue} > GIT_DIFF"
+		gitDiff = readFile('GIT_DIFF')
+	}
+	catch (Exception error) {}
 
 	def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${status}] - branch ${env.BRANCH_NAME}"
Index: Makefile.am
===================================================================
--- Makefile.am	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ Makefile.am	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 22:14:18 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jan 25 22:16:13 2016
-## Update Count     : 10
+## Last Modified On : Fri Jun 17 14:56:18 2016
+## Update Count     : 13
 ###############################################################################
 
@@ -20,3 +20,3 @@
 BACKEND_CC = @BACKEND_CC@		# C compiler used to compile Cforall programs, versus C++ compiler used to build cfa command
 
-MAINTAINERCLEANFILES = lib/* bin/*
+MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/*
Index: Makefile.in
===================================================================
--- Makefile.in	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ Makefile.in	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -222,5 +222,5 @@
 SUBDIRS = src/driver src src/libcfa	# order important, src before libcfa because cfa-cpp used to build prelude
 EXTRA_DIST = Docs			# non-source files
-MAINTAINERCLEANFILES = lib/* bin/*
+MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/*
 all: config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/LaTeXmacros/common.tex	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -11,6 +11,6 @@
 %% Created On       : Sat Apr  9 10:06:17 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Fri Jun 10 16:35:25 2016
-%% Update Count     : 101
+%% Last Modified On : Mon Jun 20 09:35:20 2016
+%% Update Count     : 178
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -23,5 +23,18 @@
 \renewcommand{\floatpagefraction}{0.8}	% float must be greater than X of the page before it is forced onto its own page
 \renewcommand{\textfraction}{0.0}	% the entire page maybe devoted to floats with no text on the page at all
+
+\lefthyphenmin=4
+\righthyphenmin=4
+
 \usepackage{pslatex}				% reduce size of san serif font
+
+\usepackage[ignoredisplayed]{enumitem}	% do not affect trivlist
+\setlist{labelsep=1ex}% global
+\setlist[itemize]{topsep=0.5ex,parsep=0.25ex,itemsep=0.25ex,listparindent=\parindent,leftmargin=\parindent}% global
+\setlist[itemize,1]{label=\textbullet}% local
+%\renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}
+\setlist[enumerate]{listparindent=\parindent}% global
+\setlist[enumerate,2]{leftmargin=\parindent,labelsep=*,align=parleft,label=\alph*.}% local
+\setlist[description]{listparindent=\parindent,leftmargin=\parindent,labelsep=*}
 
 % Names used in the document.
@@ -29,5 +42,5 @@
 \newcommand{\CFA}{C$\mathbf\forall$\xspace}              % set language symbolic name
 \newcommand{\CFL}{Cforall\xspace}                        % set language text name
-\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
+\newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
 \def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
 
@@ -35,25 +48,12 @@
 
 \makeatletter
-% parindent is relative, i.e., toggled on/off in environments like itemize,
-% so store the value for use rather than use \parident directly.
-\newlength{\parindentlength}
-\setlength{\parindentlength}{\parindent}
+% parindent is relative, i.e., toggled on/off in environments like itemize, so store the value for
+% use rather than use \parident directly.
+\newlength{\parindentlnth}
+\setlength{\parindentlnth}{\parindent}
 
 % allow escape sequence in lstinline
 %\usepackage{etoolbox}
 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
-
-% make fontsize "small" slightly larger, specifically for san serif (helvetica) in program code
-%\renewcommand\small{%
-%   \@setfontsize\small{8.5}{11}%
-%   \abovedisplayskip 8.5pt \@plus 3pt \@minus 4pt
-%   \abovedisplayshortskip \z@ \@plus 2pt
-%   \belowdisplayshortskip 4pt \@plus 2pt \@minus 2pt
-%   \def\@listi{\leftmargin\leftmargini
-%               \topsep 4pt \@plus 2pt \@minus 2pt
-%               \parsep 2pt \@pluspt \@minuspt
-%               \itemsep \parsep}%
-%   \belowdisplayskip \abovedisplayskip
-%}
 
 \usepackage{pslatex}									% reduce size of san serif font
@@ -91,8 +91,4 @@
 \newcommand{\see}[1]{\emph{see} #1}
 
-% reduce bullet size and spacing for "itemize" macro
-\renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}
-\renewenvironment{itemize}{\begin{list}{\labelitemi}{\topsep=5pt\itemsep=5pt\parsep=0pt}}{\end{list}}
-
 % Define some commands that produce formatted index entries suitable for cross-references.
 % ``\spec'' produces entries for specifications of entities.  ``\impl'' produces entries for their
@@ -140,7 +136,7 @@
 }% quote2
 \newenvironment{rationale}{%
-  \begin{quotation}\noindent$\Box$\enspace
+  \begin{quote2}\noindent$\Box$\enspace
 }{%
-  \hfill\enspace$\Box$\end{quotation}
+  \hfill\enspace$\Box$\end{quote2}
 }%
 
@@ -154,10 +150,18 @@
 
 % BNF macros
-\def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
-\let\endsyntax=\endtrivlist
-\newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}}
-\newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
-\newcommand{\oldlhs}[1]{\emph{#1: \dots}\index{#1@{\emph{#1}}|italic}}
-\newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}}
+\newenvironment{syntax}{
+\paragraph{Syntax}
+\begin{quote2}
+\begin{description}[noitemsep,leftmargin=\parindentlnth]
+}{
+\end{description}
+\end{quote2}
+}
+% \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
+%\let\endsyntax=\endtrivlist
+\newcommand{\lhs}[1]{\item[\emph{#1:}\index{#1@{\emph{#1}}|italic}]~\ignorespaces}
+\newcommand{\oldlhs}[1]{\item[\emph{#1:}\index{#1@{\emph{#1}}|italic}~\dots]~}
+\newcommand{\rhs}{\hfil\newline}
+\newcommand{\nonterm}[1]{\emph{#1}\index{#1@{\emph{#1}}|italic}}
 \newcommand{\opt}{$_{opt}$\ }
 
@@ -204,5 +208,5 @@
 stringstyle=\tt,
 tabsize=4,
-xleftmargin=\parindentlength,
+xleftmargin=\parindentlnth,
 extendedchars=true,
 escapechar=§,
Index: doc/LaTeXmacros/enumitem/README
===================================================================
--- doc/LaTeXmacros/enumitem/README	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/enumitem/README	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,106 @@
+Enumitem 3.5.2
+~~~~~~~~~~~~~~
+
+A package to customize the three basic lists (enumerate,
+itemize and description) by means of a set of parameters,
+and to clone them to define new "logical" lists.
+It provides most of the flexibility you may want to
+design your own lists:
+- fancy labels and fancy refs,
+- leftmargin, labelsep and labelwidth automatically set,
+- changes applied globally or only in one of the three
+  types or even in a single list (including topsep) by
+  means of a sort of "inheritance",
+- inline lists,
+- several description styles (which fix some bad
+  spacing, too),
+- starting value and counter resuming,
+- trivlists properly formatted,
+- control on page breaking,
+- gathering of lists to be treated like a unit.
+
+Recent changes (3.0)
+~~~~~~~~~~~~~~~~~~~~
+
+1) Inline lists, with keys to set how items are joined (ie, the
+punctuation between items).  Two modes are provided: `boxed' an
+`unboxed' -- with the former (the default) a different punctuation
+before the last item is allowed.
+2) \setlist is calc-savvy (eg, for use in loops), and you can set
+diferent lists and levels at once.
+3) All lengths related to labels can take the value * (and not only
+labelsep and leftmargin).  Its behaviour has been made consistent and
+there is new value !  which does not compute the widest label.
+4) With \restartlist{list-name}, list counters can be restarted (in
+case you are using `resume').
+5) `resume*' can be combined with other keys.
+6) Lists can be gathered globally using series, so that they are
+considered a single list.  To start a series just use
+series=<series-name> and then resume it with resume=<series-name> or
+resume*=<series-name>.
+7) The ``experimental'' fullwidth has been replaced by a new key
+`wide'.
+8) \SetLabelAlign defines new align values.
+9) You can define ``abstract'' values (eg, label=numeric) and
+new keys.
+
+Bug fixes (3.0)
+~~~~~~~~~~~~~~~
+
+- Star values (eg, leftmargin=*) could not be overriden
+and new values were ignored.
+- nolistsep as the first of several keys was not always
+recognized and therefore treated like a short label
+(ie, nol\roman*stsep).
+- labelwidth didn't always work (when there was a prior
+`widest' and *)
+- With align=right the label and the following text could
+overlap.
+- description didn't get the correct list level.
+- At some point (2.x?) \value* stopped working.
+
+3.1
+~~~
+- Fixed incompatibility with xkeyval
+
+3.2
+~~~
+- start and widest* are calc-savvy.
+- \value can be used with widest*
+- Some internal restrictions in \arabic and the like has been removed.
+It is more flexible at the cost of having a more ``relaxed'' error
+checking.
+
+3.3
+~~~
+- Using *-values with itemize and description didn't work.
+
+3.4
+~~~
+- New key nosep, replacing nolistsep, which didn't work as
+documented.
+- Fixed spacing in inline boxed lists.
+- Fixed (hopefully) the bug with noitemsep and shorlabels.
+
+3.5.0
+~~~~~
+- Fixed the fix related to inline lists (spacefactor).
+- Fixed some problems in nested boxed inline lists.
+(- And sub-sub-versions are introduced.)
+
+3.5.1
+~~~~~
+- resume* only worked once, and subsequent ones
+behaved like resume.
+
+3.5.2
+~~~~~
+- \setlist* didn't work.
+
+_________________________________________________________________
+Javier Bezos                    | http://www.tex-tipografia.com
+.................................................................
+2011-09-28
+
+
+
Index: doc/LaTeXmacros/enumitem/enumitem.sty
===================================================================
--- doc/LaTeXmacros/enumitem/enumitem.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/enumitem/enumitem.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,1593 @@
+% +--------------------------------------------------+
+% | Typeset enumitem.tex to get the documentation.   |
+% +--------------------------------------------------+
+%
+% Copyright (c) 2003-2011 by Javier Bezos.
+% All Rights Reserved.
+%
+% This file is part of the enumitem distribution release 3.5.2
+% -----------------------------------------------------------
+% 
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+% 
+% This work has the LPPL maintenance status "maintained".
+% 
+% The Current Maintainer of this work is Javier Bezos.
+%
+% Notes
+% ~~~~~
+%
+% The tag enit@ is used through the style
+%
+% To do:
+% ~~~~~~
+% - ref*, for adding stuff in the same fashion as label*
+% - option ams, to force upshape, but I have to investigate
+% how to do it.
+% - labelled descriptions (ie, label, title, body)
+% - A true nextline (far from trivial and perhaps solved with
+%   labelled descriptions).
+% - Improved \AddEnumerateCounter
+% - Compatibility with interfaces and zref-enumitem
+% - "Pausing" somehow inline boxed text.
+% - \@enumctr <-> \@listctr?
+% - Define keys with values
+% - Revise @nobreak
+%
+% Release
+% ~~~~~~~
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{enumitem}[2011/09/28 v3.5.2 Customized lists]
+
+% +=============================+
+% |      EMULATING KEYVAL       |
+% +=============================+
+%
+% "Thanks" to xkeyval, which use the same macros names as
+% keyval :-(, the latter has to be replicated in full here
+% to ensure it works as intended. The original work if by
+% David Carlisle, under license LPPL. Once the code is here,
+% it could be optimized by adpting it to the specific needs
+% of titlesec (to do).
+
+\def\enitkv@setkeys#1#2{%
+  \def\enitkv@prefix{enitkv@#1@}%
+  \let\@tempc\relax
+  \enitkv@do#2,\relax,}
+
+\def\enitkv@do#1,{%
+ \ifx\relax#1\empty\else
+  \enitkv@split#1==\relax
+  \expandafter\enitkv@do\fi}
+
+\def\enitkv@split#1=#2=#3\relax{%
+  \enitkv@@sp@def\@tempa{#1}%
+  \ifx\@tempa\@empty\else
+    \expandafter\let\expandafter\@tempc
+      \csname\enitkv@prefix\@tempa\endcsname
+    \ifx\@tempc\relax
+      \enitkv@errx{\@tempa\space undefined}%
+    \else
+      \ifx\@empty#3\@empty
+        \enitkv@default
+      \else
+        \enitkv@@sp@def\@tempb{#2}%
+        \expandafter\@tempc\expandafter{\@tempb}\relax
+      \fi
+    \fi
+  \fi}
+
+\def\enitkv@default{%
+  \expandafter\let\expandafter\@tempb
+    \csname\enitkv@prefix\@tempa @default\endcsname
+  \ifx\@tempb\relax
+    \enitkv@err{No value specified for \@tempa}%
+  \else
+    \@tempb\relax
+  \fi}
+
+\def\enitkv@errx#1{\enit@error{#1}\@ehc}
+
+\let\enitkv@err\enitkv@errx
+
+\def\@tempa#1{%
+  \def\enitkv@@sp@def##1##2{%
+    \futurelet\enitkv@tempa\enitkv@@sp@d##2\@nil\@nil#1\@nil\relax##1}%
+  \def\enitkv@@sp@d{%
+    \ifx\enitkv@tempa\@sptoken
+      \expandafter\enitkv@@sp@b
+    \else
+      \expandafter\enitkv@@sp@b\expandafter#1%
+    \fi}%
+  \def\enitkv@@sp@b#1##1 \@nil{\enitkv@@sp@c##1}}
+
+\@tempa{ }
+
+\def\enitkv@@sp@c#1\@nil#2\relax#3{\enitkv@toks@{#1}\edef#3{\the\enitkv@toks@}}
+
+\@ifundefined{KV@toks@}
+   {\newtoks\enitkv@toks@}
+   {\let\enitkv@toks@\KV@toks@}
+
+\def\enitkv@key#1#2{%
+  \@ifnextchar[{\enitkv@def{#1}{#2}}{\@namedef{enitkv@#1@#2}####1}}
+
+\def\enitkv@def#1#2[#3]{%
+  \@namedef{enitkv@#1@#2@default\expandafter}\expandafter
+    {\csname enitkv@#1@#2\endcsname{#3}}%
+  \@namedef{enitkv@#1@#2}##1}
+
+% +=============================+
+% |        DEFINITIONS          |
+% +=============================+
+%
+% (1) The package uses a token register very often. To be on the
+%   safe side, instead of \toks@, etc., a new one is declared.
+% (2) \enit@inbox is the box storing the items in boxed inline
+%   lists.
+% (3) \enit@outerparindent is used to save the outer parindent 
+%   so that it can be used in the key parindent 
+% (4) \enit@type has three values: 0 = enum, 1 = item, 2 = desc.
+% (5) \enit@calc stores which dimen is to be computed:
+%   0=labelindent, 1=labelwidth, 2=labelsep, 3=leftmargin,
+%   4=itemindent
+% (6) \enit@resuming has four values: 0 = none, 1 = series,
+%   2 = resume* series (computed in group enumitem-resume),
+%   3 = resume* list (ie, with no value).
+
+\chardef  \enit@iv=4
+\newlength\labelindent
+\newdimen \enit@outerparindent
+\newtoks  \enit@toks
+\newbox   \enit@inbox
+
+\newif\ifenit@boxmode
+\newif\ifenit@sepfrommargin
+\newif\ifenit@lblfrommargin
+\newif\ifenit@calcwidest
+\newif\ifenit@nextline
+\newif\ifenit@boxdesc
+
+% An alias (calc-savvy):
+
+\let\c@enit@cnt\@tempcnta
+
+\def\enit@meaning{\expandafter\strip@prefix\meaning}
+\def\enit@noexcs#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Miscelaneous errors
+% ===================
+
+\def\enit@error{\PackageError{enumitem}}
+  
+\def\enit@checkerror#1#2{%
+  \enit@error{Unknown value `#2' for key `#1'}%
+      {See the manual for valid values}} 
+
+\def\enit@itemerror{%
+  \enit@error{Misplaced \string\item}%
+      {Either there is some text before the first\MessageBreak
+       item or the last item has no text}} 
+
+\def\enit@noserieserror#1{%
+  \enit@error{Series `#1' not started}%
+      {You are trying to continue a series\MessageBreak
+       which has not been started with series}} 
+
+\def\enit@checkseries#1{%
+  \ifcase\enit@resuming
+    \enit@error{Misplaced key `#1'}%
+      {`series' and `resume*' must be used\MessageBreak
+       in the optional argument of lists}%
+  \fi}
+
+\def\enit@checkseries@m{%
+  \ifcase\enit@resuming\else
+    \enit@error{Uncompatible series settings}%
+      {`series' and `resume*' must not be used\MessageBreak
+       at the same time}%
+  \fi}
+
+\let\enit@toodeep\@toodeep
+
+\def\@toodeep{%
+  \ifnum\@listdepth>\enit@listdepth\relax
+    \enit@toodeep
+  \else
+    \count@\@listdepth
+    \global\advance\@listdepth\@ne
+    \@ifundefined{@list\romannumeral\the\@listdepth}%
+      {\expandafter\let
+         \csname @list\romannumeral\the\@listdepth\expandafter\endcsname
+         \csname @list\romannumeral\the\count@\endcsname}{}%
+  \fi}
+
+
+% +=============================+
+% |            KEYS             |
+% +=============================+
+%
+% Including code executed by keys.
+%
+% There are 2 keyval groups: enumitem, and enumitem-delayed.
+% The latter is used to make sure a prioritary key is the
+% latest one; eg, ref, so that the ref format set by label
+% is overriden. So, when this key is found in enumitem,
+% nothing is done, except the key/value is moved to 
+% enumitem-delayed.
+%
+% A further group (enumitem-resume) catches resume* and
+% series in optional arguments in lists.
+%
+% Vertical spacing
+% ================
+
+\enitkv@key{enumitem}{topsep}{%
+  \setlength\topsep{#1}}
+
+\enitkv@key{enumitem}{itemsep}{%
+  \setlength\itemsep{#1}}
+
+\enitkv@key{enumitem}{parsep}{%
+  \setlength\parsep{#1}}
+
+\enitkv@key{enumitem}{partopsep}{%
+  \setlength\partopsep{#1}}
+
+% Horizontal spacing
+% ==================
+%
+% There are 3 cases: *, ! and a value. The latter also
+% cancels widest with the sequence key=* ... key=value
+% \string is used, just in case some package changes the
+% catcodes.
+
+\def\enit@calcset#1#2#3{%
+  \if\string*\string#3%
+    \enit@calcwidesttrue
+    \let\enit@calc#2%
+  \else\if\string!\string#3%
+    \enit@calcwidestfalse
+    \let\enit@calc#2%
+  \else
+    \ifnum\enit@calc=#2%
+      \enit@calcwidestfalse
+      \let\enit@calc\z@
+    \fi
+    \setlength#1{#3}%
+  \fi\fi}
+
+\def\enitkv@enumitem@widest#1{%
+  \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax
+  \@namedef{enit@widest@\@enumctr}##1{#1}}
+
+\def\enitkv@enumitem@widest@default{%
+  \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax
+  \expandafter\let\csname enit@widest@\@enumctr\endcsname\relax}
+
+\enitkv@key{enumitem}{widest*}{%
+  \setcounter{enit@cnt}{#1}%
+  \expandafter\edef\csname enit@cw@\@enumctr\endcsname
+    {\the\c@enit@cnt}%
+  \expandafter\edef\csname enit@widest@\@enumctr\endcsname##1%
+    {##1{\the\c@enit@cnt}}}
+
+\enitkv@key{enumitem}{labelindent*}{%
+  \enit@lblfrommargintrue
+  \ifnum\enit@calc=\z@
+    \enit@calcwidestfalse
+  \fi
+  \setlength\labelindent{#1}%
+  \advance\labelindent\leftmargin}
+
+\enitkv@key{enumitem}{labelindent}{%
+  \enit@lblfrommarginfalse
+  \enit@calcset\labelindent\z@{#1}}
+
+\enitkv@key{enumitem}{labelwidth}{%
+  \enit@calcset\labelwidth\@ne{#1}}
+
+\enitkv@key{enumitem}{leftmargin}{%
+  \edef\enit@c{\the\leftmargin}%
+  \enit@calcset\leftmargin\thr@@{#1}%
+  \ifenit@lblfrommargin
+    \advance\labelindent-\enit@c\relax
+    \advance\labelindent\leftmargin
+  \fi}
+
+\enitkv@key{enumitem}{itemindent}{%
+  \edef\enit@c{\the\itemindent}%
+  \enit@calcset\itemindent\enit@iv{#1}%
+  \ifenit@sepfrommargin
+    \advance\labelsep-\enit@c\relax
+    \advance\labelsep\itemindent
+  \fi}
+
+\enitkv@key{enumitem}{listparindent}{%
+  \setlength\listparindent{#1}}
+
+\enitkv@key{enumitem}{rightmargin}{%
+  \setlength\rightmargin{#1}}
+
+% labelsep, from itemindent; labelsep*, from leftmargin
+
+\enitkv@key{enumitem}{labelsep*}{%
+  \enit@sepfrommargintrue
+  \ifnum\enit@calc=\tw@
+    \enit@calcwidestfalse
+    \let\enit@calc\z@
+  \fi
+  \setlength\labelsep{#1}%
+  \advance\labelsep\itemindent}
+
+\enitkv@key{enumitem}{labelsep}{%
+  \enit@sepfrommarginfalse
+  \enit@calcset\labelsep\tw@{#1}}
+
+% Series, resume and start
+% ========================
+
+\enitkv@key{enumitem-resume}{series}{%
+  \enit@checkseries@m
+  \let\enit@resuming\@ne
+  \@ifundefined{enitkv@enumitem@#1}{}%
+    {\enit@error{Invalid series name `#1'}%
+       {Do not name a series with an existing key}}%
+  \def\enit@series{#1}}
+
+\enitkv@key{enumitem}{series}{%
+  \enit@checkseries{series}}
+
+\def\enitkv@enumitem@resume#1{%
+  \edef\enit@series{#1}%
+  \@nameuse{enit@resume@series@#1}\relax}
+
+\def\enitkv@enumitem@resume@default{%
+  \@nameuse{enit@resume@\@currenvir}\relax}
+  
+\@namedef{enitkv@enumitem-resume@resume*}#1{%
+  \enit@checkseries@m
+  \let\enit@resuming\tw@
+  \edef\enit@series{#1}%
+  \@ifundefined{enit@resumekeys@series@#1}%
+    {\enit@noserieserror{#1}}%
+    {\expandafter\let\expandafter\enit@resumekeys
+         \csname enit@resumekeys@series@#1\endcsname}}
+
+\@namedef{enitkv@enumitem-resume@resume*@default}{%
+  \let\enit@resuming\thr@@
+  \expandafter\let\expandafter\enit@resumekeys
+    \csname enit@resumekeys@\@currenvir\endcsname
+  \@nameuse{enit@resume@\@currenvir}\relax}
+
+\enitkv@key{enumitem}{resume*}[]{%
+  \enit@checkseries{resume*}}
+
+\newcommand\restartlist[1]{%
+  \@ifundefined{end#1}%
+    {\enit@error{Undefined list `#1'}%
+      {No list has been defined with that name.}}%
+    {\expandafter\let
+     \csname enit@resume@#1\endcsname\@empty}}
+
+\enitkv@key{enumitem}{start}[\@ne]{%
+  \setcounter{\@listctr}{#1}%
+  \advance\@nameuse{c@\@listctr}\m@ne}
+
+% Penalties
+% =========
+  
+\enitkv@key{enumitem}{beginpenalty}{%
+  \@beginparpenalty#1\relax}
+  
+\enitkv@key{enumitem}{midpenalty}{%
+  \@itempenalty#1\relax}
+
+\enitkv@key{enumitem}{endpenalty}{%
+  \@endparpenalty#1\relax}
+   
+% Font/Format
+% ===========
+
+\enitkv@key{enumitem}{format}{%
+  \def\enit@format{#1}}
+
+\enitkv@key{enumitem}{font}{%
+  \def\enit@format{#1}}
+
+% Description styles
+% ==================
+
+\enitkv@key{enumitem}{style}[normal]{%
+  \@ifundefined{enit@style@#1}%
+    {\enit@checkerror{style}{#1}}%
+    {\enit@nextlinefalse
+     \enit@boxdescfalse
+     \@nameuse{enit@style@#1}%
+     \edef\enit@descstyle{\enit@noexcs{enit@#1style}}}}
+
+\def\enit@style@standard{%
+  \enit@boxdesctrue
+  \enit@calcset\itemindent\enit@iv!}
+
+\let\enit@style@normal\enit@style@standard
+
+\def\enit@style@unboxed{%
+  \enit@calcset\itemindent\enit@iv!}
+
+\def\enit@style@sameline{%
+  \enit@calcset\labelwidth\@ne!}
+
+\def\enit@style@multiline{%
+  \enit@align@parleft
+  \enit@calcset\labelwidth\@ne!}
+
+\def\enit@style@nextline{%
+  \enit@nextlinetrue
+  \enit@calcset\labelwidth\@ne!}
+
+% Labels and refs
+% ===============
+
+% Aligment
+% --------
+
+\enitkv@key{enumitem}{align}{%
+  \@ifundefined{enit@align@#1}%
+    {\enit@checkerror{align}{#1}}%
+    {\csname enit@align@#1\endcsname}}
+
+% \nobreak for unboxed label with color. See below.
+
+\newcommand\SetLabelAlign[2]{%
+  \enit@toks{#2}%
+  \expandafter\edef\csname enit@align@#1\endcsname
+    {\def\noexpand\enit@align####1{\nobreak\the\enit@toks}}}
+
+\def\enit@align@right{%
+  \def\enit@align##1{\nobreak\hss\llap{##1}}}
+
+\def\enit@align@left{%
+  \def\enit@align##1{\nobreak##1\hfil}}
+
+\def\enit@align@parleft{%
+  \def\enit@align##1{%
+    \nobreak
+    \strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}}
+
+% \enit@ref has three possible definitions:
+% (1) \relax, if there is neither label nor ref (ie, use
+%   LaTeX settings).
+% (2) set ref to @itemlabel, if there is label but not ref
+% (3) set ref to ref, if there is ref (with or without label)
+
+\enitkv@key{enumitem}{label}{%
+  \expandafter\def\@itemlabel{#1}%
+  \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}}
+
+\enitkv@key{enumitem}{label*}{%
+  \ifnum\enit@depth=\@ne
+    \expandafter\def\@itemlabel{#1}%
+  \else % no level 0
+    \advance\enit@depth\m@ne
+    \enit@toks{#1}%
+    \expandafter\edef\@itemlabel{%
+      \enit@noexcs{label\enit@prevlabel}%
+      \the\enit@toks}%
+    \advance\enit@depth\@ne  
+  \fi
+  \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}}
+
+% ref is set by label, except if there is an explicit ref
+% in the same hierarchy level. Explicit refs above the
+% current hierarchy level are overriden by label (besides ref),
+% too. Since an explicit ref has preference, it's delayed.
+  
+\enitkv@key{enumitem}{ref}{%
+  \g@addto@macro\enit@delayedkeys{,ref=#1}}
+
+\enitkv@key{enumitem-delayed}{ref}{%
+  \def\enit@ref{\enit@reflabel{#1}\@ne}}
+
+% #2=0 don't "normalize" (ie, already normalized)
+%   =1 "normalize" (in key ref)
+% Used thru \enit@ref
+
+\def\enit@reflabel#1#2{%
+  \ifnum\enit@depth=\@ne\else % no level 0
+    \advance\enit@depth\@ne
+    \@namedef{p@\@enumctr}{}% Don't accumulate labels
+    \advance\enit@depth\m@ne
+  \fi
+  \ifcase#2%
+    \@namedef{the\@enumctr}{{#1}}%
+  \else
+    \enit@normlabel{\csname the\@enumctr\endcsname}{#1}%
+  \fi}
+
+% \xxx* in counters (refstar) and widest (calcdef)
+% ------------------------------------------------
+% \enit@labellist contains a list of
+% \enit@elt{widest}\count\@count\enit@sc@@count
+% \enit@elt is either \enit@getwidth or \enit@refstar, defined
+% below
+% The current implementation is sub-optimal -- labels are stored in 
+% labellist, counters defined again when processing labels, and
+% modifying it is almost impossible.
+
+\let\enit@labellist\@empty 
+
+\newcommand\AddEnumerateCounter{%
+  \@ifstar\enit@addcounter@s\enit@addcounter}
+
+\def\enit@addcounter#1#2#3{%
+  \enit@toks\expandafter{%
+    \enit@labellist
+    \enit@elt{#3}}%
+  \edef\enit@labellist{%
+    \the\enit@toks
+    \enit@noexcs{\expandafter\@gobble\string#1}%
+    \enit@noexcs{\expandafter\@gobble\string#2}%
+    \enit@noexcs{enit@sc@\expandafter\@gobble\string#2}}}
+
+\def\enit@addcounter@s#1#2#3{%
+  \enit@addcounter{#1}{#2}%
+    {\@nameuse{enit@sc@\expandafter\@gobble\string#2}{#3}}}
+
+% The 5 basic counters:
+
+\AddEnumerateCounter\arabic\@arabic{0}
+\AddEnumerateCounter\alph\@alph{m}
+\AddEnumerateCounter\Alph\@Alph{M}
+\AddEnumerateCounter\roman\@roman{viii}
+\AddEnumerateCounter\Roman\@Roman{VIII}
+
+% Inline lists
+% ============
+%
+% Labels
+% ------
+
+\enitkv@key{enumitem}{itemjoin}{%
+  \def\enit@itemjoin{#1}}
+
+\enitkv@key{enumitem}{itemjoin*}{%
+  \def\enit@itemjoin@s{#1}}
+
+\enitkv@key{enumitem}{afterlabel}{%
+  \def\enit@afterlabel{#1}}
+
+% Mode
+% ----
+
+\enitkv@key{enumitem}{mode}{%
+  \@ifundefined{enit@mode#1}%
+    {\enit@checkerror{mode}{#1}}%
+    {\csname enit@mode#1\endcsname}}
+
+\let\enit@modeboxed\enit@boxmodetrue
+\let\enit@modeunboxed\enit@boxmodefalse
+
+% Short Labels
+% ============
+
+\let\enit@marklist\@empty
+
+% shorthand, expansion:
+
+\newcommand\SetEnumerateShortLabel[2]{%
+  \let\enit@a\@empty
+  \def\enit@elt##1##2{%
+    \def\enit@b{#1}\def\enit@c{##1}%
+    \ifx\enit@b\enit@c\else
+      \expandafter\def\expandafter\enit@a\expandafter{%
+        \enit@a
+        \enit@elt{##1}{##2}}%
+    \fi}%
+  \enit@marklist
+  \expandafter\def\expandafter\enit@a\expandafter{%
+    \enit@a
+    \enit@elt{#1}{#2}}%
+  \let\enit@marklist\enit@a}
+
+\SetEnumerateShortLabel{a}{\alph*}
+\SetEnumerateShortLabel{A}{\Alph*}
+\SetEnumerateShortLabel{i}{\roman*}
+\SetEnumerateShortLabel{I}{\Roman*}
+\SetEnumerateShortLabel{1}{\arabic*}
+
+% This is called \enit@first one,two,three,\@nil\@@nil. If there
+% are just one element #2 is \@nil, otherwise we have to remove
+% the trailing ,\@nil with enit@first@x
+% Called with the keys in \enit@c
+% Returns enit@toks
+
+\def\enit@first#1,#2\@@nil{%
+  \in@{=}{#1}% Quick test, if contains =, it's key=value
+  \ifin@\else
+    \enitkv@@sp@def\enit@a{#1}%
+    \@ifundefined{enitkv@enumitem@\enit@meaning\enit@a}%
+      {\ifnum\enit@type=\z@
+         \def\enit@elt{\enit@replace\enit@a}%
+         \enit@marklist % Returns \enit@toks
+       \else
+         \enit@toks{#1}%
+       \fi
+       \ifx\@nil#2%
+         \ifx,#1,\else
+           \edef\enit@c{label=\the\enit@toks}%
+         \fi
+       \else
+         \@temptokena\expandafter{\enit@first@x#2}%
+         \edef\enit@c{label=\the\enit@toks,\the\@temptokena}%
+       \fi}%
+     {}%
+  \fi
+  \enit@toks\expandafter{\enit@c}}
+
+\def\enit@first@x#1,\@nil{#1}
+
+\def\enit@replace#1#2#3{%
+  \enit@toks{}%
+  \def\enit@b##1#2##2\@@nil{%
+    \ifx\@nil##2%
+      \addto@hook\enit@toks{##1}%
+    \else
+      \edef\enit@a{\the\enit@toks}%
+      \ifx\enit@a\@empty\else
+        \enit@error{Extra short label ignored}%
+           {There are more than one short label}%
+      \fi
+      \addto@hook\enit@toks{##1#3}%
+      \enit@b##2\@@nil
+    \fi}%
+  \expandafter\enit@b#1#2\@nil\@@nil
+  \edef#1{\the\enit@toks}}
+
+% Pre and post code
+% =================
+
+\enitkv@key{enumitem}{before}{%
+  \def\enit@before{#1}}
+
+\enitkv@key{enumitem}{after}{%
+  \def\enit@after{#1}}
+
+\enitkv@key{enumitem}{before*}{%
+  \expandafter\def\expandafter\enit@before\expandafter
+    {\enit@before#1}}
+
+\enitkv@key{enumitem}{after*}{%
+  \expandafter\def\expandafter\enit@after\expandafter
+    {\enit@after#1}}
+
+% Miscelaneous keys
+% ================
+  
+\enitkv@key{enumitem}{nolistsep}[true]{%
+  \partopsep=\z@skip
+  \topsep=\z@ plus .1pt
+  \itemsep=\z@skip
+  \parsep=\z@skip}
+
+\enitkv@key{enumitem}{nosep}[true]{%
+  \partopsep=\z@skip
+  \topsep=\z@skip
+  \itemsep=\z@skip
+  \parsep=\z@skip}
+
+
+\enitkv@key{enumitem}{noitemsep}[true]{%
+  \itemsep=\z@skip
+  \parsep=\z@skip}
+
+\enitkv@key{enumitem}{wide}[\parindent]{%
+  \enit@align@left
+  \leftmargin\z@
+  \labelwidth\z@
+  \setlength\labelindent{#1}%
+  \listparindent\labelindent
+  \enit@calcset\itemindent\enit@iv!}
+
+% The following is deprecated in favour of wide:
+
+\enitkv@key{enumitem}{fullwidth}[true]{%
+  \leftmargin\z@
+  \labelwidth\z@
+  \def\enit@align##1{\hskip\labelsep##1}}
+
+% "Abstract" layer
+% ================
+%
+% Named values
+% ------------
+
+\newcommand\SetEnumitemValue[2]{% Implicit #3
+  \@ifundefined{enit@enitkv@#1}%
+    {\@ifundefined{enitkv@enumitem@#1}%
+       {\enit@error{Wrong key `#1' in \string\SetEnumitemValue}%
+          {Perhaps you have misspelled it}}{}%
+     \expandafter\let\csname enit@enitkv@#1\expandafter\endcsname
+       \csname enitkv@enumitem@#1\endcsname}{}%
+  \@namedef{enitkv@enumitem@#1}##1{%
+    \def\enit@a{##1}%
+    \@ifundefined{enit@enitkv@#1@\enit@meaning\enit@a}%
+      {\@nameuse{enit@enitkv@#1}{##1}}%
+      {\@nameuse{enit@enitkv@#1\expandafter\expandafter\expandafter}%
+         \expandafter\expandafter\expandafter
+         {\csname enit@enitkv@#1@##1\endcsname}}{}}%
+  \@namedef{enit@enitkv@#1@#2}}
+
+% Defining keys
+% -------------
+
+\newcommand\SetEnumitemKey[2]{%
+  \@ifundefined{enitkv@enumitem@#1}%
+    {\enitkv@key{enumitem}{#1}[]{\enitkv@setkeys{enumitem}{#2}}}%
+    {\enit@error{Duplicated key `#1' in \string\SetEnumitemKey}%
+       {There already exists a key with that name}}}
+
+% +=============================+
+% |       PROCESSING KEYS       |
+% +=============================+
+%
+% Set keys
+% ========
+
+\def\enit@setkeys#1{%
+  \@ifundefined{enit@@#1}{}%
+    {\expandafter\expandafter\expandafter
+     \enit@setkeys@i\csname enit@@#1\endcsname\@@}}
+
+% The following is used directly in resumeset:
+
+\def\enit@setkeys@i#1\@@{%
+  \let\enit@delayedkeys\@empty
+  \enit@shl{#1}% is or returns \enit@toks
+  \expandafter\enit@setkeys@ii\the\enit@toks\@@}
+
+\def\enit@setkeys@ii#1\@@{%
+  \enitkv@setkeys{enumitem}{#1}%
+  \enit@toks\expandafter{\enit@delayedkeys}%
+  \edef\enit@a{%
+    \noexpand\enitkv@setkeys{enumitem-delayed}{\the\enit@toks}}%
+  \enit@a}
+
+% Handling * and ! values
+% =======================
+%
+% \@gobbletwo removes \c from \c@counter.
+
+\def\enit@getwidth#1#2#3#4{%
+  \let#4#3%
+  \def#3##1{%
+    \@ifundefined{enit@widest\expandafter\@gobbletwo\string##1}% if no widest=key
+      {#1}%
+      {\csname enit@widest\expandafter\@gobbletwo\string##1\endcsname{#4}}}}
+
+\def\enit@valueerror#1{\z@ % if after an assignment, but doesn't catch \ifnum
+   \enit@error{No default \string\value\space for `#1'}%
+     {You can provide one with widest*}}%
+
+\let\enit@values\@empty
+
+\def\enit@calcwidth{%
+  \ifenit@calcwidest
+    \ifnum\enit@type=\z@ % ie, enum
+      \@ifundefined{enit@cw@\@enumctr}%
+        {\@namedef{enit@cv@\@enumctr}{\enit@valueerror\@enumctr}}%
+        {\edef\enit@values{%
+           \enit@values
+           \@nameuse{c@\@enumctr}\@nameuse{enit@cw@\@enumctr}\relax}%
+         \expandafter
+         \edef\csname enit@cv@\@enumctr\endcsname
+           {\@nameuse{c@\@enumctr}}}%
+    \fi
+    \begingroup
+      \enit@values
+      \def\value##1{\csname enit@cv@##1\endcsname}%
+      \let\enit@elt\enit@getwidth
+      \enit@labellist
+      \settowidth\labelwidth{\@itemlabel}%
+      \xdef\enit@a{\labelwidth\the\labelwidth\relax}%
+    \endgroup
+    \enit@a
+  \fi
+  \advance\dimen@-\labelwidth}
+
+\def\enit@calcleft{%
+  \dimen@\leftmargin
+  \advance\dimen@\itemindent
+  \advance\dimen@-\labelsep
+  \advance\dimen@-\labelindent
+  \ifcase\enit@calc % = 0 = labelindent
+    \enit@calcwidth
+    \advance\labelindent\dimen@
+  \or % = 1 = labelwidth, so no \enit@calcwidth
+    \labelwidth\dimen@
+  \or % = 2 = labelsep
+    \enit@calcwidth
+    \advance\labelsep\dimen@
+  \or % = 3 = leftmargin
+    \enit@calcwidth
+    \advance\leftmargin-\dimen@
+  \or % = 4 =itemindent
+    \enit@calcwidth
+    \advance\itemindent-\dimen@
+  \fi}
+
+% "Normalizing" labels
+% ====================
+%
+% Replaces \counter* by \counter{level} (those in \enit@labellist).
+%
+% #1 is either \csname...\endcsmame or the container \@itemlabel --
+% hence \expandafter
+
+\def\enit@refstar@i#1#2{%
+  \if*#2\@empty
+    \noexpand#1{\@enumctr}%
+  \else
+    \noexpand#1{#2}%
+  \fi}%
+
+\def\enit@refstar#1#2#3#4{%
+  \def#2{\enit@refstar@i#2}%
+  \def#3{\enit@refstar@i#3}}
+
+\def\enit@normlabel#1#2{%
+  \begingroup
+    \def\value{\enit@refstar@i\value}%
+    \let\enit@elt\enit@refstar
+    \enit@labellist
+    \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the 
+  \endgroup
+  \expandafter\let#1\enit@a}                    % global scope. 
+
+% Preliminary settings and default values
+% =======================================
+
+\def\enit@prelist#1#2#3{%
+  \let\enit@type#1%
+  \def\enit@depth{#2}%
+  \edef\enit@prevlabel{#3\romannumeral#2}%
+  \advance#2\@ne}
+     
+\def\enit@preset#1#2#3{%
+   \enit@sepfrommarginfalse
+   \enit@calcwidestfalse
+   \let\enit@resuming\z@
+   \let\enit@series\relax
+   \enit@boxmodetrue
+   \def\enit@itemjoin{ }%
+   \let\enit@itemjoin@s\relax
+   \let\enit@afterlabel\nobreakspace
+   \let\enit@before\@empty
+   \let\enit@after\@empty
+   \let\enit@format\@firstofone % and NOT empty
+   \let\enit@ref\relax
+   \labelindent\z@skip
+   \ifnum\@listdepth=\@ne
+     \enit@outerparindent\parindent
+   \else
+     \parindent\enit@outerparindent
+   \fi
+   \enit@setkeys{list}%
+   \enit@setkeys{list\romannumeral\@listdepth}%
+   \enit@setkeys{#1}%
+   \enit@setkeys{#1\romannumeral#2}%
+   \enit@setresume{#3}}
+
+% keyval "error" in enumitem-resume: all undefined keys (ie, all
+% except resume*) are ignored, but <series> is treated like
+% resume*=<series>
+
+\def\enitkv@err@a#1{%
+   \@ifundefined{enit@resumekeys@series@\@tempa}{}%
+     {\@nameuse{enitkv@enumitem-resume@resume*\expandafter}%
+        \expandafter{\@tempa}}}
+
+% keyval "error" in the optional argument: all undefined keys are
+% passed to the keyval error, but <series> is ignored (already
+% processed in enumitem-resume
+
+\def\enitkv@err@b#1{%
+   \@ifundefined{enit@resumekeys@series@\@tempa}%
+     {\enit@savekverr{#1}}%
+     {}}
+
+% Process keys in optional argument:
+
+\def\enit@setresume#1{%
+  \enit@shl{#1}% Returns enit@toks
+  \edef\enit@savekeys{\the\enit@toks}%
+  \let\enit@savekverr\enitkv@errx
+  \let\enitkv@errx\enitkv@err@a
+  \edef\enit@b{%
+    \noexpand\enitkv@setkeys{enumitem-resume}{\the\enit@toks}}%
+  \enit@b
+  \let\enitkv@errx\enitkv@err@b
+  \ifcase\enit@resuming\or\or % = 2
+    \expandafter
+    \enit@setkeys@i\enit@resumekeys,resume=\enit@series\@@
+  \or % = 3
+    \expandafter
+    \enit@setkeys@i\enit@resumekeys,resume\@@
+  \fi
+  \expandafter\enit@setkeys@i\enit@savekeys\@@
+  \let\enitkv@errx\enit@savekverr}
+
+% +=============================+
+% |         LIST TYPES          |
+% +=============================+
+%
+% Displayed lists
+% ===============
+% #1 #2 implicit
+
+\def\enit@dylist{%
+  \enit@align@right
+  \list}
+
+\def\enit@endlist{%
+  \enit@after
+  \endlist
+  \ifx\enit@series\relax\else % discards resume*, too
+    \ifnum\enit@resuming=\@ne % ie, series=
+      \enit@setresumekeys{series@\enit@series}\global\global
+    \else % ie, resume=, resume*= (save count, but not keys)
+      \enit@setresumekeys{series@\enit@series}\@gobblefour\global
+    \fi
+    \enit@afterlist
+  \fi
+  \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only)
+    \enit@setresumekeys\@currenvir\@gobblefour\global
+  \else
+    \enit@setresumekeys\@currenvir\@empty\@empty
+  \fi
+  \aftergroup\enit@afterlist}
+
+% #1 = either \@currenvir or series@<series>
+% #2(keys) #3(counter) are \global, \@gobblefour or \@empty
+
+\def\enit@setresumekeys#1#2#3{%
+  \enit@toks\expandafter{\enit@savekeys}%
+  \xdef\enit@afterlist{%
+    #2\def\enit@noexcs{enit@resumekeys@#1}{\the\enit@toks}%
+    \ifnum\enit@type=\z@ % ie, enum
+      #3\def\enit@noexcs{enit@resume@#1}{%
+        \csname c@\@listctr\endcsname
+        \the\csname c@\@listctr\endcsname}%
+    \fi}}
+
+% Inline lists
+% ============
+
+% Definition of \@trivlist inside inline lists.  So, when
+% \@trivlist is found in any displayed list (including quote,
+% center, verbatim...) the default \@item is restored.
+
+\def\enit@intrivlist{%
+  \enit@changed@itemfalse
+  \let\@item\enit@outer@item
+  \let\par\@@par
+  \let\@trivlist\enit@outer@triv
+  \@trivlist}
+
+% Keep track of \@item and \item changes
+
+\newif\ifenit@changed@item
+\enit@changed@itemfalse
+
+\newif\ifenit@changeditem
+\enit@changeditemfalse
+
+% List
+% ----
+
+% Arguments, as before:
+% \enitdp@<name>, <name>, <max-depth>, <format>
+% About @newlist, see @initem.
+
+\def\enit@inlist#1#2{%
+  \ifnum\@listdepth>\enit@listdepth\relax
+    \@toodeep
+  \else
+    \global\advance\@listdepth\@ne
+  \fi
+  \let\enit@align\@firstofone
+  \def\@itemlabel{#1}%
+  \@nmbrlistfalse
+  \ifenit@changed@item\else
+    \enit@changed@itemtrue
+    \let\enit@outer@triv\@trivlist
+    \let\@trivlist\enit@intrivlist
+    \@setpar\@empty
+    \let\enit@outer@item\@item
+  \fi
+  #2\relax
+  \global\@newlisttrue
+  \ifenit@boxmode
+    \ifenit@changeditem\else
+      \enit@changeditemtrue
+      \let\enit@outeritem\item
+    \fi
+    \let\@item\enit@boxitem
+  \else
+    \let\@item\enit@noboxitem
+    \ifx\enit@itemjoin@s\relax\else
+      \PackageWarning{enumitem}%
+         {itemjoin* discarded in mode unboxed\MessageBreak}%
+    \fi
+  \fi
+  \let\enit@calcleft\relax
+  \let\enit@afteritem\relax
+  \ifenit@boxmode
+    \global\setbox\enit@inbox\hbox\bgroup\color@begingroup
+      \let\item\enit@endinbox
+  \fi
+  \ignorespaces}
+
+\def\enit@endinlist{%
+  \ifenit@boxmode
+      \unskip
+      \xdef\enit@afteritem{%
+        \ifhmode\spacefactor\the\spacefactor\relax\fi}%
+      \color@endgroup
+    \egroup
+    \ifdim\wd\enit@inbox=\z@
+      \enit@itemerror
+    \else
+      \ifenit@noinitem\else
+        \ifhmode\unskip\fi
+        \@ifundefined{enit@itemjoin@s}%
+          {\enit@itemjoin}%
+          {\enit@itemjoin@s}%
+      \fi
+      \unhbox\@labels
+      \enit@afterlabel
+      \unhbox\enit@inbox
+      \enit@afteritem
+    \fi
+  \else
+    \unskip
+    \if@newlist
+      \enit@itemerror
+    \fi
+  \fi
+  \enit@after
+  \global\advance\@listdepth\m@ne
+  \global\@inlabelfalse
+  \if@newlist
+    \global\@newlistfalse
+    \@noitemerr
+  \fi
+  \ifx\enit@series\relax\else % discards resume* list, too
+    \ifnum\enit@resuming=\@ne % ie, series
+      \enit@setresumekeys{series@\enit@series}\global\global
+    \else % ie, resume, resume* (save count, but not keys)
+      \enit@setresumekeys{series@\enit@series}\@gobblefour\global
+    \fi
+    \enit@afterlist
+  \fi
+  \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only)
+    \enit@setresumekeys\@currenvir\@gobblefour\global
+  \else
+    \enit@setresumekeys\@currenvir\@empty\@empty
+  \fi
+  \aftergroup\enit@afterlist}
+
+% \@item: unboxed
+% ---------------
+
+\def\enit@noboxitem[#1]{%
+  \if@newlist
+    \leavevmode % ships pending labels out
+    \global\@newlistfalse
+  \else
+    \ifhmode
+      \unskip
+      \enit@itemjoin
+    \else
+      \noindent
+    \fi
+  \fi
+  \if@noitemarg
+    \@noitemargfalse
+    \if@nmbrlist
+      \refstepcounter{\@listctr}% after \unskip (hyperref)
+    \fi
+  \fi
+  \mbox{\makelabel{#1}}%
+  \enit@afterlabel
+  \ignorespaces}
+
+% \@item: boxed
+% ------------
+%
+% We don't want \item to be executed locally, because it sets a flag
+% (and hyperref adds another flag, too).  So, we redefine it inside
+% the box to \enit@endinbox which ends the box and then use the actual
+% (outer) \item.  labels are stored in another box, to detect empty
+% boxes, ie, misplaced \item's.  Note the 2nd \item ends collecting
+% the 1st item and ships it out, while the 3rd \item ends collecting
+% the 2nd item, puts the itemjoin and then ships the 2nd item out.
+% The flag enit@noinitem keeps track of that.
+
+\newif\ifenit@noinitem
+
+\def\enit@endinbox{%
+    \unskip
+    \xdef\enit@afteritem{%
+      \ifhmode\spacefactor\the\spacefactor\relax\fi}%
+    \color@endgroup
+  \egroup
+  \enit@outeritem}
+
+\def\enit@boxitem[#1]{%
+  \if@newlist
+    \global\@newlistfalse
+    \ifdim\wd\enit@inbox>\z@
+       \enit@itemerror
+    \fi
+    \enit@noinitemtrue
+    \leavevmode % ships pending labels out
+  \else
+    \ifdim\wd\enit@inbox=\z@
+      \enit@itemerror
+    \else
+      \ifenit@noinitem
+        \enit@noinitemfalse
+      \else
+        \ifhmode\unskip\fi
+        \enit@itemjoin
+      \fi
+      \unhbox\@labels
+      \enit@afterlabel
+      \unhbox\enit@inbox
+      \enit@afteritem
+    \fi
+  \fi
+  \if@noitemarg
+    \@noitemargfalse
+    \if@nmbrlist
+      \refstepcounter{\@listctr}%
+    \fi
+  \fi
+  \sbox\@labels{\makelabel{#1}}%
+  \let\enit@afteritem\relax
+  \setbox\enit@inbox\hbox\bgroup\color@begingroup
+    \let\item\enit@endinbox
+    \hskip1sp % in case the first thing is \label
+    \ignorespaces} 
+
+% Pause item
+% ----------
+%
+% To do.
+%
+% The three types
+% ===============
+%
+% enumerate and enumerate*
+% ------------------------
+%
+% The following has 4 arguments, which in enumerate are:
+% \@enumdepth, enum, \thr@@, <format>.
+% In user defined environments they are:
+% \enitdp@<name>, <name>, <max-depth>, <format>
+
+\def\enit@enumerate{%
+  \let\enit@list\enit@dylist
+  \enit@enumerate@i}
+
+\@namedef{enit@enumerate*}{%
+  \let\enit@list\enit@inlist
+  \enit@enumerate@i}
+
+\def\enit@enumerate@i#1#2#3#4{%
+  \ifnum#1>#3\relax
+    \enit@toodeep
+  \else
+    \enit@prelist\z@{#1}{#2}%
+    \edef\@enumctr{#2\romannumeral#1}%
+    \expandafter
+    \enit@list
+      \csname label\@enumctr\endcsname
+      {\usecounter\@enumctr
+       \let\enit@calc\z@
+       \def\makelabel##1{\enit@align{\enit@format{##1}}}%
+       \enit@preset{#2}{#1}{#4}%
+       \enit@normlabel\@itemlabel\@itemlabel
+       \enit@ref
+       \enit@calcleft
+       \enit@before}%
+  \fi}
+
+\let\enit@endenumerate\enit@endlist
+\@namedef{enit@endenumerate*}{\enit@endinlist}
+
+% itemize and itemize*
+% --------------------
+%
+% The following has 4 arguments, which in itemize are:
+% \@itemdepth, item, \thr@@, <format>.
+% In user defined environments they are:
+% \enitdp@<name>, <name>, <max-depth>, <format>
+
+\def\enit@itemize{%
+  \let\enit@list\enit@dylist
+  \enit@itemize@i}
+
+\@namedef{enit@itemize*}{%
+  \let\enit@list\enit@inlist
+  \enit@itemize@i}
+  
+\def\enit@itemize@i#1#2#3#4{%
+  \ifnum#1>#3\relax
+    \enit@toodeep
+  \else
+    \enit@prelist\@ne{#1}{#2}%
+    \edef\@itemitem{label#2\romannumeral#1}%
+    \expandafter
+    \enit@list
+      \csname\@itemitem\endcsname
+       {\let\enit@calc\z@
+        \def\makelabel##1{\enit@align{\enit@format{##1}}}%
+        \enit@preset{#2}{#1}{#4}% 
+        \enit@calcleft
+        \enit@before}%
+  \fi}
+
+\let\enit@enditemize\enit@endlist
+\@namedef{enit@enditemize*}{\enit@endinlist}
+
+% description and description*
+% ----------------------------
+%
+% Make sure \descriptionlabel exists:
+
+\providecommand*\descriptionlabel[1]{%
+  \hspace\labelsep
+  \normalfont\bfseries#1}
+
+\@namedef{enit@description*}{%
+  \let\enit@list\enit@inlist
+  \enit@description@i}
+
+\def\enit@description{%
+  \let\enit@list\enit@dylist
+  \enit@description@i}
+
+\def\enit@description@i#1#2#3#4{%
+  \ifnum#1>#3\relax
+    \enit@toodeep
+  \else
+    \enit@list{}%
+      {\let\enit@type\tw@
+       \advance#1\@ne
+       \labelwidth\z@
+       \enit@align@left
+       \let\makelabel\descriptionlabel
+       \enit@style@standard
+       \enit@preset{#2}{#1}{#4}%
+       \enit@calcleft
+       \let\enit@svlabel\makelabel
+       \def\makelabel##1{%
+         \labelsep\z@
+         \ifenit@boxdesc
+           \enit@svlabel{\enit@align{\enit@format{##1}}}%
+         \else
+           \nobreak
+           \enit@svlabel{\enit@format{##1}}%
+           \aftergroup\enit@postlabel
+         \fi}%
+       \enit@before}%
+  \fi}
+
+\let\enit@enddescription\enit@endlist
+\@namedef{enit@enddescription*}{\enit@endinlist}
+
+% trivlist
+% ========
+
+\def\enit@trivlist{%
+  \let\enit@type\tw@
+  \parsep\parskip
+  \csname @list\romannumeral\the\@listdepth\endcsname
+  \@nmbrlistfalse
+  \enit@setkeys{trivlist}%
+  \enit@setkeys{trivlist\romannumeral\@listdepth}%
+  \@trivlist
+  \labelwidth\z@
+  \leftmargin\z@
+  \itemindent\z@
+  \let\@itemlabel\@empty
+  \def\makelabel##1{##1}}
+
+% Description styles
+% ==================
+%
+% the next definition is somewhat tricky because labels are boxed.
+% That's fine when the label is just placed at the begining of a line
+% of text, but when the box is placed without horizontal material,
+% leading is killed.  So, we need change somehow \box to \unhbox, but
+% I don't want to modify \@item.  The code below presumes \@item has
+% not been changed and arguments gobble the part setting \@labels,
+% which is replaced by a new one.
+%
+% The default value in description is itemindent=!, but some styles
+% (those whose item text begin at a fixed place, ie, nextline,
+% multiline and sameline) change it to labelwidth=!.
+%
+% We must be careful with the group and the whatsit added by color to
+% boxes.  Alignment is applied here and some adjustments in skips are
+% necessary to get proper line breaks (including a \nobreak at the
+% beginning of \enit@align, ie, after the first whatsit, see above).
+% To "pass" the inner group added by color to the box, \enit@postlabel
+% ckecks if the following is }.  ie, \egroup -- if not, the box has
+% not reached yet its end.
+
+\def\enit@postlabel{%
+  \@ifnextchar\egroup
+    {\aftergroup\enit@postlabel}%
+    {\enit@postlabel@i}}
+
+\def\enit@postlabel@i#1#2#3#4#5{%
+  \def\enit@lblpenalty{\penalty\z@\hskip\skip@}%
+  \ifenit@nextline
+    \ifdim\wd\@tempboxa>\labelwidth
+      \def\enit@lblpenalty{\newline\@nobreaktrue}%
+    \fi
+  \fi
+  \everypar{%
+    \@minipagefalse
+    \global\@newlistfalse
+    \if@inlabel
+      \global\@inlabelfalse
+      {\setbox\z@\lastbox
+       \ifvoid\z@
+         \kern-\itemindent
+       \fi}%
+      \unhbox\@labels
+      \skip@\lastskip % Save last \labelsep
+      \unskip % Remove it 
+      \enit@lblpenalty % Restore it, after penalty
+    \fi
+    \if@nobreak
+      \@nobreakfalse
+      \clubpenalty\@M
+    \else
+      \clubpenalty\@clubpenalty
+      \everypar{}%
+    \fi}%
+  \def\enit@a{#1#2#3#4}%
+  \def\enit@b{\global\setbox\@labels\hbox}%
+  \ifx\enit@a\enit@b\else
+    \enit@error{Non standard \string\item}%
+      {A class or a package has redefined \string\item\MessageBreak
+       and I do not know how to continue}%
+  \fi
+  \global\setbox\@labels\hbox{%
+    \unhbox\@labels
+    \hskip\itemindent
+    \hskip-\labelwidth
+    \hskip-\labelsep
+    \ifdim\wd\@tempboxa>\labelwidth
+      \enit@align{\unhbox\@tempboxa}\unskip % Removes (typically) \hfil
+    \else
+      \leavevmode\hbox to\labelwidth{\enit@align{\unhbox\@tempboxa}}%
+    \fi
+    \hskip\labelsep}}
+
+% +=============================+
+% |     (RE)DEFINING LISTS      |
+% +=============================+
+%
+% Set keys/values
+% ===============
+% Remember \romannumeral0 expands to nothing.
+% #1 = list name, #2 = level, #3 = flag if star, #4 = keys/values
+
+\def\enit@saveset#1#2#3#4{%
+  \setcounter{enit@cnt}{#2}%
+  \ifcase#3%
+    \expandafter
+    \def\csname enit@@#1\romannumeral\c@enit@cnt\endcsname{#4}%
+  \or
+    \expandafter\let\expandafter\enit@b
+      \csname enit@@#1\romannumeral\c@enit@cnt\endcsname
+    \ifx\enit@b\relax
+      \let\enit@b\@empty
+    \fi
+    \expandafter\def
+      \csname enit@@#1\romannumeral\c@enit@cnt\expandafter\endcsname
+      \expandafter{\enit@b,#4}%
+  \fi}
+
+% To do: more robust tests (catch wrong names, but not easy)
+
+% Internally, LaTeX uses a short name for enumerate (enum)
+% and itemize (item). To be consistent with this convention,
+% a couple of macros provide a "translation". I'm not very
+% happy with the current implementation.
+
+\def\enit@shortenumerate{enum}
+\def\enit@shortitemize{item}
+
+\newcommand\setlist{%
+  \@ifstar{\enit@setlist\@ne}{\enit@setlist\z@}}
+
+\def\enit@setlist#1{%
+  \@ifnextchar[{\enit@setlist@x#1}{\enit@setlist@i#1\@empty}}
+
+% Let's accept \setlist[]*{}, too, because an error in <=3.5.1
+
+\def\enit@setlist@x#1[#2]{%
+  \@ifstar{\enit@setlist@i\@ne{#2}}{\enit@setlist@i#1{#2}}}
+
+% #1 list names/levels, #2 keys/values
+
+% #1 star flag, #2 list names/levels, #3 keys/values
+
+\def\enit@setlist@i#1#2#3{%
+  \let\enit@eltnames\relax
+  \let\enit@b\@empty
+  \let\enit@eltlevels\relax
+  \let\enit@c\@empty
+  \protected@edef\enit@a{#2}%
+  \@for\enit@a:=\enit@a\do{% the 2nd enit@a is first expanded
+    \@ifundefined{enitdp@\enit@meaning\enit@a}%
+      {\edef\enit@c{\enit@c\enit@eltlevels{\enit@a}}}%
+      {\@ifundefined{enit@short\enit@meaning\enit@a}%
+         \@empty
+         {\edef\enit@a{\@nameuse{enit@short\enit@a}}}%
+       \edef\enit@b{\enit@b\enit@eltnames{\enit@a}}}}%
+  \ifx\enit@b\@empty
+     \def\enit@b{\enit@eltnames{list}}%
+  \fi
+  \ifx\enit@c\@empty
+     \def\enit@c{\enit@eltlevels{0}}%
+  \fi
+  \def\enit@eltnames##1{%
+    \def\enit@a{##1}%
+    \enit@c}%
+  \def\enit@eltlevels##1{%
+    \enit@saveset\enit@a{##1}#1{#3}}%
+  \enit@b}%
+
+% Deprecated:
+
+\newcommand\setdisplayed[1][0]{\setlist[trivlist,#1]}
+\let\enitdp@trivlist\@empty % dummy, let know it exists
+\newcommand\setenumerate[1][0]{\setlist[enumerate,#1]}
+\newcommand\setitemize[1][0]{\setlist[itemize,#1]}
+\newcommand\setdescription[1][0]{\setlist[description,#1]}
+
+% New lists
+% =========
+
+% When defining a list, \label... and counters must be defined
+% for each level, too:
+
+\def\enit@xset@itemize{%
+  \@namedef{label\enit@c\romannumeral\count@}{%
+    \enit@error{Undefined label}%
+      {You have defined a list, but labels have
+       not been setup.\MessageBreak
+       You can set the label field with \string\setlist.}}}
+\@namedef{enit@xset@itemize*}{\enit@xset@itemize}
+
+\def\enit@xset@enumerate{%
+  \enit@xset@itemize
+  \@ifundefined{c@\enit@c\romannumeral\count@}%
+    {\@definecounter{\enit@c\romannumeral\count@}}{}}
+\@namedef{enit@xset@enumerate*}{\enit@xset@enumerate}
+
+\let\enit@xset@description\@empty
+\@namedef{enit@xset@description*}{\enit@xset@description}
+
+\newcommand\newlist{\enit@newlist\newenvironment}
+\newcommand\renewlist{\enit@newlist\renewenvironment}
+
+% <new/renew>, <name>, <type>, <max-depth>
+
+\def\enit@newlist#1#2#3#4{%
+  \@ifundefined{enit@xset@#3}%
+    {\enit@error{Unknown list type `#3')}%
+          {Valid types are:
+           enumerate, itemize, description,\messageBreak
+           enumerate*, itemize*, description*}}%
+    {}%
+  \setcounter{enit@cnt}{#4}%
+  \count@\@ne
+  \@ifundefined{enit@short#2}%
+    {\def\enit@c{#2}}%
+    {\edef\enit@c{\csname enit@short#2\endcsname}}%
+  \loop
+    \@nameuse{enit@xset@#3}% Uses \enit@c
+    \ifnum\count@<\c@enit@cnt
+    \advance\count@\@ne
+  \repeat
+  \@ifundefined{enitdp@#2}%
+    {\expandafter\newcount\csname enitdp@#2\endcsname}{}%
+  \csname enitdp@#2\endcsname\z@
+  \advance\c@enit@cnt\m@ne
+  \edef\enit@a{%
+    \noexpand#1{#2}[1][]%
+      {\enit@noexcs{enit@#3}%
+       \enit@noexcs{enitdp@#2}%
+       {\enit@c}%
+       {\the\c@enit@cnt}%
+       {####1}}%
+      {\enit@noexcs{enit@end#3}}}%
+  \enit@a}
+
+% Changing the default nesting limit
+% ----------------------------------
+
+\newcommand\setlistdepth{\def\enit@listdepth}
+\setlistdepth{5}
+
+% +=============================+
+% |       PACKAGE OPTIONS       |
+% +=============================+
+
+\newif\ifenit@loadonly
+
+\DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist}
+\DeclareOption{loadonly}{\enit@loadonlytrue}
+\DeclareOption{shortlabels}
+  {\def\enit@shl#1{%
+     \ifnum\enit@type=\tw@
+       \enit@toks{#1}%
+     \else
+       \def\enit@c{#1}%
+       \enit@first#1,\@nil\@@nil % Returns enit@toks
+    \fi}}
+\DeclareOption{inline}
+  {\newenvironment{enumerate*}[1][]%
+     {\@nameuse{enit@enumerate*}\enitdp@enumerate{enum}\thr@@{#1}}
+     {\@nameuse{enit@endenumerate*}}
+   \newenvironment{itemize*}[1][]%
+     {\@nameuse{enit@itemize*}\enitdp@itemize{item}\thr@@{#1}}
+     {\@nameuse{enit@enditemize*}}
+   \newenvironment{description*}[1][]%
+     {\@nameuse{enit@description*}\enitdp@description{description}\@M{#1}}
+     {\@nameuse{enit@enddescription*}}}
+
+\let\enit@shl\enit@toks
+
+\ProcessOptions
+
+\let\trivlist\enit@trivlist
+
+% If there is no loadonly, redefine the basic lists:
+
+\ifenit@loadonly\else
+
+\let\enitdp@enumerate\@enumdepth
+\renewenvironment{enumerate}[1][]
+  {\enit@enumerate\enitdp@enumerate{enum}\thr@@{#1}}
+  {\enit@endenumerate}
+
+\let\enitdp@itemize\@itemdepth
+\renewenvironment{itemize}[1][]
+  {\enit@itemize\enitdp@itemize{item}\thr@@{#1}}
+  {\enit@enditemize}
+
+\newcount\enitdp@description
+\renewenvironment{description}[1][]
+  {\enit@description\enitdp@description{description}\@M{#1}}
+  {\enit@enddescription}
+
+\fi
+
+\endinput
Index: doc/LaTeXmacros/enumitem/enumitem.tex
===================================================================
--- doc/LaTeXmacros/enumitem/enumitem.tex	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/enumitem/enumitem.tex	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,1467 @@
+% +--------------------------------------------------+
+% | Typeset this file to document enumitem.sty       |
+% +--------------------------------------------------+
+%
+% Copyright (c) 2003-2011 by Javier Bezos.
+% All Rights Reserved.
+%
+% This file is part of the enumitem distribution release 3.5.2
+% ------------------------------------------------------------
+% 
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+% 
+% This work has the LPPL maintenance status "maintained".
+% 
+% The Current Maintainer of this work is Javier Bezos.
+
+\documentclass[a4paper]{ltxguide}
+
+\makeatletter
+\newenvironment{desc}
+  {\if@nobreak
+     \vskip-\lastskip
+     \vspace*{-2.5ex}%
+   \fi
+   \decl}
+  {\enddecl}
+\makeatother
+
+\newcommand\3{\unskip\enspace\fbox{\fontsize{4}{4}\selectfont NEW 3.0}}
+
+\usepackage{hyperref}
+
+%\usepackage{pslatex}
+
+\title{Customizing lists\\with the\\\textsf{enumitem} package}
+
+\author{Javier Bezos\footnote{For bug reports, comments and
+suggestions go to \href{http://www.tex-tipografia.com/enumitem.html}%
+{\texttt{http://www.tex-tipografia.com/enumitem.html}}.
+English is not my strong point, so contact me when you
+find mistakes in the manual. Other packages by the same author:
+\textsf{gloss} (with Jos\'e Luis D\'{\i}az), \textsf{accents,
+tensind, esindex, dotlessi, titlesec, titletoc}.}}
+
+\date{Version 3.5.2\\2011-09-28}
+
+\IfFileExists{enumitem.sty}{\usepackage{enumitem}}{}
+
+\addtolength{\topmargin}{-3pc}
+\addtolength{\textwidth}{6pc}
+\addtolength{\oddsidemargin}{-2pc}
+\addtolength{\textheight}{7pc}
+
+\raggedright
+\parindent1.8em
+\parskip0pt
+
+\begin{document}
+
+\maketitle
+
+\section{Introduction}
+
+When I began to use \LaTeX{} several year ago, two particular points
+annoyed me because I found customizing them was very complicated
+---headlines/footlines and lists.  A new way to redefine the former is
+accomplished in my own \textsf{titlesec} package, but none was
+available to customize the latter except:
+\begin{itemize}
+\item \textsf{enumerate}, which just allows to change the label and
+it does it pretty well.
+
+\item \textsf{mdwlist}, which only ``provides some vaguely useful
+list-related commands and environments,'' as its manual states,
+and not a coherent way of handling lists.
+
+\item \textsf{paralist}, which provides lists within a paragraph (the
+original purpose of this package), a few other hard-wired
+specific changes and the optional argument of \textsf{enumerate}.
+\end{itemize}
+
+One of the main drawbacks of the standard |list| is its weird
+parameters, whose meaning is not always obvious.  In order to provide
+a cleaner interface two approaches were possible: either defining new
+lists, or introducing a new syntax making the standard lists easier to
+customize.  For marks I took the first approach in titlesec, just
+because I did not manage to find a satisfactory solution with the
+\LaTeX{} internal macros, but since lists are in some sense more
+``complete'' than sections and marks, I have taken here the second
+approach.
+
+In the interface a sort of ``inheritance'' is used. You can
+set globally the behaviour of lists and then override several
+parameters of, say, enumerate and then in turn override
+a few paremeters of a particular instance. The values will
+be searched in the hierarchy.
+
+\section{The package}
+
+This package is intended to ease customizing the three
+basic list environments: |enumerate|, |itemize| and
+|description|. It extends their syntax to allow
+an optional argument where a set of parameters in the
+form |key=value| are available:
+\begin{itemize}
+\item
+Vertical spacing:
+\begin{itemize}
+\item |topsep|
+\item |partopsep|
+\item |parsep|
+\item |itemsep|
+\end{itemize}
+\item
+Horizontal spacing:
+\begin{itemize}
+\item |leftmargin|
+\item |rightmargin|
+\item |listparindent|
+\item |labelwidth|
+\item |labelsep|
+\item |itemindent|
+\end{itemize}
+\end{itemize}
+
+For example:
+\begin{verbatim}
+\begin{itemize}[itemsep=1ex,leftmargin=1cm]
+\end{verbatim}
+
+The keys above are equivalent to the well known list parameters---see a
+\LaTeX{} manual for a description of them.  Next sections explains the
+extensions provided by |enumitem|.
+
+\section{Keys}
+
+This section describes the keys in displayed lists. Most of them are 
+available in inline lists, where further keys are available (see 
+\ref{s.inline}).
+
+\subsection{Label and cross references format}
+
+\begin{desc}
+|label=<commands>|
+\end{desc}
+
+Sets the label to be used in the current level.
+A set of starred versions of |\alph|, |\Alph|,
+|\arabic|, |\roman| and |\Roman|, without argument
+stand for the current counter in |enumerate|.\footnote{Actually,
+the asterisk is currently the argument but things may change.
+Consider them as starred variants and follow the corresponding
+syntax.} Thus
+\begin{verbatim}
+\begin{enumerate}[label=\emph{\alph*})]
+\end{verbatim}
+prints \textit{a}), \textit{b}), and so on (this is a
+standard style in Spanish, and formerly used by Chicago, too).
+
+It works with |\value|, too (provided the widest label is not to be
+computed or \verb|widest*| is used, see below).  A fancier example
+(which looks ugly, but it is intended only to illustrate what is
+possible; requires \textsf{color} and \textsf{pifont}):
+\begin{verbatim}
+\begin{enumerate}[label=\protect\fcolorbox{blue}{yellow}{\protect\ding{\value*}},
+                  start=172]
+\end{verbatim}
+
+The value of |label| is a moving argument, and fragile commands must
+be protected \textit{except} the counters.  Because of that, use of
+\verb|\value| is somewhat tricky, because \verb|\the| or \verb|\ifnum|
+expects an actual value, which is not the case when \verb|label| is
+being processed to replace internally the \verb|*| by the form with
+the counter argument.  The best solution is usually encapsulating the
+logic inside a new ``counter'' with the help of
+\verb|\AddEnumerateCounter|.\footnote{Which is admittedly somewhat
+convoluted.  A better way to accomplish this is on the way.}
+
+If you prefer setting labels like the \textsf{enumerate} package, use 
+``short labels'' (see section \ref{s.short}).
+
+\begin{desc}
+|label*=<commands>|
+\end{desc}
+
+Like |label| but its value is appended to the parent label.  For example, the follollowing defines a |legal| list (1.,
+1.1., 1.1.1., and so on):
+\begin{verbatim}
+\newlist{legal}{enumerate}{10}
+\setlist[legal]{label*=\arabic*.}
+\end{verbatim}
+
+\begin{desc}
+|ref=<commands>|
+\end{desc}
+
+By default, |label| sets also the form of cross references and
+|\the...| (overriding the settings in previous hierarchical
+levels), but you can define a different format with this key.  For
+example, to remove the right parethesis:
+\begin{verbatim}
+\begin{enumerate}[label=\emph{\alph*}),ref=\emph{\alph*}]
+\end{verbatim}
+In both |label| and |ref|, the counters can be
+used as usual:
+\begin{verbatim}
+\begin{enumerate}[label=\theenumi.\arabic*.]
+\end{verbatim}
+or
+\begin{verbatim}
+\begin{enumerate}[label=\arabic{enumi}.\arabic*.]
+\end{verbatim}
+(provided the current level is the second one).
+
+Note the |label|s are \textit{not} accumulated to form
+the reference. If you want, say, something like 1.\textit{a}
+from 1) as first level and \textit{a}) as second level,
+you must set it with |ref|. You may use
+|\ref{level1}.\ref{level2}| with appropiate |ref|
+settings, but as Robin Fairbairns points out in the \TeX{} FAQ
+\begin{quote}
+\dots{} [that] would be both tedious and error-prone. What is more, it 
+would be undesirable, since you would be constructing a visual 
+representation which is inflexible (you could not change all the 
+references to elements of a list at one fell swoop).
+\end{quote}
+This is sensible and I recommend to follow the advice, but sometimes
+you might want something like:
+\begin{verbatim}
+... subitem \ref{level2} of item \ref{level1} ...
+\end{verbatim}
+
+The value of |ref| is a moving argument, and fragile
+commands must be protected \textit{except} the counters.
+
+\begin{desc}
+|font=<commands>|\qquad\verb|format=<commands>|
+\end{desc}
+
+Sets the label font.  Useful when the label is changed with the
+optional argument of |\item| and in \texttt{description}.  The last
+command in |<commands>| can take an argument with the item label.  In
+\texttt{description} class setting are in force, so you may want begin
+with \verb|\normalfont|. A synonymous is \texttt{format}.
+
+\begin{desc}
+|align=left|\qquad |align=right|\qquad |align=parleft|\3
+\end{desc}
+
+How the label is aligned (with relation to the label box edges).
+Three values are possible: |left|, the default |right| and
+\verb|parleft| (a parbox of width \verb|\labelwidth| with flush left
+text).  The parameters controlling the label spacing should be
+properly set, either by hand or more conveniently with the |*|
+settings (see below):
+\begin{verbatim}
+\begin{enumerate}[label=\Roman*., align=left, leftmargin=*]
+\end{verbatim}
+(When the label box is supposed to have its natural width, use
+|left|.) 
+
+\begin{desc}
+|\SetLabelAlign{<value>}{<commands>}|\3
+\end{desc}
+
+New align types can be defined (or the existing ones redefined) with
+|\SetLabelAlign|; the predefined values are equivalent
+to:\footnote{Prior to version 3.0 the left alignments was incorrectly
+defined and the label and the text could overlap.}
+\begin{verbatim}
+\SetLabelAlign{right}{\hss\llap{#1}}
+\SetLabelAlign{left}{#1\hfil}
+\SetLabelAlign{parleft}{\strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}
+\end{verbatim}
+
+If the last thing in the definition is a skip (typically \verb|\hfil|), it is
+removed sometimes by description. If for some reason you want to avoid
+this, just add \verb|\null| at the end.
+
+Although primarily intended for the alignment, this commands has other
+uses (as in the provided \verb|parleft|).  For example, with the
+following all labels with |align=right| are set as superscripts:
+\begin{verbatim}
+\SetLabelAlign{right}{\hss\llap{\textsuperscript{#1}}}
+\end{verbatim}
+(A new name is also possible, of course.)
+
+If you want the internal settings for \texttt{align} and \texttt{font}
+be ignored, you can override the \textsf{enumitem} definition of
+\verb|\makelabel| in \texttt{before}:
+\begin{verbatim}
+\begin{description}[before={\renewcommand\makelabel[1]{\ref{##1}}}]
+\end{verbatim}
+(Alternatively, define a macro and use \verb|\let|.) 
+
+\subsection{Horizontal spacing of labels}
+
+\begin{desc}
+|labelindent=<length>|\\
+\verb|\labelindent|
+\end{desc}
+
+This  parameter is added in \textsf{enumitem} for the blank space from
+the margin of the enclosing list/text to the left edge of the label box.  This
+means there is a redundancy because one of the parameters depends on
+the others, i.e., it has to be computed from the other values, as
+described below.  There is a new counter length |\labelindent| which
+defaults to 0 pt. The five parameteres are related in the following 
+way:
+\[
+\verb|\leftmargin|+\verb|\itemindent| = 
+\verb|\labelindent|+\verb|\labelwidth|+\verb|\labelsep|
+\]
+
+\begin{desc}
+|leftmargin=!|\qquad|itemindent=!|\qquad|labelsep=!|
+\qquad|labelwidth=!|\qquad|labelindent=!|\3
+\end{desc}
+
+Sets which value is to be computed from the others. This is done 
+after \textit{all} keys has been read. Explicit values are not lost, and
+so with the following hierarchical settings:
+\begin{verbatim}
+leftmargin=2em
+labelindent=1em,leftmargin=!
+labelindent=!
+\end{verbatim}
+|leftmargin| is again 2em and |labelindent| is the computed parameter.
+The default is |labelindent=!|, but note some keys sets another value 
+(\verb|wide| and description \verb|style|s).
+
+With |align=right| (the default), |labelindent=!| and
+|labelwidth=!| behave similarly in practice. 
+
+\begin{desc}
+|leftmargin=*|\qquad|itemindent=*|\qquad|labelsep=*|
+\qquad|labelwidth=*|\qquad|labelindent=*|
+\end{desc}
+
+Like before, but |labelwidth| is set to the width of the current
+label, using the default value of \textit{0} in |\arabic*|,
+\textit{viii} in |\roman*|, \textit{m} in |\alph*| and
+similarly in uppercase forms (these values can be changed with
+|widest|, see below).  Examples are:
+\begin{verbatim}
+\begin{itemize}[label=\textbullet, leftmargin=*]
+\begin{enumerate}[label=\roman*), leftmargin=*, widest=iii]
+\begin{itemize}[label=\textbullet,
+                leftmargin=2pc, labelsep=*]
+\begin{enumerate}[label=\arabic*., leftmargin=2\parindent, 
+                  labelindent=\parindent, labelsep=*]
+\end{verbatim}
+
+The most useful are |labelsep=*| and |leftmargin=*|.
+With the former the item body begins at a fixed place (namely,
+|leftmargin|), while with the latter begins at a variable place
+depending on the label (but always the same within a list, of course).
+Most of times, what you would want is |leftmargin=*|.
+
+Unfortunately, \LaTeX{} does not define a default |labelsep| to
+be applied to all lists---simply the current value is used.  With
+\textsf{enumitem} you can set default values for every list, as
+described below, and so, if you want to make sure |labelsep| is
+under your control, all you need is something like:
+\begin{verbatim}
+\setlist{itemsep=.5em}
+\end{verbatim}
+
+|labelwidth=*| and |labelwidth=!| are synonymous.
+
+\begin{desc}
+|widest=<string>|\qquad|widest*=<integer>|\3\qquad|widest|
+\end{desc}
+
+To be used in conjunction with the \texttt{*}-values, if
+desired.  It overrides the default value for the widest
+printed counter.  Sometimes, if lists are not very long, a value of
+|a| for |\alph| is more sensible than the default |m|:
+\begin{verbatim}
+\begin{enumerate}[leftmargin=*,widest=a] % Assume standard 2nd level
+\end{verbatim}
+With no value, the default is restored. With |widest*|, the string is 
+built using |<integer>| as the value of the counter (e.g., with 
+\verb|\roman|, 
+\verb|widest=viii| and \verb|widest*=8| are the same).
+
+Since |\value| does not return a string but a number, 
+|widest| and the \verb|*| values cannot be used with it. 
+However, with \verb|widest*|, being a number, it is allowed.
+
+\subsection{More on horizontal spacing}
+
+Since |\parindent| is not used as such inside lists, but instead
+is set internally to either |\itemindent| or |\listparindent|,
+when used as the value of a parameter \textsf{enumitem} returns the
+global value, i.  e., the value it has outside the outermost list.
+
+The horizontal space in the left margin of the current level is
+distributed in the following way:\footnote{Admittedly, these figures
+are not exactly the clearest possible, and I intend to improve them in
+a future release}
+\begin{center}
+\begin{tabular}{cc}
+\fbox{\fbox{\strut \texttt{labelindent}}
+  \fbox{\strut \texttt{labelwidth}}
+  \fbox{\strut \texttt{labelsep} $-$ \texttt{itemintent}}}
+&
+\fbox{\strut\texttt{itemindent}}\\
+\texttt{leftmargin}
+\end{tabular}
+\end{center}
+
+\begin{desc}
+\verb|labelsep*=<length>|\3
+\end{desc}
+
+Remember |labelsep| spans part of |leftmargin| and
+|itemindent| if the latter is not zero.  This is often somewhat
+confusing, so a new key is provided---with \texttt{labelsep*} the
+value is reckoned from the left margin (it just sets |\labelsep| 
+and then adds |\itemindent| to it, but in addition later changes to
+|itemindent| are taken into account):
+\begin{center}
+\begin{tabular}{cc}
+\fbox{\fbox{\strut \texttt{labelindent}}
+  \fbox{\strut \texttt{labelwidth}}
+  \fbox{\strut \texttt{labelsep*}}}
+&
+\fbox{\strut\texttt{itemindent}}\\
+\texttt{leftmargin}
+\end{tabular}
+\end{center}
+
+\begin{desc}
+|labelindent*=<length>|\3
+\end{desc}
+
+Like |labelindent|, but it is reckoned from the left margin in 
+the current list and not from that in the enclosing list/text.
+
+\subsection{Numbering, stopping, and resuming}
+
+\begin{desc}
+|start=<integer>|
+\end{desc}
+Sets the number of the first item.
+
+\begin{desc}
+|resume|
+\end{desc}
+
+The counter continues from the previous |enumerate|,
+instead of being reset to 1.
+\begin{verbatim}
+\begin{enumerate}
+\item First item.
+\item Second item.
+\end{enumerate}
+Text.
+\begin{enumerate}[resume]
+\item Third item 
+\end{enumerate}
+\end{verbatim}
+
+This is done locally. If you want global resuming, see next section on series.
+
+\begin{desc}
+|resume*|
+\end{desc}
+
+Like |resume| but the options from the previous list are used,
+too.  This option must be restricted to the optional argument in a
+environment (this is the only place where it makes sense).  It should
+be used sparingly---if you are using it often, then very likely you
+want to define a new list (see \ref{s.clone}).  Further keys are allowed, and
+in this case the saved options are overriden by those in the current
+list (i.e., the position of \texttt{resume*} does not matters).  For
+example:
+\begin{verbatim}
+\begin{enumerate}[resume*,start=1] % or [start=1,resume*]
+\end{verbatim}
+uses the keys in the previuos \texttt{enumerate}, but restarts the
+counter.  If there is a series of a certain list with
+\texttt{resume*}, options are taken from the list previous to the
+first one, except for \texttt{start}.
+
+\subsection{Series}
+
+\begin{desc}
+|series=<series-name>|\3\\
+|<series-name>|\qquad|resume*=<series-name>|
+\qquad|resume=<series-name>|\3
+\end{desc}
+
+A new method (3.0) of continuing lists is by means of the key
+\texttt{series}, so that they behave like a unit.  A list with key
+\texttt{series} is considered the starting list and its settings are
+stored \textit{globally}, so that they can be used later with
+\texttt{resume}/\texttt{resume*}.  All these keys take a value with
+the series name (which must be different from existing keys):
+\begin{itemize}
+\item |resume=<series-name>| just continue numbering items in the
+series,
+\item |resume*=<series>| also applies the settings of the 
+starting list,
+\item |<series>|, i.e., the series name used as a key, is an 
+alternative to |resume*=<series>|.
+\end{itemize}
+For example:
+\begin{verbatim}
+\begin{enumerate}[label=\arabic*(a),leftmargin=1cm,series=lafter]
+\item A
+\item B
+\end{enumerate}
+\end{verbatim}
+You get: 1(a)  2(a). You can continue with:
+\begin{verbatim}
+\begin{enumerate}[label=\arabic*(b),resume*=lafter]
+                 % or [label=\arabic*(b),lafter]
+\item A
+\item B
+\end{enumerate}
+\end{verbatim}
+You get: 3(b)  4(b). (But you can use |start=1|, if you like.)
+
+Note you can add further arguments, which are executed after those
+saved at the starting list and therefore take precedence over them --
+in particular, |resume*| itself takes precedence over a
+|start| (e.g., |start=1|) in the the starting list.
+
+Every time a series is started, several commands are defined 
+internally, so to avoid wasting resources and use the same name for 
+non-overlapping series.
+
+
+\subsection{Penalties}
+
+\begin{desc}
+|beginpenalty=<integer>|\qquad
+|midpenalty=<integer>|\qquad |endpenalty=<integer>|
+\end{desc}
+
+Set the penalty at the beginning of a list, between items and at the
+end of the list, respectively.  Please, refer to your \LaTeX{} or
+\TeX{} manual about how penalties control page breaks.  Unlike other
+parameters, when a list starts their values are not reset to the
+default, thus they apply to the child lists.
+\begin{desc}
+|before=<code>| \qquad |before*=<code>|
+\end{desc}
+
+Execute code before the list starts (more precisely, in the second
+argument of the |list| environment used to define them).  The
+unstarred form sets the code to be executed, overriding any previous
+value, while the starred one adds the code to the existing one (in
+the setting hierarchy, see below, \textit{not} with relation to the
+enclosing list/text).  It can contain, say, rules and text, but this
+has not been extensively tested.  All calculations have been finished,
+and you can access and manipulate the list parameters.  For example,
+to have both margins (left and right) set to the widest label:
+\begin{verbatim}
+\setlist{leftmargin=*,before=\setlength{\rightmargin}{\leftmargin}}
+\end{verbatim}
+
+\begin{desc}
+|after=<code>|\qquad|after*=<code>|
+\end{desc}
+
+Same, but just before the list ends.
+
+\subsection{Description styles}
+
+A key available in |description|.
+\begin{desc}
+|style=<name>|
+\end{desc}
+
+Sets the description \textit{style}. |<name>| can be any of the 
+following:
+\begin{itemize}
+
+\item |standard|: like |description| in standard classes, although
+with other classes it could be somewhat different.  The label is
+boxed.  Sets \verb|itemindent=!|.
+
+\item |unboxed|: much like the standard |description|, but 
+the label is not boxed to avoid uneven spacing and unbroken labels if 
+they are long. Sets \verb|itemindent=!|.
+
+\item |nextline|: if the label does not fit in the margin, the text
+continues in the next line, otherwise it is placed in a box of width
+|\leftmargin| $-$ |\labelsep|, i.e., the item body never sticks into
+the left margin.  Sets \verb|labelwidth=!|.
+
+\item |sameline|: like |nextline| but if the label does not 
+fit in the margin the text continues in the same line. Same as
+\verb|style=unboxed,labelwidth=!|.
+
+\item |multiline|: the label is placed in a parbox whose width is 
+|leftmargin|, with several lines if 
+necessary. Same as \verb|style=standard,align=parleft,labelwidth=!|.
+
+Three caveats: (1) mixing boxed and unboxed labels has not a
+well-defined behaviour, (2) when nesting list all combinations are
+allowed but not all make sense, and (3) nesting \verb|nextline| lists
+is not supported (it works, but its behaviour might change in the
+future, because the current one is not what one could expect).
+
+
+
+\end{itemize}
+
+
+\subsection{Compact lists}
+
+\begin{desc}
+|noitemsep|\qquad|nosep|
+\end{desc}
+
+The key |noitemsep| kills the space between items and paragraphs
+(i.e., |itemsep=0pt| and |parsep=0pt|), while
+|nosep| kills all vertical spacing.\footnote{The key 
+\texttt{nolistsep}, now deprecated, introduced a thin stretch, which 
+was not the intended behaviour.}
+
+\subsection{``Wide'' lists}
+
+\begin{desc}
+\verb|wide|\3\\
+\verb|wide=<parindent>|
+\end{desc}
+
+With this convenience key, the leftmargin is null and the label is
+part of the text---in other word, the items look like ordinary
+paragraphs.\footnote{\texttt{fullwidth} is deprecated.} Here |labelsep|
+sets the separation between the label and the first word.  It is
+equivalent to
+\begin{verbatim}
+align=left, leftmargin=0pt, labelindent=\parindent,
+listparindent=\parindent, labelwidth=0pt, itemindent=!
+\end{verbatim}
+With |wide=<parindent>| you may set at once another value instead of
+|\parindent|.  Of course, these keys can be overriden after
+\verb|wide|, too; for example, remembering that with left-aligned labels
+the text is pushed if the they are wider than |labelwidth|, you
+can set |labelwidth=1.5em| for a minimal width, or instead of
+|itemindent=!| you may prefer |itemindent=*|, which sets the
+minimal width to that of widest label.  In level 2 you may prefer
+|labelindent=2\parindent|, and so on.  You may also want to
+combine it with |noitemsep| or |nolistsep|.
+
+\section{Inline lists}
+\label{s.inline}
+
+\3
+
+Inline lists are ``horizontal'' lists set as ordinary text inside a
+paragraph.  With this package you can create inline lists, as
+explained below, with \verb|\newlist|, which have their own labels and
+counters.  However, in most cases inline versions of standard lists,
+with the same labelling schema, will be enough -- the package option
+\verb|inline| does that.
+
+
+\begin{desc}
+|inline| \qquad(package option)\\
+\texttt{enumerate*}\qquad\texttt{itemize*}\qquad
+\texttt{description*} \qquad(environments)
+\end{desc}
+
+With the package option \texttt{inline}, three environments for inline
+lists are defined: \texttt{enumerate*}, \texttt{itemize*}, and
+\texttt{description*}.  They emulate the behaviour of
+\textsf{paralist} and \textsf{shortlst} in that labels and settings
+are shared with the displayed (ie, ``normal'') lists \texttt{enumerate},
+\texttt{itemize} and \texttt{description}, respectively (however,
+remember resuming is based on environment names, not on list types).  This applies
+only to those created with \texttt{inline} -- inline lists created
+with |\newlist| as described below are independent and use their
+own labels and settings. Note as well \verb|inline| is not required 
+if you needn't inline versions of standard lists.
+
+\begin{desc}
+|itemjoin=<string>|\qquad|itemjoin*=<string>|
+\qquad|afterlabel=<string>|
+\end{desc}
+
+Format is set with keys \texttt{itemjoin} (default is a space), and
+\texttt{afterlabel} (default is |\nobreakspace|, ie, |~|).
+An additional key is \texttt{itemjoin*}, which, if set, is used
+instead of \texttt{itemjoin} before the last item.  So, with
+\begin{verbatim}
+before=\unskip{: }, itemjoin={{; }}, itemjoin*={{, and }}
+\end{verbatim}
+the following punctuation between items is used:
+\begin{quote}
+Blah blah: (a) one; (b) two; (c) three, and (d) four. Blah blah
+\end{quote}
+
+\verb|itemjoin| is ignored in vertical mode (i.e., in mode unboxed
+and just after a quote, a displayed list and the like).
+
+\begin{desc}
+|mode=unboxed|\qquad|mode=boxed|
+\end{desc}
+
+Items are boxed, so floats are lost and nested lists are not allowed
+(remember many displayed elements are defined as lists).  If using
+floats or lists inside inline lists is important, use an alternative
+``mode'', which you can activate with
+\texttt{mode=unboxed} (the default is \texttt{mode=boxes}).  With it
+floats may be used freely, but misplaced |\item|s are not catched and
+\texttt{itemjoin*} is ignored (a warning is written to the log about
+this fact).
+
+\section{Global settings}
+
+Global changes, to be applied to all of these list, are also
+possible:
+\begin{desc}
+|\setlist[enumerate,<levels>]{<format>}|\\
+|\setlist[itemize,<levels>]{<format>}|\\
+|\setlist[description,<levels>]{<format>}|\\
+|\setlist[<levels>]{<format>}|
+\end{desc}
+Where |<level>| is the list level (one or more) in |list|, and the
+corresponding levels in |enumerate| and 
+|itemize|.\footnote{\verb|\string\setenumerate|, 
+\verb|\string\setitemize| and \verb|\string\setdescription| are 
+deprecated.}  With no
+|<levels>|, the format applies to all of them.  Here list does not
+mean any list but only the three ones handled by this package and
+those redefined by this package or defined with |\newlist| (see
+below).  For example:
+\begin{verbatim}
+\setlist{noitemsep}
+\setlist[1]{\labelindent=\parindent} % << Usually a good idea
+\setlist[itemize]{leftmargin=*}
+\setlist[itemize,1]{label=$\triangleleft$}
+\setlist[enumerate]{labelsep=*, leftmargin=1.5pc}
+\setlist[enumerate,1]{label=\arabic*., ref=\arabic*}
+\setlist[enumerate,2]{label=\emph{\alph*}),
+                      ref=\theenumi.\emph{\alph*}}
+\setlist[enumerate,3]{label=\roman*), ref=\theenumii.\roman*}
+\setlist[description]{font=\sffamily\bfseries}
+\end{verbatim}
+These setting are read in the following order: list, list at the
+current level, enumerate/itemize/description, and
+enumerate/itemize/description at the current level; if a key appears
+several times with different values, the last one, i.e.,  the most
+specific one, is applied.  If we are resuming a series or a list with
+\texttt{resume*}, the saved keys are then applied.  Finally, the
+optional argument (except \texttt{resume*}), if any, is applied.
+
+\LaTeX{} provides a set of macros to change many of these parameters,
+but setting them with the package is more consistent and sometimes
+more flexible at the cost of being more ``explicit'' (and verbose).
+
+The list specification can contain variables and counters, provided
+they are expandable, and counters are \textsf{calc}-savvy, so that if
+you load this package you can write things like:
+\begin{verbatim}
+\newcount{toplist}
+\setcount{toplist}{1}
+\newcommand{\mylistname}{enumerate}
+\setlist[\mylistname,\value{toplist}+1]{labelsep=\itemindent+2em]
+\end{verbatim}
+This allows defining lists within loops.
+
+Currently, a way to discriminate the font size is not provided
+(|\normalsize|, |\small|\dots).
+
+\section{\textsf{enumerate}-like labels}
+\label{s.short}
+
+\begin{desc}
+|shortlabels| (package option)
+\end{desc}
+
+With the package option \texttt{shortlabels} you can use an
+\textsf{enumerate}-like syntax, where |A|, |a|, |I|,
+|i| and |1| stand for |\Alph*|, |\alph*|,
+|\Roman*|, |\roman*| and |\arabic*|.  This is intended
+mainly as a sort of compatibility mode with the \textsf{enumerate}
+package, and therefore the following special rule applies: if the very
+first option (at any level) is not recognized as a valid key, then it
+will be considered a label with the \textsf{enumerate}-like syntax.  For
+example:
+\begin{verbatim}
+\begin{enumerate}[i), labelindent=\parindent]
+...
+\end{enumerate}
+\end{verbatim}
+Although perhaps not so useful, you can omit |label=| in the
+itemize environment under similar conditions, too:
+\begin{verbatim}
+\begin{itemize}[\textbullet]
+...
+\end{itemize}
+\end{verbatim}
+
+\begin{desc}
+|\SetEnumerateShortLabel{<key>}{<replacement>}|
+\end{desc}
+
+With this command, you can define new keys (or redefine them), which is
+particularly useful for enumerate to be adapted to especific
+typographical rules or to extend it for non-Latin scrips. Here
+|<replacement>| contains one of the starred versions of 
+counters. For example:
+\begin{verbatim}
+\SetEnumerateShortLabel{i}{\textsc{\roman*}}
+\end{verbatim}
+redefines |i| so that items using this key are numbered with
+small caps roman numerals. The key has to be a single letter.
+
+\section{Cloning the basic lists}
+\label{s.clone}
+
+\begin{desc}
+|\newlist{<name>}{<type>}{<max-depth>}|\\
+|\renewlist{<name>}{<type>}{<max-depth>}|
+\end{desc}
+
+The three lists can be cloned so that you can define ``logical''
+environments behaving like them.  To define a new lists (or redefine a
+existing one), use |\newlist| (or |\renewlist|), where |<type>| is
+|enumerate|, |itemize| or |description|.
+
+If <type> is |enumerate|, a set of counters with names |<name>i|,
+|<name>ii|, |<name>iii|, |<name>iv|, etc.  (depending on <max-depth>)
+is defined.  Don't use an arbitrarily large number for <max-depth>, to
+avoid creating too many counters.  Then you can use those counters in
+labels; e.  g., if you have defined a list named \texttt{steps}, you
+can define a label with:
+\begin{verbatim}
+label=\arabic{stepsii}.\arabic{stepsi}
+\end{verbatim}
+
+\begin{desc}
+\verb|\setlist[<names>,<levels>]{<keys/values>}|\\
+\verb|\setlist*[<names>,<levels>]{<keys/values>}|
+\end{desc}
+
+After creating a list, you can (in fact you
+must, at least the label) set the new list with |\setlist|:
+\begin{verbatim}
+\newlist{ingredients}{itemize}{1}
+\setlist[ingredients]{label=\textbullet}
+\newlist{steps}{enumerate}{2}
+\setlist[steps,1,2]{label=(\arabic*)}
+\end{verbatim}
+Names in the optional argument of |\setlist| say which lists applies the
+settings to, and numbers say the level (it is calc-savvy).  Several
+lists and/or several levels can be given, and all combinations are
+set; e.g.:
+\begin{verbatim}
+\setlist[enumerate,itemize,2,3]{...}
+\end{verbatim}
+\noindent sets enumerate/2, enumerate/3, itemize/2 and itemize/3. 
+No number (or 0) means ``all levels'' and no name means ``all lists''; no 
+optional argument means ``all lists at all levels''.
+
+The three inline lists have types \texttt{enumerate*},
+\texttt{itemize*}, and \texttt{description*}, which are available
+always, even without the package option |inline| (which just defines
+three environments with these names).
+
+The starred form \verb|\setlist*| adds the settings to previous ones.
+
+\begin{desc}
+\verb|\setlistdepth{<integer>|\3
+\end{desc}
+
+By default, \LaTeX{} has a limit of 5 nesting levels, but when 
+cloning list this value may be too short, and therefore you may want 
+to set a new value. In levels below the 5th (or the deepest defined by a 
+class), the settings of the last are used (i.e., \verb|\@listvi|).
+
+\section{More about counters}
+
+\subsection{New counter representation}
+
+\begin{desc}
+\verb|\AddEnumerateCounter{<LaTeX command>}{<internal command>}{<widest label>}|
+\end{desc}
+
+``Registers'' a counter representation so that \textsf{enumitem}
+recognizes it.  Intended mainly for non Latin scripts, but also useful
+in Latin scripts.  For example:
+\begin{verbatim}
+\makeatletter
+\def\ctext#1{\expandafter\@ctext\csname c@#1\endcsname}
+\def\@ctext#1{\ifcase#1\or First\or Second\or Third\or
+Fourth\or Fifth\or Sixth\fi}
+\makeatother
+\AddEnumerateCounter{\ctext}{\@ctext}{Second}
+\end{verbatim}
+A starred variant allows to give a number instead of a string as the 
+widest label; for example, if the widest label is that corresponding 
+to the value 2:\3
+\begin{verbatim}
+\AddEnumerateCounter*{\ctext}{\@ctmoreext}{2}
+\end{verbatim}
+This variant is to be preferred if the representation is not a plain 
+string but it is styled, e.g.,
+with small caps. (The counter names can contain |@| even if not a letter.) 
+
+\subsection{Restarting \texttt{enumerate}s}
+
+\begin{desc}
+|\restartlist{<list-name>}|\3
+\end{desc}
+
+Currently, with
+\begin{verbatim}
+\setlist[enumerate]{resume}
+\end{verbatim}
+you can get a continuous numbering through a document.  A new command has
+been added for restarting the counter in the middle of the document:
+\begin{verbatim}
+\restartlist{<list-name>}
+\end{verbatim}
+
+It is based solely in the list name, not the list type, which means
+\texttt{enumerate*} as defined with the package option \texttt{inline}
+is not the same as \texttt{enumerate}, because its name is different.
+
+\section{Generic keys and values}
+
+\begin{desc}
+|\SetEnumitemKey{<key>}{<replacement>}|\3
+\end{desc}
+
+With this command you can create your own (valueless) keys.  For
+example:
+\begin{verbatim}
+\SetEnumitemKey{midsep}{topsep=3pt,partopsep=0pt}
+\end{verbatim}
+
+Keys so defined can then be used like the others. Another example is
+multicolumn lists, with \textsf{multicol}:
+\begin{verbatim}
+\SetEnumitemKey{twocol}{
+  itemsep=1\itemsep,
+  parsep=1\parsep,
+  before=\raggedcolumns\begin{multicols}{2},
+  after=\end{multicols}}
+\end{verbatim}
+
+(The settings for \texttt{itemsep} and \texttt{parsep} kill the
+stretch and shrink parts.  Of course, you may want to define a
+new list.)
+
+Note the package may introduce new keys in the future, so
+\verb|\SetEnumitemKey| is a potential source of forward
+incompatibilities.  However, it's safe using a non-letter character
+other than hyphen or star in the key name (e.g., \verb|:name| or 
+\verb|2_col|).
+
+\begin{desc}
+|\SetEnumitemValue{<key>}{<string-value>}{<replacement>}|\3
+\end{desc}
+
+This commands provides a further abstraction layer for the
+|<key>=<value>| pairs.  With it you can define logical names which
+are translated to the actual value.  For example, with:
+\begin{verbatim}
+\SetEnumitemValue{label}{numeric}{\arabic*.}
+\SetEnumitemValue{leftmargin}{standard}{\parindent}
+\end{verbatim}
+you might say:
+\begin{verbatim}
+\begin{enumerate}[label=numeric,leftmargin=standard]
+\end{verbatim}
+So, you can left to the final design what |label=numeric| means.
+
+\section{Package options}
+
+Besides \verb|inline|, \verb|ignoredisplayed|, and \verb|shortlabels|,
+the following option is available.
+
+\begin{desc}
+\verb|loadonly|
+\end{desc}
+
+With this package option the package is loaded but the three
+lists are not redefined. You can create your own lists, yet, or
+even redefine the existing ones.
+
+\section{Three patterns}
+
+Three list layouts could be considered very
+frequent. Let us apply the parameters above to define them. (Below 
+are samples.)
+
+The first pattern aligns the label with the surrounding
+|\parindent| while the item body is indented depending
+on the label and a fixed |labelsep|:
+\begin{verbatim}
+labelindent=\parindent,
+leftmargin=*
+\end{verbatim}
+A fairly frequent variant is aligning the label with the
+surrounding text (rememeber |labelindent| is |0pt| by
+default):
+\begin{verbatim}
+leftmargin=*
+\end{verbatim}
+The former looks better in the first level while the latter
+seems preferable in subsequent ones. That can be easily
+set with
+\begin{verbatim}
+\setlist{leftmargin=*}
+\setlist[1]{labelindent=\parindent} % Only the level 1
+\end{verbatim}
+
+The second pattern aligns the item body with the surrounding
+|\parindent|. In this case:
+\begin{verbatim}
+leftmargin=\parindent
+\end{verbatim}
+
+A third pattern would be to align the label with |\parindent|
+and the item body with |2\parindent|:
+\begin{verbatim}
+labelindent=\parindent,
+leftmargin=2\parindent,
+itemsep=*
+\end{verbatim}
+Again, a variant would be to align the label with the surrounding
+text and the itembody with |\parindent|:
+\begin{verbatim}
+leftmargin=\parindent,
+itemsep=*
+\end{verbatim}
+
+Note here |\parindent| means the global value applied
+to normal paragraphs.
+
+\section{The trivlist issue}
+
+\LaTeX{} uses a simplified version of |list| named |trivlist| to set
+displayed material, like |center|, |verbatim|, \verb|tabbing|,
+\verb|theorem|, etc., even if conceptually they are not lists.
+Unfortunately, |trivlist| uses the current list settings, which has
+the odd side effect that changing the vertical spacing of lists also
+changes sometimes the spacing in these environments.
+
+This package modifies |trivlist| so that the default settings for 
+the current level (ie, those set by the corresponding |clo| 
+files) are set again. In standard \LaTeX{} that is usually redundand, 
+but if we want to fine tune lists, not resetting the default values 
+could be a real issue (particularly if you use the |nolistsep| 
+option).
+
+A minimal control of vertical spacing has been made possible 
+with\footnote{\verb|\string\setdisplayed| is deprecated.}
+\begin{itemize}
+\item |\setlist[trivlist,<level>]{<keys/values>}|
+\end{itemize}
+but |trivlist| itself, which is not used directly very
+often, does not accept an optional argument. This feature
+is not intended as a full-fledge |trivlist| formatter.
+
+If for some reason you do not want to change |trivlist|
+and preserve the original definition, you can use the
+package option |ignoredisplayed|.
+
+\section{Samples}
+
+\expandafter\ifx\csname setenumerate\endcsname\relax
+
+Please, install first the package and then typeset this
+document again.
+
+\else
+
+In these samples we set |\setlist{noitemsep}|
+
+\setlist{noitemsep}
+\small
+
+\newcommand{\newsample}{\vskip6pt\goodbreak\hrule height 1pt\vskip6pt}
+\newcommand{\samplesep}{\vskip6pt\goodbreak\hrule\vskip6pt}
+\newbox\vsep
+\setbox\vsep\hbox{\vrule height 2ex depth 16ex width 1pt}
+\dp\vsep0pt
+\newcommand\showsep{\leavevmode\llap{\copy\vsep}}
+
+\newsample
+
+\begin{verbatim}
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[labelindent=\parindent,leftmargin=*]
+  \item lanza en astillero,
+  \item adarna antigua,
+  \item roc\'{\i}n flaco, y
+  \item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+\end{verbatim}
+
+The rule shows \verb|labelindent|. 
+
+\samplesep
+
+\showsep En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[labelindent=\parindent,leftmargin=*]
+\item lanza en astillero,
+\item adarna antigua,
+\item roc\'{\i}n flaco, y
+\item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+With |\begin{enumerate}[leftmargin=*] % labelindent=0pt by default|. 
+
+The rule shows \verb|labelindent|.
+
+\samplesep
+
+\noindent\showsep\hskip\parindent En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[leftmargin=*]
+\item lanza en astillero,
+\item adarna antigua,
+\item roc\'{\i}n flaco, y
+\item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+With |\begin{enumerate}[leftmargin=\parindent]|.
+
+The rule shows \verb|leftmargin|.
+
+\samplesep
+
+\showsep En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[leftmargin=\parindent]
+\item lanza en astillero,
+\item adarna antigua,
+\item roc\'{\i}n flaco, y
+\item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+With |\begin{enumerate}[labelindent=\parindent,|\allowbreak
+| leftmargin=*,|\allowbreak| label=\Roman*.,|\allowbreak
+| widest=IV,|\allowbreak| align=left]|.
+
+The rule shows \verb|labelindent|.
+
+\samplesep
+
+\showsep En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[labelindent=\parindent, leftmargin=*,
+                  label=\Roman*., widest=IV, align=left]
+\item lanza en astillero,
+\item adarna antigua,
+\item roc\'{\i}n flaco, y
+\item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+With |\begin{enumerate}[label=\fbox{\arabic*}]|. A reference to
+the first item is \ref{i:first}
+
+\samplesep
+
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[label=\fbox{\arabic*}]
+\item \label{i:first}lanza en astillero,
+\item adarna antigua,
+\item roc\'{\i}n flaco, y
+\item galgo corredor.
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+With nested lists.
+
+\samplesep
+
+\begin{verbatim}
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[label=(\alph*), labelindent=\parindent,
+     leftmargin=*, start=12]
+\item lanza en astillero,
+\begin{enumerate}[label=(\alph{enumi}.\roman*), leftmargin=*, start=7]
+\item adarna antigua,
+\end{enumerate}
+\item roc\'{\i}n flaco, y
+\begin{enumerate}[label=(\alph{enumi}.\roman*), leftmargin=*, resume]
+\item galgo corredor.
+\end{enumerate}
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+\end{verbatim}
+
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{enumerate}[label=(\alph*), labelindent=\parindent,
+     leftmargin=*, start=12]
+\item lanza en astillero,
+\begin{enumerate}[label=(\alph{enumi}.\roman*), leftmargin=*, start=7]
+\item adarna antigua,
+\end{enumerate}
+\item roc\'{\i}n flaco, y
+\begin{enumerate}[label=(\alph{enumi}.\roman*), leftmargin=*, resume]
+\item galgo corredor.
+\end{enumerate}
+\end{enumerate}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+\begin{verbatim}
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{description}[font=\sffamily\bfseries, leftmargin=3cm,
+    style=nextline]
+  \item[Lo primero que ten\'{\i}a el Quijote] lanza en astillero,
+  \item[Lo segundo] adarna antigua,
+  \item[Lo tercero] roc\'{\i}n flaco, y
+  \item[Y por \'{u}ltimo, lo cuarto] galgo corredor.
+\end{description}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+\end{verbatim}
+
+\samplesep
+
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{description}[font=\sffamily\bfseries, leftmargin=3cm,
+    style=nextline]
+\item[Lo primero que ten\'{\i}a el Quijote] lanza en astillero,
+\item[Lo segundo] adarna antigua,
+\item[Lo tercero] roc\'{\i}n flaco, y
+\item[Y por \'{u}ltimo, lo cuarto] galgo corredor.
+\end{description}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+Same, but with |sameline|.
+
+\samplesep
+
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{description}[font=\sffamily\bfseries, leftmargin=3cm,
+    style=sameline]
+\item[Lo primero que ten\'{\i}a el Quijote] lanza en astillero,
+\item[Lo segundo] adarna antigua,
+\item[Lo tercero] roc\'{\i}n flaco, y
+\item[Y por \'{u}ltimo, lo cuarto] galgo corredor.
+\end{description}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\newsample
+
+Same, but with |multiline|. Note the text overlaps if
+the item body is too short.
+
+\samplesep
+
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{description}[font=\sffamily\bfseries, leftmargin=3cm,
+    style=multiline]
+\item[Lo primero que ten\'{\i}a el Quijote] lanza en astillero,
+\item[Lo segundo] adarna antigua,
+\item[Lo tercero] roc\'{\i}n flaco, y
+\item[Y por \'{u}ltimo, lo cuar] galgo corredor.
+\end{description}
+Una olla de algo m\'{a}s vaca que carnero, salpic\'{o}n las m\'{a}s
+noches, duelos y quebrantos los s\'{a}bados...
+
+\fi
+
+\normalsize
+
+\section{Afterword}
+
+\subsection{\LaTeX{} lists}
+
+As it is well known, \LaTeX{} predefines three lists:
+\texttt{enumerate}, \texttt{itemize} and \texttt{description}.  This
+is a very frequent classification which can also be found in, say,
+HTML. However, there is a more general model based in three
+fields---namely, label, title, and body---, so that enumerate and
+itemize has label (numbered and unnumbered) but no title, while
+description has title but no label.  In this model, one can have a
+description with entries marked with labels, as for example (of 
+course, this simple solution is far from satistactory):
+\begin{verbatim}
+\newcommand\litem[1]{\item{\bfseries #1,\enspace}}
+\begin{itemize}[label=\textbullet]
+\litem{Lo primero que ten\'{\i}a el Quijote} lanza en astillero,
+... etc.
+\end{verbatim}
+
+\vskip6pt
+\goodbreak
+\hrule
+\vskip6pt
+
+\newcommand\litem[1]{\item{\bfseries #1,\enspace}}
+En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
+no ha mucho tiempo que viv\'{\i}a un hidalgo de los de
+\begin{itemize}[label=\textbullet]
+\litem{Lo primero que ten\'{\i}a el Quijote} lanza en astillero,
+\litem{Lo segundo} adarna antigua,
+\litem{Lo tercero} roc\'{\i}n flaco, y
+\litem{Y por \'{u}ltimo, lo cuarto} galgo corredor.
+\end{itemize}
+
+\vskip6pt
+\goodbreak
+\hrule
+\vskip6pt
+
+This format in not infrequent at all and a tool for defining them is 
+on the way and at a very advanced stage. It has not been include in 
+version 3.0 because I'm not sure if the proper place is this package 
+or \textsf{titlesec} and it is not stable enough yet.
+
+\subsection{Known issues}
+
+\begin{itemize}
+
+\item
+List resuming is based on environment names, and when a
+|\newenvironment| contains a list you may want to use |\begin| and
+|\end|.  Using the corresponding commands, however, is not an error,
+but it is your responsability to make sure the result is correct.
+
+\item
+It seems there is no way to catch a misspelled name in |\setlist|
+and a meaningless error ``Missing number, treated as zero'' is raised.
+
+\item The behaviour of mixed boxed labels (including enumerate and
+itemize) and unboxed labels is not well-defined.  The same applies to
+boxed and unboxed inline lists (which could even raise an error).
+Similarly, resuming a series and a list at the same time is allowed,
+too, but again its behaviour is not well-defined.
+
+\item (3.5.2) An incompatibility with 2.x has popped up -- if you were
+using the optional argument to pass a value to a \verb|\ref| or other 
+macro requiring expandable macros, an error is raised. A quick fix 
+is letting \verb|\makelabel| to |\descriptionlabel| in \texttt{before}.
+
+\end{itemize}
+
+\subsection{What's new in 3.0}
+
+\begin{itemize}
+\item Inline lists, with keys to set how items are joined (ie, the
+punctuation between items).  Two modes are provided: \verb|boxed|  and
+\verb|unboxed|.
+
+\item \verb|\setlist| is \textsf{calc}-savvy (eg, for use in loops),
+and you can set diferent lists and levels at once.  \item All lengths
+related to labels can take the value \verb|*| (and not only
+\verb|labelsep| and \verb|leftmargin|).  Its behaviour has been made
+consistent and there is new value \verb|!| which does not compute the
+widest label.
+
+\item With \verb|\restartlist{<list-name>}|, list counters can be restarted (in
+case you are using \verb|resume|).
+
+\item \verb|resume*| can be combined with other keys.
+
+\item Lists can be gathered globally using series, so that they are
+considered a single list.  To start a series just use
+|series=<series-name>| and then resume it with |resume=<series-name>| or
+|resume*=<series-name>|.
+
+\item The ``experimental'' \verb|fullwidth| has been replaced by a new key
+\verb|wide|.
+
+\item|\SetLabelAlign| defines new align values.
+
+\item You can define ``abstract'' values (eg, \verb|label=numeric|) and
+new keys.
+\end{itemize}
+
+\begin{itemize}
+\item (3.2) \verb|start| and \verb|widest*| are \textsf{calc}-savvy.
+\item (3.2) \verb|\value| can be used with \verb|widest*|.
+\item (3.2) Some internal restrictions in \verb|\arabic| and the like
+has been removed.  It is more flexible at the cost of having a more
+``relaxed'' error checking.
+\end{itemize}
+\subsection{Bug fixes}
+
+\begin{itemize}
+\item Star values (eg, \verb|leftmargin=*|) could not be overriden
+and new values were ignored.
+\item \verb|nolistsep| as the first of several keys was not always
+recognized and therefore treated like a short label
+(i.e., \verb|nol\roman*stsep|).
+\item \verb|labelwidth| did not always work (when there was a prior
+\verb|widest| and \verb|*|)
+\item With \verb|align=right| the label and the following text could
+overlap.
+\item \verb|description| did not get the correct list level.
+\item At some point (2.x?) \verb|\value*| stopped working.
+\item (3.1) Unfortunately, \textsf{xkeyval} ``kills'' 
+\textsf{keyval}, so the lattest has been replicated in 
+\textsf{enumitem}.
+\item (3.3) Fixes a serious bug -- with \verb|*| neither 
+\verb|itemize| nor \verb|description| worked.
+\item (3.4) Fixes bad spacing in mode boxed (misplaced \verb|\unskip| 
+before the first item and wrong spacefactor between items).
+\item (3.4) \verb|nolistsep| did not work as intended, but since the
+error has been there for several years, a new key \verb|nosep| is
+provided.
+\item (3.4) The issue with \verb|nolistsep| with \verb|shortlabels| 
+(see above) was not fixed in all cases. Hopefully now it is.
+\item (3.5.0) Fixed the fix related to the spacefactor between items.
+\item (3.5.0) Fixed a problem with nested boxed inline lists.
+\item (3.5.1) \texttt{resume*} only worked once, and subsequent ones
+bahaved like \texttt{resume}.
+\item (3.5.2) Fixed |\setlist*|, which didn't work.
+\end{itemize}
+
+
+\subsection{Acknowledgements}
+
+I wish to thank particularly the comments and suggestions from Lars
+Madsen, who has found some bugs, too.
+
+\end{document}
Index: doc/LaTeXmacros/listings/README
===================================================================
--- doc/LaTeXmacros/listings/README	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/README	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,18 @@
+Listings package
+
+Copyright 1996--2004 Carsten Heinz (the package)
+Copyright 1996--2007 individual authors (language drivers)
+Copyright 2006--2007 Brooks Moses (continued maintenance)
+Copyright 2013--     Jobst Hoffmann (continued maintenance)
+
+$Id: README 38 2013-06-16 19:03:21Z j_hoffmann $
+
+Released under the LaTeX Project Public License 1.3 or later
+
+The `listings' package is a source code printer for LaTeX.
+You can typeset stand alone files as well as listings with
+an environment similar to `verbatim' as well as you can
+print code snippets using a command similar to \verb'.
+Many parameters control the output and if your preferred
+programming language isn't already supported, you can make
+your own definition.
Index: doc/LaTeXmacros/listings/listings-acm.prf
===================================================================
--- doc/LaTeXmacros/listings/listings-acm.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings-acm.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,53 @@
+%%
+%% This is file `listings-acm.prf',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `acm-prf')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings-acm.prf}
+    [2015/06/04 1.6 listings language file]
+\usepackage[rgb, x11names]{xcolor}
+
+\definecolor{Comments}{rgb}{0.00,0.50,0.00}
+\definecolor{KeyWords}{rgb}{0.00,0.00,0.63}
+\definecolor{Strings}{rgb}{0.84,0.00,0.00}
+
+\lstdefinestyle{ACM}{%
+  basicstyle=\scriptsize\ttfamily,%
+  keywordstyle=\color{KeyWords},%
+  showstringspaces=false,%
+  identifierstyle=\color{black},%
+  commentstyle=\color{Comments},%
+  stringstyle=\color{Strings},%
+  frame=shadowbox,%             % for ACM-Code scrartcl commented out
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}%
+\endinput
+%%
+%% End of file `listings-acm.prf'.
Index: doc/LaTeXmacros/listings/listings-bash.prf
===================================================================
--- doc/LaTeXmacros/listings/listings-bash.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings-bash.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,66 @@
+%%
+%% This is file `listings-bash.prf',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `bash-prf')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings-bash.prf}
+    [2015/06/04 1.6 listings language file]
+\usepackage[rgb, x11names]{xcolor}
+
+\lstset{%
+  frame=tlb,%      the frame is open on the right side
+  resetmargins=false,%
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  numberstyle=\tiny,%
+  numbersep=5pt,%
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  keepspaces=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}
+\lstdefinestyle{bash}{%
+  backgroundcolor=\color{yellow!10},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle=\color{black},%
+  keywordstyle=\color{blue},%
+  keywordstyle={[2]\color{cyan}},%
+  keywordstyle={[3]\color{olive}},%
+  stringstyle=\color{teal},%
+  commentstyle=\itshape\color{orange},%
+}%
+\lstdefinestyle{bashbw}{%
+  backgroundcolor={},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle={},%
+  keywordstyle=\bfseries,%
+  stringstyle=\itshape,%
+  commentstyle=\slshape,%
+  rulesepcolor=\color{black},%
+}%
+\endinput
+%%
+%% End of file `listings-bash.prf'.
Index: doc/LaTeXmacros/listings/listings-fortran.prf
===================================================================
--- doc/LaTeXmacros/listings/listings-fortran.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings-fortran.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,66 @@
+%%
+%% This is file `listings-fortran.prf',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `fortran-prf')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings-fortran.prf}
+    [2015/06/04 1.6 listings language file]
+\usepackage[rgb, x11names]{xcolor}
+
+\lstset{%
+  frame=tlb,%      the frame is open on the right side
+  resetmargins=false,%
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  numberstyle=\tiny,%
+  numbersep=5pt,%
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  keepspaces=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}
+\lstdefinestyle{fortran}{%
+  backgroundcolor=\color{yellow!10},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle=\color{black},%
+  keywordstyle=\color{blue},%
+  keywordstyle={[2]\color{cyan}},%
+  keywordstyle={[3]\color{olive}},%
+  stringstyle=\color{teal},%
+  commentstyle=\itshape\color{orange},%
+}%
+\lstdefinestyle{fortranbw}{%
+  backgroundcolor={},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle={},%
+  keywordstyle=\bfseries,%
+  stringstyle=\itshape,%
+  commentstyle=\slshape,%
+  rulesepcolor=\color{black},%
+}%
+\endinput
+%%
+%% End of file `listings-fortran.prf'.
Index: doc/LaTeXmacros/listings/listings-lua.prf
===================================================================
--- doc/LaTeXmacros/listings/listings-lua.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings-lua.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,39 @@
+%%
+%% This is file `listings-lua.prf',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `lua-prf')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings-lua.prf}
+    [2015/06/04 1.6 listings language file]
+\usepackage[rgb, x11names]{xcolor}
+\lstdefinestyle{Lua}{%
+  language=[5.2]Lua,
+  basicstyle=\ttfamily,
+  columns=spaceflexible,
+  keywordstyle=\bfseries\color{Blue4},% language keywords
+  keywordstyle=[2]\bfseries\color{RoyalBlue3},% std. library identifiers
+  keywordstyle=[3]\bfseries\color{Purple3},% labels
+  stringstyle=\bfseries\color{Coral4},% strings
+  commentstyle=\itshape\color{Green4},% comments
+}
+\endinput
+%%
+%% End of file `listings-lua.prf'.
Index: doc/LaTeXmacros/listings/listings-python.prf
===================================================================
--- doc/LaTeXmacros/listings/listings-python.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings-python.prf	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,49 @@
+%%
+%% This is file `listings-python.prf',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `python-prf')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings-python.prf}
+    [2015/06/04 1.6 listings language file]
+\usepackage{xcolor}
+\usepackage{textcomp}
+
+%% Actual colors from idlelib/config-highlight.def --> corrected to ``web-safe''
+%% strings  = #00aa00 / 0,170,0      (a darker green)
+%% builtins = #900090 / 144,0,144    (purple-ish)
+%% keywords = #FF7700 / 255,119,0    (quite close to plain `orange')
+%% Corrected to ``web-safe''
+\definecolor{purple2}{RGB}{153,0,153} % there's actually no standard purple
+\definecolor{green2}{RGB}{0,153,0} % a darker green
+
+\lstdefinestyle{python-idle-code}{%
+  language=Python,                   % the language
+  basicstyle=\normalsize\ttfamily,   % size of the fonts for the code
+  % Color settings to match IDLE style
+  keywordstyle=\color{orange},       % core keywords
+  keywordstyle={[2]\color{purple2}}, % built-ins
+  stringstyle=\color{green2},
+  commentstyle=\color{red},
+  upquote=true,                      % requires textcomp
+}
+\endinput
+%%
+%% End of file `listings-python.prf'.
Index: doc/LaTeXmacros/listings/listings.cfg
===================================================================
--- doc/LaTeXmacros/listings/listings.cfg	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.cfg	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,49 @@
+%%
+%% This is file `listings.cfg',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `config')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{listings.cfg}[2015/06/04 1.6 listings configuration]
+\def\lstlanguagefiles
+    {lstlang0.sty,lstlang1.sty,lstlang2.sty,lstlang3.sty}
+\lstset{defaultdialect=[R/3 6.10]ABAP,
+        defaultdialect=[2005]Ada,
+        defaultdialect=[68]Algol,
+        defaultdialect=[gnu]Awk,
+        defaultdialect=[ANSI]C,
+        defaultdialect=[light]Caml,
+        defaultdialect=[1985]Cobol,
+        defaultdialect=[WinXP]command.com,
+        defaultdialect=[ISO]C++,
+        defaultdialect=[95]Fortran,
+        defaultdialect=[5.2]Mathematica,
+        defaultdialect=[OMG]OCL,
+        defaultdialect=[Standard]Pascal,
+        defaultdialect=[67]Simula,
+        defaultdialect=[plain]TeX,
+        defaultdialect=[97]VRML}
+\lstalias[]{TclTk}[tk]{tcl}
+\lstalias[6.1]{ABAP}[R/3 6.10]{ABAP}
+\lstalias[3.1]{ABAP}[R/3 3.1C]{ABAP}
+\lstalias[4.6]{ABAP}[R/3 4.6C]{ABAP}
+\endinput
+%%
+%% End of file `listings.cfg'.
Index: doc/LaTeXmacros/listings/listings.dtx
===================================================================
--- doc/LaTeXmacros/listings/listings.dtx	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.dtx	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,16660 @@
+% \iffalse
+%
+% Trademarks appear throughout this documentation without any trademark
+% symbol, so you can't assume that a name is free. There is no intention
+% of infringement; the usage is to the benefit of the trademark owner.
+%
+%
+%  S O F T W A R E   L I C E N S E
+% =================================
+%
+% The files  listings.dtx  and  listings.ins  and all files generated
+% from only these two files are referred to as `the listings package'
+% or simply `the package'. lstdrvrs.dtx  and the files generated from
+% that file are `drivers'.
+%
+% The listings package is copyright 1996--2004 Carsten Heinz, and
+% continued maintenance on the package is copyright 2006--2007 Brooks
+% Moses. From 2013 on copyright is Jobst Hoffmann, who is the maintainer
+% since july 2013. The drivers are copyright 1997/1998/1999/2000/2001/
+% 2002/2003/2004/2006/2007/2013 any individual author listed in the
+% driver files.
+%
+% The listings package and its drivers may be distributed and/or modified
+% under the conditions of the LaTeX Project Public License, either version
+% 1.3 of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% The package has the LPPL maintenance status "maintained".
+%
+% $Id: listings.dtx 201 2015-06-04 20:25:39Z j_hoffmann $
+%
+% The Current Maintainer is Jobst Hoffmann <j.hoffmann(at)fh-aachen.de>.
+%
+% end of software license
+%
+%
+%<*driver>
+\documentclass[a4paper]{ltxdoc}
+\DisableCrossrefs
+\OnlyDescription
+
+\usepackage{lstdoc,textcomp}
+\usepackage{mdframed}           % frames for external files
+\usepackage{moreverb}           % writing external files
+\usepackage{xcolor}             % because of colouring the background
+
+\makeindex
+
+\begin{document}
+    \DocInput{listings.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%^^A
+%^^A  Command/key to aspect relation
+%^^A ================================
+%^^A
+%\lstisaspect[strings]{string,morestring,deletestring,stringstyle,showstringspaces}
+%\lstisaspect[comments]{comment,morecomment,deletecomment,commentstyle}
+%\lstisaspect[comment styles]{b,d,l,n,s,ib,id,il,in,is}
+%\lstisaspect[pod]{printpod,podcomment}
+%\lstisaspect[escape]{texcl,escapebegin,escapeend,escapechar,escapeinside,mathescape}
+%\lstisaspect[keywords]{sensitive,classoffset,keywords,morekeywords,deletekeywords,keywordstyle,ndkeywords,morendkeywords,deletendkeywords,ndkeywordstyle,keywordsprefix,otherkeywords}
+%\lstisaspect[emph]{emph,moreemph,deleteemph,emphstyle}
+%\lstisaspect[tex]{texcs,moretexcs,deletetexcs,texcsstyle}
+%\lstisaspect[directives]{directives,moredirectives,deletedirectives,directivestyle}
+%\lstisaspect[html]{tag,usekeywordsintag,tagstyle,markfirstintag}
+%\lstisaspect[keywordcomments]{keywordcomment,morekeywordcomment,deletekeywordcomment,keywordcommentsemicolon}
+%\lstisaspect[index]{index,moreindex,deleteindex,indexstyle,\string\lstindexmacro}
+%\lstisaspect[procnames]{procnamestyle,indexprocnames,procnamekeys,moreprocnamekeys,deleteprocnamekeys}
+%\lstisaspect[style]{style,\string\lstdefinestyle,\string\lst@definestyle,\string\lststylefiles}
+%\lstisaspect[language]{language,alsolanguage,defaultdialect,\string\lstalias,\string\lstdefinelanguage,\string\lst@definelanguage,\string\lstloadlanguages,\string\lstlanguagefiles}
+%\lstisaspect[formats]{format,fmtindent,\string\lstdefineformat,\string\lst@defineformat,\string\lstformatfiles}
+%\lstisaspect[labels]{numbers,numberstyle,numbersep,stepnumber,numberblanklines,firstnumber,\string\thelstnumber,numberfirstline}
+%\lstisaspect[lineshape]{xleftmargin,xrightmargin,resetmargins,linewidth,lineskip,breaklines,breakindent,breakautoindent,prebreak,postbreak,breakatwhitespace}
+%\lstisaspect[frames]{framexleftmargin,framexrightmargin,framextopmargin,framexbottommargin,backgroundcolor,fillcolor,rulecolor,rulesepcolor,rulesep,framerule,framesep,frameshape,frameround,frame}
+%\lstisaspect[make]{makemacrouse}
+%\lstisaspect[fancyvrb]{fancyvrb,fvcmdparams,morefvcmdparams}
+%\lstisaspect[lgrind]{lgrindef,\string\lstlgrindeffile}
+%\lstisaspect[hyper]{hyperref,morehyperref,deletehyperref,hyperanchor,hyperlink}
+%\lstisaspect[kernel]{basewidth,fontadjust,columns,flexiblecolumns,identifierstyle,^^A
+%   tabsize,showtabs,tab,showspaces,keepspaces,formfeed,SelectCharTable,^^A
+%   MoreSelectCharTable,extendedchars,alsoletter,alsodigit,alsoother,excludedelims,^^A
+%   literate,basicstyle,print,firstline,lastline,linerange,nolol,captionpos,abovecaptionskip,^^A
+%   belowcaptionskip,label,title,caption,\string\lstlistingname,boxpos,float,^^A
+%   floatplacement,aboveskip,belowskip,everydisplay,showlines,emptylines,gobble,name,^^A
+%   \string\lstname,\string\lstlistlistingname,\string\lstlistoflistings,^^A
+%   \string\lstnewenvironment,\string\lstinline,\string\lstinputlisting,lstlisting,^^A
+%   \string\lstloadaspects,\string\lstset,\string\thelstlisting,\string\lstaspectfiles,^^A
+%   inputencoding,delim,moredelim,deletedelim,upquote,numberbychapter,^^A
+%   \string\lstMakeShortInline,\string\lstDeleteShortInline}
+%\lstisaspect[doc]{lstsample,lstxsample}^^A environment
+%\lstisaspect[experimental]{includerangemarker,rangebeginprefix,rangebeginsuffix,rangeendprefix,rangeendsuffix,rangeprefix,rangesuffix}
+%
+%^^A
+%^^A  The long awaited beginning of documentation
+%^^A =============================================
+%^^A
+%\newbox\abstractbox
+%\setbox\abstractbox=\vbox{
+%	\begin{abstract}
+%	The \packagename{listings} package is a source code printer for \LaTeX.
+%	You can typeset stand alone files as well as listings with an environment
+%   similar to \texttt{verbatim} as well as you can print code snippets using
+%   a command similar to |\verb|.
+%	Many parameters control the output and if your preferred programming
+%   language isn't already supported, you can make your own definition.
+%	\end{abstract}}
+%
+% \title{\vspace*{-2\baselineskip}The \textsf{Listings} Package}
+% \author{Copyright 1996--2004, Carsten Heinz%
+%    \\ Copyright 2006--2007, Brooks Moses
+%    \\ Copyright 2013--, Jobst Hoffmann
+%    \\ Maintainer: Jobst Hoffmann\thanks{Jobst %
+%       Hoffmann became the maintainer of the \packagename{listings}
+%       package in 2013; see the Preface for details.}~ %
+%    \textless\lstemail\textgreater}
+% \date{2015/06/04\enspace\enspace Version 1.6\ \box\abstractbox}
+% \def\lstemail{\href{mailto:j.hoffmann@fh-aachen.de}{\texttt{j.hoffmann(at)fh-aachen.de}}}
+% \ifhyper
+%    \hypersetup{pdfsubject=Package guide,pdfauthor=Jobst Hoffmann <j.hoffmann(at)fh-aachen.de>}
+% \fi
+%
+% \csname @twocolumntrue\endcsname
+% \maketitle
+%^^A \enlargethispage{2\baselineskip}
+% \csname @starttoc\endcsname{toc}
+% \onecolumn
+%
+%
+% \section*{Preface}
+%
+% \paragraph{Transition of package maintenance}
+% The \TeX\ world lost contact with Carsten Heinz in late 2004, shortly after
+% he released version 1.3b of the \packagename{listings} package.  After many
+% attempts to reach him had failed, Hendri Adriaens took over maintenance of
+% the package in accordance with the LPPL's procedure for abandoned packages.
+% He then passed the maintainership of the package to Brooks Moses, who had
+% volunteered for the position while this procedure was going through. The
+% result is known as listings version 1.4.
+%
+% This release, version 1.5, is a minor maintenance release since
+% I accepted maintainership of the package.  I would like to thank Stephan
+% Hennig who supported the Lua language definitions. He is the one who
+% asked for the integration of a new language and gave the impetus to me to
+% become the maintainer of this package.
+%
+%
+% \paragraph{News and changes}
+% Version 1.5 is the fifth bugfix release.  There are no changes
+% in this version, but two extensions: support of modern Fortran (2003,
+% 2008) and Lua.
+%
+%
+% \vfill
+% \paragraph{Thanks}
+% There are many people I have to thank for fruitful communication, posting
+% their ideas, giving error reports, adding programming languages to
+% \texttt{lstdrvrs.dtx}, and so on. Their names are listed in section
+% \ref{uClosingAndCredits}.
+%
+% \paragraph{Trademarks}
+% Trademarks appear throughout this documentation without any trademark
+% symbol; they are the property of their respective trademark owner.
+% There is no intention of infringement; the usage is to the benefit of the
+% trademark owner.
+%
+%
+% \clearpage
+%
+%
+% \part{User's guide}
+%
+%
+% \section{Getting started}\label{uGettingStarted}
+%
+%
+% \subsection{A minimal file}\label{uAMinimalFile}
+%
+% Before using the \packagename{listings} package, you should be familiar with
+% the \LaTeX\ typesetting system. You need not to be an expert.
+% Here is a minimal file for \packagename{listings}.
+% \begin{verbatim}
+%    \documentclass{article}
+%    \usepackage{listings}
+%
+%    \begin{document}
+%    \lstset{language=Pascal}
+%
+%      % Insert Pascal examples here.
+%
+%    \end{document}\end{verbatim}
+% Now type in this first example and run it through \LaTeX.
+% \begin{advise}
+% \item Must I do that really?
+%       \advisespace
+%       Yes and no. Some books about programming say this is good.
+%       What a mistake! Typing takes time---which is wasted if the code is clear to
+%       you. And if you need that time to understand what is going on, the
+%       author of the book should reconsider the concept of presenting the
+%       crucial things---you might want to say that about this guide even---or
+%       you're simply inexperienced with programming. If only the latter case
+%       applies, you should spend more time on reading (good) books about
+%       programming, (good) documentations, and (good) source code from other
+%       people. Of course you should also make your own experiments.
+%       You will learn a lot. However, running the example through \LaTeX\
+%       shows whether the \packagename{listings} package is installed correctly.
+% \item The example doesn't work.
+%       \advisespace
+%       Are the two packages \packagename{listings} and \packagename{keyval}
+%       installed on your system? Consult the administration tool of your
+%       \TeX\ distribution, your system administrator, the local \TeX\ and
+%       \LaTeX\ guides, a \TeX\ FAQ, and section \ref{rInstallation}---in
+%       that order. If you've checked \emph{all} these sources and are
+%       still helpless, you might want to write a post to a \TeX\ newsgroup
+%       like \texttt{comp.text.tex}.
+% \item Should I read the software license before using the package?
+%       \advisespace
+%       Yes, but read this \emph{Getting started} section first to decide
+%       whether you are willing to use the package.^^A ;-)
+% \end{advise}
+%
+%
+% \subsection{Typesetting listings}
+%
+% Three types of source codes are supported: code snippets, code segments, and
+% listings of stand alone files.  Snippets are placed inside paragraphs and the
+% others as separate paragraphs---the difference is the same as between text
+% style and display style formulas.
+% \begin{advise}
+% \item No matter what kind of source you have, if a listing contains national
+%       characters like \'e, \L, \"a, or whatever, you must tell the
+%       package about it! Section \lstref{uSpecialCharacters} discusses this issue.
+% \end{advise}
+%
+% \paragraph{Code snippets}
+% The well-known \LaTeX\ command |\verb| typesets code snippets verbatim.
+% The new command |\lstinline| pretty-prints the code, for example
+%`\lstinline!var i:integer;!' is typeset by
+%`{\rstyle|\lstinline|}|!var i:integer;!|'. The exclamation marks delimit
+% the code and can be replaced by any character not in the code;
+% |\lstinline$var i:integer;$| gives the same result.
+%
+% \paragraph{Displayed code}
+% The \texttt{lstlisting} environment typesets the enclosed source code. Like
+% most examples, the following one shows verbatim \LaTeX\ code on the right
+% and the result on the left. You might take the right-hand side, put it into
+% the minimal file, and run it through \LaTeX.
+% \begin{lstsample}[lstlisting]{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% It can't be easier.
+% \begin{advise}
+% \item That's not true. The name `\texttt{listing}' is shorter.
+%       \advisespace
+%       Indeed. But other packages already define environments with that name.
+%       To be compatible with such packages, all commands and environments of
+%       the \packagename{listings} package use the prefix `\texttt{lst}'.
+% \end{advise}
+% The environment provides an optional argument. It tells the package to
+% perform special tasks, for example, to print only the lines 2--5:
+% \begin{lstsample}{\lstset{frame=trbl,framesep=0pt}\label{gFirstKey=ValueList}}{}
+%    \begin{lstlisting}[firstline=2,
+%                       lastline=5]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item Hold on! Where comes the frame from and what is it good for?
+%       \advisespace
+%       You can put frames around all listings except code snippets.
+%       You will learn how later. The frame shows that empty lines at the end
+%       of listings aren't printed. This is line 5 in the example.
+% \item Hey, you can't drop my empty lines!
+%       \advisespace
+%       You can tell the package not to drop them:
+%       The key `\ikeyname{showlines}' controls these empty lines and is
+%       described in section \ref{rTypesettingListings}. Warning: First
+%       read ahead on how to use keys in general.
+% \item I get obscure error messages when using `\ikeyname{firstline}'.
+%       \advisespace
+%       That shouldn't happen. Make a bug report as described in section
+%       \lstref{uTroubleshooting}.
+% \end{advise}
+%
+% \paragraph{Stand alone files}
+% Finally we come to |\lstinputlisting|, the command used to pretty-print
+% stand alone files. It has one optional and one file name argument.
+% Note that you possibly need to specify the relative path to the file.
+% Here now the result is printed below the verbatim code since both together
+% don't fit the text width.
+% \begin{lstsample}{\lstset{comment=[l]\%,columns=fullflexible}}{\lstset{alsoletter=\\,emph=\\lstinputlisting,emphstyle=\rstyle}\lstaspectindex{\lstinputlisting}{}}
+%    \lstinputlisting[lastline=4]{listings.sty}
+% \end{lstsample}
+% \begin{advise}
+% \item The spacing is different in this example.
+%       \advisespace
+%       Yes. The two previous examples have aligned columns, i.e.~columns with
+%       identical numbers have the same horizontal position---this package
+%       makes small adjustments only. The columns in the example here are not
+%       aligned. This is explained in section \ref{uFixedAndFlexibleColumns}
+%       (keyword: full flexible column format).
+% \end{advise}
+%
+% Now you know all pretty-printing commands and environments. It remains
+% to learn the parameters which control the work of the \packagename{listings}
+% package. This is, however, the main task. Here are some of them.
+%
+%
+% \subsection{Figure out the appearance}\label{gFigureOutTheAppearance}
+%
+% Keywords are typeset bold, comments in italic shape, and spaces in strings
+% appear as \textvisiblespace. You don't like these settings? Look at this:
+%\ifcolor
+% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces]
+%    \lstset{% general command to set parameter(s)
+%        basicstyle=\small,          % print whole listing small
+%        keywordstyle=\color{black}\bfseries\underbar,
+%                                    % underlined bold black keywords
+%        identifierstyle=,           % nothing happens
+%        commentstyle=\color{white}, % white comments
+%        stringstyle=\ttfamily,      % typewriter type for strings
+%        showstringspaces=false}     % no special string spaces
+% \end{lstxsample}
+%\else
+% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces]
+%    \lstset{% general command to set parameter(s)
+%        basicstyle=\small,          % print whole listing small
+%        keywordstyle=\bfseries\underbar,
+%                                    % underlined bold keywords
+%        identifierstyle=,           % nothing happens
+%        commentstyle=\itshape,      % default
+%        stringstyle=\ttfamily,      % typewriter type for strings
+%        showstringspaces=false}     % no special string spaces
+% \end{lstxsample}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+%\ifcolor
+% \begin{advise}
+% \item You've requested white coloured comments, but I can see the comment
+%       on the left side.
+%       \advisespace
+%       There are a couple of possible reasons:
+%       (1) You've printed the documentation on nonwhite paper.
+%       (2) If you are viewing this documentation as a \texttt{.dvi}-file, your
+%           viewer seems to have problems with colour specials. Try to print
+%           the page on white paper.
+%       (3) If a printout on white paper shows the comment, the colour
+%           specials aren't suitable for your printer or printer driver.
+%           Recreate the documentation and try it again---and ensure that
+%           the \packagename{color} package is well-configured.
+% \end{advise}
+%\fi
+% The styles use two different kinds of commands. |\ttfamily| and |\bfseries|
+% both take no arguments but |\underbar| does; it underlines the following
+% argument. In general, the \emph{very last} command may read exactly one
+% argument, namely some material the package typesets. There's one exception.
+% The last command of \ikeyname{basicstyle} \emph{must not} read any
+% tokens---or you will get deep in trouble.
+% \begin{advise}
+% \item `|basicstyle=\small|' looks fine, but comments look really bad with
+%       `|commentstyle=\tiny|' and empty basic style, say.
+%       \advisespace
+%       Don't use different font sizes in a single listing.
+% \item But I really want it!
+%       \advisespace
+%       No, you don't.
+%^^A       The package adjusts internal data after selecting the basic style at
+%^^A       the beginning of each listing. This is a problem if you change the
+%^^A       font size for comments or strings, for example.
+%^^A       Section \ref{rColumnAlignment} shows how to overcome this.
+%^^A       But once again: Don't use different font sizes in a single listing
+%^^A       unless you really know what you are doing.
+% \end{advise}
+%
+% \paragraph{Warning}\label{wStrikingStyles}
+% You should be very careful with striking styles; the recent example is rather
+% moderate---it can get horrible. \emph{Always use decent highlighting.}
+% Unfortunately it is difficult to give more recommendations since they depend
+% on the type of document you're creating. Slides or other presentations often
+% require more striking styles than books, for example.
+% In the end, it's \emph{you} who have to find the golden mean!
+%
+%
+% \subsection{Seduce to use}\label{gSeduceToUse}
+%
+% You know all pretty-printing commands and some main parameters. Here now
+% comes a small and incomplete overview of other features. The table of
+% contents and the index also provide information.
+%
+% \paragraph{Line numbers}
+% are available for all displayed listings, e.g.~tiny numbers on the left, each
+% second line, with 5pt distance to the listing:
+% \begin{lstxsample}[numbers,numberstyle,stepnumber,numbersep]
+%    \lstset{numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item I can't get rid of line numbers in subsequent listings.
+%       \advisespace
+%       `|numbers=none|' turns them off.
+% \item Can I use these keys in the optional arguments?
+%       \advisespace
+%       Of course. Note that optional arguments modify values for one
+%       particular listing only: you change the appearance, step or distance
+%       of line numbers for a single listing. The previous values are
+%       restored afterwards.
+% \end{advise}
+% The environment allows you to interrupt your listings: you can end a listing
+% and continue it later with the correct line number even if there are other
+% listings in between. Read section \ref{uLineNumbers} for a thorough
+% discussion.
+%
+% \paragraph{Floating listings}
+% Displayed listings may float:
+% \begin{lstsample}{\lstset{frame=tb}}{}
+%    \begin{lstlisting}[float,caption=A floating example]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% Don't care about the parameter \ikeyname{caption} now. And if you put the
+% example into the minimal file and run it through \LaTeX, please don't wonder:
+% you'll miss the horizontal rules since they are described elsewhere.
+% \begin{advise}
+% \item \LaTeX's float mechanism allows one to determine the placement of floats.
+%       How can I do that with these?
+%       \advisespace
+%       You can write `|float=tp|', for example.
+% \end{advise}
+%
+% \paragraph{Other features}
+% There are still features not mentioned so far: automatic breaking of long
+% lines, the possibility to use \LaTeX\ code in listings, automated indexing,
+% or personal language definitions.
+% One more little teaser? Here you are. But note that the result is not
+% produced by the \LaTeX\ code on the right alone. The main parameter is
+% hidden.
+% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{}
+%    \begin{lstlisting}
+%    if (i<=0) then i := 1;
+%    if (i>=0) then i := 0;
+%    if (i<>0) then i := 0;
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% You're not sure whether you should use \packagename{listings}?
+% Read the next section!
+%
+%
+% \subsection{Alternatives}
+%
+% \begin{advise}
+% \item Why do you list alternatives?
+%       \advisespace
+%       Well, it's always good to know the competitors.^^A :-)
+% \item I've read the descriptions below and the \packagename{listings} package
+%       seems to incorporate all the features. Why should I use one of the
+%       other programs?
+%       \advisespace
+%       Firstly, the descriptions give a taste and not a complete overview,
+%       secondly, \packagename{listings} lacks some properties, and, ultimately,
+%       you should use the program matching your needs most precisely.
+% \end{advise}
+% This package is certainly not the final utility for typesetting source code.
+% Other programs do their job very well, if you are not satisfied with
+% \packagename{listings}. Some are independent of \LaTeX, others come as
+% separate program plus \LaTeX\ package, and others are packages which
+% don't pretty-print the source code. The second type includes converters,
+% cross compilers, and preprocessors. Such programs create \LaTeX\ files
+% you can use in your document or stand alone ready-to-run \LaTeX\ files.
+%
+% Note that I'm not dealing with any literate programming tools here, which
+% could also be alternatives. However, you should have heard of the
+% \texttt{WEB} system, the tool Prof.~Donald E.~Knuth developed and made use
+% of to document and implement \TeX.
+%
+% \paragraph{\href{http://www.infres.enst.fr/~demaille/a2ps}{\packagename{a2ps}}}
+% started as `ASCII to PostScript' converter, but today you can invoke the
+% program with \texttt{--pretty-print=}\meta{language} option. If your
+% favourite programming language is not already supported, you can write your
+% own so-called style sheet. You can request line numbers, borders, headers,
+% multiple pages per sheet, and many more. You can even print symbols like
+% $\forall$ or $\alpha$ instead of their verbose forms. If you just want
+% program listings and not a document with some listings, this is the best
+% choice.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/nonfree/support/lgrind}{\packagename{LGrind}}}
+% is a cross compiler and comes with many predefined programming languages.
+% For example, you can put the code on the right in your document, invoke
+% \packagename{LGrind} with \texttt{-e} option (and file names), and run the
+% created file through \LaTeX. You should get a result similar to the
+% left-hand side:
+% \begin{center}
+% \begin{minipage}{0.45\linewidth}
+%\iflgrind
+%    \LGindent=0pt
+%    \LGinlinefalse\LGbegin\lgrinde
+%    \L{\LB{\K{for}_\V{i}:=\V{maxint}_\K{to}_\N{0}_\K{do}}}
+%    \L{\LB{\K{begin}}}
+%    \L{\LB{____\C{}\{_do_nothing_\}\CE{}}}
+%    \L{\LB{\K{end};}}
+%    \L{\LB{}}
+%    \L{\LB{\V{Write}(\S{}{'}Case_insensitive_{'}\SE{});}}
+%    \L{\LB{\V{WritE}(\S{}{'}Pascal_keywords.{'}\SE{});}}
+%    \endlgrinde\LGend
+%\else
+%    \packagename{LGrind} not installed.
+%\fi
+% \end{minipage}
+% \begin{minipage}{0.45\linewidth}
+% \begin{verbatim}
+% %[
+% for i:=maxint to 0 do
+% begin
+%     { do nothing }
+% end;
+%
+% Write('Case insensitive ');
+% WritE('Pascal keywords.');
+% %]\end{verbatim}
+% \end{minipage}
+% \end{center}
+% If you use |%(| and |%)| instead of |%[| and |%]|, you get a code snippet
+% instead of a displayed listing. Moreover you can get line numbers to the
+% left or right, use arbitrary \LaTeX\ code in the source code, print symbols
+% instead of verbose names, make font setup, and more. You will (have to)
+% like it (if you don't like \packagename{listings}).
+%
+% Note that \packagename{LGrind} contains code with a no-sell license and is
+% thus nonfree software.
+%
+% \paragraph{\href{ftp://axp3.sv.fh-mannheim.de/cvt2latex}{\packagename{cvt2ltx}}}
+% is a family of `source code to \LaTeX' converters for C, Objective C, \Cpp,
+% IDL and Perl. Different styles, line numbers and other qualifiers can be
+% chosen by command-line option. Unfortunately it isn't documented how other
+% programming languages can be added.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/support/C++2LaTeX-1_1pl1}{\packagename{\Cpp2\LaTeX}}}
+% is a C/\Cpp\ to \LaTeX\ converter. You can specify the fonts for comments,
+% directives, keywords, and strings, or the size of a tabulator. But as far as
+% I know you can't number lines.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/support/slatex}{\packagename{S\LaTeX}}}
+% is a pretty-printing Scheme program (which invokes \LaTeX\ automatically)
+% especially designed for Scheme and other Lisp dialects. It supports stand
+% alone files, text and display listings, and you can even nest the
+% commands/environments if you use \LaTeX\ code in comments, for example.
+% Keywords, constants, variables, and symbols are definable and use of
+% different styles is possible. No line numbers.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/support/tiny_c2l}{\packagename{tiny\textunderscore c2ltx}}}
+% is a C/\Cpp/Java to \LaTeX\ converter based on \packagename{cvt2ltx} (or the
+% other way round?). It supports line numbers, block comments, \LaTeX\ code
+% in/as comments, and smart line breaking. Font selection and tabulators are
+% hard-coded, i.e.~you have to rebuild the program if you want to change the
+% appearance.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/misc}{\packagename{listing}}}
+% ---note the missing \packagename{s}---is not a pretty-printer and the
+% aphorism about documentation at the end of \texttt{listing.sty} is not
+% true.\space ^^A :-)
+% It defines |\listoflistings| and a nonfloating environment for listings.
+% All font selection and indention must be done by hand. However, it's
+% useful if you have another tool doing that work, e.g.~\packagename{LGrind}.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/alg}{\packagename{alg}}}
+% provides essentially the same functionality as \packagename{algorithms}.
+% So read the next paragraph and note that the syntax will be different.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/algorithms}{\packagename{algorithms}}}
+% goes a quite different way. You describe an algorithm and the package
+% formats it, for example
+% \begin{center}
+% \begin{minipage}{0.45\linewidth}
+%\ifalgorithmicpkg
+%    \begin{algorithmic}
+%    \IF {$i\leq0$}
+%    \STATE $i\gets1$
+%    \ELSE\IF {$i\geq0$}
+%    \STATE $i\gets0$
+%    \ENDIF\ENDIF
+%    \end{algorithmic}
+%\else
+%    \packagename{algorithms} not installed.
+%\fi
+% \end{minipage}
+% \begin{minipage}{0.45\linewidth}
+% \begin{verbatim}
+%\begin{algorithmic}
+%\IF{$i\leq0$}
+%\STATE $i\gets1$
+%\ELSE\IF{$i\geq0$}
+%\STATE $i\gets0$
+%\ENDIF\ENDIF
+%\end{algorithmic}\end{verbatim}
+% \end{minipage}
+% \end{center}
+% As this example shows, you get a good looking algorithm even from a bad
+% looking input. The package provides a lot more constructs like |for|-loops,
+% |while|-loops, or comments. You can request line numbers, `ruled', `boxed'
+% and floating algorithms, a list of algorithms, and you can customize the
+% terms \textbf{if}, \textbf{then}, and so on.
+%
+% \paragraph{\href{http://www.mimuw.edu.pl/~wolinski/pretprin.html}{\packagename{pretprin}}}
+% is a package for pretty-printing texts in formal languages---as the title
+% in TUGboat, Volume 19 (1998), No.~3 states. It provides environments which
+% pretty-print \emph{and} format the source code. Analyzers for Pascal and
+% Prolog are defined; adding other languages is easy---if you are or get a bit
+% familiar with automatons and formal languages.
+%
+% \paragraph{\packagename{alltt}}
+% defines an environment similar to \texttt{verbatim} except that |\|, |{| and
+% |}| have their usual meanings. This means that you can use commands in the
+% verbatims, e.g.~select different fonts or enter math mode.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/moreverb}{\packagename{moreverb}}}
+% requires \packagename{verbatim} and provides verbatim output to a file,
+% `boxed' verbatims and line numbers.
+%
+% \paragraph{\packagename{verbatim}}
+% defines an improved version of the standard \texttt{verbatim} environment and
+% a command to input files verbatim.
+%
+% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/fancyvrb}{\packagename{fancyvrb}}}
+% is, roughly speaking, a superset of \packagename{alltt},
+% \packagename{moreverb}, and \packagename{verbatim}, but many more parameters
+% control the output. The package provides frames, line numbers on the left or
+% on the right, automatic line breaking (difficult), and more. For example, an
+% interface to \packagename{listings} exists, i.e.~you can pretty-print source
+% code automatically.
+% The package \packagename{fvrb-ex} builds on \packagename{fancyvrb} and
+% defines environments to present examples similar to the ones in this guide.
+%
+%
+% \section{The next steps}\label{uTheNextSteps}
+%
+% Now, before actually using the \packagename{listings} package, you should
+% \emph{really} read the software license. It does not cost much time and
+% provides information you probably need to know.
+%
+%
+% \subsection{Software license}\label{uSoftwareLicense}
+%
+% The files \texttt{listings.dtx} and \texttt{listings.ins} and all
+% files generated from only these two files are referred to as `the
+% \packagename{listings} package' or simply `the package'.
+% \texttt{lstdrvrs.dtx} and the files generated from that file are
+% `drivers'.
+%
+% \paragraph{Copyright}
+%   The \packagename{listings} package is copyright 1996--2004 Carsten Heinz,
+%   and copyright 2006 Brooks Moses.  The drivers are copyright any individual
+%   author listed in the driver files.
+%
+% \paragraph{Distribution and modification}
+%   The \packagename{listings} package and its drivers may be distributed
+%   and/or modified under the conditions of the LaTeX Project Public License,
+%   either version 1.3 of this license or (at your option) any later version.
+%   The latest version of this license is in
+%      \href{http://www.latex-project.org/lppl.txt}{http://www.latex-project.org/lppl.txt}
+%   and version 1.3 or later is part of all distributions of LaTeX version
+%  2003/12/01 or later.
+%
+% \paragraph{Contacts}
+%   Read section \lstref{uTroubleshooting} on how to submit a bug report.
+%   Send all other comments, ideas, and additional programming languages to
+%   \lstemail\ using \texttt{listings} as part of the subject.
+%
+%
+% \subsection{Package loading}\label{uPackageLoading}
+%
+% As usual in \LaTeX, the package is loaded by
+%    |\usepackage[|\meta{options}|]{listings}|,
+% where |[|\meta{options}|]| is optional and gives a comma separated list of
+% options. Each either loads an additional \packagename{listings} aspect, or
+% changes default properties. Usually you don't have to take care of such
+% options. But in some cases it could be necessary: if you want to compile
+% documents created with an earlier version of this package or if you use
+% special features. Here's an incomplete list of possible options.
+% \begin{advise}
+% \item Where is a list of all of the options?
+%       \advisespace
+%       In the developer's guide since they were introduced to debug the
+%       package more easily. Read section \ref{uHowTos} on how to get that
+%       guide.
+% \end{advise}
+% \begin{description}
+% \item[\normalfont\texttt{0.21}]\leavevmode
+%
+%       invokes a compatibility mode for compiling documents written for
+%       \packagename{listings} version 0.21.
+%
+% \item[\normalfont\texttt{draft}]\leavevmode
+%
+%       The package prints no stand alone files, but shows the captions and
+%       defines the corresponding labels.
+%       Note that a global |\documentclass|-option \texttt{draft} is
+%       recognized, so you don't need to repeat it as a package option.
+%
+% \item[\normalfont\texttt{final}]\leavevmode\label{uoption:final}
+%
+%       Overwrites a global \texttt{draft} option.
+%
+% \item[\normalfont\texttt{savemem}]\leavevmode
+%
+%       tries to save some of \TeX's memory. If you switch between languages
+%       often, it could also reduce compile time. But all this depends on the
+%       particular document and its listings.
+% \end{description}
+% Note that various experimental features also need explicit loading via
+% options. Read the respective lines in section \ref{rExperimentalFeatures}.
+%
+% \medbreak
+% After package loading it is recommend to load all used dialects of programming
+% languages with the following command. It is faster to load several languages
+% with one command than loading each language on demand.
+% \begin{syntax}
+% \item {\rstyle\icmdname\lstloadlanguages}\marg{comma separated list of languages}
+%
+%       Each language is of the form \oarg{dialect}\meta{language}. Without
+%       the optional \oarg{dialect} the package loads a default dialect. So
+%       write `|[Visual]C++|' if you want Visual \Cpp\ and `|[ISO]C++|' for
+%       ISO \Cpp. Both together can be loaded by the command
+%       |\lstloadlanguages{[Visual]C++,[ISO]C++}|.
+%
+%       Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages}
+%       shows all defined languages and their dialects.
+% \end{syntax}
+%^^A After or even before language loading, you might want to define default
+%^^A dialects---just to be independent of configuration files.
+%
+%
+% \subsection{The key=value interface}\label{uTheKey=ValueInterface}
+%
+% This package uses the \packagename{keyval} package from the
+% \packagename{graphics} bundle by David Carlisle. Each parameter is
+% controlled by an associated key and a user supplied value. For example,
+% \ikeyname{firstline} is a key and |2| a valid value for this key.
+%
+% The command {\rstyle\icmdname\lstset} gets a comma separated list of
+% ``key|=|value'' pairs. The first list with more than a single entry is on
+% page \pageref{gFirstKey=ValueList}: |firstline=2,lastline=5|.
+% \begin{advise}
+% \item So I can write `|\lstset{firstline=2,lastline=5}|' once for all?
+%       \advisespace
+%       No. `\ikeyname{firstline}' and `\ikeyname{lastline}' belong to a small
+%       set of
+%       keys which are only used on individual listings. However, your command is
+%       not illegal---it has no effect. You have to use these keys inside the
+%       optional argument of the environment or input command.
+% \item What's about a better example of a key|=|value list?
+%       \advisespace
+%       There is one in section \ref{gFigureOutTheAppearance}.
+% \item `|language=[77]Fortran|' does not work inside an optional argument.
+%       \advisespace
+%       You must put braces around the value if a value with optional argument
+%       is used inside an optional argument. In the case here write
+%       `|language={[77]Fortran}|' to select Fortran 77.
+% \item If I use the `\ikeyname{language}' key inside an optional argument, the
+%       language isn't active when I typeset the next listing.
+%       \advisespace
+%       All parameters set via `|\lstset|' keep their values up to the end of
+%       the current environment or group. Afterwards the previous values are
+%       restored. The optional parameters of the two pretty-printing commands
+%       and the `\texttt{lstlisting}' environment take effect on the particular
+%       listing only, i.e.~values are restored immediately. For example, you
+%       can select a main language and change it for special listings.
+% \item \icmdname\lstinline\ has an optional argument?
+%       \advisespace
+%       Yes. And from this fact comes a limitation: you can't use the left
+%       bracket `|[|' as delimiter unless you specify at least an empty
+%       optional argument as in `|\lstinline[][var i:integer;[|'.
+%       If you forget this, you will either get a ``runaway argument'' error
+%       from \TeX, or an error message from the \packagename{keyval} package.
+% \end{advise}
+%
+%
+% \subsection{Programming languages}\label{uProgrammingLanguages}
+%
+% You already know how to activate programming languages---at least Pascal.
+% An optional parameter selects particular dialects of a language. For example,
+% |language=[77]Fortran| selects Fortran 77 and |language=[XSC]Pascal| does the
+% same for Pascal XSC. The general form is
+%    {\rstyle\ikeyname{language}}|=|\oarg{dialect}\meta{language}.
+% If you want to get rid of keyword, comment, and string detection, use
+% |language={}| as an argument to |\lstset| or as optional argument.
+%
+% Table \ref{uPredefinedLanguages} shows all predefined languages and dialects.
+% Use the listed names as \meta{language} and \meta{dialect}, respectively. If
+% no dialect or `empty' is given in the table, just don't specify a dialect.
+% Each underlined dialect is default; it is selected if you leave out
+% the optional argument. The predefined defaults are the newest language
+% versions or standard dialects.
+%^^A
+%^^A  Make table of predefined languages.
+%^^A
+%\let\lstlanguages\empty
+%\makeatletter
+%\@for\lst@temp:={lstlang1.sty,lstlang2.sty,lstlang3.sty}\do
+%    {\IfFileExists\lst@temp{}{\let\lstlanguages\relax}}
+%\makeatother
+%\ifx\lstlanguages\relax
+%    \PackageWarningNoLine{Listings}
+%        {Standard drivers not available.\MessageBreak
+%         Please check your installation.\MessageBreak
+%         Compilation aborted}
+%    \csname @@end\expandafter\endcsname
+%\fi
+%\lstscanlanguages\lstlanguages{lstlang1.sty,lstlang2.sty,lstlang3.sty}{}^^A
+%\def\topfigrule{\hrule\kern-0.4pt\relax}^^A
+%\let\botfigrule\topfigrule
+%\belowcaptionskip=\smallskipamount
+% \begin{table}[tbhp]
+% \small
+% \caption{Predefined languages.
+%          Note that some definitions are preliminary, for example HTML and XML.
+%          Each underlined dialect is the default dialect.}^^A
+%          \label{uPredefinedLanguages}^^A
+% \makeatletter
+% \setbox\@tempboxa\hbox{^^A
+%    \InputIfFileExists{listings.cfg}{\lst@InputCatcodes}{}}^^A
+% \lstprintlanguages\lstlanguages
+% \end{table}
+%^^A
+%^^A end of table
+%^^A
+%\lstset{defaultdialect=[doc]Pascal}^^A restore
+% \begin{advise}
+% \item How can I define default dialects?
+%       \advisespace
+%       Check section \ref{rLanguagesAndStyles} for `\keyname{defaultdialect}'.
+% \item I have C code mixed with assembler lines. Can \packagename{listings}
+%       pretty-print such source code, i.e.~highlight keywords and comments of
+%       both languages?
+%       \advisespace
+%       `\ikeyname{alsolanguage}|=|\oarg{dialect}\meta{language}' selects a
+%       language additionally to the active one. So you only have to write a
+%       language definition for your assembler dialect, which doesn't interfere
+%       with the definition of C, say. Moreover you might want to use the key
+%       `\keyname{classoffset}' described in section \ref{rLanguagesAndStyles}.
+% \item How can I define my own language?
+%       \advisespace
+%       This is discussed in section \ref{rLanguageDefinitions}. And if you
+%       think that other people could benefit by your definition, you might
+%       want to send it to the address in section \ref{uSoftwareLicense}.
+%       Then it will be published under the \LaTeX\ Project Public License.
+% \end{advise}
+% Note that the arguments \meta{language} and \meta{dialect} are case
+% insensitive and that spaces have no effect.
+%
+% There is at least one language (VDM, Vienna Development Language,
+% \url{http://www.vdmportal.org}) which is not directly supported by the
+% \packagename{listings} package. It needs a package for its own:
+% \packagename{vdmlisting}. On the other hand \packagename{vdmlisting} uses
+% the \packagename{listings} package and so it should be mentioned in this
+% context.
+%
+%
+% \subsubsection{Preferences}\label{uPreferences}
+%
+% Sometimes authors of language support provide their own configuration
+% preferences. These may come either from their personal experience or
+% from the settings in an IDE and can be defined as a \packagename{listings}
+% style. From version 1.5b of the \packagename{listings} package on these
+% styles are provided as files with the name
+% |listings-|\meta{language}|.prf|, \meta{language} is the name of the
+% supported programming language in lowercase letters.
+%
+% So if an user of the \packagename{listings} package wants to use these
+% preferences, she/he can say for example when using Python
+% \begin{quote}
+%     |\input{listings-python.prf}|
+% \end{quote}
+% at the end of her/his |listings.cfg| configuration file as long as the
+% file |listings-python.prf| resides in the \TeX{} search path. Of course
+% that file can be changed according to the user's preferences.
+%
+% At the moment there are five such preferences files:
+% \begin{enumerate}
+%   \item |listings-acm.prf|
+%   \item |listings-bash.prf|
+%   \item |listings-fortran.prf|
+%   \item |listings-lua.prf|
+%   \item |listings-python.prf|
+% \end{enumerate}
+% All contributors are invited to supply more personal preferences.
+%
+%
+% \subsection{Special characters}\label{uSpecialCharacters}
+%
+%
+% \paragraph{Tabulators}
+% You might get unexpected output if your sources contain tabulators.
+% The package assumes tabulator stops at columns 9, 17, 25, 33, and so on.
+% This is predefined via |tabsize=8|. If you change the eight to the number
+% $n$, you will get tabulator stops at columns $n+1,2n+1,3n+1,$ and so on.
+% \begin{lstsample}[tabsize]{}{}
+%    \lstset{tabsize=2}
+%    \begin{lstlisting}
+%    123456789
+%    	{ one tabulator }
+%    		{ two tabs }
+%    123		{ 123 + two tabs }
+%    \end{lstlisting}
+% \end{lstsample}
+% For better illustration, the left-hand side uses |tabsize=2| but the verbatim
+% code |tabsize=4|. Note that |\lstset| modifies the values for all following
+% listings in the same environment or group. This is no problem here since the
+% examples are typeset inside minipages. If you want to change settings for a
+% single listing, use the optional argument.
+%
+%
+% \paragraph{Visible tabulators and spaces}
+% One can make spaces and tabulators visible:
+% \begin{lstsample}[showspaces,showtabs,tab]{}{}
+%    \lstset{showspaces=true,
+%            showtabs=true,
+%            tab=\rightarrowfill}
+%    \begin{lstlisting}
+%        for i:=maxint to 0 do
+%        begin
+%    	{ do nothing }
+%        end;
+%    \end{lstlisting}
+% \end{lstsample}
+% If you request \ikeyname{showspaces} but no \ikeyname{showtabs},
+% tabulators are converted to visible spaces.
+% The default definition of \ikeyname{tab} produces a `wide visible space'
+% \lstinline[showtabs]!	!. So you might want to use |$\to$|, |$\dashv$|
+% or something else instead.
+% \begin{advise}
+% \item Some sort of advice: (1) You should really indent lines of source code
+%       to make listings more readable. (2) Don't indent some lines with
+%       spaces and others via tabulators. Changing the tabulator size (of your
+%       editor or pretty-printing tool) completely disturbs the columns.
+%       (3) As a consequence, never share your files with differently tab sized
+%       people!^^A true only if you use tabulators, just :-)
+% \item To make the \LaTeX\ code more readable, I indent the environments'
+%       program listings. How can I remove that indention in the output?
+%       \advisespace
+%       Read `How to gobble characters' in section \ref{uHowTos}.
+% \end{advise}
+%
+%
+% \paragraph{Form feeds}
+% Another special character is a form feed causing an empty line by default.
+% {\rstyle\ikeyname{formfeed}}|=\newpage| would result in a new page every
+% form feed. Please note that such definitions (even the default) might get
+% in conflict with frames.
+%
+%
+% \paragraph{National characters}
+% If you type in such characters directly as characters of codes 128--255 and
+% use them also in listings, let the package know it---or you'll get really
+% funny results. {\rstyle\ikeyname{extendedchars}}|=true| allows and
+% |extendedchars=false| prohibits \packagename{listings} from handling
+% extended characters in listings. If you use them, you should load
+% \packagename{fontenc}, \packagename{inputenc} and/or
+% any other package which defines the characters.
+% \begin{advise}
+% \item I have problems using \packagename{inputenc} together with
+%       \packagename{listings}.
+%       \advisespace
+%       This could be a compatibility problem. Make a bug report as described
+%       in section \lstref{uTroubleshooting}.
+% \end{advise}
+% The extended characters don't cover Arabic, Chinese, Hebrew, Japanese, and so
+% on---specifically, any encoding which uses multiple bytes per character.
+%
+% Thus, if you use the a package that supports multibyte characters, such as
+% the \packagename{CJK} or \packagename {ucs} packages for Chinese and
+% UTF-8 characters, you must avoid letting \packagename{listings}
+% process the extended characters.  It is generally best to also specify
+% |extendedchars=false| to avoid having \packagename{listings} get entangled
+% in the other package's extended-character treatment.
+%
+% If you do have a listing contained within a CJK environment, and want to have
+% CJK characters inside the listing, you can place them within a comment that
+% escapes to \LaTeX -- see section \ref{rEscapingToLaTeX} for how to do that.
+% (If the listing is not inside a CJK environment, you can simply put a small
+% CJK environment within the escaped-to-\LaTeX portion of the comment.)
+%
+% Similarly, if you are using UTF-8 extended characters in a listing, they must
+% be placed within an escape to \LaTeX.
+%
+% Also, section \ref{uNationalCharacters} has a few details on how to work with
+% extended characters in the context of $\Lambda$.
+%
+%
+% \subsection{Line numbers}\label{uLineNumbers}
+%
+% You already know the keys \ikeyname{numbers}, \ikeyname{numberstyle},
+% \ikeyname{stepnumber}, and \ikeyname{numbersep} from section
+% \ref{gSeduceToUse}. Here now we deal with continued listings.
+% You have two options to get consistent line numbering across listings.
+%
+% \begin{lstsample}[firstnumber]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{}
+%    \begin{lstlisting}[firstnumber=100]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    \end{lstlisting}
+%    And we continue the listing:
+%    \begin{lstlisting}[firstnumber=last]
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% In the example, \ikeyname{firstnumber} is initially set to 100; some lines
+% later the value is \texttt{last}, which continues the numbering of the last
+% listing. Note that the empty line at the end of the first part is not printed
+% here, but it counts for line numbering. You should also notice that you can
+% write |\lstset{firstnumber=last}| once and get consecutively numbered code
+% lines---except you specify something different for a particular listing.
+%
+% On the other hand you can use |firstnumber=auto| and name your listings.
+% Listings with identical names (case sensitive!) share a line counter.
+% \begin{lstsample}[name]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{}
+%    \begin{lstlisting}[name=Test]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%
+%    \end{lstlisting}
+%    And we continue the listing:
+%    \begin{lstlisting}[name=Test]
+%    Write('Case insensitive ');
+%    WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% The next |Test| listing goes on with line number {\makeatletter\lstno@Test},
+% no matter whether there are other listings in between.
+% \begin{advise}
+% \item Okay. And how can I get decreasing line numbers?
+%       \advisespace
+%       Sorry, what?
+%       \advisespace
+%       Decreasing line numbers as on page \pageref{rDecreasingLabels}.
+%       \advisespace
+%       May I suggest to demonstrate your individuality by other means?
+%       If you differ, you should try a negative `\ikeyname{stepnumber}'
+%       (together with `\ikeyname{firstnumber}').
+% \end{advise}
+%
+% Read section \ref{uHowTos} on how to reference line numbers.
+%
+%
+% \subsection{Layout elements}
+%
+% It's always a good idea to structure the layout by vertical space,
+% horizontal lines, or different type sizes and typefaces. The best to stress
+% whole listings are---not all at once---colours, frames, vertical space, and
+% captions. The latter are also good to refer to listings, of course.
+%
+% \paragraph{Vertical space}
+% The keys {\rstyle\ikeyname{aboveskip}} and {\rstyle\ikeyname{belowskip}}
+% control the vertical space above and below displayed listings. Both keys get
+% a dimension or skip as value and are initialized to |\medskipamount|.
+%
+% \paragraph{Frames}
+% The key \ikeyname{frame} takes the verbose values \keyvalue{none},
+% \keyvalue{leftline}, \keyvalue{topline}, \keyvalue{bottomline},
+% \keyvalue{lines} (top and bottom), \keyvalue{single} for single frames, or
+% \keyvalue{shadowbox}.
+% \begin{lstsample}[frame]{}{}
+%    \begin{lstlisting}[frame=single]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item The rules aren't aligned.
+%       \advisespace
+%       This could be a bug of this package or a problem with your
+%       \texttt{.dvi} driver. \emph{Before} sending a bug report to the package
+%       author, modify the parameters described in section \ref{rFrames}
+%       heavily. And do this step by step!
+%       For example, begin with `|framerule=10mm|'. If the rules are
+%       misaligned by the same (small) amount as before, the problem does not
+%       come from the rule width. So continue with the next parameter.  Also,
+%       Adobe Acrobat sometimes has single-pixel rounding errors which can
+%       cause small misalignments at the corners when PDF files are displayed
+%       on screen; these are unfortunately normal.
+% \end{advise}
+% Alternatively you can control the rules at the \texttt{t}op, \texttt{r}ight,
+% \texttt{b}ottom, and \texttt{l}eft directly by using the four initial letters
+% for single rules and their upper case versions for double rules.
+% \begin{lstsample}[frame]{}{}
+%    \begin{lstlisting}[frame=trBL]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% Note that a corner is drawn if and only if both adjacent rules are requested.
+% You might think that the lines should be drawn up to the edge, but what's
+% about round corners? The key \ikeyname{frameround} must get exactly four
+% characters as value. The first character is attached to the upper right
+% corner and it continues clockwise. `\texttt{t}' as character makes the
+% corresponding corner round.
+% \begin{lstsample}[frameround]{}{}
+%    \lstset{frameround=fttt}
+%    \begin{lstlisting}[frame=trBL]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% Note that \ikeyname{frameround} has been used together with |\lstset| and thus
+% the value affects all following listings in the same group or environment.
+% Since the listing is inside a \texttt{minipage} here, this is no problem.
+% \begin{advise}
+% \item Don't use frames all the time, and in particular not with short listings.
+%       This would emphasize nothing. Use frames for $10\%$ or even less of
+%       your listings, for your most important ones.
+% \item If you use frames on floating listings, do you really want frames?
+%       \advisespace
+%       No, I want to separate floats from text.
+%       \advisespace
+%       Then it is better to redefine \LaTeX's `|\topfigrule|' and
+%       `|\botfigrule|'. For example, you could write
+%       `|\renewcommand*\topfigrule{\hrule\kern-0.4pt\relax}|' and make the
+%       same definition for |\botfigrule|.
+% \end{advise}
+%
+% \paragraph{Captions}
+% Now we come to \ikeyname{caption} and \ikeyname{label}. You might guess
+% (correctly) that they can be used in the same manner as \LaTeX's |\caption|
+% and |\label| commands, although here it is also possible to have a caption
+% regardless of whether or not the listing is in a float:
+% \begin{lstsample}[caption,label]{\lstset{xleftmargin=.05\linewidth}}{}
+%    \begin{lstlisting}[caption={Useless code},label=useless]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% Afterwards you could refer to the listing via |\ref{useless}|. By default
+% such a listing gets an entry in the list of listings, which can be printed
+% with the command {\rstyle\icmdname\lstlistoflistings}. The key
+% {\rstyle\ikeyname{nolol}} suppresses an entry for both the environment or
+% the input command. Moreover, you can specify a short caption for the list
+% of listings:
+%    \keyname{caption}|={|\oarg{short}\meta{long}|}|.
+% Note that the whole value is enclosed in braces since an optional value is
+% used in an optional argument.
+%
+% If you don't want the label \texttt{\lstlistingname} plus number, you should
+% use \ikeyname{title}:
+% \begin{lstsample}[title]{\lstset{xleftmargin=.05\linewidth}}{}
+%    \begin{lstlisting}[title={`Caption' without label}]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item Something goes wrong with `\keyname{title}' in my document: in front of
+%       the title is a delimiter.
+%       \advisespace
+%       The result depends on the document class; some are not compatible.
+%       Contact the package author for a work-around.
+% \end{advise}
+%
+% \paragraph{Colours}
+% One more element. You need the \packagename{color} package and can then
+% request coloured background via
+% \ikeyname{backgroundcolor}|=|\meta{color command}.
+% \begin{advise}
+% \item Great! I love colours.
+%       \advisespace
+%       Fine, yes, really. And I like to remind you of the warning about
+%       striking styles on page \pageref{wStrikingStyles}.
+% \end{advise}
+%\ifcolor
+% \begin{lstxsample}[backgroundcolor]
+%    \lstset{backgroundcolor=\color{yellow}}
+% \end{lstxsample}
+%\else
+% \begin{verbatim}
+%    color package not installed\end{verbatim}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}[frame=single,
+%                       framerule=0pt]
+%    for i:=maxint to 0 do
+%    begin
+%        j:=square(root(i));
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% The example also shows how to get coloured space around the whole listing:
+% use a frame whose rules have no width.
+%
+%
+% \subsection{Emphasize identifiers}\label{uEmphasizeIdentifiers}
+%
+% Recall the pretty-printing commands and environment. |\lstinline| prints
+% code snippets, |\lstinputlisting| whole files, and \texttt{lstlisting}
+% pieces of code which reside in the \LaTeX\ file. And what are these
+% different `types' of source code good for? Well, it just happens that a
+% sentence contains a code fragment. Whole files are typically included in or
+% as an appendix. Nevertheless some books about programming also include such
+% listings in normal text sections---to increase the number of pages.
+% Nowadays source code should be shipped on disk or CD-ROM and only the main
+% header or interface files should be typeset for reference. So, please, don't
+% misuse the \packagename{listings} package. But let's get back to the topic.
+%
+% Obviously `\texttt{lstlisting} source code' isn't used to make an executable
+% program from. Such source code has some kind of educational purpose or even
+% didactic.
+% \begin{advise}
+% \item What's the difference between educational and didactic?
+%       \advisespace
+%       Something educational can be good or bad, true or false.
+%       Didactic is true by definition.^^A :-)
+% \end{advise}
+% Usually \emph{keywords} are highlighted when the package typesets a piece of
+% source code. This isn't necessary for readers who know the programming
+% language well. The main matter is the presentation of interface, library or
+% other functions or variables. If this is your concern, here come the right
+% keys. Let's say, you want to emphasize the functions |square| and |root|,
+% for example, by underlining them. Then you could do it like this:
+% \begin{lstxsample}[emph,emphstyle]
+%    \lstset{emph={square,root},emphstyle=\underbar}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        j:=square(root(i));
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item Note that the list of identifiers |{square,root}| is enclosed in
+%       braces. Otherwise the \packagename{keyval} package would complain
+%       about an undefined key \keyname{root} since the comma finishes the
+%       key=value pair.
+%       Note also that you \emph{must} put braces around the value if you
+%       use an optional argument of a key inside an optional argument of a
+%       pretty-printing command. Though it is not necessary, the following
+%       example uses these braces. They are typically forgotten when they
+%       become necessary,
+% \end{advise}
+%
+% Both keys have an optional \meta{class number} argument for multiple
+% identifier lists:
+%\ifcolor
+% \begin{lstxsample}[emph,emphstyle]
+%    \lstset{emph={square},      emphstyle=\color{red},
+%            emph={[2]root,base},emphstyle={[2]\color{blue}}}
+% \end{lstxsample}
+%\else
+% \begin{lstxsample}[emph,emphstyle]
+%    \lstset{emph={square},      emphstyle=\underbar,
+%            emph={[2]root,base},emphstyle={[2]\fbox}}
+% \end{lstxsample}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        j:=square(root(i));
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item What is the maximal \meta{class number}?
+%       \advisespace
+%       $2^{31}-1=2\,147\,483\,647$. But \TeX's memory will exceed before you
+%       can define so many different classes.
+% \end{advise}
+%
+% One final hint: Keep the lists of identifiers disjoint. Never use a keyword
+% in an `emphasize' list or one name in two different lists. Even if your
+% source code is highlighted as expected, there is no guarantee that it is
+% still the case if you change the order of your listings or if you use the
+% next release of this package.
+%
+%
+%\iffalse
+% \subsection{*Listing alignment}\label{uListingAlignment}
+%
+% The examples are typeset with centered \texttt{minipage}s. That's the reason
+% why you can't see that line numbers are printed in the margin. Now we
+% separate the minipage margin and the minipage by a vertical rule:
+% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{}
+%    Some text before
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% The listing is lined up with the normal text. The parameter \ikeyname{xleftmargin}
+% moves the listing to the right (or left if the dimension is negative).
+% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{}
+%    Some text before
+%    \begin{lstlisting}[xleftmargin=15pt]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+%
+%    \begin{lstlisting}{ }
+%    Write('Insensitive');
+%    WritE('keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% Note again that optional arguments change settings for single listings.
+%
+% If you use environments like \texttt{itemize} or \texttt{enumerate}, there
+% is `natural' indention coming from these environments. By default the
+% \packagename{listings} package respects this. But you might use
+% |resetmargins=true| (or |false|) to make your own decision. You can use it
+% together with |xleftmargin|, of course.
+% \begin{advise}
+% \item I get heavy overfull |\hbox|es from some listings.
+%       \advisespace
+%       This comes from long lines in your listings. You have some options
+%       to get rid of the overful |\hbox|es. Firstly I recommend to typeset
+%       listings in smaller fonts than the surrounding text, for example
+%       `|basicstyle=\small|'. Secondly you might want to use the flexible
+%       column format. Thirdly you can increase the line width or set it
+%       explicitly, refer section \ref{rMarginsAndLineShape}.
+%       If all this doesn't help, you might want to change
+%       `\ikeyname{basewidth}', but be careful! The two unknown items are
+%       explained in the next section.
+% \end{advise}
+%
+% You might need to control the vertical position of listings with the
+% \ikeyname{boxpos} key, for example, if you use them in \texttt{minipage} or
+% \texttt{tabular} environments. Here `listings' means \texttt{lstlisting} or
+% |\lstinputlisting|. As the following example shows, you can even place such
+% listings inside paragraphs, but you must force the package to do this by
+% enclosing the listing in |\hbox{| and |}|.
+% \begin{advise}
+% \item Is it good form to use the \TeX-primitive `|\hbox|' in a \LaTeX\
+%       document?
+%       \advisespace
+%       No, it's not. But \LaTeX's `|\mbox|' does not work in this example:
+% \end{advise}
+% \begin{lstsample}{}{}
+%    Here are some multi-line listings inside a paragraph.
+%    The `boxpos' key controls their vertical alignment:
+%    \hbox{\begin{lstlisting}[boxpos=c]
+%    center
+%    center
+%    \end{lstlisting}}
+%    \hbox{\begin{lstlisting}[boxpos=b]
+%    bottom baseline
+%    bottom baseline
+%    \end{lstlisting}}
+%    \hbox{\begin{lstlisting}[boxpos=t]
+%    top baseline
+%    top baseline
+%    \end{lstlisting}}
+% \end{lstsample}
+%\fi
+%
+%
+% \subsection{Indexing}\label{uIndexing}
+%
+% Indexing is just like emphasizing identifiers---I mean the usage:
+% \begin{lstxsample}[index]
+%    \lstset{index={square},index={[2]root}}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        j:=square(root(i));
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% Of course, you can't see anything here. You will have to look at the index.
+% \begin{advise}
+% \item Why is the `\ikeyname{index}' key able to work with multiple identifier
+%       lists?
+%       \advisespace
+%       This question is strongly related to the `{\rstyle\ikeyname{indexstyle}}'
+%       key. Someone might want to create multiple indexes or want to insert
+%       prefixes like `|constants|', `|functions|', `|keywords|', and so on.
+%       The `\ikeyname{indexstyle}' key works like the other style keys except
+%       that the last token \emph{must} take an argument, namely the
+%       (printable form of the) current identifier.
+%
+%       You can define `|\newcommand\indexkeywords[1]{\index{keywords, #1}}|'
+%       and make similar definitions for constant or function names. Then
+%       `|indexstyle=[1]\indexkeywords|' might meet your purpose. This becomes
+%       easier if you want to create multiple indexes with the
+%       \href{http://www.ctan.org/tex-archive/macros/latex/contrib/camel}
+%       {\packagename{index}} package.
+%       If you have defined appropriate new indexes, it is possible to write
+%       `|indexstyle=\index[keywords]|', for example.
+%
+% \item Let's say, I want to index all keywords. It would be annoying to
+%       type in all the keywords again, specifically if the used programming
+%       language changes frequently.
+%       \advisespace
+%       Just read ahead.
+% \end{advise}
+% The \ikeyname{index} key has in fact two optional arguments. The first is the
+% well-known \meta{class number}, the second is a comma separated list of other
+% keyword classes whose identifiers are indexed. The indexed identifiers then
+% change automatically with the defined keywords---not automagically, it's not
+% an illusion.^^A :-)
+%
+% Eventually you need to know the names of the keyword classes. It's usually
+% the key name followed by a class number, for example, |emph2|, |emph3|,
+% \ldots, |keywords2| or |index5|. But there is no number for the first order
+% classes |keywords|, |emph|, |directives|, and so on.
+% \begin{advise}
+% \item `|index=[keywords]|' does not work.
+%       \advisespace
+%       The package can't guess which optional argument you mean. Hence you
+%       must specify both if you want to use the second one. You should try
+%       `|index=[1][keywords]|'.
+% \end{advise}
+%
+%
+% \subsection{Fixed and flexible columns}\label{uFixedAndFlexibleColumns}
+%
+% The first thing a reader notices---except different styles for keywords,
+% etc.---is the column alignment. Arne John Glenstrup invented the flexible
+% column format in 1997. Since then some efforts were made to develop this
+% branch farther. Currently four column formats are provided: fixed, flexible,
+% space-flexible, and full flexible. Take a close look at the following
+% examples.
+% \begin{center}
+% \lstset{style={},language={}}
+% \def\sample{\begin{lstlisting}^^J WOMEN\ \ are^^A
+%                               ^^J \ \ \ \ \ \ \ MEN^^A
+%                               ^^J WOMEN are^^A
+%                               ^^J better MEN^^J \end{lstlisting}}
+% \begin{tabular}{@{}c@{\qquad\quad}c@{\qquad\quad}c@{\qquad\quad}c@{}}
+% {\rstyle\ikeyname{columns}}|=| & \texttt{fixed} & \texttt{flexible} & \texttt{fullflexible}\\
+%          & (at {\makeatletter\lst@widthfixed})
+%          & (at {\makeatletter\lst@widthflexible})
+%          & (at {\makeatletter\lst@widthflexible})\\
+% \noalign{\medskip}
+%   \lstset{basicstyle=\ttfamily,basewidth=0.51em}\sample
+% & \lstset{columns=fixed}\sample
+% & \lstset{columns=flexible}\sample
+% & \lstset{columns=fullflexible}\sample
+% \end{tabular}
+% \end{center}
+% \begin{advise}
+% \item Why are women better men?
+%       \advisespace
+%       Do you want to philosophize? Well, have I ever said that the
+%       statement ``women are better men'' is true? I can't even remember this
+%       about ``women are men'' \ldots . ^^A ;-)
+% \end{advise}
+% In the abstract one can say: The fixed column format ruins the spacing
+% intended by the font designer, while the flexible formats ruin the column
+% alignment (possibly) intended by the programmer. Common to all is that the
+% input characters are translated into a sequence of basic output units like
+% \begingroup \lstset{gobble=6,xleftmargin=\leftmargini}
+% \makeatletter
+%^^A  Make \fbox around each output unit.
+% \fboxsep=0pt
+% \def\lst@alloverstyle#1{\fbox{\kern-\fboxrule\strut#1}\kern-\fboxrule}
+% \begin{lstlisting}[basewidth=1em]
+%     if x=y then write('align')
+%            else print('align');
+% \end{lstlisting}
+% Now, the fixed format puts $n$ characters into a box of width $n\times{}
+% $`base width', where the base width is {\makeatletter\lst@widthfixed} in the
+% example. The format shrinks and stretches the space between the characters
+% to make them fit the box. As shown in the example, some character strings look
+%    \hbox to 2em{b\hss a\hss d}
+% or
+%    \hbox to 2em{w\hss o\hss r\hss s\hss e},
+% but the output is vertically aligned.
+% \endgroup
+%
+% If you don't need or like this, you should use a flexible format. All
+% characters are typeset at their natural width. In particular, they never
+% overlap. If a word requires more space than reserved, the rest of the line
+% simply moves to the right. The difference between the three formats is that
+% the full flexible format cares about nothing else, while the normal flexible
+% and space-flexible formats try to fix the column alignment if a character
+% string needs less space than `reserved'.  The normal flexible format will
+% insert make-up space to fix the alignment at spaces, before and after
+% identifiers, and before and after sequences of other characters; the
+% space-flexible format will only insert make-up space by stretching
+% existing spaces.  In the flexible example above, the two MENs are vertically
+% aligned since some space has been inserted in the fourth line to fix the
+% alignment. In the full flexible format, the two MENs are not aligned.
+%
+% Note that both flexible modes printed the two blanks in the first line as a
+% single blank, but for different reasons: the normal flexible format fixes
+% the column alignment (as would the space-flexible format), and the full
+% flexible format doesn't care about the second space.
+%
+%
+% \section{Advanced techniques}\label{uAdvancedTechniques}
+%
+%
+% \subsection{Style definitions}
+%
+% It is obvious that a pretty-printing tool like this requires some kind of
+% language selection and definition. The first has already been described and
+% the latter is convered by the next section. However, it is very convenient
+% to have the same for printing styles: at a central place of your document
+% they can be modified easily and the changes take effect on all listings.
+%
+% Similar to languages,
+%    {\rstyle\ikeyname{style}}|=|\meta{style name}
+% activates a previously defined style. A definition is as easy:
+%    {\rstyle|\lstdefinestyle|}\marg{style name}\marg{key=value list}.
+% Keys not used in such a definition are untouched by the corresponding style
+% selection, of course. For example, you could write
+% \begin{verbatim}
+%   \lstdefinestyle{numbers}
+%       {numbers=left, stepnumber=1, numberstyle=\tiny, numbersep=10pt}
+%   \lstdefinestyle{nonumbers}
+%       {numbers=none}\end{verbatim}
+% and switch from listings with line numbers to listings without ones and vice
+% versa simply by |style=nonumbers| and |style=numbers|, respectively.
+% \begin{advise}
+% \item You could even write
+%           `|\lstdefinestyle{C++}{language=C++,style=numbers}|'.
+%       Style and language names are independent of each other and so might
+%       coincide. Moreover it is possible to activate other styles.
+%
+% \item It's easy to crash the package using styles. Write
+%       '|\lstdefinestyle{crash}{style=crash}|' and '|\lstset{style=crash}|'.
+%       \TeX's capacity will exceed, sorry [parameter stack size]. Only bad
+%       boys use such recursive calls, but only good girls use this package.
+%       Thus the problem is of minor interest.^^A :-)
+% \end{advise}
+%
+%
+% \subsection{Language definitions}\label{uLanguageDefinitions}
+%
+% These are like style definitions except for an optional dialect name and an
+% optional base language---and, of course, a different command name and
+% specialized keys. In the simple case it's
+%    {\rstyle|\lstdefinelanguage|}\marg{language name}\marg{key=value list}.
+% For many programming languages it is sufficient to specify keywords and
+% standard function names, comments, and strings. Let's look at an example.
+% \begin{lstxsample}[morekeywords,sensitive,morecomment,morestring]
+%    \lstdefinelanguage{rock}
+%      {morekeywords={one,two,three,four,five,six,seven,eight,
+%          nine,ten,eleven,twelve,o,clock,rock,around,the,tonight},
+%       sensitive=false,
+%       morecomment=[l]{//},
+%       morecomment=[s]{/*}{*/},
+%       morestring=[b]",
+%      }
+% \end{lstxsample}
+% \begingroup \csname lst@EndWriteFile\endcsname
+% \bigbreak
+%
+% \noindent
+% There isn't much to say about keywords. They are defined like identifiers
+% you want to emphasize. Additionally you need to specify whether they are
+% case sensitive or not. And yes: you could insert |[2]| in front of the
+% keyword \texttt{one} to define the keywords as `second order' and print them
+% in |keywordstyle={[2]...}|.
+% \begin{advise}
+% \item I get a `\texttt{Missing = inserted for }|\ifnum|' error when I select
+%       my language.
+%       \advisespace
+%       Did you forget the comma after `|keywords={...}|'? And if you encounter
+%       unexpected characters after selecting a language (or style), you have
+%       probably forgotten a different comma or you have given to many
+%       arguments to a key, for example, |morecomment=[l]{--}{!}|.
+% \end{advise}
+%
+% So let's turn to comments and strings. Each value starts with a
+% \emph{mandatory} \oarg{type} argument followed by a changing number of
+% opening and closing delimiters. Note that each delimiter (pair) requires a
+% key=value on its own, even if types are equal. Hence, you'll need to insert
+% \texttt{morestring=[b]'} if single quotes open and close string or character
+% literals in the same way as double quotes do in the example.
+%
+% Eventually you need to know the types and their numbers of delimiters. The
+% reference guide contains full lists, here we discuss only the most common.
+% For strings these are {\rstyle\texttt{b}} and {\rstyle\texttt{d}} with one
+% delimiter each. This delimiter opens and closes the string and inside a
+% string it is either escaped by a \texttt backslash or it is \texttt doubled.
+% The comment type {\rstyle\texttt{l}} requires exactly one delimiter, which
+% starts a comment on any column. This comment goes up to the end of line.
+% The other two most common comment types are {\rstyle\texttt{s}} and
+% {\rstyle\texttt{n}} with two delimiters each. The first delimiter opens a
+% comment which is terminated by the second delimiter. In contrast to the
+% \texttt s-type, \texttt n-type comments can be nested.
+% \begin{lstxsample}[b,d,l,s,n]
+%    \lstset{morecomment=[l]{//},
+%            morecomment=[s]{/*}{*/},
+%            morecomment=[n]{(*}{*)},
+%            morestring=[b]",
+%            morestring=[d]'}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    "str\"ing "    not a string
+%    'str''ing '    not a string
+%    // comment line
+%    /* comment/**/ not a comment
+%    (* nested (**) still comment
+%       comment  *) not a comment
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{advise}
+% \item Is it \emph{that} easy?
+%       \advisespace
+%       Almost. There are some troubles you can run into. For example, if
+%       `\texttt{-*}' starts a comment line and `\texttt{-*-}' a string
+%       (unlikely but possible), then you must define the shorter delimiter
+%       first.
+%       Another problem: by default some characters are not allowed inside
+%       keywords, for example `\texttt{-}', `\texttt{:}', `\texttt{.}', and
+%       so on. The reference guide covers this problem by introducing some
+%       more keys, which let you adjust the standard character table
+%       appropriately. But note that white space characters are prohibited
+%       inside keywords.
+% \end{advise}
+% Finally remember that this section is only an introduction to language
+% definitions. There are more keys and possibilities.
+%
+%
+% \subsection{Delimiters}\label{uDelimiters}
+%
+% You already know two special delimiter classes: comments and strings.
+% However, their full syntax hasn't been described so far. For example,
+% \ikeyname{commentstyle} applies to all comments---unless you specify
+% something different. The \emph{optional} \oarg{style} argument follows the
+% \emph{mandatory} \oarg{type} argument.
+%\ifcolor
+% \begin{lstxsample}
+%    \lstset{morecomment=[l][keywordstyle]{//},
+%            morecomment=[s][\color{white}]{/*}{*/}}
+% \end{lstxsample}
+%\else
+% \begin{lstxsample}
+%    \lstset{morecomment=[l][keywordstyle]{//},
+%            morecomment=[s][\underbar]{/*}{*/}}
+% \end{lstxsample}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    // bold comment line
+%    a single /* comment */
+%    \end{lstlisting}
+% \end{lstsample}
+% As you can see, you have the choice between specifying the style explicitly
+% by \LaTeX\ commands or implicitly by other style keys. But, you're right,
+% some implicitly defined styles have no seperate keys, for example the second
+% order keyword style. Here---and never with the number 1---you just append
+% the order to the base key: \texttt{keywordstyle2}.
+%
+% You ask for an application? Here you are: one can define different printing
+% styles for `subtypes' of a comment, for example
+%\ifcolor
+% \begin{lstxsample}
+%    \lstset{morecomment=[s][\color{blue}]{/*+}{*/},
+%            morecomment=[s][\color{red}]{/*-}{*/}}
+% \end{lstxsample}
+%\else
+% \begin{lstxsample}
+%    \lstset{morecomment=[s][\upshape]{/*+}{*/},
+%            morecomment=[s][\bfseries]{/*-}{*/}}
+% \end{lstxsample}
+%\fi
+% \begin{lstsample}{\lstset{morecomment=[s]{/*}{*/}}}{}
+%    \begin{lstlisting}
+%    /*  normal comment */
+%    /*+    keep cool   */
+%    /*-     danger!    */
+%    \end{lstlisting}
+% \end{lstsample}
+% Here, the comment style is not applied to the second and third line.
+% \begin{advise}
+% \item Please remember that both `extra' comments must be defined \emph{after}
+%       the normal comment, since the delimiter `\texttt{/*}' is a substring of
+%       `\texttt{/*+}' and `\texttt{/*-}'.
+%
+% \item I have another question. Is `\texttt{language=}\meta{different
+%       language}' the only way to remove such additional delimiters?
+%       \advisespace
+%       Call {\rstyle\ikeyname{deletecomment}} and/or
+%       {\rstyle\ikeyname{deletestring}} with the same arguments to remove
+%       the delimiters (but you don't need to provide the optional style
+%       argument).
+% \end{advise}
+% Eventually, you might want to use the prefix \texttt{i} on any comment type.
+% Then the comment is not only invisible, it is completely discarded from the
+% output!
+% \begin{lstxsample}[is]
+%    \lstset{morecomment=[is]{/*}{*/}}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    begin /* comment */ end
+%    begin/* comment */end
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% Okay, and now for the real challenges. More general delimiters can be defined
+% by the key {\rstyle\ikeyname{moredelim}}. Legal types are {\rstyle\texttt{l}}
+% and {\rstyle\texttt{s}}. These types can be preceded by an \texttt{i}, but
+% this time \emph{only the delimiters} are discarded from the output. This way
+% you can select styles by markers.
+% \begin{lstxsample}
+%    \lstset{moredelim=[is][\ttfamily]{|}{|}}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    roman |typewriter|
+%    \end{lstlisting}
+% \end{lstsample}
+% You can even let the package detect keywords, comments, strings, and other
+% delimiters inside the contents.
+% \begin{lstxsample}
+%    \lstset{moredelim=*[s][\itshape]{/*}{*/}}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    /* begin
+%      (* comment *)
+%       ' string ' */
+%    \end{lstlisting}
+% \end{lstsample}
+% Moreover, you can force the styles to be applied cumulatively.
+% \begin{lstxsample}
+%    \lstset{moredelim=**[is][\ttfamily]{|}{|}, % cumulative
+%            moredelim=*[s][\itshape]{/*}{*/}}  % not so
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    /* begin
+%       ' string '
+%       |typewriter| */
+%
+%    | begin
+%     ' string '
+%     /*typewriter*/ |
+%    \end{lstlisting}
+% \end{lstsample}
+% Look carefully at the output and note the differences. The second
+% \texttt{begin} is not printed in bold typewriter type since standard
+% \LaTeX\ has no such font.
+%
+% This suffices for an introduction. Now go and find some more applications.
+%
+%
+% \subsection{Closing and credits}\label{uClosingAndCredits}
+%
+% You've seen a lot of keys but you are far away from knowing all of them.
+% The next step is the real use of the \packagename{listings} package.
+% Please take the following advice. Firstly, look up the known commands and
+% keys in the reference guide to get a notion of the notation there. Secondly,
+% poke around with these keys to learn some other parameters. Then, hopefully,
+% you'll be prepared if you encounter any problems or need some special things.
+%
+% \begin{advise}
+% \item
+% There is one question `you' haven't asked all the last pages: who is to
+% blame. Carsten Heinz wrote the guides, coded the \packagename{listings}
+% package and wrote some language drivers. Brooks Moses currently maintains
+% the package.  Other people defined more languages
+% or contributed their ideas; many others made bug reports, but only the first
+% bug finder is listed.
+%^^A
+%^^A Thanks for error reports (first bug finder only), new programming
+%^^A languages, etc.
+%^^A Special thanks for communication which lead to kernel extensions, and to
+%^^A Hendri Adriaens for reviving maintenance on the package.
+%^^A
+% Special thanks go to (alphabetical order)
+% \begin{quote}
+% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth
+%   \lstthanks{Hendri~Adriaens}{-},
+%   \lstthanks{Andreas~Bartelt}{Andreas.Bartelt@Informatik.Uni-Oldenburg.DE},
+%   \lstthanks{Jan~Braun}{Jan.Braun@tu-bs.de},
+%   \lstthanks{Denis~Girou}{Denis.Girou@idris.fr},
+%   \lstthanks{Arne~John~Glenstrup}{panic@diku.dk},
+%   \lstthanks{Frank~Mittelbach}{frank.mittelbach@latex-project.org},
+%   \lstthanks{Rolf~Niepraschk}{niepraschk@PTB.DE},
+%   \lstthanks{Rui~Oliveira}{rco@di.uminho.pt},
+%   \lstthanks{Jens~Schwarzer}{schwarzer@schwarzer.dk}, and
+%   \lstthanks{Boris~Veytsman}{boris@plmsc.psu.edu}.
+% \end{quote}
+% Moreover we wish to thank
+% \begin{quote}
+% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth
+%   \lstthanks{Bj{\o}rn~{\AA}dlandsvik}{bjorn@imr.no},
+%   \lstthanks{Omair-Inam~Abdul-Matin}{-},
+%   \lstthanks{Gaurav~Aggarwal}{gaurav@ics.uci.edu},
+%   \lstthanks{Jason~Alexander}{jalex@ea.oac.uci.edu},
+%   \lstthanks{Andrei~Alexandrescu}{-},
+%   \lstthanks{Holger~Arndt}{-},
+%   \lstthanks{Donald~Arseneau}{ASND@erich.triumf.ca},
+%   \lstthanks{David~Aspinall}{David.Aspinall@ed.ac.uk},
+%   \lstthanks{Frank~Atanassow}{-},
+%   \lstthanks{Claus~Atzenbeck}{Claus.Atzenbeck@stud.uni-regensburg.de},
+%   \lstthanks{Michael~Bachmann}{-},
+%   \lstthanks{Luca~Balzerani}{-},
+%   \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de} (big thankyou), ^^A beta tester
+%   \lstthanks{Heiko~Bauke}{-},
+%   \lstthanks{Oliver~Baum}{oli.baum@web.de},
+%   \lstthanks{Ralph~Becket}{rbeck@microsoft.com},
+%   \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co},
+%   \lstthanks{Kai~Below}{below@tu-harburg.de},
+%   \lstthanks{Matthias~Bethke}{-},
+%   \lstthanks{Javier~Bezos}{javier.bezos@bancoval.es},
+%   \lstthanks{Olaf~Trygve~Berglihn}{olafb@pvv.org}, ^^A {1999/11/29}{3-char comment delimiter don't work (Python)}
+%   \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net},
+%   \lstthanks{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de},
+%   \lstthanks{Beat~Birkhofer}{beat@birkhofer.ch},
+%   \lstthanks{Fr\'ed\'eric~Boulanger}{Frederic.Boulanger@supelec.fr},
+%   \lstthanks{Joachim~Breitner}{-},
+%   \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de},
+%   \lstthanks{Walter~E.~Brown}{WB@fnal.gov},
+%   \lstthanks{Achim~D.~Brucker}{brucker@informatik.uni-freiburg.de},
+%   \lstthanks{J\'an Bu\v{s}a}{-},
+%   \lstthanks{Thomas~ten~Cate}{-},
+%   \lstthanks{David~Carlisle}{davidc@nag.co.uk},
+%   \lstthanks{Bradford~Chamberlain}{brad@cs.washington.edu},
+%   \lstthanks{Brian~Christensen}{-},
+%   \lstthanks{Neil~Conway}{-},
+%   \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr},
+%   \lstthanks{Xavier~Cr\'egut}{cregut@enseeiht.fr},
+%   \lstthanks{Christopher~Creutzig}{-},
+%   \lstthanks{Holger~Danielsson}{dani@fbg.schwerte.de},
+%   \lstthanks{Andreas~Deininger}{deininger@uni-kassel.de},
+%   \lstthanks{Robert~Denham}{Robert.Denham@dnr.qld.gov.au},
+%   \lstthanks{Detlev~Dr\"oge}{droege@informatik.uni-koblenz.de},
+%   \lstthanks{Anders~Edenbrandt}{Anders.Edenbrandt@dna.lth.se},
+%   \lstthanks{Mark~van~Eijk}{mark@luon.net},
+%   \lstthanks{Norbert~Eisinger}{Norbert.Eisinger@informatik.uni-muenchen.de},
+%   \lstthanks{Brian~Elmegaard}{-},
+%   \lstthanks{Jon~Ericson}{Jon.Ericson@jpl.nasa.gov},
+%   \lstthanks{Thomas~Esser}{te@dbs.uni-hannover.de},
+%   \lstthanks{Chris~Edwards}{edwch00p@infoscience.otago.ac.nz},
+%   \lstthanks{David~John~Evans}{Matrix.Software@dial.pipex.com},
+%   \lstthanks{Tanguy~Fautr\'e}{tfautre@pandora.be},
+%   \lstthanks{Ulrike~Fischer}{-},
+%   \lstthanks{Robert~Frank}{rf7@ukc.ac.uk},
+%   \lstthanks{Michael~Franke}{-},
+%   \lstthanks{Ignacio~Fern\'andez~Galv\'an}{-},
+%   \lstthanks{Martine~Gautier}{-}
+%   \lstthanks{Daniel~Gazard}{gazard_d@epita.fr},
+%   \lstthanks{Daniel~Gerigk}{Daniel.Gerigk@ePost.de},
+%   \lstthanks{Dr.~Christoph~Giess}{-},
+%   \lstthanks{KP~Gores}{kp.gores@web.de},
+%   \lstthanks{Adam~Grabowski}{adam@mizar.org},
+%   \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr},
+%   \lstthanks{Christian~Gudrian}{Christian.Gudrian@kawo1.rwth-aachen.de},
+%   \lstthanks{Jonathan~de~Halleux}{dehalleux@auto.ucl.ac.be},
+%   \lstthanks{Carsten~Hamm}{carsten.hamm@siemens.com},
+%   \lstthanks{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de},
+%   \lstthanks{Harald~Harders}{h.harders@tu-bs.de},
+%   \lstthanks{Christian~Haul}{haul@dvs1.informatik.tu-darmstadt.de},
+%   \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au},
+%   \lstthanks{Jim~Hefferon}{Hefferon9@aol.com},
+%   \lstthanks{Heiko~Heil}{info@heiko-heil.de},
+%   \lstthanks{J\"urgen~Heim}{heim@astro.uni-tuebingen.de},
+%   \lstthanks{Martin~Heller}{-},
+%   \lstthanks{Stephan~Hennig}{-},
+%   \lstthanks{Alvaro~Herrera}{alvherre@dcc.uchile.cl},
+%   \lstthanks{Richard~Hoefter}{hoefter@gmx.de},
+%   \lstthanks{Dr.~Jobst~Hoffmann}{HOFFMANN@rz.rwth-aachen.de},
+%   \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk},
+%   \lstthanks{Morten~H\o gholm}{-},
+%   \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net},
+%   \lstthanks{G\'erard~Huet}{-},
+%   \lstthanks{Hermann~H\"uttler}{hermann.huettler@gmx.net},
+%   \lstthanks{Ralf~Imh\"auser}{snoopy@tribal.line.org},
+%   \lstthanks{R.~Isernhagen}{R.Isernhagen@FH-Wolfenbuettel.DE},
+%   \lstthanks{Oldrich~Jedlicka}{ojedlick@students.zcu.cz},
+%   \lstthanks{Dirk~Jesko}{jesko@iti.cs.uni-magdeburg.de},
+%   \lstthanks{Lo\"\i c~Joly}{-},
+%   \lstthanks{Christian~Kaiser}{chk@combit.net},
+%   \lstthanks{Bekir~Karaoglu}{karabekirus@yahoo.com},
+%   \lstthanks{Marcin~Kasperski}{Marcin.Kasperski@softax.com.pl},
+%   \lstthanks{Christian~Kindinger}{chkind@uni-wuppertal.de},
+%   \lstthanks{Steffen~Klupsch}{steffen@vlsi.informatik.tu-darmstadt.de},
+%   \lstthanks{Markus~Kohm}{-},
+%   \lstthanks{Peter~K\"oller}{pkoeller@metaprojekt.de} (big thankyou), ^^A beta tester
+%   \lstthanks{Reinhard~Kotucha}{Reinhard.Kotucha@web.de},
+%   \lstthanks{Stefan~Lagotzki}{info@lagotzki.de},
+%   \lstthanks{Tino~Langer}{langer@tournex.de},
+%   \lstthanks{Rene~H.~Larsen}{rhl@traceroute.dk},
+%   \lstthanks{Olivier~Lecarme}{ol@i3s.unice.fr},
+%   \lstthanks{Thomas~Leduc}{Thomas.Leduc@lsv.ens-cachan.fr},
+%   \lstthanks{Dr.~Peter~Leibner}{Peter.Leibner@sta.siemens.de},
+%   \lstthanks{Thomas~Leonhardt}{leonhardt@informatik.tu-darmstadt.de} (big thankyou), ^^A beta tester
+%   \lstthanks{Magnus~Lewis-Smith}{Magnus.Lewis-Smith@pace.co.uk},
+%   \lstthanks{Knut~Lickert}{knut.lickert@gmx.de},
+%   \lstthanks{Benjamin~Lings}{-},
+%   \lstthanks{Dan~Luecking}{luecking@uark.edu},
+%   \lstthanks{Peter~L\"offler}{-},
+%   \lstthanks{Markus~Luisser}{-},
+%   \lstthanks{Kris~Luyten}{no email available},
+%   \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@urano.iceb.ufop.br},
+%   \lstthanks{Andreas~Matthias}{amat@kabsi.at},
+%   \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com},
+%   ^^A \lstthanks{Brooks~Moses}{-},
+%   \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it},
+%   \lstthanks{Knut~M\"uller}{knut@physik3.gwdg.de},
+%   \lstthanks{Svend~Tollak~Munkejord}{svendm@efisms.energy.sintef.no},
+%   \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de},
+%   \lstthanks{Torsten~Neuer}{tneuer@inwise.de},
+%   \lstthanks{Enzo~Nicosia}{-},
+%   \lstthanks{Michael~Niedermair}{m.g.n@gmx.de},
+%   \lstthanks{Xavier~Noria}{fxn@hashref.com},
+%   \lstthanks{Heiko~Oberdiek}{oberdiek@ruf.uni-freiburg.de},
+%   \lstthanks{Xavier~Olive}{-},
+%   \lstthanks{Alessio~Pace}{-},
+%   \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca},
+%   \lstthanks{Morten~H.~Pedersen}{mhp@dadlnet.dk},
+%   \lstthanks{Xiaobo~Peng}{-},
+%   \lstthanks{Zvezdan~V.~Petkovic}{zpetkovic@acm.org},
+%   \lstthanks{Michael~Piefel}{piefel@informatik.hu-berlin.de},
+%   \lstthanks{Michael~Piotrowski}{mxp@linguistik.uni-erlangen.de},
+%   \lstthanks{Manfred~Piringer}{sz0490@rrze.uni-erlangen.de},
+%   \lstthanks{Vincent~Poirriez}{Vincent.Poirriez@univ-valenciennes.fr},
+%   \lstthanks{Adam~Prugel-Bennett}{apb@ecs.soton.ac.uk},
+%   \lstthanks{Ralf~Quast}{rquast@hs.uni-hamburg.de},
+%   \lstthanks{Aslak~Raanes}{araanes@ifi.ntnu.no},
+%   \lstthanks{Venkatesh~Prasad~Ranganath}{vranganath@cox.net},
+%   \lstthanks{Tobias~Rapp}{-},
+%   \lstthanks{Jeffrey~Ratcliffe}{-},
+%   \lstthanks{Georg~Rehm}{Georg.Rehm@germanistik.uni-giessen.de},
+%   \lstthanks{Fermin~Reig}{reig@ics.uci.edu},
+%   \lstthanks{Detlef~Reimers}{dreimers@aol.com},
+%   \lstthanks{Stephen~Reindl}{stephen.reindl@vodafone.com},
+%   \lstthanks{Franz~Rinnerthaler}{-},
+%   \lstthanks{Peter~Ruckdeschel}{Peter.Ruckdeschel@uni-bayreuth.de},
+%   \lstthanks{Magne~Rudshaug}{magne@ife.no},
+%   \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de},
+%   \lstthanks{Vespe~Savikko}{vespe@cs.tut.fi},
+%   \lstthanks{Mark~Schade}{-},
+%   \lstthanks{Gunther~Schmidl}{gschmidl@gmx.at},
+%   \lstthanks{Andreas~Schmidt}{-},
+%   \lstthanks{Walter~Schmidt}{wschmi@arcor.de},
+%   \lstthanks{Christian~Schneider}{-},
+%   \lstthanks{Jochen~Schneider}{jschneider@ds3.etech.haw-hamburg.de},
+%   \lstthanks{Benjamin~Schubert}{benjamin.schubert@berlin.de},
+%   \lstthanks{Sebastian~Schubert}{-},
+%   \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de},
+%   \lstthanks{Axel~Sommerfeldt}{axel@sommerfeldt.net},
+%   \lstthanks{Richard~Stallman}{-},
+%   \lstthanks{Nigel~Stanger}{nstanger@infoscience.otago.ac.nz},
+%   \lstthanks{Martin~Steffen}{ms@informatik.uni-kiel.de},
+%   \lstthanks{Andreas~Stephan}{Andreas.Stephan@victoria.de},
+%   \lstthanks{Stefan~Stoll}{stoll@phys.chem.ethz.ch},
+%   \lstthanks{Enrico~Straube}{no email available},
+%   \lstthanks{Werner~Struckmann}{struck@ips.cs.tu-bs.de},
+%   \lstthanks{Martin~S\"u\ss kraut}{Edon.Myder@web.de},
+%   \lstthanks{Gabriel~Tauro}{gabriel@informatik.uni-jena.de},
+%   \lstthanks{Winfried~Theis}{theis@statistik.uni-dortmund.de},
+%   \lstthanks{Jens~T.~Berger~Thielemann}{jensthi@ifi.uio.no},
+%   \lstthanks{William~Thimbleby}{-},
+%   \lstthanks{Arnaud~Tisserand}{arnaud.tisserand@ens-lyon.fr},
+%   \lstthanks{Jens~Troeger}{-},
+%   \lstthanks{Kalle~Tuulos}{kalle.tuulos@nic.fi},
+%   \lstthanks{Gregory~Van~Vooren}{Gregory.VanVooren@rug.ac.be},
+%   \lstthanks{Timothy~Van~Zandt}{tvz@econ.insead.edu},
+%   \lstthanks{J\"org~Viermann}{-},
+%   \lstthanks{Thorsten~Vitt}{vitt@informatik.hu-berlin.de},
+%   \lstthanks{Herbert~Voss}{voss@perce.de} (big thankyou), ^^A beta tester
+%   \lstthanks{Edsko~de~Vries}{devriese@tcd.ie},
+%   \lstthanks{Herfried~Karl~Wagner}{hirf@gmx.at},
+%   \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be},
+%   \lstthanks{Bernhard~Walle}{-},
+%   \lstthanks{Jared~Warren}{warren@cs.queensu.ca},
+%   \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de},
+%   \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@gmx.de},
+%   \lstthanks{Andreas~Weidner}{-},
+%   \lstthanks{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at},
+%   \lstthanks{Robert~Wenner}{robert.wenner@gmx.de},
+%   \lstthanks{Michael~Wiese}{wiese@itwm.uni-kl.de},
+%   \lstthanks{James~Willans}{-},
+%   \lstthanks{J\"orn~Wilms}{wilms@rocinante.colorado.edu},
+%   \lstthanks{Kai~Wollenweber}{kai@ece.WPI.EDU},
+%   \lstthanks{Ulrich~G.~Wortmann}{uliw@erdw.ethz.ch},
+%   \lstthanks{Cameron~H.G.~Wright}{-},
+%   \lstthanks{Andrew~Zabolotny}{-}, and
+%   \lstthanks{Florian~Z\"ahringer}{-}.
+% \end{quote}
+% There are probably other people who contributed to this package.
+% If I've missed your name, send an email.
+% \end{advise}
+%
+%
+% \part{Reference guide}
+%
+%
+% \section{Main reference}\label{rMainReference}
+%
+% Your first training is completed. Now that you've left the User's guide, the
+% friend telling you what to do has gone. Get more practice and become a
+% journeyman!^^A :-)
+% \begin{advise}
+% \item Actually, the friend hasn't gone. There are still some advices, but
+%       only from time to time.
+% \end{advise}
+%
+%
+% \subsection{How to read the reference}
+%
+% Commands, keys and environments are presented as follows.
+% \begin{syntax}
+% \item[1.0,default,hints] \texttt{command}, \texttt{environment} or
+%       \keyname{key} with \meta{parameters}
+%
+%       This field contains the explanation; here we describe the other fields.
+%
+%       If present, the label in the left margin provides extra information:
+%       `\textit{addon}' indicates additionally introduced functionality,
+%       `\textit{changed}' a modified key, `\textit{data}' a command just
+%       containing data (which is therefore adjustable via |\renewcommand|),
+%       and so on. Some keys and functionality are `\emph{bug}'-marked or
+%       with a \dag-sign. These features might change in future or could be
+%       removed, so use them with care.
+%
+%       If there is verbatim text touching the right margin, it is the
+%       predefined value. Note that some keys default to this value every
+%       listing, namely the keys which can be used on individual listings only.
+% \end{syntax}
+% Regarding the parameters, please keep in mind the following:
+% \begin{enumerate}
+% \item A list always means a comma separated list. You must put braces around
+%       such a list. Otherwise you'll get in trouble with the
+%       \packagename{keyval} package; it complains about an undefined key.
+% \item You must put parameter braces around the whole value of a key if you
+%       use an \oarg{optional argument} of a key inside an optional
+%       \oarg{key=value list}:
+%       |\begin{lstlisting}[caption=|{\rstyle|{|}|[one]two|{\rstyle|}|}|]|.
+% \item Brackets `|[ ]|' usually enclose optional arguments and must be typed
+%       in verbatim. Normal brackets `[ ]' always indicate an optional argument
+%       and must not be typed in. Thus |[*]| must be typed in exactly as is,
+%       but [|*|] just gets |*| if you use this argument.
+% \item A vertical rule indicates an alternative, e.g.~^^A
+%       \meta{\alternative{true,false}} allows either \texttt{true} or
+%       \texttt{false} as arguments.
+% \item If you want to enter one of the special characters |{}#%\|, this
+%       character must be escaped with a backslash. This means that you must
+%       write |\}| for the single character `right brace'---but of course not
+%       for the closing paramater character.
+% \end{enumerate}
+%
+%
+% \subsection{Typesetting listings}\label{rTypesettingListings}
+%
+% \begin{syntax}
+% \item[0.19] \rcmdname\lstset\marg{key=value list}
+%
+%       sets the values of the specified keys, see also section
+%       \ref{uTheKey=ValueInterface}.
+%       The parameters keep their values up to the end of the current group.
+%       In contrast, all optional \meta{key=value list}s below modify the
+%       parameters for single listings only.
+%
+% \item[0.18] \rcmdname\lstinline\oarg{key=value list}\meta{character}\meta{source code}\meta{same character}
+%
+%       works like |\verb| but respects the active language and style. These
+%       listings use flexible columns unless requested differently in the
+%       optional argument, and do not support frames or background colors.
+%       You can write `|\lstinline!var i:integer;!|' and get
+%       `\lstinline!var i:integer;!'.
+%
+%       Since the command first looks ahead for an optional argument, you must
+%       provide at least an empty one if you want to use |[| as
+%       \meta{character}.
+%
+%       \dag\ An experimental implementation has been done to support the
+%       syntax |\lstinline|\oarg{key=value list}\marg{source code}. Try it if
+%       you want and report success and failure. A known limitation is that
+%       inside another argument the last source code token must not be an
+%       explicit space token---and, of course, using a listing inside another
+%       argument is itself experimental, see section
+%       \ref{rListingsInsideArguments}.
+%
+%       Another limitation is that this feature can't be used in cells of a
+%       |tabular|-environment. See \section{uListingsArguments} for a
+%       workaround.
+%
+%       See also section \ref{rShortInline} for commands to create short analogs
+%       for the |\lstinline| command.
+%
+% \item[0.15] |\begin{|\texttt{\rstyle lstlisting}|}|\oarg{key=value list}
+%
+%       \leavevmode\hspace*{-\leftmargini}|\end{|\texttt{\rstyle lstlisting}|}|
+%
+%       typesets the code in between as a displayed listing.
+%
+%       In contrast to the environment of the \packagename{verbatim} package,
+%       \LaTeX\ code on the same line and after the end of environment is
+%       typeset respectively executed.
+%
+% \item[0.1] \rcmdname\lstinputlisting\oarg{key=value list}\marg{file name}
+%
+%       typesets the stand alone source code file as a displayed listing.
+% \end{syntax}
+%
+%
+% \subsection{Space and placement}
+%
+% \begin{syntax}
+% \item[0.20,floatplacement] \rkeyname{float}|=|[|*|]\meta{subset of \textup{\texttt{tbph}}}\syntaxor\rkeyname{float}
+%
+%       makes sense on individual displayed listings only and lets them float.
+%       The argument controls where \LaTeX\ is \emph{allowed} to put the float:
+%       at the top or bottom of the current/next page, on a separate page, or
+%       here where the listing is.
+%
+%       The optional star can be used to get a double-column float in a
+%       two-column document.
+%
+% \item[0.21,tbp] \rkeyname{floatplacement}|=|\meta{place specifiers}
+%
+%       is used as place specifier if \keyname{float} is used without value.
+%
+% \item[0.21,\medskipamount] \rkeyname{aboveskip}|=|\meta{dimension}
+% \item[0.21,\medskipamount] \rkeyname{belowskip}|=|\meta{dimension}
+%
+%       define the space above and below displayed listings.
+%
+% \item[0.17,0pt,\dag] \rkeyname{lineskip}|=|\meta{dimension}
+%
+%       specifies additional space between lines in listings.
+%
+% \item[0.18,c,\dag] \rkeyname{boxpos}|=|\meta{\alternative{b,c,t}}
+%
+%       Sometimes the \packagename{listings} package puts a |\hbox| around a
+%       listing---or it couldn't be printed or even processed correctly.
+%       The key determines the vertical alignment to the surrounding material:
+%       bottom baseline, centered or top baseline.
+% \end{syntax}
+%
+%
+% \subsection{The printed range}
+%
+% \begin{syntax}
+% \item[0.12,true] \rkeyname{print}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{print}
+%
+%       controls whether an individual displayed listing is typeset. Even if
+%       set false, the respective caption is printed and the label is defined.
+%
+%       Note: If the package is loaded without the \texttt{draft} option, you
+%       can use this key together with |\lstset|. In the other case the key
+%       can be used to typeset particular listings despite using the
+%       \texttt{draft} option.
+%
+% \item[0.1,1] \rkeyname{firstline}|=|\meta{number}
+% \item[0.1,9999999] \rkeyname{lastline}|=|\meta{number}
+%
+%       can be used on individual listings only. They determine the physical
+%       input lines used to print displayed listings.
+%
+% \item[1.2] \rkeyname{linerange}|={|\meta{first1}\texttt-\meta{last1}\texttt,\meta{first2}\texttt-\meta{last2}\texttt, and so on|}|\label{uoption:linerange}
+%
+%       can be used on individual listings only. The given line ranges
+%       of the listing are displayed. The intervals must be sorted and must
+%       not intersect.
+%
+% \item[0.20,false] \rkeyname{showlines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{showlines}
+%
+%       If true, the package prints empty lines at the end of listings.
+%       Otherwise these lines are dropped (but they count for line numbering).
+%
+% \item[1.0] \rkeyname{emptylines}|=|[|*|]\meta{number}
+%
+%       sets the maximum of empty lines allowed. If there is a block of more
+%       than \meta{number} empty lines, only \meta{number} ones are printed.
+%       Without the optional star, line numbers can be disturbed when blank
+%       lines are omitted; with the star, the lines keep their original
+%       numbers.
+%
+% \item[0.19,0] \rkeyname{gobble}|=|\meta{number}
+%
+%       gobbles \meta{number} characters at the beginning of each
+%       \emph{environment} code line. This key has no effect on \cs{lstinline}
+%       or \cs{lstinputlisting}.
+%
+%       Tabulators expand to \ikeyname{tabsize} spaces before they are gobbled.
+%       Code lines with fewer than \ikeyname{gobble} characters are considered
+%       empty.  Never indent the end of environment by more characters.
+% \end{syntax}
+%
+%
+% \subsection{Languages and styles}\label{rLanguagesAndStyles}
+%
+% Please note that the arguments \meta{language}, \meta{dialect}, and
+% \meta{style name} are case insensitive and that spaces have no effect.
+% \begin{syntax}
+% \item[0.18,{{}}] \rkeyname{style}|=|\meta{style name}
+%
+%       activates the key=value list stored with |\lstdefinestyle|.
+%
+% \item[0.19] \rcmdname\lstdefinestyle\marg{style name}\marg{key=value list}
+%
+%       stores the key=value list.
+%
+% \item[0.17,{{}}] \rkeyname{language}|=|\oarg{dialect}\meta{language}
+%
+%       activates a (dialect of a) programming language. The `empty' default
+%       language detects no keywords, no comments, no strings, and so on; it
+%       may be useful for typesetting plain text.
+%       If \meta{dialect} is not specified, the package chooses the default
+%       dialect, or the empty dialect if there is no default dialect.
+%
+%       Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages}
+%       lists all languages and dialects provided by \texttt{lstdrvrs.dtx}.
+%       The predefined default dialects are underlined.
+%
+% \item[0.21] \rkeyname{alsolanguage}|=|\oarg{dialect}\meta{language}
+%
+%       activates a (dialect of a) programming language in addition to the
+%       current active one. Note that some language definitions interfere with
+%       each other and are plainly incompatible; for instance, if one is case
+%       sensitive and the other is not.
+%
+%       Take a look at the \ikeyname{classoffset} key in section
+%       \ref{rFigureOutTheAppearance} if you want to highlight the keywords
+%       of the languages differently.
+%
+% \item[0.19] \rkeyname{defaultdialect}|=|\oarg{dialect}\meta{language}
+%
+%       defines \meta{dialect} as default dialect for \meta{language}.
+%       If you have defined a default dialect other than empty, for example
+%       |defaultdialect=[iama]fool|, you can't select the empty dialect, even
+%       not with |language=[]fool|.
+% \end{syntax}
+%
+% Finally, here's a small list of language-specific keys.
+% \begin{syntax}
+% \item[0.19,false,optional] \rkeyname{printpod}|=|\meta{\alternative{true,false}}
+%
+%       prints or drops PODs in Perl.
+%
+% \item[0.20,true,{renamed,optional}] \rkeyname{usekeywordsintag}|=|\meta{\alternative{true,false}}\label{uoption:usekeywordsintag}
+%
+%       The package either use the first order keywords in tags or prints all
+%       identifiers inside |<>| in keyword style.
+%
+% \item[1.1,{{}},optional] \rkeyname{tagstyle}|=|\meta{style}\label{uoption:tagstyle}
+%
+%       determines the style in which tags and their content is printed.
+%
+% \item[1.1,false,optional] \rkeyname{markfirstintag}|=|\meta{style}\label{uoption:markfirstintag}
+%
+%       prints the first name in tags with keyword style.
+%
+% \item[0.20,true,optional] \rkeyname{makemacrouse}|=|\meta{\alternative{true,false}}
+%
+%       Make specific: Macro use of identifiers, which are defined as first
+%       order keywords, also prints the surrounding |$(| and |)| in keyword
+%       style. e.g.~you could get
+%           \textbf{\textdollar(}\textbf{strip} \textdollar(BIBS)\textbf{)}.
+%       If deactivated you get
+%           \textdollar(\textbf{strip} \textdollar(BIBS)).
+% \end{syntax}
+%
+%
+% \subsection{Figure out the appearance}\label{rFigureOutTheAppearance}
+%
+% \begin{syntax}
+% \item[0.18,{{}}] \rkeyname{basicstyle}|=|\meta{basic style}
+%
+%       is selected at the beginning of each listing. You could use
+%       |\footnotesize|, |\small|, |\itshape|, |\ttfamily|, or something like
+%       that. The last token of \meta{basic style} must not read any following
+%       characters.
+%
+% \item[0.18,{{}}] \rkeyname{identifierstyle}|=|\meta{style}
+% \item[0.11,\itshape] \rkeyname{commentstyle}|=|\meta{style}
+% \item[0.12,{{}}] \rkeyname{stringstyle}|=|\meta{style}
+%
+%       determines the style for non-keywords, comments, and strings. The
+%       \emph{last} token can be an one-parameter command like |\textbf| or
+%       |\underbar|.
+%
+% \item[0.11,\bfseries,addon] \rkeyname{keywordstyle}|=|\oarg{number}[\textasteriskcentered]\meta{style}\label{roption:keywordstyle}
+%
+%       is used to print keywords.  The optional \meta{number} argument is the
+%       class number to which the style should be applied.
+%
+%       Add-on: If you use the optional star after the (optional) class number, the
+%       keywords are printed uppercase\,---\,even if a language is case
+%       sensitive and defines lowercase keywords only. Maybe there should also be an
+%       option for lowercase keywords \ldots
+%
+% \item[0.19,keywordstyle,deprecated] \rkeyname{ndkeywordstyle}|=|\meta{style}
+%
+%       is equivalent to |keywordstyle=2|\meta{style}.
+%
+% \item[1.0,0] \rkeyname{classoffset}|=|\meta{number}
+%
+%       is added to all class numbers before the styles, keywords, identifiers,
+%       etc.~are assigned. The example below defines the keywords directly;
+%       you could do it indirectly by selecting two different languages.
+% \end{syntax}
+%\ifcolor
+% \begin{lstxsample}
+%    \lstset{classoffset=0,
+%            morekeywords={one,three,five},keywordstyle=\color{red},
+%            classoffset=1,
+%            morekeywords={two,four,six},keywordstyle=\color{blue},
+%            classoffset=0}% restore default
+% \end{lstxsample}
+%\else
+% \begin{lstxsample}
+%    \lstset{classoffset=0,
+%            morekeywords={one,three,five},keywordstyle=\itshape,
+%            classoffset=1,
+%            morekeywords={two,four,six},keywordstyle=\bfseries},
+%            classoffset=0}% restore default
+% \end{lstxsample}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}
+%    one two three
+%    four five six
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% \begin{syntax}
+% \item[0.20,keywordstyle,{addon,bug,optional}] \rkeyname{texcsstyle}|=|[|*|]\oarg{class number}\meta{style}\label{roption:texcsstyle}
+% \item[0.20,keywordstyle,optional] \rkeyname{directivestyle}|=|\meta{style}
+%
+%       determine the style of \TeX\ control sequences and directives.
+%       Note that these keys are present only if you've chosen an appropriate
+%       language.
+%
+%       The optional star of |texcsstyle| also highlights the backslash in
+%       front of the control sequence name. Note that this option is set for
+%       all |texcs| lists.
+%
+%       Bug: \texttt{texcs\ldots} interferes with other keyword lists. If, for
+%       example, \texttt{emph} contains the word \texttt{foo}, then the control
+%       sequence |\foo| will show up in \texttt{emphstyle}.
+%
+% \item[0.21] \rkeyname{emph}|=|\oarg{number}\marg{identifier list}
+% \item[0.21] \rkeyname{moreemph}|=|\oarg{number}\marg{identifier list}
+% \item[0.21] \rkeyname{deleteemph}|=|\oarg{number}\marg{identifier list}
+% \item[0.21] \rkeyname{emphstyle}|=|\oarg{number}\marg{style}
+%
+%       respectively define, add or remove the \meta{identifier list} from
+%       `emphasize class \meta{number}', or define the style for that class.
+%       If you don't give an optional argument, the package assumes
+%       \meta{number}$\,=1$.
+%
+%       These keys are described more detailed in section
+%       \ref{uEmphasizeIdentifiers}.
+%
+% \item[1.0] \rkeyname{delim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)}
+% \item[1.0] \rkeyname{moredelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)}
+% \item[1.0] \rkeyname{deletedelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt]\meta{delimiter\textup(s\textup)}
+%
+%       define, add, or remove user supplied delimiters.  (Note that this does
+%       not affect strings or comments.)
+%
+%       In the first two cases \meta{style} is used to print the delimited
+%       code (and the delimiters). Here, \meta{style} could be something like
+%       |\bfseries| or |\itshape|, or it could refer to other styles via
+%       \texttt{keywordstyle}, \texttt{keywordstyle2}, \texttt{emphstyle},
+%       etc.
+%
+%       Supported types are \texttt{l} and \texttt{s}, see the comment keys in
+%       section \ref{uLanguageDefinitions} for an explanation. If you use the
+%       prefix \texttt i, i.e.~\texttt{il} or \texttt{is}, the delimiters are
+%       not printed, which is some kind of invisibility.
+%
+%       If you use one optional star, the package will detect keywords,
+%       comments, and strings inside the delimited code. With both optional
+%       stars, aditionally the style is applied cumulatively; see section
+%       \ref{uDelimiters}.
+% \end{syntax}
+%
+%
+% \subsection{Getting all characters right}
+%
+% \begin{syntax}
+% \item[0.18,true] \rkeyname{extendedchars}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{extendedchars}
+%
+%       allows or prohibits extended characters in listings, that means
+%       (national) characters of codes 128--255. If you use extended
+%       characters, you should load \packagename{fontenc} and/or
+%       \packagename{inputenc}, for example.
+%
+% \item[1.0,{{}}] \rkeyname{inputencoding}|=|\meta{encoding}
+%
+%       determines the input encoding. The usage of this key requires the
+%       \packagename{inputenc} package; nothing happens if it's not loaded.
+%
+% \item[1.1,false] \rkeyname{upquote}|=|\meta{\alternative{true,false}}\label{uoption:upquote}
+%
+%       determines whether the left and right quote are printed |`'| or
+%       \texttt{\textasciigrave\textquotesingle}.
+%       This key requires the \packagename{textcomp} package if true.
+%
+% \item[0.12,8] \rkeyname{tabsize}|=|\meta{number}
+%
+%       sets tabulator stops at columns $\meta{number}+1$, $2\cdot\meta{number}+1$, $3\cdot\meta{number}+1$, and so on.
+%       Each tabulator in a listing moves the current column to the next
+%       tabulator stop.
+%
+% \item[0.20,false] \rkeyname{showtabs}|=|\meta{\alternative{true,false}}
+%
+%       make tabulators visible or invisible. A visible tabulator looks like
+%       \lstinline[showtabs]!	!, but that can be changed. If you choose
+%       invisible tabulators but visible spaces, tabulators are converted to
+%       an appropriate number of spaces.
+%
+% \item[0.20] \rkeyname{tab}|=|\meta{tokens}
+%
+%       \meta{tokens} is used to print a visible tabulator. You might want to use |$\to$|, |$\mapsto$|, |$\dashv$| or something like that instead of the strange default definition.
+%
+% \item[0.20,false] \rkeyname{showspaces}|=|\meta{\alternative{true,false}}
+%
+%       lets all blank spaces appear {\textvisiblespace} or as blank spaces.
+%
+% \item[0.12,true] \rkeyname{showstringspaces}|=|\meta{\alternative{true,false}}
+%
+%       lets blank spaces in strings appear {\textvisiblespace} or as blank
+%       spaces.
+%
+% \item[0.19,\bigbreak] \rkeyname{formfeed}|=|\meta{tokens}
+%
+%       Whenever a listing contains a form feed, \meta{tokens} is executed.
+% \end{syntax}
+%
+%
+% \subsection{Line numbers}\label{rLineNumbers}
+%
+% \begin{syntax}
+% \item[1.0,none] \rkeyname{numbers}|=|\meta{\alternative{none,left,right}}
+%
+%       makes the package either print no line numbers, or put them on the
+%       left or the right side of a listing.
+%
+% \item[0.16,1] \rkeyname{stepnumber}|=|\meta{number}
+%
+%       All lines with ``line number $\equiv 0$ modulo \meta{number}'' get a
+%       line number.
+%       If you turn line numbers on and off with \keyname{numbers}, the
+%       parameter \keyname{stepnumber} will keep its value. Alternatively you
+%       can turn them off via |stepnumber=0| and on with a nonzero number, and
+%       keep the value of \keyname{numbers}.
+%
+% \item[1.1,false] \rkeyname{numberfirstline}|=|\meta{\alternative{true,false}}\label{uoption:numberfirstline}
+%
+%       The first line of each listing gets numbered (if numbers are on at all)
+%       even if the line number is not divisible by \keyname{stepnumber}.
+%
+% \item[0.16,{{}}] \rkeyname{numberstyle}|=|\meta{style}
+%
+%       determines the font and size of the numbers.
+%
+% \item[0.19,10pt] \rkeyname{numbersep}|=|\meta{dimension}
+%
+%       is the distance between number and listing.
+%
+% \item[1.0,true] \rkeyname{numberblanklines}|=|\meta{\alternative{true,false}}
+%
+%       If this is set to false, blank lines get no printed line number.
+%
+% \item[0.20,auto] \rkeyname{firstnumber}|=|\meta{\alternative{auto,last,\normalfont\meta{number}}}
+%
+%       \texttt{auto} lets the package choose the first number: a new listing
+%       starts with number one, a named listing continues the most recent
+%       same-named listing (see below), and a stand alone file begins with
+%       the number corresponding to the first input line.
+%
+%       \texttt{last} continues the numbering of the most recent listing and
+%       \meta{number} sets it to the number.
+%
+% \item[1.0] \rkeyname{name}|=|\meta{name}
+%
+%       names a listing. Displayed environment-listings with the same name
+%       share a line counter if |firstnumber=auto| is in effect.
+%
+% \item[0.20,\arabic{lstnumber},data] \rcmdname\thelstnumber
+%
+%       prints the lines' numbers.
+% \end{syntax}
+% We show an example on how to redefine |\thelstnumber|. But if you test it,
+% you won't get the result shown on the left.
+% \begin{lstxsample}
+%    \renewcommand*\thelstnumber{\oldstylenums{\the\value{lstnumber}}}
+% \end{lstxsample}
+% \begin{lstsample}{\lstset{stepnumber=-1}\label{rDecreasingLabels}}{}
+%    \begin{lstlisting}[numbers=left,
+%                       firstnumber=753]
+%    begin { empty lines }
+%
+%
+%
+%
+%
+%
+%    end; { empty lines }
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% \begin{advise}
+% \item
+% The example shows a sequence $n,n+1,\ldots,n+7$ of 8 three-digit figures such that the sequence contains each digit $0,1,\ldots,9$.
+% But 8 is not minimal with that property.
+% Find the minimal number and prove that it is minimal.
+% How many minimal sequences do exist?
+%
+% Now look at the generalized problem:
+% Let $k\in\{1,\ldots,10\}$ be given.
+% Find the minimal number $m\in\{1,\ldots,10\}$ such that there is a sequence $n,{n+1},\ldots,\allowbreak{n+m-1}$ of $m$ $k$-digit figures which contains each digit $\{0,\ldots,9\}$.
+% Prove that the number is minimal.
+% How many minimal sequences do exist?
+%
+% If you solve this problem with a computer, write a \TeX\ program!
+% \end{advise}
+%
+%
+% \subsection{Captions}
+%
+% In despite of \LaTeX\ standard behaviour, captions and floats are independent
+% from each other here; you can use captions with non-floating listings.
+% \begin{syntax}
+% \item[0.21] \rkeyname{title}|=|\meta{title text}
+%
+%       is used for a title without any numbering or label.
+%
+% \item[0.20] \rkeyname{caption}|={|\oarg{short}\meta{caption text}|}|
+%
+%       The caption is made of \cs{lstlistingname} followed by a running
+%       number, a seperator, and \meta{caption text}. Either the caption text
+%       or, if present, \meta{short} will be used for the list of listings.
+%
+% \item[0.21] \rkeyname{label}|=|\meta{name}
+%
+%       makes a listing referable via |\ref|\marg{name}.
+%
+% \item[0.16] \rcmdname\lstlistoflistings
+%
+%       prints a list of listings. Each entry is with descending priority
+%       either the short caption, the caption, the file name or the name of the
+%       listing, see also the key \keyname{name} in section \ref{rLineNumbers}.
+%
+% \item[1.0] \rkeyname{nolol}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{nolol}
+%
+%       If true, the listing does not make it into the list of listings.
+%
+% \item[0.16,Listings,data] \rcmdname\lstlistlistingname
+%
+%       The header name for the list of listings.
+%
+% \item[0.20,Listing,data] \rcmdname\lstlistingname
+%
+%       The caption label for listings.
+%
+% \item[0.20,\arabic{lstlisting},data] \rcmdname\thelstlisting
+%
+%       prints the running number of the caption.
+%
+% \item[1.4,true] \rkeyname{numberbychapter}|=|\meta{\alternative{true,false}}
+%
+%       If true, and |\thechapter| exists, listings are numbered by chapter.
+%       Otherwise, they are numbered sequentially from the beginning of the
+%       document.  This key can only be used before |\begin{document}|.
+%
+% \item[0.19] \rcmdname\lstname
+%
+%       prints the name of the current listing which is either the file name or
+%       the name defined by the \keyname{name} key. This command can be used to
+%       define a caption or title template, for example by
+%       |\lstset{caption=\lstname}|.
+%
+% \item[0.20,t] \rkeyname{captionpos}|=|\meta{subset of \textup{\texttt{tb}}}
+%
+%       specifies the positions of the caption: top and/or bottom of the
+%       listing.
+%
+% \item[0.20,\smallskipamount] \rkeyname{abovecaptionskip}|=|\meta{dimension}
+% \item[0.20,\smallskipamount] \rkeyname{belowcaptionskip}|=|\meta{dimension}
+%
+%       is the vertical space respectively above or below each caption.
+% \end{syntax}
+%
+%
+% \subsection{Margins and line shape}\label{rMarginsAndLineShape}
+%
+% \begin{syntax}
+% \item[0.21,\linewidth] \rkeyname{linewidth}|=|\meta{dimension}
+%
+%       defines the base line width for listings. The following three keys are
+%       taken into account additionally.
+%
+% \item[0.19,0pt] \rkeyname{xleftmargin}|=|\meta{dimension}
+% \item[1.0,0pt] \rkeyname{xrightmargin}|=|\meta{dimension}
+%
+%       The dimensions are used as extra margins on the left and right. Line
+%       numbers and frames are both moved accordingly.
+%
+% \item[0.19,false] \rkeyname{resetmargins}|=|\meta{\alternative{true,false}}
+%
+%       If true, indention from list environments like \texttt{enumerate} or
+%       \texttt{itemize} is reset, i.e.~not used.
+%
+% \item[0.20,false] \rkeyname{breaklines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breaklines}
+%
+%       activates or deactivates automatic line breaking of long lines.
+%
+% \item[1.2,false] \rkeyname{breakatwhitespace}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakatwhitespace}\label{uoption:breakatwhitespace}
+%
+%       If true, it allows line breaks only at white space.
+%
+% \item[0.20,{{}}] \rkeyname{prebreak}|=|\meta{tokens}
+% \item[0.20,{{}}] \rkeyname{postbreak}|=|\meta{tokens}
+%
+%       \meta{tokens} appear at the end of the current line respectively at the beginning of the next (broken part of the) line.
+%
+%       You must not use dynamic space (in particular spaces) since internally we use |\discretionary|.
+%       However |\space| is redefined to be used inside \meta{tokens}.
+%
+% \item[0.20,20pt] \rkeyname{breakindent}|=|\meta{dimension}
+%
+%       is the indention of the second, third, \ldots\ line of broken lines.
+%
+% \item[0.20,true] \rkeyname{breakautoindent}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakautoindent}
+%
+%       activates or deactivates automatic indention of broken lines. This
+%       indention is used additionally to \ikeyname{breakindent}, see the
+%       example below.
+%       Visible spaces or visible tabulators might set this auto
+%       indention to zero.
+% \end{syntax}
+% In the following example we use tabulators to create long lines, but the
+% verbatim part uses |tabsize=1|.
+% \begin{lstxsample}
+%    \lstset{postbreak=\space, breakindent=5pt, breaklines}
+% \end{lstxsample}
+% \begin{lstsample}{\lstset{string=[d]",tabsize=6}}{\lstset{tabsize=1}\hfuzz=1in}
+%    \begin{lstlisting}
+%    		"A long string is broken!"
+%    			"Another long line."
+%    \end{lstlisting}
+%
+%    \begin{lstlisting}[breakautoindent
+%                                 =false]
+%    		{ Now auto indention is off. }
+%    \end{lstlisting}
+% \end{lstsample}
+%
+%
+% \subsection{Frames}\label{rFrames}
+%
+% \begin{syntax}
+% \item[1.0,none] \rkeyname{frame}|=|\meta{\alternative{none,leftline,topline,bottomline,lines,single,shadowbox}}
+%
+%       draws either no frame, a single line on the left, at the top, at the
+%       bottom, at the top and bottom, a whole single frame, or a shadowbox.
+%
+%       Note that \packagename{fancyvrb} supports the same frame types except
+%       \texttt{shadowbox}. The shadow color is \keyname{rulesepcolor}, see
+%       below.
+%
+% \item[0.19,{{}}] \rkeyname{frame}|=|\meta{subset of \textup{\texttt{trblTRBL}}}
+%
+%		The characters \texttt{trblTRBL} designate lines at the top and
+%       bottom of a listing and to lines on the right and left. Upper case
+%       characters are used to draw double rules. So |frame=tlrb| draws a
+%       single frame and |frame=TL| double lines at the top and on the left.
+%
+%       Note that frames usually reside outside the listing's space.
+%
+% \item[0.20,ffff] \rkeyname{frameround}|=|\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}}
+%
+%       The four letters designate the top right, bottom right, bottom
+%       left and top left corner. In this order. \texttt{t} makes the
+%       according corner round. If you use round corners, the rule width is
+%       controlled via |\thinlines| and |\thicklines|.
+%
+%       Note: The size of the quarter circles depends on \keyname{framesep}
+%       and is independent of the extra margins of a frame. The size is
+%       possibly adjusted to fit \LaTeX's circle sizes.
+%
+% \item[0.19,3pt] \rkeyname{framesep}|=|\meta{dimension}
+% \item[0.19,2pt] \rkeyname{rulesep}|=|\meta{dimension}
+%
+%		control the space between frame and listing and between double rules.
+%
+% \item[0.19,0.4pt] \rkeyname{framerule}|=|\meta{dimension}
+%
+%		controls the width of the rules.
+%
+% \item[1.0,0pt] \rkeyname{framexleftmargin}|=|\meta{dimension}
+% \item[1.0,0pt] \rkeyname{framexrightmargin}|=|\meta{dimension}
+% \item[1.0,0pt] \rkeyname{framextopmargin}|=|\meta{dimension}
+% \item[1.0,0pt] \rkeyname{framexbottommargin}|=|\meta{dimension}
+%
+%       are the dimensions which are used additionally to \keyname{framesep}
+%       to make up the margin of a frame.
+%
+% \item[0.21] \rkeyname{backgroundcolor}|=|\meta{color command}
+% \item[0.21] \rkeyname{rulecolor}|=|\meta{color command}
+% \item[1.0] \rkeyname{fillcolor}|=|\meta{color command}
+% \item[1.0] \rkeyname{rulesepcolor}|=|\meta{color command}
+%
+%       specify the colour of the background, the rules, the space between
+%       `text box' and first rule, and of the space between two rules,
+%       respectively.
+%       Note that the value requires a |\color| command, for example
+%       \keyname{rulecolor}|=\color{blue}|.
+% \end{syntax}
+% \ikeyname{frame} does not work with |fancyvrb=true| or when the package
+% internally makes a |\hbox| around the listing! And there are certainly more
+% problems with other commands; please take the time to make a (bug) report.
+%\ifcolor
+% \begin{lstxsample}
+%    \lstset{framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{blue}}
+% \end{lstxsample}
+%\else
+%    \lstset{framexleftmargin=5mm, frame=shadowbox}
+%\fi
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}[numbers=left]
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% Note here the use of |framexleftmargin| to include the line numbers inside
+% the frame.
+%
+% Do you want exotic frames? Try the following key if you want, for example,
+% \begin{lstsample}{\lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}}{}
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{syntax}
+% \item[0.20,,\dag] \rkeyname{frameshape}|=|\marg{top shape}\marg{left shape}\marg{right shape}\marg{bottom shape}
+%
+%       gives you full control over the drawn frame parts.
+%       The arguments are not case sensitive.
+%
+%       Both \meta{left shape} and \meta{right shape} are `left-to-right'
+%       \alternative{y,n} character sequences (or empty). Each |y| lets the
+%       package draw a rule, otherwise the rule is blank. These vertical rules
+%       are drawn `left-to-right' according to the specified shapes.
+%       The example above uses |yny|.
+%
+%       \meta{top shape} and \meta{bottom shape} are `left-rule-right'
+%       sequences (or empty). The first `left-rule-right' sequence is attached
+%       to the most inner rule, the second to the next, and so on.
+%       Each sequence has three characters: `rule' is either |y| or |n|;
+%       `left' and `right' are |y|, |n| or |r| (which makes a corner round).
+%       The example uses |RYRYNYYYY| for both shapes:
+%       |RYR| describes the most inner (top and bottom) frame shape, |YNY|
+%       the middle, and |YYY| the most outer.
+% \end{syntax}
+% To summarize, the example above used
+% \begin{verbatim}
+%    \lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}\end{verbatim}
+% Note that you are not resticted to two or three levels.
+% However you'll get in trouble if you use round corners when they are too big.
+%
+%
+% \subsection{Indexing}
+%
+% \begin{syntax}
+% \item[0.19] \rkeyname{index}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers}
+% \item[0.21] \rkeyname{moreindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers}
+% \item[0.21] \rkeyname{deleteindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers}
+%
+%       define, add and remove \meta{identifiers} and \meta{keyword classes}
+%       from the index class list \meta{number}. If you don't specify the
+%       optional number, the package assumes \meta{number} $=1$.
+%
+%		Each appearance of the explicitly given identifiers and each appearance
+%       of the identifiers of the specified \meta{keyword classes} is indexed.
+%       For example, you could write |index=[1][keywords]| to index all
+%       keywords. Note that |[1]| is required here---otherwise we couldn't use
+%       the second optional argument.
+%
+% \item[0.19,\lstindexmacro] \rkeyname{indexstyle}|=|\oarg{number}\meta{tokens \textup(one-parameter command\textup)}
+%
+%       \meta{tokens} actually indexes the identifiers for the list
+%       \meta{number}. In contrast to the style keys, \meta{tokens}
+%       \emph{must} read exactly one parameter, namely the identifier.
+%       Default definition is\icmdname{\lstindexmacro}\vspace*{-\itemsep}
+% \begin{verbatim}
+%    \newcommand\lstindexmacro[1]{\index{{\ttfamily#1}}}\end{verbatim}
+%       \vspace*{-\itemsep}which you shouldn't modify.
+%       Define your own indexing commands and use them as argument to this key.
+% \end{syntax}
+% Section \ref{uIndexing} describes this feature in detail.
+%
+%
+% \subsection{Column alignment}\label{rColumnAlignment}
+%
+% \begin{syntax}
+% \item[1.0,{[c]fixed}] \rkeyname{columns}|=|\oarg{\alternative{c,l,r}}\meta{alignment}
+%
+%       selects the column alignment.  The \meta{alignment} can be |fixed|,
+%       |flexible|, |spaceflexible|, or |fullflexible|; see section
+%       \ref{uFixedAndFlexibleColumns} for details.
+%
+%       The optional |c|, |l|, or |r| controls the horizontal orientation of
+%       smallest output units (keywords, identifiers, etc.). The arguments work
+%       as follows, where vertical bars visualize the effect:
+%           $\vert$\lstinline[columns={[c]fixed}]!listing!$\vert$,
+%           $\vert$\lstinline[columns={[l]fixed}]!listing!$\vert$, and
+%           $\vert$\lstinline[columns={[r]fixed}]!listing!$\vert$
+%       in fixed column mode,
+%           $\vert$\lstinline[columns={[c]flexible}]!listing!$\vert$,
+%           $\vert$\lstinline[columns={[l]flexible}]!listing!$\vert$, and
+%           $\vert$\lstinline[columns={[r]flexible}]!listing!$\vert$
+%       with flexible columns, and
+%           $\vert$\lstinline[columns={[c]fullflexible}]!listing!$\vert$,
+%           $\vert$\lstinline[columns={[l]fullflexible}]!listing!$\vert$, and
+%           $\vert$\lstinline[columns={[r]fullflexible}]!listing!$\vert$
+%       with space-flexible or full flexible columns (which ignore the
+%       optional argument, since they do not add extra space around
+%       printable characters).
+%
+% \item[0.18,false] \rkeyname{flexiblecolumns}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{flexiblecolumns}
+%
+%       selects the most recently selected flexible or fixed column format,
+%       refer to section \ref{uFixedAndFlexibleColumns}.
+%
+% \item[0.21,false,\dag] \rkeyname{keepspaces}|=|\meta{\alternative{true,false}}
+%
+%       |keepspaces=true| tells the package not to drop spaces to fix column
+%       alignment and always converts tabulators to spaces.
+%
+% \item[0.16] \rkeyname{basewidth}|=|\meta{dimension}\syntaxor
+% \item[0.18,{{0.6em,0.45em}}] \rkeyname{basewidth}|={|\meta{fixed}|,|\meta{flexible mode}|}|
+%
+%       sets the width of a single character box for fixed and flexible column
+%       mode (both to the same value or individually).
+%
+% \item[0.20,false] \rkeyname{fontadjust}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{fontadjust}
+%
+%       If true the package adjusts the base width every font selection.
+%       This makes sense only if \ikeyname{basewidth} is given in font specific
+%       units like `em' or `ex'---otherwise this boolean has no effect.
+%
+%       After loading the package, it doesn't adjust the width every font
+%       selection: it looks at \ikeyname{basewidth} each listing and uses the
+%       value for the whole listing. This is possibly inadequate if the style
+%       keys in section \ref{rFigureOutTheAppearance} make heavy font size
+%       changes, see the example below.
+%
+%       Note that this key might disturb the column alignment and might have an
+%       effect on the keywords' appearance!
+% \end{syntax}
+% \begin{lstsample}{\lstset{basicstyle=\normalsize}}{}
+%    \lstset{commentstyle=\scriptsize}
+%    \begin{lstlisting}
+%    { scriptsize font
+%      doesn't look good }
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+% \begin{lstsample}{\lstset{basicstyle=\normalsize,commentstyle=\scriptsize}}{}
+%    \begin{lstlisting}[fontadjust]
+%    { scriptsize font
+%      looks better now }
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{lstlisting}
+% \end{lstsample}
+%
+%
+% \subsection{Escaping to \LaTeX}\label{rEscapingToLaTeX}
+%
+% \textbf{Note:} {\itshape Any escape to \LaTeX\ may disturb the column
+% alignment since the package can't control the spacing there.}
+% \begin{syntax}
+% \item[0.18,false] \rkeyname{texcl}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{texcl}
+%
+%       activates or deactivates \LaTeX\ comment lines. If activated, comment
+%       line delimiters are printed as usual, but the comment line text (up to
+%       the end of line) is read as \LaTeX\ code and typeset in comment style.
+% \end{syntax}
+% The example uses \Cpp\ comment lines (but doesn't say how to define them).
+% Without |\upshape| we would get \textit{calculate} since the comment style
+% is |\itshape|.
+% \begin{lstsample}{\lstset{morecomment=[l]//}}{}
+%    \begin{lstlisting}[texcl]
+%    // \upshape calculate $a_{ij}$
+%      A[i][j] = A[j][j]/A[i][j];
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% \begin{syntax}
+% \item[0.19,false] \rkeyname{mathescape}|=|\meta{\alternative{true,false}}
+%
+%       activates or deactivates special behaviour of the dollar sign.
+%       If activated a dollar sign acts as \TeX's text math shift.
+%
+%       This key is useful if you want to typeset formulas in listings.
+%
+% \item[0.19,{{}}] \rkeyname{escapechar}|=|\meta{character}\syntaxor\rkeyname{escapechar}|={}|
+%
+%       If not empty the given character escapes the user to \LaTeX: all code
+%       between two such characters is interpreted as \LaTeX\ code. Note that
+%       \TeX's special characters must be entered with a preceding backslash,
+%       e.g.~|escapechar=\%|.
+%
+% \item[0.20,{{}}] \rkeyname{escapeinside}|=|\meta{character}\meta{character}\syntaxor\rkeyname{escapeinside}|={}|
+%
+%       Is a generalization of \ikeyname{escapechar}. If the value is not
+%       empty, the package escapes to \LaTeX\ between the first and second
+%       character.
+%
+% \item[0.20,{{}}] \rkeyname{escapebegin}|=|\meta{tokens}
+% \item[0.20,{{}}] \rkeyname{escapeend}|=|\meta{tokens}
+%
+%       The tokens are executed at the beginning respectively at the end of
+%       each escape, in particular for \ikeyname{texcl}.
+%       See section \ref{uNationalCharacters} for an application.
+% \end{syntax}
+%
+% \begin{lstsample}{\lstset{morecomment=[l]//}}{}
+%    \begin{lstlisting}[mathescape]
+%    // calculate $a_{ij}$
+%      $a_{ij} = a_{jj}/a_{ij}$;
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% \begin{lstsample}{\lstset{morecomment=[l]//}}{}
+%    \begin{lstlisting}[escapechar=\%]
+%    // calc%ulate $a_{ij}$%
+%      %$a_{ij} = a_{jj}/a_{ij}$%;
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% \begin{lstsample}{\lstset{morecomment=[l]//}}{}
+%    \lstset{escapeinside=`'}
+%    \begin{lstlisting}
+%    // calc`ulate $a_{ij}$'
+%      `$a_{ij} = a_{jj}/a_{ij}$';
+%    \end{lstlisting}
+% \end{lstsample}
+% In the first example the comment line up to $a_{ij}$ has been typeset by the
+% \packagename{listings} package in comment style. The $a_{ij}$ itself is
+% typeset in `\TeX\ math mode' without comment style. About half of the
+% comment line of the second example has been typeset by this package, and
+% the rest is in `\LaTeX\ mode'.
+%
+% To avoid problems with the current and future version of this package:
+% \begin{enumerate}
+% \item Don't use any commands of the \packagename{listings} package when you
+%       have escaped to \LaTeX.
+% \item Any environment must start and end inside the same escape.
+% \item You might use |\def|, |\edef|, etc., but do not assume that the
+%       definitions are present later, unless they are |\global|.
+% \item |\if \else \fi|, groups, math shifts |$| and |$$|, \ldots\ must be
+%       balanced within each escape.
+% \item \ldots
+% \end{enumerate}
+% Expand that list yourself and mail me about new items.
+%
+%
+% \subsection{Interface to \textsf{fancyvrb}}
+%
+% The \packagename{fancyvrb} package---fancy verbatims---from Timothy van Zandt
+% provides macros for reading, writing and typesetting verbatim code. It has
+% some remarkable features the \packagename{listings} package doesn't have.
+% (Some are possible, but you must find somebody who will implement them |;-)|.
+% \begin{syntax}
+% \item[0.19] \rkeyname{fancyvrb}|=|\meta{\alternative{true,false}}
+%
+%       activates or deactivates the interface. If active, verbatim code is
+%       read by \packagename{fancyvrb} but typeset by \packagename{listings},
+%       i.e.~with emphasized keywords, strings, comments, and so on.
+%       Internally we use a very special definition of |\FancyVerbFormatLine|.
+%
+%       This interface works with |Verbatim|, |BVerbatim| and |LVerbatim|.
+%       But you shouldn't use \packagename{fancyvrb}'s \keyname{defineactive}.
+%       (As far as I can see it doesn't matter since it does nothing at all,
+%       but for safety \ldots .)
+%       If \packagename{fancyvrb} and \packagename{listings} provide similar
+%       functionality, you should use \packagename{fancyvrb}'s.
+%
+% \item[1.1,{\overlay 1}] \rkeyname{fvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:fvcmdparams}
+% \item[1.1] \rkeyname{morefvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:morefvcmdparams}
+%
+%       If you use \packagename{fancyvrb}'s \keyname{commandchars}, you must
+%       tell the \packagename{listings} package how many arguments each command
+%       takes. If a command takes no arguments, there is nothing to do.
+%
+%       The first (third, fifth, \ldots) parameter to the keys is the command
+%       and the second (fourth, sixth, \ldots) is the number of arguments
+%       that command takes. So, if you want to use |\textcolor{red}{keyword}|
+%       with the \packagename{fancyvrb}-\packagename{listings} interface, you
+%       should write |\lstset{morefvcmdparams=\textcolor 2}|.
+% \end{syntax}
+%
+% \iffancyvrb
+% \begin{lstsample}{}{}
+%    \lstset{morecomment=[l]\ }% :-)
+%    \fvset{commandchars=\\\{\}}
+%
+%    \begin{BVerbatim}
+%    First verbatim line.
+%    \fbox{Second} verbatim line.
+%    \end{BVerbatim}
+%
+%    \par\vspace{72.27pt}
+%
+%    \lstset{fancyvrb}
+%    \begin{BVerbatim}
+%    First verbatim line.
+%    \fbox{Second} verbatim line.
+%    \end{BVerbatim}
+%    \lstset{fancyvrb=false}
+% \end{lstsample}
+% The lines typeset by the \packagename{listings} package are wider since the
+% default \ikeyname{basewidth} doesn't equal the width of a single typewriter type
+% character. Moreover, note that the first space begins a comment as defined at
+% the beginning of the example.
+% \else
+% \begin{center}
+%    \packagename{fancyvrb} seems to be unavailable on your platform, thus the
+%    example couldn't be printed here.
+% \end{center}
+% \fi
+%
+%
+% \subsection{Environments}\label{rEnvironments}
+%
+% If you want to define your own pretty-printing environments, try the
+% following command. The syntax comes from \LaTeX's |\newenvironment|.
+% \begin{syntax}
+% \item[0.19] \rcmdname\lstnewenvironment\\
+%       \marg{name}\oarg{number}\oarg{opt.~default~arg.}\\
+%       |{|\meta{starting code}|}|\\
+%       |{|\meta{ending code}|}|
+% \end{syntax}
+% As a simple example we could just select a particular language.
+% \begin{lstxsample}
+%    \lstnewenvironment{pascal}
+%        {\lstset{language=pascal}}
+%        {}
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{pascal}
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    \end{pascal}
+% \end{lstsample}
+% Doing other things is as easy, for example, using more keys and adding an
+% optional argument to adjust settings each listing:
+% \begin{verbatim}
+%\lstnewenvironment{pascalx}[1][]
+%    {\lstset{language=pascal,numbers=left,numberstyle=\tiny,float,#1}}
+%    {}\end{verbatim}
+%
+%
+% \subsection{Short Inline Listing Commands}\label{rShortInline}
+%
+% Short equivalents of |\lstinline| can also be defined, in a manner similar
+% to the short verbatim macros provided by \packagename{shortvrb}.
+%
+% \begin{syntax}
+% \item[1.4] \rcmdname\lstMakeShortInline[\oarg{options}]\meta{character}
+%
+%       defines \meta{character} to be an equivalent of
+%       |\lstinline|[\oarg{options}]\meta{character},
+%       allowing for a convenient syntax when using lots of inline listings.
+%
+% \item[1.4] \rcmdname\lstDeleteShortInline\meta{character}
+%
+%       removes a definition of \meta{character} created by |\lstMakeShortInline|,
+%       and returns \meta{character} to its previous meaning.
+% \end{syntax}
+%
+%
+% \subsection{Language definitions}\label{rLanguageDefinitions}
+%
+% You should first read section \ref{uLanguageDefinitions} for an introduction
+% to language definitions. Otherwise you're probably unprepared for the full
+% syntax of |\lstdefinelanguage|.
+% \begin{syntax}
+% \item[0.19] \rcmdname\lstdefinelanguage\syntaxnewline[\oarg{dialect}]\marg{language}\syntaxnewline[\oarg{base dialect}\marg{and base language}]\syntaxnewline\marg{key=value list}\syntaxnewline[\oarg{list of required aspects \textup(keywordcomments,texcs,etc.\textup)}]
+%
+%		defines the (given dialect of the) programming language \meta{language}.
+%       If the language definition is based on another definition, you must
+%       specify the whole \oarg{base dialect}\marg{and base language}. Note
+%       that an empty \meta{base dialect} uses the default dialect!
+%
+%       The last optional argument should specify all required aspects. This is
+%       a delicate point since the aspects are described in the developer's
+%       guide. You might use existing languages as templates. For example,
+%       ANSI C uses \aspectname{keywords}, \aspectname{comments},
+%       \aspectname{strings} and \aspectname{directives}.
+%
+%       \icmdname{\lst@definelanguage} has the same syntax and is used to
+%       define languages in the driver files.
+%
+% \begin{advise}
+% \item Where should I put my language definition?
+%       \advisespace
+%       If you need the language for one particular document, put it into
+%       the preamble of that document. Otherwise create the local file
+%       `\texttt{lstlang0.sty}' or add the definition to that file, but use
+%       `|\lst@definelanguage|' instead of `|\lstdefinelanguage|'.
+%       However, you might want to send the definition to the address in
+%       section \ref{uSoftwareLicense}. Then it will be included with the
+%       rest of the languages distributed with the package, and published under
+%       the \LaTeX\ Project Public License.
+% \end{advise}
+%
+% \item[0.18] \rcmdname\lstalias\marg{alias}\marg{language}
+%
+%       defines an alias for a programming language. Each \meta{alias} is
+%       redirected to the same dialect of \meta{language}.
+%       It's also possible to define an alias for one particular dialect only:
+%
+% \item[0.18] \rcmdname\lstalias\oarg{alias dialect}\marg{alias}\oarg{dialect}\marg{language}
+%
+%       Here all four parameters are \emph{nonoptional} and an alias with empty
+%       \meta{dialect} will select the default dialect. Note that aliases
+%       cannot be chained: The two aliases `|\lstalias{foo1}{foo2}|' and
+%       `|\lstalias{foo2}{foo3}|' will \emph{not} redirect |foo1| to |foo3|.
+% \end{syntax}
+% All remaining keys in this section are intended for building language
+% definitions. \emph{No other key should be used in such a definition!}
+%
+%
+% \paragraph{Keywords}
+% We begin with keyword building keys. Note: {\itshape If you want to enter
+% {\upshape|\|, |{|, |}|, |%|, |#|} or {\upshape|&|} as (part of) an argument
+% to the keywords below, you must do it with a preceding backslash!}
+% \begin{syntax}
+% \item[1.0,,{\dag bug}] \rkeyname{keywordsprefix}|=|\meta{prefix}
+%
+%       All identifiers starting with \meta{prefix} will be printed as first
+%       order keywords.
+%
+%       Bugs: Currently there are several limitations.
+%       (1) The prefix is always case sensitive.
+%       (2) Only one prefix can be defined at a time.
+%       (3) If used `standalone' outside a language definition, the key might
+%           work only after selecting a nonempty language (and switching back to
+%           the empty language if necessary).
+%       (4) The key does not respect the value of \keyname{classoffset} and
+%           has no optional class \meta{number} argument.
+%
+% \item[0.11] \rkeyname{keywords}|=|\oarg{number}\marg{list of keywords}
+% \item[0.11] \rkeyname{morekeywords}|=|\oarg{number}\marg{list of keywords}
+% \item[0.18] \rkeyname{deletekeywords}|=|\oarg{number}\marg{list of keywords}
+%
+%       define, add to or remove the keywords from keyword list \meta{number}.
+%       The use of \keyname{keywords} is discouraged since it deletes all
+%       previously defined keywords in the list and is thus incompatible with
+%       the \keyname{alsolanguage} key.
+%
+%       Please note the keys \ikeyname{alsoletter} and \ikeyname{alsodigit}
+%       below if you use unusual charaters in keywords.
+%
+% \item[0.19,,deprecated] \rkeyname{ndkeywords}|=|\marg{list of keywords}
+% \item[0.19,,deprecated] \rkeyname{morendkeywords}|=|\marg{list of keywords}
+% \item[0.19,,deprecated] \rkeyname{deletendkeywords}|=|\marg{list of keywords}
+%
+%       define, add to or remove the keywords from keyword list 2; note that
+%       this is equivalent to |keywords=[2]|\ldots etc.
+%       The use of \keyname{ndkeywords} is strongly discouraged.
+%
+% \item[0.19,,{addon,optional}] \rkeyname{texcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)}
+% \item[0.20,,{addon,optional}] \rkeyname{moretexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)}
+% \item[0.21,,{addon,optional}] \rkeyname{deletetexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)}
+%
+%       Ditto for control sequences in \TeX\ and \LaTeX.
+%
+% \item[0.18,,optional] \rkeyname{directives}|=|\marg{list of compiler directives}
+% \item[0.21,,optional] \rkeyname{moredirectives}|=|\marg{list of compiler directives}
+% \item[0.21,,optional] \rkeyname{deletedirectives}|=|\marg{list of compiler directives}
+%
+%       defines compiler directives in C, \Cpp, Objective-C, and POV.
+%
+% \item[0.14] \rkeyname{sensitive}|=|\meta{\alternative{true,false}}
+%
+%       makes the keywords, control sequences, and directives case sensitive
+%       and insensitive, respectively. This key affects the keywords, control
+%       sequences, and directives only when a listing is processed. In all
+%       other situations they are case sensitive, for example,
+%       |deletekeywords={save,Test}| removes `save' and `Test', but neither
+%       `SavE' nor `test'.
+%
+% \item[0.19] \rkeyname{alsoletter}|=|\marg{character sequence}
+% \item[0.19] \rkeyname{alsodigit}|=|\marg{character sequence}
+% \item[0.19] \rkeyname{alsoother}|=|\marg{character sequence}
+%
+%       All identifiers (keywords, directives, and such) consist of a letter
+%       followed by alpha-numeric characters (letters and digits).
+%       For example, if you write
+%           |keywords={one-two,\#include}|,
+%       the minus sign must become a digit and the sharp a letter since the
+%       keywords can't be detected otherwise.
+%
+%       Table \ref{rStdCharTable} show the standard configuration of the
+%       \packagename{listings} package. The three keys overwrite the default
+%       behaviour. Each character of the sequence becomes a letter, digit
+%       and other, respectively.
+%
+% \item[0.20] \rkeyname{otherkeywords}|=|\marg{keywords}
+%
+%       Defines keywords that contain other characters, or start with digits.
+%       Each given `keyword' is printed in keyword style, but without changing
+%       the `letter', `digit' and `other' status of the characters. This key
+%       is designed to define keywords like |=>|, |->|, |-->|, |--|, |::|, and
+%       so on. If one keyword is a subsequence of another (like |--| and
+%       |-->|), you must specify the shorter first.
+%
+% \item[0.20,,{renamed,optional}] \rkeyname{tag}|=|\meta{character}\meta{character}\syntaxor\rkeyname{tag}|={}|\label{uoption:tag}
+%
+%       The first order keywords are active only between the first and second
+%       character. This key is used for HTML.
+% \end{syntax}
+%
+% \begin{table}[tb]
+% \caption{Standard character table}\label{rStdCharTable}
+% \begin{tabular}{ll}
+% class & characters\\
+% \noalign{\smallskip}
+% letter & \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\
+%        & \texttt{a b c d e f g h i j k l m n o p q r s t u v w x y z}\\
+%        & \texttt{@ \textdollar\ } |_|\\
+% digit  & \texttt{0 1 2 3 4 5 6 7 8 9}\\
+% other  & \texttt{!\ " \#\ \%\ \&\ ' ( ) * + , - .\ / :\ ; < = > ?}\\
+%        & {\catcode`\|=12\texttt{[ \char92\ ] \textasciicircum\ \char123\ | \char125\ \textasciitilde}}\\
+% space  & chr(32)\\
+% tabulator & chr(9)\\
+% form feed & chr(12)\\
+% \noalign{\smallskip}
+% \end{tabular}
+% \par\noindent
+% Note: Extended characters of codes 128--255 (if defined) are \emph{currently}
+% letters.
+% \end{table}
+%
+%
+% \paragraph{Strings}
+% \begin{syntax}
+% \item[0.12] \rkeyname{string}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter \textup(character\textup)}
+% \item[0.21] \rkeyname{morestring}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter}
+% \item[0.21] \rkeyname{deletestring}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter}
+%
+%       define, add to or delete the delimiter from the list of string
+%       delimiters. Starting and ending delimiters are the same, i.e.~in the
+%       source code the delimiters must match each other.
+%
+%       The optional argument is the type and controls the how the delimiter
+%       itself is represented in a string or character literal: it is escaped by a
+%       |b|ackslash, |d|oubled (or both is allowed via |bd|).  Alternately, the
+%       type can refer to an unusual form of delimiter: |s|tring delimiters (akin
+%       to the |s| comment type) or |m|atlab-style delimiters.  The latter is a
+%       special type for Ada and Matlab and possibly other languages where the
+%       string delimiters are also used for other purposes.  It is equivalent
+%       to |d|, except that a string does not start after a letter, a right
+%       parenthesis, a right bracket, or some other characters.
+% \end{syntax}
+%
+%
+% \paragraph{Comments}
+% \begin{syntax}
+% \item[0.13] \rkeyname{comment}|=|\oarg{type}\meta{delimiter\textup(s\textup)}
+% \item[0.21] \rkeyname{morecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)}
+% \item[0.21] \rkeyname{deletecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)}
+%
+%       Ditto for comments, but some types require more than a single
+%       delimiter. The following overview uses \keyname{morecomment} as the
+%       example, but the examples apply to \keyname{comment} and \keyname{deletecomment}
+%       as well.
+%
+% \item[0.13] \keyname{morecomment}|=[l]|\meta{delimiter}
+%
+%       The delimiter starts a comment line, which in general starts with the
+%       delimiter and ends at end of line. If the character sequence |//|
+%       should start a comment line (like in \Cpp, Comal 80 or Java),
+%       |morecomment=[l]//| is the correct declaration. For Matlab it
+%       would be |morecomment=[l]\%|---note the preceding backslash.
+%
+% \item[0.13] \keyname{morecomment}|=[s]|\marg{delimiter}\marg{delimiter}
+%
+%       Here we have two delimiters. The second ends a comment starting with
+%       the first delimiter. If you require two such comments you can use this
+%       type twice. C, Java, PL/I, Prolog and SQL all define single comments
+%       via |morecomment=[s]{/*}{*/}|, and Algol does it with
+%       |morecomment=[s]{\#}{\#}|, which means that the sharp delimits both
+%       beginning and end of a single comment.
+%
+% \item[0.13] \keyname{morecomment}|=[n]|\marg{delimiter}\marg{delimiter}
+%
+%       is similar to type |s|, but comments can be nested. Identical arguments
+%       are not allowed---think a while about it!
+%       Modula-2 and Oberon-2 use |morecomment=[n]{(*}{*)}|.
+%
+% \item[0.18] \keyname{morecomment}|=[f]|\meta{delimiter}
+% \item[0.18] \keyname{morecomment}|=[f][commentstyle]|\oarg{n=preceding columns}\meta{delimiter}
+%
+%       The delimiter starts a comment line if and only if it appears on a
+%       fixed column-number, namely if it is in column $n$ (zero based).
+%
+% \item[0.17,,optional] \rkeyname{keywordcomment}|=|\marg{keywords}
+% \item[0.21,,optional] \rkeyname{morekeywordcomment}|=|\marg{keywords}
+% \item[0.21,,optional] \rkeyname{deletekeywordcomment}|=|\marg{keywords}
+%
+%       A keyword comment begins with a keyword and ends with the same keyword.
+%       Consider |keywordcomment={comment,co}|. Then
+%       `\textbf{comment}\allowbreak\ldots\textbf{comment}' and
+%       `\textbf{co}\ldots\textbf{co}' are comments.
+%
+% \item[0.17,,optional] \rkeyname{keywordcommentsemicolon}|=|\marg{keywords}\marg{keywords}\marg{keywords}
+%
+%       The definition of a `keyword comment semicolon' requires three keyword
+%       lists, e.g.~|{end}{else,end}{comment}|. A semicolon always ends such a
+%       comment. Any keyword of the first argument begins a comment and any
+%       keyword of the second argument ends it (and a semicolon also);
+%       a comment starting with any keyword of the third argument is terminated
+%       with the next semicolon only. In the example all possible comments are
+%       `\textbf{end}\ldots\textbf{else}', `\textbf{end}\ldots\textbf{end}'
+%       (does not start a comment again) and `\textbf{comment}\ldots;' and
+%       `\textbf{end}\ldots;'.
+%       Maybe a curious definition, but Algol and Simula use such comments.
+%
+%       Note: The keywords here need not to be a subset of the defined
+%       keywords. They won't appear in keyword style if they aren't.
+%
+% \item[0.17,,optional] \rkeyname{podcomment}|=|\meta{\alternative{true,false}}
+%
+%       activates or deactivates PODs---Perl specific.
+% \end{syntax}
+%
+%
+% \subsection{Installation}\label{rInstallation}
+%
+% \paragraph{Software installation}
+% \begin{enumerate}
+% \item Following the \TeX\ directory structure (TDS), you should put the files
+%       of the \packagename{listings} package into directories as follows:
+%       \begin{center}
+%       \begin{tabular}{lcl}
+%       \texttt{listings.pdf}&$\to$&\texttt{texmf/doc/latex/listings}\\
+%       \texttt{listings.dtx}, \texttt{listings.ins},\\
+%       \texttt{listings.ind}, \texttt{lstpatch.sty},\\
+%       \texttt{lstdrvrs.dtx}&$\to$&\texttt{texmf/source/latex/listings}
+%       \end{tabular}
+%       \end{center}
+%       Note that you may not have a patch file \texttt{lstpatch.sty}.
+%       If you don't use the TDS, simply adjust the directories below.
+% \item	Create the directory \texttt{texmf/tex/latex/listings} or, if it exists
+%       already, remove all
+%       files except \texttt{lst}\meta{whatever}\texttt{0.sty} and
+%       \texttt{lstlocal.cfg} from it.
+% \item	Change the working directory to \texttt{texmf/source/latex/listings}
+%       and run \texttt{listings.ins} through \TeX.
+% \item Move the generated files to \texttt{texmf/tex/latex/listings} if this
+%       is not already done.
+%       \begin{center}
+%       \begin{tabular}{lcl}
+%       \texttt{listings.sty}, \texttt{lstmisc.sty},
+%           &&\qquad(kernel and add-ons)\\
+%       \texttt{listings.cfg},
+%           &&\qquad(configuration file)\\
+%       \texttt{lstlang}\meta{number}\texttt{.sty},
+%           &&\qquad(language drivers)\\
+%       \texttt{lstpatch.sty}&$\to$&\texttt{texmf/tex/latex/listings}
+%       \end{tabular}
+%       \end{center}
+% \item If your \TeX\ implementation uses a file name database, update it.
+% \item If you receive a patch file later on, put it where
+%       \texttt{listings.sty} is (and update the file name database).
+% \end{enumerate}
+% Note that \packagename{listings} requires at least version 1.10 of the
+% \packagename{keyval} package included in the \packagename{graphics} bundle by
+% David Carlisle.
+%
+%
+% \paragraph{Software configuration}
+% Read this only if you encounter problems with the standard configuration or
+% if you want the package to suit foreign languages, for example.
+%
+% Never modify a file from the \packagename{listings} package, in particular
+% not the configuration file. Each new installation or new version overwrites
+% it. The software license allows modification, but I can't recommend it.
+% It's better to create one or more of the files
+% \begin{center}
+% \begin{tabular}{lcl}
+% \texttt{lstmisc0.sty} & for & local add-ons
+%                               (see the developer's guide),\\
+% \texttt{lstlang0.sty} & for & local language definitions
+%                               (see \ref{rLanguageDefinitions}), and\\
+% \texttt{lstlocal.cfg} & as  & local configuration file
+% \end{tabular}
+% \end{center}
+% and put them in the same directory as the other \packagename{listings} files.
+% These three files are not touched by a new installation unless you remove them.
+% If \texttt{lstlocal.cfg} exists, it is loaded after \texttt{listings.cfg}.
+% You might want to change one of the following parameters.
+% \begin{syntax}
+% \item[,,data] \rcmdname\lstaspectfiles\quad contains~\rlap{\texttt{\lstaspectfiles}}
+% \item[,,data] \rcmdname\lstlanguagefiles\quad contains~\rlap{\texttt{\lstlanguagefiles}}
+%
+%       The package uses the specified files to find add-ons and language
+%       definitions.
+% \end{syntax}
+% Moreover, you might want to adjust
+%   \icmdname\lstlistlistingname,
+%   \icmdname\lstlistingname,
+%   \ikeyname{defaultdialect},
+%   \icmdname\lstalias, or
+%   \icmdname\lstalias
+% \ as described in earlier sections.
+%
+%
+% \section{Experimental features}\label{rExperimentalFeatures}
+%
+% This section describes the more or less unestablished parts of this package.
+% It's unlikely that they will all be removed (unless stated explicitly), but
+% they are liable to (heavy) changes and improvements. Such features have been
+% \dag-marked in the last sections. So, if you find anything \dag-marked here,
+% you should be very, very careful.
+%
+%
+% \subsection{Listings inside arguments}\label{rListingsInsideArguments}
+%
+% There are some things to consider if you want to use |\lstinline| or the
+% listing environment inside arguments. Since \TeX\ reads the argument before
+% the `\lst-macro' is executed, this package can't do anything to preserve the
+% input: spaces shrink to one space, the tabulator and the end of line are
+% converted to spaces, \TeX's comment character is not printable, and so on.
+% Hence, \emph{you} must work a bit more. You have to put a backslash in front
+% of each of the following four characters: |\{}%|. Moreover you must protect
+% spaces in the same manner if: (i) there are two or more spaces following each
+% other or (ii) the space is the first character in the line.
+% That's not enough: Each line must be terminated with a `line feed' |^^J|.
+% And you can't escape to \LaTeX\ inside such listings!
+%
+% The easiest examples are with |\lstinline| since we need no line feed.
+% \begin{verbatim}
+%\footnote{\lstinline{var i:integer;} and
+%          \lstinline!protected\ \ spaces! and
+%          \fbox{\lstinline!\\\{\}\%!}}\end{verbatim}
+% yields\lstset{language=Pascal}\footnote{\lstinline{var i:integer;} and
+%          \lstinline!protected\ \ spaces! and
+%          \fbox{\lstinline!\\\{\}\%!}}
+% if the current language is Pascal. Note that this example shows another
+% experimental feature: use of argument braces as delimiters. This is
+% described in section \ref{rTypesettingListings}.
+%
+% And now an environment example:
+% \begin{lstsample}{\lstset{language={}}}{}
+%    \fbox{%
+%    \begin{lstlisting}^^J
+%    \ !"#$\%&'()*+,-./^^J
+%    0123456789:;<=>?^^J
+%    @ABCDEFGHIJKLMNO^^J
+%    PQRSTUVWXYZ[\\]^_^^J
+%    `abcdefghijklmno^^J
+%    pqrstuvwxyz\{|\}~^^J
+%    \end{lstlisting}}
+% \end{lstsample}
+% \begin{advise}
+% \item You might wonder that this feature is still experimental. The reason:
+%       You shouldn't use listings inside arguments; it's not always safe.
+% \end{advise}
+%
+%
+% \subsection{\dag\ Export of identifiers}\label{rExportOfIdentifiers}
+%
+% It would be nice to export function or procedure names. In general that's a
+% dream so far. The problem is that programming languages use various syntaxes
+% for function and procedure declaration or definition. A general interface is
+% completely out of the scope of this package---that's the work of a compiler
+% and not of a pretty-printing tool. However, it is possible for particular
+% languages: in Pascal, for instance, each function or procedure definition and
+% variable declaration is preceded by a particular keyword.
+% Note that you must request the following keys with the \texttt{procnames} option:
+% |\usepackage[procnames]{listings}|.
+% \begin{syntax}
+% \item[0.19,{{}},{\dag optional}] \rkeyname{procnamekeys}|=|\marg{keywords}
+% \item[0.21,,\dag optional] \rkeyname{moreprocnamekeys}|=|\marg{keywords}
+% \item[0.21,,\dag optional] \rkeyname{deleteprocnamekeys}|=|\marg{keywords}
+%
+%		each specified keyword indicates a function or procedure definition.
+%		Any identifier following such a keyword appears in `procname' style.
+%		For Pascal you might use\vspace{-.5\baselineskip}
+% \begin{verbatim}
+%    procnamekeys={program,procedure,function}\end{verbatim}
+%
+% \item[0.19,keywordstyle,\dag optional] \rkeyname{procnamestyle}|=|\meta{style}
+%
+%		defines the style in which procedure and function names appear.
+%
+% \item[0.19,false,\dag optional] \rkeyname{indexprocnames}|=|\meta{\alternative{true,false}}
+%
+%		If activated, procedure and function names are also indexed.
+% \end{syntax}
+% \begin{TODO}
+% The \aspectname{procnames} aspect is unsatisfactory (and has been unchanged
+% at least since 2000). It marks and indexes the function definitions so far, but
+% it would be possible to mark also the following function calls, for example.
+% A key could control whether function names are added to a special keyword
+% class, which then appears in `procname' style. But should these names be
+% added globally? There are good reasons for both. Of course, we would also
+% need a key to reset the name list.
+% \end{TODO}
+%
+%
+% \subsection{\dag\ Hyperlink references}\label{rHyperReferences}
+%
+% This very small aspect must be requested via the \texttt{hyper} option since it
+% is experimental. One possibility for the future is to combine this aspect
+% with \aspectname{procnames}. Then it should be possible to click on a
+% function name and jump to its definition, for example.
+% \begin{syntax}
+% \item[0.21,,{\dag optional}] \rkeyname{hyperref}|=|\marg{identifiers}
+% \item[0.21,,{\dag optional}] \rkeyname{morehyperref}|=|\marg{identifiers}
+% \item[0.21,,{\dag optional}] \rkeyname{deletehyperref}|=|\marg{identifiers}
+%
+%       hyperlink the specified identifiers (via \packagename{hyperref}
+%       package). A `click' on such an identifier jumps to the previous
+%       occurrence.
+%
+% \item[0.21,\hyper@@anchor,{\dag optional}] \rkeyname{hyperanchor}|=|\meta{two-parameter macro}
+% \item[0.21,\hyperlink,{\dag optional}] \rkeyname{hyperlink}|=|\meta{two-parameter macro}
+%
+%       set a hyperlink anchor and link, respectively.
+%       The defaults are suited for the \packagename{hyperref} package.
+% \end{syntax}
+%
+%
+% \subsection{Literate programming}
+%
+% We begin with an example and hide the crucial key=value list.
+% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{}
+%    \begin{lstlisting}
+%    var i:integer;
+%
+%    if (i<=0) i := 1;
+%    if (i>=0) i := 0;
+%    if (i<>0) i := 0;
+%    \end{lstlisting}
+% \end{lstsample}
+% Funny, isn't it? We could leave |i := 0| in our listings instead of
+% i| |$\gets$| |0, but that's not literate!  ^^A :-)
+% Now you might want to know how this has been done. Have a \emph{close}
+% look at the following key.
+% \begin{syntax}
+% \item[0.20,,\dag] \rkeyname{literate}|=|[|*|]\meta{replacement item}\ldots\meta{replacement item}
+%
+%       First note that there are no commas between the items. Each item
+%       consists of three arguments:
+%           \marg{replace}\marg{replacement text}\marg{length}.
+%       \meta{replace} is the original character sequence.
+%       Instead of printing these characters, we use \meta{replacement text},
+%       which takes the width of \meta{length} characters in the output.
+%
+%       Each `printing unit' in \meta{replacement text} \emph{must} be in braces
+%       unless it's a single character. For example, you must put braces
+%       around |$\leq$|.
+%       If you want to replace |<-1->| by |$\leftarrow1\rightarrow$|, the
+%       replacement item would be |{<-1->}{{$\leftarrow$}1{$\rightarrow$}}3|.
+%       Note the braces around the arrows.
+%
+%       If one \meta{replace} is a subsequence of another \meta{replace}, you
+%       must define the shorter sequence first. For example, |{-}| must be defined
+%       before |{--}| and this before |{-->}|.
+%
+%       The optional star indicates that literate replacements should not be
+%       made in strings, comments, and other delimited text.
+% \end{syntax}
+% In the example above, I've used
+% \begin{verbatim}
+%  literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1\end{verbatim}
+% \begin{TODO}
+% Of course, it's good to have keys for adding and removing single
+% \meta{replacement item}s. Maybe the key(s) should work in the same fashion
+% as the string and comment definitions, i.e.~one item per key=value.
+% This way it would be easier to provide better auto-detection in case of a
+% subsequence.
+% \end{TODO}
+%
+%
+% \subsection{\textsf{LGrind} definitions}\label{rLGrindDefinitions}
+%
+% Yes, it's a nasty idea to steal language definitions from other programs.
+% Nevertheless, it's possible for the \packagename{LGrind} definition
+% file---at least partially. Please note that this file must be found by
+% \TeX.
+% \begin{syntax}
+% \item[0.21,,{optional}] \rkeyname{lgrindef}|=|\meta{language}
+%
+%       scans the \texttt{lgrindef} language definition file for
+%       \meta{language} and activates it if present. Note that not all
+%       \packagename{LGrind} capabilities have a \packagename{listings}
+%       analogue.
+%
+%       Note that `Linda' language doesn't work properly since it defines
+%       compiler directives with preceding `|#|' as keywords.
+%
+% \item[0.21,lgrindef.,{data,optional}] \rcmdname\lstlgrindeffile
+%
+%       contains the (path and) name of the definition file.
+% \end{syntax}
+%
+%
+% \subsection{\dag\ Automatic formatting}
+%
+% \lstloadaspects{formats}^^A
+% The automatic source code formatting is far away from being good. First of
+% all, there are no general rules on how source code should be formatted. So
+% `format definitions' must be flexible. This flexibility requires a complex
+% interface, a powerful `format definition' parser, and lots of code lines
+% behind the scenes. Currently, format definitions aren't flexible enough
+% (possibly not the definitions but the results). A single `format item' has
+% the form
+% \begin{itemize}\item[]
+%     \meta{input chars}|=|\oarg{exceptional chars}\meta{pre}\oarg{\texttt{\string\string}}\meta{post}
+% \end{itemize}
+% Whenever \meta{input chars} aren't followed by one of the \meta{exceptional
+% chars}, formatting is done according to the rest of the value. If |\string|
+% isn't specified, the input characters aren't printed (except it's an
+% identifier or keyword). Otherwise \meta{pre} is `executed' before printing
+% the original character string and \meta{post} afterwards. These two are
+% `subsets' of
+% \begin{itemize}
+% \item |\newline| ---ensuring a new line;
+% \item |\space| ---ensuring a whitespace;
+% \item |\indent| ---increasing indention;
+% \item |\noindent| ---descreasing indention.
+% \end{itemize}
+% Now we can give an example.\lstaspectindex{\lstdefineformat}{}\lstaspectindex{format}{}
+% \begin{lstxsample}
+%    \lstdefineformat{C}{%
+%        \{=\newline\string\newline\indent,%
+%        \}=\newline\noindent\string\newline,%
+%        ;=[\ ]\string\space}
+% \end{lstxsample}
+% \begin{lstsample}{\lstset{language={}}}{}
+%    \begin{lstlisting}[format=C]
+%    for (int i=0;i<10; i++){/* wait */};
+%    \end{lstlisting}
+% \end{lstsample}
+% Not good. But there is a (too?) simple work-around:
+% \begin{lstxsample}
+%    \lstdefineformat{C}{%
+%        \{=\newline\string\newline\indent,%
+%        \}=[;]\newline\noindent\string\newline,%
+%        \};=\newline\noindent\string\newline,%
+%        ;=[\ ]\string\space}
+% \end{lstxsample}
+% \begin{lstsample}{\lstset{language={}}}{}
+%    \begin{lstlisting}[format=C]
+%    for (int i=0;i<10; i++){/* wait */};
+%    \end{lstlisting}
+% \end{lstsample}
+% Sometimes the problem is just to find a suitable format definition.
+% Further formatting is complicated.
+% Here are only three examples with increasing level of difficulty.
+% \begin{enumerate}
+% \item Insert horizontal space to separate function/procedure name and
+%       following parenthesis or to separate arguments of a function,
+%       e.g.~add the space after a comma (if inside function call).
+% \item Smart breaking of long lines. Consider long `and/or' expressions.
+%       Formatting should follow the logical structure!
+% \item Context sensitive formatting rules. It can be annoying if empty
+%       or small blocks take three or more lines in the output---think of
+%       scrolling down all the time. So it would be nice if the block
+%       formatting was context sensitive.
+% \end{enumerate}
+% Note that this is a very first and clumsy attempt to provide automatic
+% formatting---clumsy since the problem isn't trivial. Any ideas are welcome.
+% Implementations also. Eventually you should know that you must request format
+% definitions at package loading, e.g.~via |\usepackage[formats]{listings}|.
+%
+% \subsection{Arbitrary linerange markers}\label{rArbitraryLinerangeMarkers}
+%
+% Instead of using \keyname{linerange} with line numbers, one can use text
+% markers. Each such marker consists of a \meta{prefix}, a \meta{text}, and a
+% \meta{suffix}. You once (or more) define prefixes and suffixes and then use
+% the marker text instead of the line numbers.
+% \begin{lstxsample}
+%    \lstset{rangeprefix=\{\ ,% curly left brace plus space
+%            rangesuffix=\ \}}% space plus curly right brace
+% \end{lstxsample}
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}%
+%          [linerange=loop\ 2-end]
+%    { loop 1 }
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    { end }
+%    { loop 2 }
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    { end }
+%    \end{lstlisting}
+% \end{lstsample}
+% Note that \TeX's special characters like the curly braces, the space, the
+% percent sign, and such must be escaped with a backslash.
+% \begin{syntax}
+% \item[1.2] \rkeyname{rangebeginprefix}|=|\meta{prefix}
+% \item[1.2] \rkeyname{rangebeginsuffix}|=|\meta{suffix}
+% \item[1.2] \rkeyname{rangeendprefix}|=|\meta{prefix}
+% \item[1.2] \rkeyname{rangeendsuffix}|=|\meta{suffix}
+%
+%       define individual prefixes and suffixes for the begin- and end-marker.
+%
+% \item[1.2] \rkeyname{rangeprefix}|=|\meta{prefix}
+% \item[1.2] \rkeyname{rangesuffix}|=|\meta{suffix}
+%
+%       define identical prefixes and suffixes for the begin- and end-marker.
+%
+% \item[1.2,true] \rkeyname{includerangemarker}|=|\meta{\alternative{true,false}}
+%
+%       shows or hides the markers in the output.
+% \end{syntax}
+% \begin{lstsample}{\lstset{rangeprefix=\{\ ,rangesuffix=\ \}}}{}
+%    \begin{lstlisting}%
+%          [linerange=loop\ 1-end,
+%           includerangemarker=false,
+%           frame=single]
+%    { loop 1 }
+%    for i:=maxint to 0 do
+%    begin
+%        { do nothing }
+%    end;
+%    { end }
+%    \end{lstlisting}
+% \end{lstsample}
+%
+%
+% \subsection{Multicolumn Listings}\label{rMulticolumnListings}
+%
+% When the \packagename{multicol} package is loaded, it can be used to typeset
+% multi-column listings.  These are specified with the |multicols| key.  For
+% example:
+% \begin{lstsample}{}{}
+%    \begin{lstlisting}[multicols=2]
+%    if (i < 0)
+%      i = 0
+%      j = 1
+%    end if
+%    if (j < 0)
+%      j = 0
+%    end if
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% The multicolumn option is known to fail with some keys.
+%
+% \begin{advise}
+% \item Which keys?
+%       \advisespace
+%       Unfortunately, I don't know.  Carsten left the code for this option
+%       in the version 1.3b patch file with only that cryptic note for
+%       documentation.  Bug reports would be welcome, though I don't promise
+%       that they're fixable.  ---Brooks
+% \end{advise}
+%
+%
+%\iffalse
+% \section{Forthcoming ?}
+%
+% This section is rather rudimentary. It just lists some things I don't want
+% to forget.
+%
+% First of all, I'd like to support even more languages, for example Maple,
+% PostScript, and so on. Fortunately my lifetime is limited, so other
+% people may do that work. Please (e-)mail me your language definitions.
+%
+% Then, there are several ideas for the future. Some have already been stated
+% as `to do's; some came from other people and are stated below; some more are
+% far from being implemented,
+%   e.g.~\keyname{linerange}|=|\oarg{inter}\marg{line range list}
+% which prints all lines in the range and executes \meta{inter} when omitting
+% some code lines. The main problem here are frames and background colours;
+% what should happen to them? In fact, the problem is how this can be coded.
+% Another idea is to change the background colour (or the basic style) for
+% particular code blocks. This, too, is not easy.
+%
+%^^A Auto-detect whether surplus space (from spaces and tabs) isn't needed to fix
+%^^A alignment of wide character combinations like |==| or |<>|.
+%^^A
+%^^A Make package compatible to calc package.
+%^^A
+%^^A Rewrite \lst@LAS, \lst@DefDriver, \lst@Require to distinguish loading
+%^^A of languages (which don't need base languages at once) and aspects
+%^^A (which need required aspects to be loaded).
+%
+% \lsthelper{Vincent~Poirriez}{1999/11/18}{code examples inside caml comments}:
+% Inside caml comments, |[| and |]| should print the code in
+% between in basicstyle (or another newly introduced style). Nesting of these
+% `code example delimiters' is allowed, e.g.~|(* [[x;y]] *)|.
+%
+% \lsthelper{Claus~Atzenbeck}{1999/12/03}{`extendedchars=false' doesn't issue
+% warning when extended characters are used}: issue warning in final mode if
+% \ikeyname{extendedchars}|=false| but extended chars are used.
+%
+% \lsthelper{Andreas~Matthias}{2000/01/04}{define header/footer to print
+% the listing name}: Make the header/footer print the listing name. Some
+% people asked for continued captions.
+%\fi
+%
+%
+% \part{Tips and tricks}
+%
+% Note: This part of the documentation is under construction.
+% Section \ref{uHowTos} must be sorted by topic and ordered in some way.
+% Moreover a new section `Examples' is planned, but not written.
+% Lack of time is the main problem \ldots
+%
+%
+% \section{Troubleshooting}\label{uTroubleshooting}
+%
+% If you're faced with a problem with the \packagename{listings} package, there are
+% some steps you should undergo before you make a bug report. First you should
+% consult the reference guide to see whether the problem is already known. If not,
+% create a \emph{minimal} file which reproduces the problem. Follow these
+% instructions:
+% \begin{enumerate}
+% \item Start from the minimal file in section \ref{uAMinimalFile}.
+% \item Add the \LaTeX\ code which causes the problem, but keep it short.
+%       In particular, keep the number of additional packages small.
+% \item Remove some code from the file (and the according packages) until the
+%       problem disappears. Then you've found a crucial piece.
+% \item Add this piece of code again and start over with step 3 until all code
+%       and all packages are substantial.
+% \item You now have a minimal file. Send a bug report to the address on the
+%       first page of this documentation and include the minimal file together
+%       with the created \texttt{.log}-file. If you use a very special package
+%       (i.e.~one not on CTAN), also include the package if its software license
+%       allows it.
+% \end{enumerate}
+%
+%
+% \section{Bugs and workarounds}\label{uBugsWorkarounds}
+%
+% \subsection{Listings inside arguments}\label{uListingsArguments}
+%
+% At the moment it isn't possible to use \verb-\lstinline{...}- in a cell
+% of a table\makeatletter\@ifundefined{r@uProcessingInline}{}{%
+% (see section \ref{uProcessingInline} on page \pageref{uProcessingInline}
+% for more information)},%
+% \makeatother%
+% but it is possible to define a wrapper macro
+% which can be used instead of \verb-\lstinline{...}-:
+% \begin{lstsample}[lstlisting]{}{}
+%    \newcommand\foo{\lstinline{t}}
+%    \newcommand\foobar[2][]{\lstinline[#1]{#2}}
+%
+%    \begin{tabular}{ll}
+%    \foo & a variable\\
+%    \foobar[language=java]{int u;} & a declaration
+%    \end{tabular}
+% \end{lstsample}
+%
+%
+% \subsection{Listings with a background colour and \LaTeX{} escaped
+% formulas}
+% \label{uListingsBackgroundColour}
+%
+% If there is any text escaped to \LaTeX{} with some coloured background
+% and surrounding frames, then there are gaps in the background as well as
+% in the lines making up the frame.
+% \begin{lstsample}[lstlisting]{}{}
+%    \begin{lstlisting}[language=C, mathescape,
+%      backgroundcolor=\color{yellow!10}, frame=tlb]
+%    /* the following code computes $\displaystyle\sum_{i=1}^{n}i$ */
+%    for (i = 1; i <= limit; i++) {
+%      sum += i;
+%    }
+%    \end{lstlisting}
+% \end{lstsample}
+%
+% At the moment there is only one workaround:
+% \begin{itemize}
+%   \item Write your code into an external file \meta{filename}.
+%   \item Input your code by |\lstinputlisting|\meta{filename} into your
+%     document and surround it with a frame generated by |\begin{mdframed}|
+%     \ldots{} |\end{mdframed}|.
+% \end{itemize}
+% \begin{lstsample}[lstlisting]{}{}
+%    \begin{verbatimwrite}{temp.c}
+%    /* the following code computes $\displaystyle\sum_{i=1}^{n}i$ */
+%    for (i = 1; i <= limit; i++) {
+%      sum += i;
+%    }
+%    \end{verbatimwrite}
+%    \begin{mdframed}[backgroundcolor=yellow!10, rightline=false]
+%      \lstinputlisting[language=C,mathescape,frame={}]{./temp.c}
+%    \end{mdframed}
+% \end{lstsample}
+% For more information about the |verbatimwrite| environment have a look at
+% \cite{Fairbairns:moreverb}, the |mdframed| environment is deeply discussed in
+% \cite{DanielSchubert:mdframed}.
+%
+%
+% \section{How tos}\label{uHowTos}
+%
+%
+% \subsubsection*{How to reference line numbers}
+% Perhaps you want to put |\label{|\meta{whatever}|}| into a \LaTeX\ escape which is
+% inside a comment whose delimiters aren't printed?  If you did that, the compiler
+% won't see the \LaTeX\ code since it would be inside a comment, and the
+% \packagename{listings} package wouldn't print anything since the delimiters would
+% be dropped and |\label| doesn't produce any printable output, but you could still
+% reference the line number. Well, your wish is granted.
+%
+% In Pascal, for example, you could make the package recognize the `special'
+% comment delimiters |(*@| and |@*)| as begin-escape and end-escape sequences.
+% Then you can use this special comment for |\label|s and other things.
+% \begin{lstsample}{\lstset{numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{}
+%    \lstset{escapeinside={(*@}{@*)}}
+%
+%    \begin{lstlisting}
+%    for i:=maxint to 0 do
+%    begin
+%        { comment }(*@\label{comment}@*)
+%    end;
+%    \end{lstlisting}
+%    Line \ref{comment} shows a comment.
+% \end{lstsample}
+% \begin{advise}
+% \item Can I use `|(*@|' and `|*)|' instead?
+%       \advisespace
+%       Yes.
+% \item Can I use `|(*|' and `|*)|' instead?
+%       \advisespace
+%       Sure. If you want this.
+% \item Can I use `|{@|' and `|@}|' instead?
+%       \advisespace
+%       No, never! The second delimiter is not allowed. The character `|@|' is
+%       defined to check whether the escape is over. But reading the lonely
+%       `end-argument' brace, \TeX\ encounters the error `\texttt{Argument of @
+%       has an extra \char125}'. Sorry.
+% \item Can I use `|{|' and `|}|' instead?
+%       \advisespace
+%       No. Again the second delimiter is not allowed. Here now \TeX\ would
+%       give you a `\texttt{Runaway argument}' error. Since `|}|' is defined to
+%       check whether the escape is over, it won't work as `end-argument' brace.
+% \item And how can I use a comment line?
+%       \advisespace
+%       For example, write `|escapeinside={//*}{\^^M}|'. Here |\^^M| represents
+%       the end of line character.
+% \end{advise}
+%
+%
+% \subsubsection*{How to gobble characters}
+% To make your \LaTeX\ code more readable, you might want to indent your
+% \texttt{lstlisting} listings. This indention should not show up in the
+% pretty-printed listings, however, so it must be removed. If you indent each code
+% line by three characters, you can remove them via |gobble=3|:
+% \begin{lstsample}{}{\lstset{showspaces}}
+%    \begin{lstlisting}[gobble=3]
+%    1  for i:=maxint to 0 do
+%     2 begin
+%      3    { do nothing }
+%    123end;
+%
+%       Write('Case insensitive ');
+%       WritE('Pascal keywords.');
+%    \end{lstlisting}
+% \end{lstsample}
+% Note that empty lines and the beginning and the end of the environment
+% need not respect the indention. However, never indent the end by more than
+% `\ikeyname{gobble}' characters. Moreover note that tabulators expand to
+% |tabsize| spaces before we gobble.
+% \begin{advise}
+% \item Could I use `\ikeyname{gobble}' together with `|\lstinputlisting|'?
+%       \advisespace
+%       Yes, but it has no effect.
+%
+% \item Note that `\ikeyname{gobble}' can also be set via `|\lstset|'.
+% \end{advise}
+%
+%
+% \subsubsection*{How to include graphics}
+% \lsthelper{Herbert~Weinhandl}{1999/09/06}{listings + eps} found a very easy
+% way to include graphics in listings. Thanks for contributing this idea---an
+% idea I would never have had.
+%
+% Some programming languages allow the dollar sign to be part of an identifier.
+% But except for intermediate function names or library functions, this
+% character is most often unused. The \packagename{listings} package defines
+% the \ikeyname{mathescape} key, which lets `|$|' escape to \TeX's math mode.
+% This makes the dollar character an excellent candidate for our purpose here:
+% use a package which can include a graphic, set \ikeyname{mathescape} true,
+% and include the graphic between two dollar signs, which are inside a comment.
+%
+% The following example is originally from a header file I got from Herbert.
+% For the presentation here I use the \texttt{lstlisting} environment and an
+% excerpt from the header file. The |\includegraphics| command is from
+% David Carlisle's \packagename{graphics} bundle.
+% \begin{verbatim}
+%   \begin{lstlisting}[mathescape=true]
+%   /*
+%    $ \includegraphics[height=1cm]{defs-p1.eps} $
+%    */
+%   typedef struct {
+%     Atom_T          *V_ptr;   /* pointer to Vacancy in grid    */
+%     Atom_T          *x_ptr;   /* pointer to (A|B) Atom in grid */
+%   } ABV_Pair_T;
+%   \end{lstlisting}\end{verbatim}
+% The result looks pretty good. Unfortunately you can't see it, because the
+% graphic wasn't available when the manual was typeset.
+%
+%
+% \subsubsection*{How to get closed frames on each page}
+% The package supports closed frames only for listings which don't cross pages.
+% If a listing is split on two pages, there is neither a bottom rule at the
+% bottom of a page, nor a top rule on the following page. If you insist on
+% these rules, you might want to use \texttt{framed.sty} by Donald Arseneau.
+% Then you could write
+% \begin{verbatim}
+%    \begin{framed}
+%    \begin{lstlisting}
+%      or \lstinputlisting{...}
+%    \end{lstlisting}
+%    \end{framed}\end{verbatim}
+% The package also provides a \texttt{shaded} environment. If you use it, you
+% shouldn't forget to define \texttt{shadecolor} with the \packagename{color}
+% package.
+%
+%
+% \subsubsection*{How to print national characters with $\Lambda$ and \packagename{listings}}\label{uNationalCharacters}
+%
+% Apart from typing in national characters directly, you can use the `escape'
+% feature described in section \ref{rEscapingToLaTeX}.
+% The keys \ikeyname{escapechar}, \ikeyname{escapeinside}, and \ikeyname{texcl}
+% allow partial usage of \LaTeX\ code.
+%
+% Now, if you use $\Lambda$ (Lambda, the \LaTeX\ variant for Omega) and want,
+% for example, Arabic comment lines, you need not write |\begin{arab}|
+% \ldots\ |\end{arab}| each escaped comment line. This can be automated:
+% \begin{verbatim}
+%    \lstset{escapebegin=\begin{arab},escapeend=\end{arab}}
+%
+%    \begin{lstlisting}[texcl]
+%    // Replace text by Arabic comment.
+%    for (int i=0; i<1; i++) { };
+%    \end{lstlisting}\end{verbatim}
+% If your programming language doesn't have comment lines, you'll have to use
+% \ikeyname{escapechar} or \ikeyname{escapeinside}:
+% \begin{verbatim}
+%    \lstset{escapebegin=\begin{greek},escapeend=\end{greek}}
+%
+%    \begin{lstlisting}[escapeinside=`']
+%    /* `Replace text by Greek comment.' */
+%    for (int i=0; i<1; i++) { };
+%    \end{lstlisting}\end{verbatim}
+% Note that the delimiters |`| and |'| are essential here. The example doesn't
+% work without them. There is a more clever way if the comment delimiters of
+% the programming language are single characters, like the braces in Pascal:
+% \begin{verbatim}
+%    \lstset{escapebegin=\textbraceleft\begin{arab},
+%            escapeend=\end{arab}\textbraceright}
+%
+%    \begin{lstlisting}[escapeinside=\{\}]
+%    for i:=maxint to 0 do
+%    begin
+%        { Replace text by Arabic comment. }
+%    end;
+%    \end{lstlisting}\end{verbatim}
+% Please note that the `interface' to $\Lambda$ is completely untested.
+% Reports are welcome!
+%
+%
+% \subsubsection*{How to get bold typewriter type keywords}
+% Use the \href{http://www.ctan.org/tex-archive/fonts/luximono}{\packagename{LuxiMono}} package.
+%
+% \iffalse
+% Many people asked for bold typewriter fonts since they aren't included in
+% the \LaTeX\ standard distribution. Here now one answer on how to use them
+% in spite of that.
+% \begin{advise}
+% \item Please note that I personally don't regard the following as a good
+%       solution. Such a bold typewriter type is too heavy. It would be better
+%       to use a light version of \texttt{cmtt} as basic font and \texttt{cmtt}
+%       or a \emph{slightly} heavier type for keywords.
+%
+% \item Why don't you tell us how to use the better solution?
+%       \advisespace
+%       A light version of \texttt{cmtt} doesn't exist. If it's once available,
+%       you can do a similar job as described below.
+% \end{advise}
+% First of all, you'll need Metafont source files for bold typewriter, e.g.~
+% \texttt{cmbtt8.mf}, \texttt{cmbtt9.mf} and \texttt{cmbtt10.mf} from
+% \href{ftp://ftp.dante.de/tex-archive/fonts/cm/mf-extra/bold}
+%      {CTAN/fonts/cm/mf-extra/bold}.
+% Secondly you have to create \texttt{.tfm}-files, i.e.~run the Metafont
+% program on these sources. This is possibly done automatically when you use
+% the fonts in a document. Finally you must tell \LaTeX\ that you've installed
+% bold typewriter fonts. Just use
+% \begin{verbatim}
+%    \DeclareFontShape{OT1}{cmtt}{bx}{n}
+%         {<5><6><7><8>cmbtt8%
+%          <9>cmbtt9%
+%          <10><10.95>cmbtt10%
+%          <12><14.4><17.28><20.74><24.88>cmbtt10%
+%          }{}\end{verbatim}
+% in the preamble of your document. If you use these fonts often, you might
+% want to make a local copy of \texttt{ot1cmtt.fd} and replace the declaration
+% there. But note that you're not allowed to distributed the modified file
+% under its original name!
+% \fi
+%
+%
+% \subsubsection*{How to work with plain text}
+% If you want to use \packagename{listings} to set plain text (perhaps with
+% line numbers, or like |verbatim| but with line wrapping, or so forth, use
+% the empty language: |\lstset{language=}|.
+%
+%
+% \subsubsection*{How to get the developer's guide}
+% In the \emph{source directory} of the listings package, i.e.~where
+% the \texttt{.dtx} files are, create the file \texttt{ltxdoc.cfg} with the
+% following contents.
+% \begin{verbatim}
+%    \AtBeginDocument{\AlsoImplementation}\end{verbatim}
+% Then run \texttt{listings.dtx} through \LaTeX\ twice, run Makeindex (with
+% the |-s gind.ist| option), and then run \LaTeX\ one last time on
+% \texttt{listings.dtx}. This creates the whole documentation including User's
+% guide, Reference guide, Developer's guide, and Implementation.
+%
+% If you can run the (GNU) make program, executing the command
+% \begin{verbatim}
+%    make all\end{verbatim}
+% or
+% \begin{verbatim}
+%    make listings-devel\end{verbatim}
+% gives the same result---it is called \texttt{listings-devel.pdf}.
+%
+% \makeatletter
+%^^A \def\index@prologue{\section*{Index}\markboth{Index}{Index}}
+% \def\index@prologue{\part{Index}\markboth{Index}{Index}}
+% \makeatother
+%^^A \StopEventually{\lstcheckreference\setcounter{IndexColumns}{2}\PrintIndex}
+% \StopEventually{%
+% \begin{thebibliography}{MDB01}
+%
+%     \bibitem[Fai11]{Fairbairns:moreverb}
+%       Robin Fairbairns.
+%       \newblock{The \textsf{moreverb} package}, 2011.
+%
+%     \bibitem[DS13]{DanielSchubert:mdframed}
+%       Marco Daniel and Elke Schubert.
+%       \newblock{The \textsf{mdframed} package}, 2013.
+% \end{thebibliography}
+% \setcounter{IndexColumns}{2}\PrintIndex}
+%
+%
+% \part{Developer's guide}
+%
+% First I must apologize for this developer's guide since some parts are not
+% explained as well as possible. But note that you are in a pretty good shape:
+% this developer's guide exists! ^^A :-)
+% You might want to peek into section \ref{dPackageExtensions} before reading
+% section \ref{dBasicConcepts}.
+%
+%
+% \section{Basic concepts}\label{dBasicConcepts}
+%
+% The functionality of the \packagename{listings} package appears to be
+% divided into two parts: on the one hand commands which actually typeset
+% listings and on the other via |\lstset| adjustable parameters. Both could
+% be implemented in terms of \lst-aspects, which are simply collections of
+% public keys and commands and internal hooks and definitions. The package
+% defines a couple of aspects, in particular the kernel, the main engine.
+% Other aspects drive this engine, and language and style definitions tell
+% the aspects how to drive. The relations between car, driver and assistant
+% driver are exactly reproduced---and I'll be your driving instructor.
+%
+%
+% \subsection{Package loading}\label{dPackageLoading}
+%
+% Each option in |\usepackage[|\meta{options}|]{listings}| loads an aspect or
+% \emph{prevents} the package from loading it if the aspect name is
+% \emph{preceded by an exclamation mark}. This mechanism was designed to clear
+% up the dependencies of different package parts and to debug the package. For
+% this reason there is another option:
+% \begin{syntax}
+% \item[0.21,,option] \texttt{noaspects}\leavevmode
+%
+%       deletes the list of aspects to load. Note that, for example, the
+%       option lists |0.21,!labels,noaspects| and |noaspects| are essentially
+%       the same: the kernel is loaded and no other aspect.
+% \end{syntax}
+% This is especially useful for aspect-testing since we can load exactly the
+% required parts. Note, however, that an aspect is loaded later if a predefined
+% programming language requests it. One can load aspects also by hand:
+% \begin{syntax}
+% \item[0.20] |\lstloadaspects|\marg{comma separated list of aspect names}
+%
+%       loads the specified aspects if they are not already loaded.
+% \end{syntax}
+% Here now is a list of all aspects and related keys and commands---in the hope
+% that this list is complete.
+% \begin{description}
+% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax
+% \item[\aspectname{strings}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{strings}
+%
+% \item[\aspectname{comments}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{comments}
+%
+% \item[\aspectname{pod}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{pod}
+%
+% \item[\aspectname{escape}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{escape}
+%
+% \item[\aspectname{writefile}] requires 1 |\toks|, 1 |\write|
+%
+%       |\lst@BeginWriteFile|, |\lst@BeginAlsoWriteFile|, |\lst@EndWriteFile|
+%
+% \item[\aspectname{style}]\leavevmode
+%
+%       empty style, \lstprintaspectkeysandcmds{style}
+%
+% \item[\aspectname{language}]\leavevmode
+%
+%       empty language, \lstprintaspectkeysandcmds{language}
+%
+% \item[\aspectname{keywords}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{keywords}
+%
+% \item[\aspectname{emph}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{emph}
+%
+% \item[\aspectname{html}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{html}
+%
+% \item[\aspectname{tex}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{tex}
+%
+% \item[\aspectname{directives}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{directives}
+%
+% \item[\aspectname{index}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{index}
+%
+% \item[\aspectname{procnames}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{procnames}
+%
+% \item[\aspectname{keywordcomments}]
+%       requires \aspectname{keywords}, \aspectname{comments}
+%
+%       \lstprintaspectkeysandcmds{keywordcomments}
+%
+% \item[\aspectname{labels}] requires 2 |\count|
+%
+%       \lstprintaspectkeysandcmds{labels}
+%
+% \item[\aspectname{lineshape}] requires 2 |\dimen|
+%
+%       \lstprintaspectkeysandcmds{lineshape}
+%
+% \item[\aspectname{frames}] requires \aspectname{lineshape}
+%
+%       \lstprintaspectkeysandcmds{frames}
+%
+% \item[\aspectname{make}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{make}
+%
+% \item[\aspectname{doc}] requires \aspectname{writefile} and 1 |\box|
+%
+%       \lstprintaspectkeysandcmds{doc}
+%
+% \item[\aspectname{0.21}] defines old keys in terms of the new ones.
+% \item[\aspectname{fancyvrb}] requires 1 |\box|
+%
+%       \lstprintaspectkeysandcmds{fancyvrb}
+%
+% \item[\aspectname{lgrind}]\leavevmode
+%
+%       \lstprintaspectkeysandcmds{lgrind}
+%
+% \item[\aspectname{hyper}] requires \aspectname{keywords}
+%
+%       \lstprintaspectkeysandcmds{hyper}
+% \end{description}
+% The kernel allocates 6 |\count|, 4 |\dimen| and 1 |\toks|.
+% Moreover it defines the following keys, commands, and environments:
+% \begin{itemize}\item[]
+% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax
+%       \lstprintaspectkeysandcmds{kernel}, \keyname{fancyvrb}
+% \end{itemize}
+%
+%
+% \subsection{How to define \lst-aspects}\label{dHowToDefineLstAspects}
+%
+% There are at least three ways to add new functionality: (a) you write an
+% aspect of general interest, send it to me, and I'll just paste it into the
+% implementation; (b) you write a `local' aspect not of general interest; or
+% (c) you have an idea for an aspect and make me writing it. (a) and (b) are
+% good choices.^^A :-)
+%
+% An aspect definition starts with |\lst@BeginAspect| plus arguments and ends
+% with the next |\lst@EndAspect|. In particular, aspect definitions can't be
+% nested.
+% \begin{syntax}
+% \item[0.20] |\lst@BeginAspect|[\oarg{list of required aspects}]\marg{aspect name}
+% \item[0.20] |\lst@EndAspect|
+% \end{syntax}
+% The optional list is a comma separated list of required aspect names.
+% The complete aspect is not defined in each of the following cases:
+% \begin{enumerate}
+% \item \meta{aspect name} is empty.
+% \item The aspect is already defined.
+% \item A required aspect is neither defined nor loadable via
+%       |\lstloadaspects|.
+% \end{enumerate}
+% Consequently you can't define a part of an aspect and later on another part.
+% But it is possible to define aspect $A_1$ and later aspect $A_2$ which
+% requires $A_1$.
+% \begin{advise}
+% \item Put local add-ons into `\texttt{lstmisc0.sty}'---this file is searched
+%       first by default. If you want to make add-ons for one particular
+%       document just replace the surrounding `|\lst@BeginAspect|' and
+%       `|\lst@EndAspect|' by `|\makeatletter|' and `|\makeatother|' and use
+%       the definitions in the preamble of your document. However, you have to
+%       load required aspects on your own.
+% \end{advise}
+% You can put any \TeX\ material in between the two commands, but note that
+% definitions must be |\global| if you need them later---\LaTeX's |\newcommand|
+% makes local definitions and can't be preceded by |\global|. So use the
+% following commands, |\gdef|, and commands described in later sections.
+% \begin{syntax}
+% \item[0.20] |\lst@UserCommand|\meta{macro}\meta{parameter text}\marg{replacement text}
+%
+%       The macro is (mainly) equivalent to |\gdef|. The purpose is to
+%       distinguish user commands and internal global definitions.
+%
+% \item[0.19] |\lst@Key|\marg{key name}\marg{init value}[\oarg{default value}]\marg{definition}
+% \item[0.19] |\lst@Key|\marg{key name}|\relax|[\oarg{default value}]\marg{definition}
+%
+%       defines a key using the \packagename{keyval} package from David
+%       Carlisle. \meta{definition} is the replacement text of a macro with
+%       one parameter. The argument is either the value from `key=value' or
+%       \meta{default value} if no `=value' is given. The helper macros
+%       |\lstKV@...| below might simplify \meta{definition}.
+%
+%       The key is not initialized if the second argument is |\relax|.
+%       Otherwise \meta{init value} is the initial value given to the key.
+%       Note that we locally switch to |\globalsdefs=1| to ensure that
+%       initialization is not effected by grouping.
+%
+% \item[0.19] |\lst@AddToHook|\marg{name of hook}\marg{\TeX\ material}
+%
+%       adds \TeX\ material at predefined points. Section \ref{dHooks} lists
+%       all hooks and where they are defined respectively executed.
+%       |\lst@AddToHook{A}{\csa}| before |\lst@AddToHook{A}{\csb}|
+%       \emph{does not} guarantee that |\csa| is executed before |\csb|.
+%
+% \item[0.20] |\lst@AddToHookExe|\marg{name of hook}\marg{\TeX\ material}
+%
+%       also executes \meta{\TeX\ material} for initialization. You might use
+%       local variables---local in the sense of \TeX\ and/or usual programming
+%       languages---but when the code is executed for initialization all
+%       assignments are global: we set |\globaldefs| locally to one.
+%
+% \item[0.20] |\lst@UseHook|\marg{name of hook}
+%
+%       executes the hook.
+% \end{syntax}
+% \begin{advise}
+% \item Let's look at two examples. The first extends the package by adding
+%       some hook-material. If you want status messages, you might write
+% \begin{verbatim}
+%    \lst@AddToHook{Init}{\message{\MessageBreak Processing listing ...}}
+%    \lst@AddToHook{DeInit}{\message{complete.\MessageBreak}}\end{verbatim}
+%       The second example introduces two keys to let the user control the
+%       messages. The macro |\lst@AddTo| is described in section
+%       \ref{dGeneralPurposeMacros}.
+% \begin{verbatim}
+%   \lst@BeginAspect{message}
+%   \lst@Key{message}{Annoying message.}{\gdef\lst@message{#1}}
+%   \lst@Key{moremessage}\relax{\lst@AddTo\lst@message{\MessageBreak#1}}
+%   \lst@AddToHook{Init}{\typeout{\MessageBreak\lst@message}}
+%   \lst@EndAspect\end{verbatim}
+%       However, there are certainly aspects which are more useful.
+% \end{advise}
+% The following macros can be used in the \meta{definition} argument of the
+% |\lst@Key| command to evaluate the argument. The additional prefix |KV|
+% refers to the \packagename{keyval} package.
+% \begin{syntax}
+% \item[0.19] |\lstKV@SetIf|\marg{value}\meta{if macro}
+%
+%       \meta{if macro} becomes |\iftrue| if the first character of
+%       \meta{value} equals |t| or |T|. Otherwise it becomes |\iffalse|.
+%       Usually you will use |#1| as \meta{value}.
+%
+% \item[1.0] \cs{lstKV@SwitchCases}\marg{value}\\
+%   |{|\meta{string 1}|&|\meta{execute 1}|\\|\\
+%   | |\meta{string 2}|&|\meta{execute 2}|\\|\\
+%   \hbox to 3em{\hfill\vdots}\\
+%   | |\meta{string $n$}|&|\meta{execute $n$}|}|\marg{else}
+%
+%       Either execute \meta{else} or the \meta{value} matching part.
+%
+% \item[0.20] |\lstKV@TwoArg|\marg{value}\marg{subdefinition}
+% \item[0.20] |\lstKV@ThreeArg|\marg{value}\marg{subdefinition}
+% \item[0.20] |\lstKV@FourArg|\marg{value}\marg{subdefinition}
+%
+%       \meta{subdefinition} is the replacement text of a macro with two,
+%       three, and four parameters. We call this macro with the arguments given
+%       by \meta{value}. Empty arguments are added if necessary.
+%
+% \item[0.19] |\lstKV@OptArg|\oarg{default arg.}\marg{value}\marg{subdefinition}
+%
+%       |[|\meta{default arg.}|]| is \emph{not} optional. \meta{subdefinition}
+%       is the replacement text of a macro with parameter text |[##1]##2|.
+%       Note that the macro parameter character |#| is doubled since used
+%       within another macro. \meta{subdefinition} accesses these arguments
+%       via |##1| and |##2|.
+%
+%       \meta{value} is usually the argument |#1| passed by the
+%       \packagename{keyval} package. If \meta{value} has no optional argument,
+%       \meta{default arg.} is inserted to provide the arguments to
+%       \meta{subdefinition}.
+%
+% \item[0.21] |\lstKV@XOptArg|\oarg{default arg.}\marg{value}\meta{submacro}
+%
+%       Same as |\lstKV@OptArg| but the third argument \meta{submacro} is
+%       already a definition and not replacement text.
+%
+% \item[0.20] |\lstKV@CSTwoArg|\marg{value}\marg{subdefinition}
+%
+%       \meta{value} is a \texttt comma \texttt separated list of one or two
+%       arguments. These are given to the subdefinition which is the
+%       replacement text of a macro with two parameters. An empty second
+%       argument is added if necessary.
+% \end{syntax}
+% \begin{advise}
+% \item One more example. The key `\keyname{sensitive}' belongs to the aspect
+%       \aspectname{keywords}. Therefore it is defined in between
+%       `|\lst@BeginAspect{keywords}|' and `|\lst@EndAspect|', which is not shown
+%       here.
+% \begin{verbatim}
+%   \lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive}
+%   \lst@AddToHookExe{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim}
+%       The last line is equivalent to
+% \begin{verbatim}
+%   \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}
+%   \global\let\lst@ifsensitive\iftrue\end{verbatim}
+%       We initialize the variable globally since the user might request an
+%       aspect in a group. Afterwards the variable is used locally---there is
+%       no |\global| in \meta{\TeX\ material}. Note that we could define and
+%       init the key as follows:
+% \begin{verbatim}
+%   \lst@Key{sensitive}t[t]{\lstKV@SetIf{#1}\lst@ifsensitive}
+%   \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim}
+%\end{advise}
+%
+%
+% \subsection{Internal modes}\label{dInternalModes}
+%
+% You probably know \TeX's conditional commands |\ifhmode|, |\ifvmode|,
+% |\ifmmode|, and |\ifinner|. They tell you whether \TeX\ is in (restricted)
+% horizontal or (internal) vertical or in (nondisplay) mathematical mode. For
+% example, true |\ifhmode| and true |\ifinner| indicate restricted horizontal
+% mode, which means that you are in a |\hbox|. The typical user doesn't care
+% about such modes; \TeX/\LaTeX\ manages all this. But since you're reading the
+% developer's guide, we discuss the analogue for the \packagename{listings}
+% package now. It uses modes to distinguish comments from strings, `comment
+% lines' from `single comments', and so on.
+%
+% The package is in `no mode' before reading the source code. In the phase of
+% initialization it goes to `processing mode'. Afterwards the mode depends on
+% the actual source code. For example, consider the line
+% \begin{verbatim}
+%    "string" // comment\end{verbatim}
+% and assume \texttt{language=C++}. Reading the string delimiter, the package
+% enters `string mode' and processes the string. The matching closing delimiter
+% leaves the mode, i.e.\ switches back to the general `processing mode'. Coming
+% to the two slashes, the package detects a comment line; it therefore enters
+% `comment line mode' and outputs the slashes. Usually this mode lasts to the
+% end of line.
+%
+% But with \texttt{textcl=true} the \aspectname{escape} aspect immediately
+% leaves `comment line mode', interrupts the current mode sequence, and enters
+% `\TeX\ comment line mode'. At the end of line we reenter the previous mode
+% sequence `no mode' $\to$ 'processing mode'. This escape to \LaTeX\ works
+% since `no mode' implies that \TeX's characters and catcodes are present,
+% whereas `processing mode' means that \packagename{listings}' characters and
+% catcodes are active.
+%
+% \begin{table}[htbp]
+% \caption{Internal modes}\label{dDefinedInternalModes}
+% \def\lsttabspace{\hspace*{1em}\hfill}
+% \begin{tabular}{@{}lp{0.56\linewidth}@{}}
+% aspect\lsttabspace\meta{mode name} & Usage/We are processing \ldots\\
+% \noalign{\smallskip}
+% kernel\lsttabspace |\lst@nomode| &
+%       If this mode is active, \TeX's `character table' is present; the other
+%       implication is not true. Any other mode \emph{may} imply that catcodes
+%       and\nobreak/\allowbreak or definitions of characters are changed.
+% \\
+%       \lsttabspace |\lst@Pmode| &
+%       is a general processing mode. If active we are processing a listing,
+%       but haven't entered a more special mode.
+% \\
+%       \lsttabspace |\lst@GPmode| &
+%       general purpose mode for language definitions.
+% \\
+% \aspectname{pod}\lsttabspace |\lst@PODmode| &
+%       \ldots~a POD---Perl specific.
+% \\
+% \aspectname{escape}\lsttabspace |\lst@TeXLmode| &
+%       \ldots~a comment line, but \TeX's character table is present---except
+%       the EOL character, which is needed to terminate this mode.
+% \\
+%       \lsttabspace |\lst@TeXmode| &
+%       indicates that \TeX's character table is present (except one user
+%       specified character, which is needed to terminate this mode).
+% \\
+% \aspectname{directives}\lsttabspace |\lst@CDmode| &
+%       indicates that the current line began with a compiler directive.
+% \\
+% \aspectname{keywordcomments}\lsttabspace |\lst@KCmode| &
+%       \ldots~a keyword comment.
+% \\
+%       \lsttabspace |\lst@KCSmode| &
+%       \ldots~a keyword comment which can be terminated by a semicolon only.
+% \\
+% \aspectname{html}\lsttabspace |\lst@insidemode| &
+%       Active if we are between \texttt{<} and \texttt{>}.
+% \\
+% \aspectname{make}\lsttabspace |\lst@makemode| &
+%       Used to indicate a keyword.
+% \end{tabular}
+% \end{table}
+% Table \ref{dDefinedInternalModes} lists all static modes and which aspects
+% they belong to. Most features use dynamically created mode numbers, for
+% example all strings and comments. Each aspect may define its own mode(s)
+% simply by allocating it/\allowbreak them inside the aspect definition.
+% \begin{syntax}
+% \item[0.19] |\lst@NewMode|\meta{mode \textup(control sequence\textup)}
+%
+%       defines a new static mode, which is a nonnegative integer assigned to
+%       \meta{mode}. \meta{mode} should have the prefix \texttt{lst@} and
+%       suffix \texttt{mode}.
+%
+% \item[0.21] |\lst@UseDynamicMode|\marg{token\textup(s\textup)}
+%
+%       inserts a dynamic mode number as argument to the token(s).
+%
+%       This macro cannot be used to get a mode number when an aspect is
+%       loaded or defined. It can only be used every listing in the process
+%       of initialization, e.g.~to define comments when the character table
+%       is selected.
+%
+% \item[0.19,,changed] |\lst@EnterMode|\meta{mode}\marg{start tokens}
+%
+%       opens a group level, enters the mode, and executes \meta{start tokens}.
+%
+%       Use |\lst@modetrue| in \meta{start tokens} to prohibit future mode
+%       changes---except leaving the mode, of course. You must test yourself
+%       whether you're allowed to enter, see below.
+%
+% \item[0.19] |\lst@LeaveMode|
+%
+%       returns to the previous mode by closing a group level if and only if
+%       the current mode isn't |\lst@nomode| already. You must test yourself
+%       whether you're allowed to leave a mode, see below.
+%
+%\iffalse
+% \item[0.19] |\lst@LeaveAllModes|
+%
+%       returns to |\lst@nomode|.
+%       This is some kind of emergency macro, so don't use it!
+%\fi
+%
+% \item[0.19] |\lst@InterruptModes|
+% \item[0.19] |\lst@ReenterModes|
+%
+%       The first command returns to |\lst@nomode|, but saves the current mode
+%       sequence on a special stack. Afterwards the second macro returns to the
+%       previous mode. In between these commands you may enter any mode you
+%       want. In particular you can interrupt modes, enter some modes, and say
+%       `interrupt modes' again. Then two re-enters will take you back in front
+%       of the first `interrupt modes'.
+%
+%       Remember that |\lst@nomode| implies that \TeX's character table is
+%       active.
+% \end{syntax}
+% Some variables show the internal state of processing. You are allowed to read
+% them, but \emph{direct write access is prohibited}. Note: |\lst@ifmode| is
+% \emph{not} obsolete since there is no relation between the boolean and the
+% current mode. It will happen that we enter a mode without setting
+% |\lst@ifmode| true, and we'll set it true without assigning any mode!
+% \begin{syntax}
+% \item[0.18,,counter] |\lst@mode|
+%
+%       keeps the current mode number. Use |\ifnum\lst@mode=|\meta{mode name}
+%       to test against a mode. Don't modify the counter directly!
+%
+% \item[0.18,,boolean] |\lst@ifmode|
+%
+%       No mode change is allowed if this boolean is true---except leaving the
+%       current mode. Use |\lst@modetrue| to modify this variable, but do it
+%       only in \meta{start tokens}.
+%
+% \item[1.0,,boolean] |\lst@ifLmode|
+%
+%       Indicates whether the current mode ends at end of line.
+% \end{syntax}
+%
+%
+% \subsection{Hooks}\label{dHooks}
+%
+% Several problems arise if you want to define an aspect.
+% You should and/or must
+%   (a) find additional functionality (of general interest) and implement it,
+%   (b) create the user interface, and
+%   (c) interface with the \packagename{listings} package, i.e.~find correct
+%       hooks and insert appropriate \TeX\ material.
+% (a) is out of the scope of this developer's guide. The commands |\lstKV@...|
+% in section \ref{dHowToDefineLstAspects} might help you with (b). Here now we
+% describe all hooks of the \packagename{listings} package.
+%
+% All hooks are executed inside an overall group. This group starts somewhere
+% near the beginning and ends somewhere at the end of each listing. Don't make
+% any other assumptions on grouping. So define variables globally if it's
+% necessary---and be alert of side effects if you don't use your own groups.
+% \begin{syntax}
+% \item \hookname{AfterBeginComment}
+%
+%       is executed after the package has entered comment mode.
+%       The starting delimiter is usually typeset when the hook is called.
+%
+% \item \hookname{BoxUnsafe}
+%
+%       Contains all material to deactivate all commands and registers which
+%       are possibly unsafe inside |\hbox|. It is used whenever the package
+%       makes a box around a listing and for \packagename{fancyvrb} support.
+%
+% \item \hookname{DeInit}
+%
+%       Called at the very end of a listing but before closing the box from
+%       \hookname{BoxUnsafe} or ending a float.
+%
+% \item \hookname{DetectKeywords}
+%
+%       This \hookname{Output} subhook is executed if and only if mode changes
+%       are allowed, i.e.~if and only if the package doesn't process a comment,
+%       string, and so on---see section \ref{dInternalModes}.
+%
+% \item \hookname{DisplayStyle}
+%
+%       deactivates/activates features for displaystyle listings.
+%
+% \item \hookname{EmptyStyle}
+%
+%       Executed to select the `empty' style---except the user has redefined
+%       the style.
+%
+% \item \hookname{EndGroup}
+%
+%       Executed whenever the package closes a group, e.g.~at end of comment or
+%       string.
+%
+% \item \hookname{EOL}
+%
+%       Called at each end of \emph{input} line, right before
+%       \hookname{InitVarsEOL}.
+%
+% \item \hookname{EveryLine}
+%
+%       Executed at the beginning of each \emph{output} line, i.e.~more than
+%       once for broken lines. This hook must not change the horizontal or
+%       vertical position.
+%
+% \item \hookname{EveryPar}
+%
+%       Executed once for each input line when the output starts. This hook
+%       must not change the horizontal or vertical position.
+%
+%^^A \item \hookname{ExcludeDelims}
+%^^A
+%^^A       Executed by the \keyname{excludedelims} key before the excluded
+%^^A       delimiters are determined.
+%^^A
+% \item \hookname{ExitVars}
+%
+%       Executed right before \hookname{DeInit}.
+%
+% \item \hookname{FontAdjust}
+%
+%       adjusts font specific internal values (currently |\lst@width| only).
+%
+% \item \hookname{Init}
+%
+%       Executed once each listing to initialize things before the character
+%       table is changed. It is called after \hookname{PreInit} and before
+%       \hookname{InitVars}.
+%
+% \item \hookname{InitVars}
+%
+%       Called to init variables each listing.
+%
+% \item \hookname{InitVarsBOL}
+%
+%       initializes variables at the beginning of each input line.
+%
+% \item \hookname{InitVarsEOL}
+%
+%       updates variables at the end of each input line.
+%
+% \item \hookname{ModeTrue}
+%
+%       executed by the package when mode changes become illegal.
+%       Here keyword detection is switched off for comments and strings.
+%
+% \item \hookname{OnEmptyLine}
+%
+%       executed \emph{before} the package outputs an empty line.
+%
+% \item \hookname{OnNewLine}
+%
+%       executed \emph{before} the package starts one or more new lines,
+%       i.e.~before saying |\par\noindent\hbox{}| (roughly speaking).
+%
+% \item \hookname{Output}
+%
+%       Called before an identifier is printed.
+%       If you want a special printing style, modify |\lst@thestyle|.
+%
+% \item \hookname{OutputBox}
+%
+%       used inside each output box. Currently it is only used to make the
+%       package work together with Lambda---hopefully.
+%
+% \item \hookname{OutputOther}
+%
+%       Called before other character strings are printed.
+%       If you want a special printing style, modify |\lst@thestyle|.
+%
+% \item \hookname{PostOutput}
+%
+%       Called after printing an identifier or any other output unit.
+%
+% \item \hookname{PostTrackKeywords}
+%
+%       is a very special \hookname{Init} subhook to insert keyword tests and
+%       define keywords on demand.
+%       This hook is called after \hookname{TrackKeywords}.
+%
+% \item \hookname{PreInit}
+%
+%       Called right before \hookname{Init} hook.
+%
+% \item \hookname{PreSet}
+%
+%       Each typesetting command/environment calls this hook to initialize
+%       internals before any user supplied key is set.
+%
+% \item \hookname{SelectCharTable}
+%
+%       is executed after the package has selected the standard character
+%       table. Aspects adjust the character table here and define string and
+%       comment delimiters, and such.
+%
+% \item \hookname{SetFormat}
+%
+%       Called before internal assignments for setting a format are made.
+%       This hook determines which parameters are reset every format selection.
+%
+% \item \hookname{SetStyle}
+%
+%       Called before internal assignments for setting a style are made.
+%       This hook determines which parameters are reset every style selection.
+%
+% \item \hookname{SetLanguage}
+%
+%       Called before internal assignments for setting a language are made.
+%       This hook determines which parameters are reset every language
+%       selection.
+%
+% \item \hookname{TextStyle}
+%
+%       deactivates/activates features for textstyle listings.
+%
+% \item \hookname{TrackKeywords}
+%
+%       is a very special \hookname{Init} subhook to insert keyword tests and
+%       define keywords on demand.
+%       This hook is called before \hookname{PostTrackKeywords}.
+% \end{syntax}
+%
+%
+% \subsection{Character tables}\label{dCharacterTables}
+%
+% Now you know how a car looks like, and you can get a driving license if you
+% take some practice. But you will have difficulties if you want to make heavy
+% alterations to the car. So let's take a closer look and come to the most
+% difficult part: the engine. We'll have a look at the big picture and fill in
+% the details step by step. For our purpose it's good to override \TeX's
+% character table. First we define a standard character table which contains
+% \begin{itemize}
+% \item letters: characters identifiers are out of,
+% \item digits: characters for identifiers or numerical constants,
+% \item spaces: characters treated as blank spaces,
+% \item tabulators: characters treated as tabulators,
+% \item form feeds: characters treated as form feed characters, and
+% \item others: all other characters.
+% \end{itemize}
+% This character table is altered depending on the current programming language.
+% We may define string and comment delimiters or other special characters.
+% Table \ref{rStdCharTable} on page \pageref{rStdCharTable} shows the standard
+% character table. It can be modified with the keys \keyname{alsoletter},
+% \keyname{alsodigit}, and \keyname{alsoother}.
+%
+% How do these `classes' work together? Let's say that the current character
+% string is `|tr|'. Then letter `|y|' simply appends the letter and we get
+% `|try|'. The next nonletter (and nondigit) causes the output of the
+% characters. Then we collect all coming nonletters until reaching a letter
+% again. This causes the output of the nonletters, and so on. Internally each
+% character becomes active in the sense of \TeX\ and is defined to do the right
+% thing, e.g.~we say
+% \begin{verbatim}
+%    \def A{\lst@ProcessLetter A}\end{verbatim}
+% where the first `|A|' is active and the second has letter catcode 11.
+% The macro |\lst@ProcessLetter| gets one token and treats it as a letter.
+% The following macros exist, where the last three get no explicit argument.
+% \begin{syntax}
+% \item[0.18] |\lst@ProcessLetter| \meta{spec.\ token}
+% \item[0.18] |\lst@ProcessDigit| \meta{spec.\ token}
+% \item[0.18] |\lst@ProcessOther| \meta{spec.\ token}
+% \item[0.18] |\lst@ProcessTabulator|
+% \item[0.18] |\lst@ProcessSpace|
+% \item[0.20] |\lst@ProcessFormFeed|
+% \end{syntax}
+% \meta{spec.\ token} is supposed to do two things. Usually it expands to
+% a printable version of the character. But if |\lst@UM| is equivalent to
+% |\@empty|, \meta{spec.\ token} must expand to a \emph{character token}.
+% For example, the sharp usually expands to |\#|, which is defined via
+% |\chardef| and is not a character token. But if |\lst@UM| is equivalent to
+% |\@empty|, the sharp expands to the character `|#|' (catcode 12). Note:
+% \emph{Changes to} |\lst@UM| \emph{must be locally.}  However, there should
+% be no need to do such basic things yourself. The \packagename{listings}
+% package provides advanced macros which use that feature,
+% e.g.~|\lst@InstallKeywords| in section \ref{dKeywordsAndWorkingIdentifiers}.
+%
+% \begin{syntax}
+% \item[0.18] |\lst@Def|\marg{character code}\meta{parameter text}\marg{definition}
+% \item[0.18] |\lst@Let|\marg{character code}\meta{token}
+%
+%       defines the specified character respectively assigns \meta{token}.
+%       The catcode table if not affected. Be careful if your definition has
+%       parameters: it is not safe to read more than one character ahead.
+%       Moreover, the argument can be \emph{arbitrary}; somtimes it's the next
+%       source code character, sometimes it's some code of the
+%       \packagename{listings} package, e.g.~|\relax|, |\@empty|, |\else|,
+%       |\fi|, and so on. Therefore don't use \TeX's ord-operator |`| on such
+%       an argument, e.g.~don't write |\ifnum`#1=65| to test against `|A|'.
+%
+%       |\lst@Def| and |\lst@Let| are relatively slow. The real definition of
+%       the standard character table differs from the following example, but it
+%       could begin with
+% \begin{verbatim}
+%    \lst@Def{9}{\lst@ProcessTabulator}
+%    \lst@Def{32}{\lst@ProcessSpace}
+%    \lst@Def{48}{\lst@ProcessDigit 0}
+%    \lst@Def{65}{\lst@ProcessLetter A}\end{verbatim}
+%
+%\iffalse
+% \item[0.20] |\lst@activecharstrue|
+% \item[0.20] |\lst@activecharsfalse|
+%
+%       control whether selecting the character table also makes all characters
+%       active (standard/extended). This is usually true and therefore default.
+%       Only the \packagename{fancyvrb} interface sets it locally false.
+%\fi
+% \end{syntax}
+% That's enough for the moment. Section \ref{dUsefulInternalDefinitions}
+% presents advanced definitions to manipulate the character table, in
+% particular how to add new comment or string types.
+%
+%
+% \subsection{On the output}
+%
+% The \packagename{listings} package uses some variables to keep the output
+% data. Write access is not recommended. Let's start with the easy ones.
+% \begin{syntax}
+% \item[0.17,,data] |\lst@lastother|
+%
+%       equals \meta{spec.\ token} version of the last processed
+%       nonidentifier-character. Since programming languages redefine the
+%       standard character table, we use the original \meta{spec.\ token}.
+%       For example, if a double quote was processed last, |\lst@lastother|
+%       is not equivalent to the macro which enters and leaves string mode.
+%       It's equivalent to |\lstum@"|, where |"| belongs to the control
+%       sequence. Remember that \meta{spec.\ token} expands either to a
+%       printable or to a token character.
+%
+%       |\lst@lastother| is equivalent to |\@empty| if such a character is not
+%       available, e.g.~at the beginning of a line. Sometimes an indentifier
+%       has already been printed after processing the last `other' character,
+%       i.e.~the character is far, far away. In this case |\lst@lastother|
+%       equals |\relax|.
+%
+% \item[0.17] |\lst@outputspace|
+%
+%       Use this predefined \meta{spec.\ token} (obviously for character code
+%       32) to test against |\lst@lastother|.
+%
+% \item[0.20] |\lstum@backslash|
+%
+%       Use this predefined \meta{spec.\ token} (for character code 92) to test
+%       against |\lst@lastother|. In the replacement text for |\lst@Def| one
+%       could write |\ifx| |\lst@lastother| |\lstum@backslash| \ldots\ to test
+%       whether the last character has been a backslash.
+%
+% \item[0.20] |\lst@SaveOutputDef|\marg{character code}\meta{macro}
+%
+%       Stores the \meta{spec.\ token} corresponding to \meta{character code}
+%       in \meta{macro}. This is the only safe way to get a correct meaning to
+%       test against |\lst@lastother|, for example
+%           |\lst@SaveOutputDef{"5C}\lstum@backslash|.
+%
+%       You'll get a ``runaway argument'' error if \meta{character code} is not
+%       between 33 and 126 (inclusive).
+% \end{syntax}
+% Now let's turn to the macros dealing a bit more with the output data and
+% state.
+% \begin{syntax}
+% \item[1.0] |\lst@XPrintToken|
+%
+%       outputs the current character string and resets it. This macro keeps
+%       track of all variables described here.
+%
+% \item[0.18,,token] |\lst@token|
+%
+%       contains the current character string. Each `character' usually
+%       expands to its printable version, but it must expand to a character
+%       token if |\lst@UM| is equivalent to |\@empty|.
+%
+% \item[0.12,,counter] |\lst@length|
+%
+%       is the length of the current character string.
+%
+% \item[0.12,,dimension] |\lst@width|
+%
+%       is the width of a single character box.
+%
+% \item[0.20,,global dimension] |\lst@currlwidth|
+%
+%       is the width of so far printed line.
+%
+% \item[0.18,,global counter] |\lst@column|
+% \item[0.12,,global counter] |\lst@pos| (nonpositive)
+%
+%       |\lst@column|$-$|\lst@pos| is the length of the so far printed line.
+%       We use two counters since this simplifies tabulator handling:
+%       |\lst@pos| is a nonpositive representative of `length of so far
+%       printed line' modulo \keyname{tabsize}.
+%       It's usually not the biggest nonpositive representative.
+%
+% \item[0.20] |\lst@CalcColumn|
+%
+%       |\@tempcnta| gets |\lst@column| $-$ |\lst@pos| $+$ |\lst@length|.
+%       This is the current column number minus one, or the current column
+%       number zero based.
+%
+% \item[0.18,,global dimension] |\lst@lostspace|
+%
+%       equals `lost' space: desired current line width minus real line width.
+%       Whenever this dimension is positive the flexible column format can use
+%       this space to fix the column alignment.
+% \end{syntax}
+%
+%
+% \section{Package extensions}\label{dPackageExtensions}
+%
+%
+% \subsection{Keywords and working identifiers}\label{dKeywordsAndWorkingIdentifiers}
+%
+% The \aspectname{keywords} aspect defines two main macros. Their respective
+% syntax is shown on the left. On the right you'll find examples how the
+% package actually defines some keys.
+% \begin{syntax}
+% \item[0.21]
+%   \cs{lst@InstallFamily}
+%
+%   \marg{prefix}\syntaxfill \texttt k\\
+%   \marg{name}\syntaxfill |{keywords}|\\
+%   \marg{style name}\syntaxfill |{keywordstyle}|\\
+%   \marg{style init}\syntaxfill |\bfseries|\\
+%   \marg{default style name}\syntaxfill |{keywordstyle}|\\
+%   \marg{working procedure}\syntaxfill |{}|\\
+%   \meta{\alternative{l,o}}\syntaxfill |l|\\
+%   \meta{\alternative{d,o}}\syntaxfill |d|
+%
+%       installs either a keyword or `working' class of identifiers according
+%       to whether \meta{working procedure} is empty.
+%
+%       The three keys \meta{name}, \keyname{more}\meta{name} and
+%       \keyname{delete}\meta{name}, and if not empty \meta{style name} are
+%       defined. The first order member of the latter one is initialized with
+%       \meta{style init} if not equivalent to |\relax|. If the user leaves a
+%       class style undefined, \meta{default style name} is used instead.
+%       Thus, make sure that this style is always defined. In the example,
+%       the first order keywordstyle is set to |\bfseries| and is the default
+%       for all other classes.
+%
+%       If \meta{working procedure} is not empty, this code is executed when
+%       reaching such an (user defined) identifier. \meta{working procedure}
+%       takes exactly one argument, namely the class number to which the
+%       actual identifier belongs to. If the code uses variables and requires
+%       values from previous calls, you must define these variables
+%       |\global|ly. It's not sure whether working procedures are executed
+%       inside a (separate) group or not.
+%
+%       \texttt l indicates a language key, i.e.~the lists are reset every
+%       language selection. \texttt o stands for `other' key.
+%       The keyword respectively working test is either installed at the
+%       \hookname{DetectKeyword} or \hookname{Output} hook according to
+%       \meta{\alternative{d,o}}.
+%
+% \item[0.20]
+%   \cs{lst@InstallKeywords}
+%
+%   \marg{prefix}\syntaxfill \texttt{cs}\\
+%   \marg{name}\syntaxfill |{texcs}|\\
+%   \marg{style name}\syntaxfill |{texcsstyle}|\\
+%   \marg{style init}\syntaxfill |\relax|\\
+%   \marg{default style name}\syntaxfill |{keywordstyle}|\\
+%   \marg{working procedure}\syntaxfill see below\\
+%   \meta{\alternative{l,o}}\syntaxfill |l|\\
+%   \meta{\alternative{d,o}}\syntaxfill |d|
+%
+%       Same parameters, same functionality with one execption. The macro
+%       installs exactly one keyword class and not a whole family. Therefore
+%       the argument to \meta{working procedure} is constant (currently empty).
+%
+%       The working procedure of the example reads as follows.\vspace*{-.5\baselineskip}
+% \begin{verbatim}
+%    {\ifx\lst@lastother\lstum@backslash
+%         \let\lst@thestyle\lst@texcsstyle
+%     \fi}\end{verbatim}
+%\vspace*{-.5\baselineskip}
+%       What does this procedure do? First of all it is called only if a
+%       keyword from the user supplied list (or language definition) is found.
+%       The procedure now checks for a preceding backslash and sets the output
+%       style accordingly.
+%
+%\iffalse
+% \item[0.20] |\lst@InstallTest|\marg{prefix}\syntaxbreak
+%       |\lst@|\meta{name}|@list||\lst@|\meta{name}~|\lst@g|\meta{name}|@list||\lst@g|\meta{name}\syntaxbreak
+%       |\lst@g|\meta{name}|@sty|~\meta{\alternative{w,s}}\meta{\alternative{d,o}}
+%
+%       installs a `working identifier' test or keyword style depending on
+%       \meta{\alternative{w,s}}. |\lst@g|\meta{name}|@sty| contains the
+%       working procedure or style macro. Note that the behaviour of the tests
+%       depends on the \texttt{savemem} option.
+%       The keyword respectively working test is either installed at the
+%       \hookname{DetectKeyword} or \hookname{Output} hook according to
+%       \meta{\alternative{d,o}}.
+%
+%^^A    Either each call of this macro or each different \meta{prefix} inserts
+%^^A    another test (depending on the \texttt{savemem} option).
+%
+%       |\lst@|\meta{name} contains the current identifier list and
+%       |\lst@|\meta{name}|@list| a `|\lst@|\meta{$n_i$}|\lst@g|\meta{$n_i$}'
+%       sequence of currently used classes. If no other classes are used,
+%       this equals |\lst@|\meta{name}|\lst@g|\meta{name}. The global versions
+%       |\lst@g|\ldots\ are used to keep track of the keywords.
+%       (This description needs improvement.)
+%\fi
+% \end{syntax}
+%
+%
+% \subsection{Delimiters}
+%
+% We describe two stages: adding a new delimiter type to an existing class of
+% delimiters and writing a new class. Each class has its name; currently exist
+% \texttt{Comment}, \texttt{String}, and \texttt{Delim}. As you know, the
+% latter and the first both provide the type \texttt l, but there is no string
+% which starts with the given delimiter and ends at end of line. So we'll add
+% it now!
+%
+% First of all we extend the list of string types by
+% \begin{verbatim}
+%    \lst@AddTo\lst@stringtypes{,l}\end{verbatim}
+% Then we must provide the macro which takes the user supplied delimiter and
+% makes appropriate definitions. The command name consists of the prefix
+% |\lst@|, the delimiter name, |DM| for using dynamic modes, and |@| followed
+% by the type.
+% \begin{verbatim}
+%    \gdef\lst@StringDM@l#1#2\@empty#3#4#5{%
+%        \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}\end{verbatim}
+% You can put these three lines into a \texttt{.sty}-file or surround them by
+% |\makeatletter| and |\makeatother| in the preamble of a document.
+% And that's all!
+%{\makeatletter
+%\lst@AddTo\lst@stringtypes{,l}
+%\gdef\lst@StringDM@l#1#2\@empty#3#4#5{^^A
+%   \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+%}
+% \begin{lstsample}{}{}
+%    \lstset{string=[l]//}
+%    \begin{lstlisting}
+%    // This is a string.
+%    This isn't a string.
+%    \end{lstlisting}
+% \end{lstsample}
+% You want more details, of course. Let's begin with the arguments.
+% \begin{itemize}
+% \item The first argument \emph{after} |\@empty| is used to start the
+%       delimiter. It's provided by the delimiter class.
+% \item The second argument \emph{after} |\@empty| is used to end the
+%       delimiter. It's also provided by the delimiter class. We didn't
+%       need it in the example, see the explanation below.
+% \item The third argument \emph{after} |\@empty| is
+%       \marg{style}\meta{start tokens}.
+%       This with a preceding |\def\lst@currstyle| is used as argument to
+%       |\lst@EnterMode|. The delimiter class also provides it. In the
+%       example we `extended' |#5| by |\lst@Lmodetrue| (line mode true).
+%       The mode automatically ends at end of line, so we didn't need the
+%       end-delimiter argument.
+% \end{itemize}
+% And now for the other arguments. In case of dynamic modes, the first argument
+% is the mode number. Then follow the user supplied  delimiter(s) whose number
+% must match the remaining arguments up to |\@empty|. For non-dynamic modes,
+% you must either allocate a static mode yourself or use a predefined mode
+% number. The delimiters then start with the first argument.
+%
+% Eventually let's look at the replacement text of the macro. The sequence
+% |\lst@CArg #2\relax| puts two required arguments after |\lst@DefDelimB|.
+% The syntax of the latter macro is
+% \begin{syntax}
+% \item[1.0] \cs{lst@DefDelimB}
+%
+%   |{|\meta{1st}\meta{2nd}\marg{rest}|}|\syntaxfill |{//{}}|\\
+%   \meta{save 1st}\syntaxfill |\lst@c/0|\\
+%   \marg{execute}\syntaxfill|{}|\\
+%   \marg{delim~exe~modetrue}\syntaxfill|{}|\\
+%   \marg{delim~exe~modefalse}\syntaxfill|{}|\\
+%   \meta{start-delimiter macro}\syntaxfill|#3|\\
+%   \meta{mode number}\syntaxfill |{#1}|\\
+%   |{|\marg{style}\meta{start tokens}|}|\syntaxfill |{#5\lst@Lmodetrue}|
+%
+%       defines \meta{1st}\meta{2nd}\meta{rest} as starting-delimiter.
+%       \meta{execute} is executed when the package comes to \meta{1st}.
+%       \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are
+%       executed only if the whole delimiter \meta{1st}\meta{2nd}\meta{rest}
+%       is found. Exactly one of them is called depending on |\lst@ifmode|.
+%
+%       By default the package enters the mode if the delimiter is found
+%       \emph{and} |\lst@ifmode| is false. Internally we make an appropriate
+%       definition of |\lst@bnext|, which can be gobbled by placing
+%       |\@gobblethree| at the very end of \meta{delim exe modefalse}.
+%       One can provide an own definition (and gobble the default).
+%
+%       \meta{save 1st} must be an undefined macro and is used internally to
+%       store the previous meaning of \meta{1st}. The arguments \meta{2nd}
+%       and/or \meta{rest} are empty if the delimiter has strictly less than
+%       three characters. All characters of \meta{1st}\meta{2nd}\meta{rest}
+%       must already be active (if not empty).
+%       That's not a problem since the macro |\lst@CArgX| does this job.
+%
+% \item[1.0] \cs{lst@DefDelimE}
+%
+%   |{|\meta{1st}\meta{2nd}\marg{rest}|}|\\
+%   \meta{save 1st}\\
+%   \marg{execute}\\
+%   \marg{delim~exe~modetrue}\\
+%   \marg{delim~exe~modefalse}\\
+%   \meta{end-delimiter macro}\\
+%   \meta{mode number}
+%
+%       Ditto for ending-delimiter with slight differences:
+%       \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are executed
+%       depending on whether |\lst@mode| equals \meta{mode}.
+%
+%       The package ends the mode if the delimiter is found and |\lst@mode|
+%       equals \meta{mode}. Internally we make an appropriate definition of
+%       |\lst@enext| (not |\lst@bnext|), which can be gobbled by placing
+%       |\@gobblethree| at the very end of \meta{delim exe modetrue}.
+%
+% \item[1.0] \cs{lst@DefDelimBE}
+%
+%   followed by the same eight arguments as for |\lst@DefDelimB| and \ldots\\
+%   \meta{end-delimiter macro}
+%
+%       This is a combination of |\lst@DefDelimB| and |\lst@DefDelimE| for the
+%       case of starting and ending delimiter being the same.
+% \end{syntax}
+% We finish the first stage by examining two easy examples.
+% \texttt d-type strings are defined by
+% \begin{verbatim}
+%    \gdef\lst@StringDM@d#1#2\@empty#3#4#5{%
+%        \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4}\end{verbatim}
+% (and an entry in the list of string types).
+% Not a big deal. Ditto \texttt d-type comments:
+% \begin{verbatim}
+%    \gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{%
+%        \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+%        \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}\end{verbatim}
+% Here we just need to use both |\lst@DefDelimB| and |\lst@DefDelimE|.
+% \goodbreak
+%
+% So let's get to the second stage. For illustration, here's the definition of
+% the \texttt{Delim} class. The respective first argument to the service macro
+% makes it delete all delimiters of the class, add the delimiter, or delete
+% the particular delimiter only.
+% \begin{verbatim}
+%    \lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}}
+%    \lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}}
+%    \lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}\end{verbatim}
+% The service macro itself calls another macro with appropriate arguments.
+% \begin{verbatim}
+%    \gdef\lst@DelimKey#1#2{%
+%        \lst@Delim{}#2\relax{Delim}\lst@delimtypes #1%
+%                    {\lst@BeginDelim\lst@EndDelim}
+%            i\@empty{\lst@BeginIDelim\lst@EndIDelim}}\end{verbatim}
+% We have to look at those arguments. Above you can see the actual arguments
+% for the \texttt{Delim} class, below are the \texttt{Comment} class ones.
+% Note that the user supplied value covers the second and third line of
+% arguments.
+% \begin{syntax}
+% \item[0.21,,changed]
+%   \cs{lst@Delim}
+%
+%   \meta{default style macro}\syntaxfill \cs{lst@commentstyle}\\ \relax
+%   [\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt][\texttt[\meta{type option}\texttt]]]\\
+%   \meta{delimiter\textup(s\textup)}\cs{relax}\syntaxfill|#2|\cs{relax}\\
+%   \marg{delimiter name}\syntaxfill|{Comment}|\\
+%   \meta{delimiter types macro}\syntaxfill\texttt{\cs{lst@commenttypes}}\\
+%   \alternative{\cs{@empty},\cs{@nil},\cs{relax}}\syntaxfill|#1|\\
+%   \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginComment}\cs{lst@EndComment}|}|\\
+%   \meta{extra prefix}\syntaxfill |i|\\
+%   \meta{extra conversion}\syntaxfill |\@empty|\\
+%   \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginIComment}\cs{lst@EndIComment}|}|
+%
+%   Most arguments should be clear. We'll discuss the last four. Both
+%   \marg{begin- and end-delim macro} must contain exactly two control
+%   sequences, which are given to |\lst@|\meta{name}[|DM|]|@|\meta{type}
+%   to begin and end a delimiter. These are the arguments |#3| and |#4| in our
+%   first example of |\lst@StringDM@l|. Depending on whether the user chosen
+%   type starts with \meta{extra prefix}, the first two or the last control
+%   sequences are used.
+%
+%   By default the package takes the delimiter(s), makes the characters active,
+%   and places them after |\lst@|\meta{name}[|DM|]|@|\meta{type}. If the user
+%   type starts with \meta{extra prefix}, \meta{extra conversion} might change
+%   the definition of |\lst@next| to choose a different conversion. The default
+%   is equivalent to |\lst@XConvert| with |\lst@false|.
+%
+%   Note that \meta{type} never starts with \meta{extra prefix} since it is
+%   discarded. The functionality must be fully implemented by choosing a
+%   different \marg{begin- and end-delim macro} pair.
+% \end{syntax}
+% You might need to know the syntaxes of the \meta{begin- and end-delim macro}s.
+% They are called as follows.
+% \begin{syntax}
+% \item[0.21] |\lst@Begin|\meta{whatever}
+%
+%   \marg{mode}
+%   |{|\marg{style}\meta{start tokens}|}|
+%   \meta{delimiter}|\@empty|
+%
+% \item[0.21] |\lst@End|\meta{whatever}
+%
+%   \marg{mode}
+%   \meta{delimiter}|\@empty|
+% \end{syntax}
+% The existing macros are internally defined in terms of |\lst@DelimOpen| and
+% |\lst@DelimClose|, see the implementation.
+%
+%
+% \subsection{Getting the kernel run}
+%
+% If you want new pretty-printing environments, you should be happy with
+% section \ref{rEnvironments}. New commands like |\lstinline| or
+% |\lstinputlisting| are more difficult. Roughly speaking you must follow
+% these steps.
+% \begin{enumerate}
+% \item Open a group to make all changes local.
+% \item \meta{Do whatever you want.}
+% \item Call |\lsthk@PreSet| in any case.
+% \item Now you \emph{might } want to (but need not) use |\lstset| to set some
+%       new values.
+% \item \meta{Do whatever you want.}
+% \item Execute |\lst@Init\relax| to finish initialization.
+% \item \meta{Do whatever you want.}
+% \item Eventually comes the source code, which is processed by the kernel.
+%       You must ensure that the characters are either not already read or all
+%       active. Moreover \emph{you} must install a way to detect the end of the
+%       source code. If you've reached the end, you must \ldots
+% \item \ldots\ call |\lst@DeInit| to shutdown the kernel safely.
+% \item \meta{Do whatever you want.}
+% \item Close the group from the beginning.
+% \end{enumerate}
+% For example, consider the |\lstinline| command in case of being not inside an
+% argument. Then the steps are as follows.
+% \begin{enumerate}
+% \item |\leavevmode\bgroup| opens a group.
+% \item |\def\lst@boxpos{b}| `baseline' aligns the listing.
+% \item |\lsthk@PreSet|
+% \item |\lstset{flexiblecolumns,#1}| (|#1| is the user provided
+%       key=value list)
+% \item |\lsthk@TextStyle| deactivates all features not safe here.
+% \item |\lst@Init\relax|
+% \item |\lst@Def{`#1}{\lst@DeInit\egroup}| installs the `end inline'
+%       detection, where |#1| is the next character after |\lstinline|.
+%       Moreover chr(13) is redefined to end the fragment in the same way but
+%       also issues an error message.
+% \item Now comes the source code and \ldots
+% \item \ldots\ |\lst@DeInit| (from |\lst@Def| above) ends the code snippet
+%       correctly.
+% \item Nothing.
+% \item |\egroup| (also from |\lst@Def|) closes the group.
+% \end{enumerate}
+% The real definition is different since we allow source code inside arguments.
+% Read also section \ref{iTheInputCommand} if you really want to write
+% pretty-printing commands.
+%
+%
+% \section{Useful internal definitions}\label{dUsefulInternalDefinitions}
+%
+% This section requires an update.
+%
+%
+% \subsection{General purpose macros}\label{dGeneralPurposeMacros}
+%
+% \begin{syntax}
+% \item[0.19] |\lst@AddTo|\meta{macro}\marg{\TeX~material}
+%
+%       adds \meta{\TeX~material} globally to the contents of \meta{macro}.
+%
+% \item[0.20] |\lst@Extend|\meta{macro}\marg{\TeX~material}
+%
+%       calls |\lst@AddTo| after the first token of \meta{\TeX~material} is
+%       |\expand|ed|after|. For example, |\lst@Extend \a \b| merges the
+%       contents of the two macros and stores it globally in |\a|.
+%
+% \item[0.19] |\lst@lAddTo|\meta{macro}\marg{\TeX~material}
+% \item[0.20] |\lst@lExtend|\meta{macro}\marg{\TeX~material}
+%
+%       are local versions of |\lst@AddTo| and |\lst@Extend|.
+%
+% \item[0.18] |\lst@DeleteKeysIn|\meta{macro}\meta{macro \textup(keys to remove\textup)}
+%
+%       Both macros contain a comma separated list of keys (or keywords). All
+%       keys appearing in the second macro are removed (locally) from the first.
+%
+% \item[0.19] |\lst@ReplaceIn|\meta{macro}\meta{macro \textup(containing replacement list\textup)}
+% \item[0.20] |\lst@ReplaceInArg|\meta{macro}\marg{replacement list}
+%
+%       The replacement list has the form $a_1b_1$\ldots$a_nb_n$, where each
+%       $a_i$ and $b_i$ is a character sequence (enclosed in braces if
+%       necessary) and may contain macros, but the first token of $b_i$ must
+%       not be equivalent to |\@empty|. Each sequence $a_i$ inside the first
+%       macro is (locally) replaced by $b_i$.
+%       The suffix |Arg| refers to the \emph{braced} second argument instead of
+%       a (nonbraced) macro. It's a hint that we get the `real' argument and
+%       not a `pointer' to the argument.
+%
+% \item[0.20] |\lst@IfSubstring|\marg{character sequence}\meta{macro}\marg{then}\marg{else}
+%
+%       \meta{then} is executed if \meta{character sequence} is a substring of
+%       the contents of \meta{macro}. Otherwise \meta{else} is called.
+%
+% \item[0.12] |\lst@IfOneOf|\meta{character sequence}|\relax|\meta{macro}\marg{then}\marg{else}
+%
+%       |\relax| terminates the first parameter here since it is faster than
+%       enclosing it in braces. \meta{macro} contains a comma separated list
+%       of identifiers. If the character sequence is one of these indentifiers,
+%       \meta{then} is executed, and otherwise \meta{else}.
+%
+% \item[0.21] |\lst@Swap|\marg{tok1}\marg{tok2}
+%
+%       changes places of the following two tokens or arguments \emph{without}
+%       inserting braces. For example, |\lst@Swap{abc}{def}| expands to
+%       |defabc|.
+%
+% \item[0.18] |\lst@IfNextChars|\meta{macro}\marg{then}\marg{else}
+% \item[0.19] |\lst@IfNextCharsArg|\marg{character sequence}\marg{then}\marg{else}
+%
+%       Both macros execute either \meta{then} or \meta{else} according to
+%       whether the given character sequence respectively the contents of the
+%       given macro is found (after the three arguments). Note an important
+%       difference between these macros and \LaTeX's |\@ifnextchar|:
+%       We remove the characters behind the arguments until it is possible to
+%       decide which part must be executed. However, we save these characters
+%       in the macro |\lst@eaten|, so they can be inserted using \meta{then} or
+%       \meta{else}.
+%
+% \item[0.19] |\lst@IfNextCharActive|\marg{then}\marg{else}
+%
+%       executes \meta{then} if next character is active, and \meta{else}
+%       otherwise.
+%
+% \item[0.20] |\lst@DefActive|\meta{macro}\marg{character sequence}
+%
+%       stores the character sequence in \meta{macro}, but all characters
+%       become active. The string \emph{must not} contain a begin group, end
+%       group or escape character (|{}\|); it may contain a left brace, right
+%       brace or backslash with other meaning (= catcode). This command
+%       would be quite surplus if \meta{character sequence} is not already read
+%       by \TeX\ since such catcodes can be changed easily. It is explicitly
+%       allowed that the charcaters have been read, e.g.~in
+%       |\def\test{\lst@DefActive\temp{ABC}}|!
+%
+%       Note that this macro changes |\lccode|s 0--9 without restoring them.
+%
+% \item[0.20] |\lst@DefOther|\meta{macro}\marg{character sequence}
+%
+%       stores \meta{character sequence} in \meta{macro}, but all characters
+%       have catcode 12. Moreover all spaces are removed and control sequences
+%       are converted to their name without preceding backslash. For example,
+%       |\{ Chip \}| leads to |{Chip}| where all catcodes are 12---internally
+%       the primitive |\meaning| is used.
+%
+% \iffalse
+% \item[0.19] |\lst@MakeActive|\marg{character sequence}
+%
+%       stores the character sequence in |\lst@arg| and has the same
+%       restrictions as |\lst@DefActive|. If fact, the latter definition uses
+%       this macro here.
+% \fi
+% \end{syntax}
+%
+%
+% \subsection{Character tables manipulated}\label{dCharacterTablesManipulated}
+%
+% \begin{syntax}
+% \item[0.20] |\lst@SaveDef|\marg{character code}\meta{macro}
+%
+%       Saves the current definition of the specified character in
+%       \meta{macro}. You should always save a character definition before you
+%       redefine it! And use the saved version instead of writing directly
+%       |\lst@Process|\ldots---the character could already be redefined and
+%       thus not equivalent to its standard definition.
+%
+% \item[0.20] |\lst@DefSaveDef|\marg{character code}\meta{macro}\meta{parameter text}\marg{definition}
+% \item[0.20] |\lst@LetSaveDef|\marg{character code}\meta{macro}\meta{token}
+%
+%       combine |\lst@SaveDef| and |\lst@Def| respectively |\lst@Let|.
+% \end{syntax}
+% Of course I shouldn't forget to mention \emph{where} to alter the character
+% table. Hook material at \hookname{SelectCharTable} makes permanent changes,
+% i.e.~it effects all languages. The following two keys can be used in any
+% language definition and effects the particular language only.
+% \begin{syntax}
+% \item[0.20] |SelectCharTable=|\meta{\TeX\ code}
+% \item[0.20] |MoreSelectCharTable=|\meta{\TeX\ code}
+%
+%       uses \meta{\TeX\ code} (additionally) to select the character table.
+%       The code is executed after the standard character table is selected,
+%       but possibly before other aspects make more changes. Since previous
+%       meanings are always saved and executed inside the new definition, this
+%       should be harmless.
+% \end{syntax}
+% Here come two rather useless examples. Each point (full stop) will cause a
+% message `|.|' on the terminal and in the |.log| file if language |useless| is
+% active:
+% \begin{verbatim}
+%   \lstdefinelanguage{useless}
+%       {SelectCharTable=\lst@DefSaveDef{46}% save chr(46) ...
+%            \lsts@point             % ... in \lsts@point and ...
+%            {\message{.}\lsts@point}% ... use new definition
+%       }\end{verbatim}
+% If you want to count points, you could write
+% \begin{verbatim}
+%   \newcount\lst@points % \global
+%   \lst@AddToHook{Init}{\global\lst@points\z@}
+%   \lst@AddToHook{DeInit}{\message{Number of points: \the\lst@points}}
+%   \lstdefinelanguage[2]{useless}
+%       {SelectCharTable=\lst@DefSaveDef{46}\lsts@point
+%            {\global\advance\lst@points\@ne \lsts@point}
+%       }\end{verbatim}
+% |% \global| indicates that the allocated counter is used globally. We zero
+% the counter at the beginning of each listing, display a message about the
+% current value at the end of a listing, and each processed point advances the
+% counter by one.
+%
+% \begin{syntax}
+% \item[0.21] |\lst@CArg|\meta{active characters}|\relax|\meta{macro}
+%
+%       The string of active characters is split into \meta{1st}, \meta{2nd},
+%       and \marg{rest}. If one doesn't exist, an empty argument is used. Then
+%       \meta{macro} is called with |{|\meta{1st}\meta{2nd}\marg{rest}|}| plus
+%       a yet undefined control sequence \meta{save 1st}. This macro is
+%       intended to hold the current definition of \meta{1st}, so \meta{1st}
+%       can be redefined without loosing information.
+%
+% \item[0.19] |\lst@CArgX|\meta{characters}|\relax|\meta{macro}
+%
+%       makes \meta{characters} active before calling |\lst@CArg|.
+%
+% \item[0.21] |\lst@CDef{|\meta{1st}\meta{2nd}\marg{rest}|}|\meta{save 1st}\marg{execute}\marg{pre}\marg{post}
+%
+%       should be used in connection with |\lst@CArg| or |\lst@CArgX|, i.e.~as
+%       \meta{macro} there. \meta{1st}, \meta{2nd}, and \meta{rest} must be
+%       active characters and \meta{save 1st} must be an undefined control
+%       sequence.
+%
+%       Whenever the package reaches the character \meta{1st} (in a listing),
+%       \meta{execute} is executed. If the package detects the whole string
+%       \meta{1st}\meta{2nd}\meta{rest}, we additionally execute \meta{pre},
+%       then the string, and finally \meta{post}.
+%
+% \item[0.21] |\lst@CDefX|\meta{1st}\meta{2nd}\marg{rest}\meta{save 1st}\marg{execute}\marg{pre}\marg{post}
+%
+%       Ditto except that we execute \meta{pre} and \meta{post} without the
+%       original string if we reach \meta{1st}\meta{2nd}\meta{rest}.
+%       This means that the string is replaced by \meta{pre}\meta{post} (with
+%       preceding \meta{execute}).
+% \end{syntax}
+% As the final example, here's the definition of |\lst@DefDelimB|.
+% \begin{verbatim}
+%    \gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{%
+%        \lst@CDef{#1}#2%
+%            {#3}%
+%            {\let\lst@bnext\lst@CArgEmpty
+%             \lst@ifmode #4\else
+%                 #5%
+%                 \def\lst@bnext{#6{#7}{#8}}%
+%             \fi
+%             \lst@bnext}%
+%            \@empty}\end{verbatim}
+% You got it?
+%
+%
+% \part{Implementation}
+%
+%
+% \CheckSum{12365}
+%^^A
+%^^A Don't index TeX-primitives.
+%^^A
+% \DoNotIndex{\advance,\afterassignment,\aftergroup,\batchmode,\begingroup}
+% \DoNotIndex{\box,\catcode,\char,\chardef,\closeout,\copy,\count,\csname,\def}
+% \DoNotIndex{\dimen,\discretionary,\divide,\dp,\edef,\else,\end,\endcsname}
+% \DoNotIndex{\endgroup,\endinput,\endlinechar,\escapechar,\everypar}
+% \DoNotIndex{\expandafter,\fi,\gdef,\global,\globaldefs,\hbadness,\hbox}
+% \DoNotIndex{\hrulefill,\hss,\ht}
+% \DoNotIndex{\if,\ifdim,\iffalse,\ifhmode,\ifinner,\ifnum,\ifodd,\iftrue}
+% \DoNotIndex{\ifvoid,\ifx,\ignorespaces,\immediate,\input,\jobname,\kern}
+% \DoNotIndex{\lccode,\leftskip,\let,\long,\lower,\lowercase,\meaning,\message}
+% \DoNotIndex{\multiply,\muskip,\noexpand,\noindent,\openout,\par,\parfillskip}
+% \DoNotIndex{\parshape,\parskip,\raise,\read,\relax,\rightskip,\setbox,\skip}
+% \DoNotIndex{\string,\the,\toks,\uppercase,\vbox,\vcenter,\vrule,\vtop,\wd}
+% \DoNotIndex{\write,\xdef}
+%
+%^^A
+%^^A Don't index LaTeX's private definitions.
+%^^A
+% \DoNotIndex{\@@end,\@@par,\@M,\@arabic,\@circlefnt,\@currentlabel}
+% \DoNotIndex{\@currenvir,\@depth,\@doendpe,\@dottedtocline,\@eha,\@ehc}
+% \DoNotIndex{\@empty,\@firstofone,\@firstoftwo,\@float,\@for,\@getcirc}
+% \DoNotIndex{\@gobble,\@gobbletwo,\@halfwidth,\@height,\@ifnextchar}
+% \DoNotIndex{\@ifundefined,\@ignoretrue,\@makecaption,\@makeother,\@namedef}
+% \DoNotIndex{\@ne,\@noligs,\@notprerr,\@onlypreamble,\@secondoftwo,\@spaces}
+% \DoNotIndex{\@starttoc,\@totalleftmargin,\@undefined,\@whilenum}
+% \DoNotIndex{\@wholewidth,\@width}
+% \DoNotIndex{\c@chapter,\c@figure,\c@page,\end@float,\f@family,\filename@area}
+% \DoNotIndex{\filename@base,\filename@ext,\filename@parse,\if@twoside}
+% \DoNotIndex{\l@ngrel@x,\m@ne,\new@command,\nfss@catcodes,\tw@,\thr@@}
+% \DoNotIndex{\z@,\zap@space}
+%
+%^^A
+%^^A Don't index LaTeX's package definitions.
+%^^A
+% \DoNotIndex{\AtEndOfPackage}
+% \DoNotIndex{\CurrentOption,\DeclareOption,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\MessageBreak,\NeedsTeXFormat,\PackageError,\PackageWarning}
+% \DoNotIndex{\ProcessOptions,\ProvidesFile,\ProvidesPackage,\RequirePackage}
+%
+%^^A
+%^^A Don't index LaTeX's public definitions.
+%^^A
+% \DoNotIndex{\abovecaptionskip,\active,\addcontentsline,\addtocounter,\begin}
+% \DoNotIndex{\belowcaptionskip,\bfseries,\bgroup,\bigbreak,\chapter}
+% \DoNotIndex{\contentsname,\do,\egroup,\footnotesize,\index,\itshape}
+% \DoNotIndex{\linewidth,\llap,\makeatletter,\newbox,\newcommand,\newcount}
+% \DoNotIndex{\newcounter,\newdimen,\newtoks,\newwrite,\nointerlineskip}
+% \DoNotIndex{\normalbaselines,\normalfont,\numberline,\pretolerance,\protect}
+% \DoNotIndex{\qquad,\refstepcounter,\removelastskip,\renewcommand,\rlap}
+% \DoNotIndex{\small,\smallbreak,\smallskipamount,\smash,\space,\strut}
+% \DoNotIndex{\strutbox,\tableofcontents,\textasciicircum,\textasciitilde}
+% \DoNotIndex{\textasteriskcentered,\textbackslash,\textbar,\textbraceleft}
+% \DoNotIndex{\textbraceright,\textdollar,\textendash,\textgreater,\textless}
+% \DoNotIndex{\textunderscore,\textvisiblespace,\thechapter,\ttdefault}
+% \DoNotIndex{\ttfamily,\typeout,\value,\vphantom}
+%
+%^^A
+%^^A Don't index definitions from other packages.
+%^^A
+% \DoNotIndex{\MakePercentComment,\MakePercentIgnore}
+%
+%^^A
+%^^A Don't index 0.19 definitions.
+%^^A
+% \DoNotIndex{\listlistingsname,\listoflistings,\lstbox,\lstbox@}
+% \DoNotIndex{\lstlanguage@}
+%
+%^^A
+%^^A Don't index 0.20 subdefinitions.
+%^^A
+% \DoNotIndex{\lst@ATH@,\lst@BOLGobble@,\lst@BOLGobble@@,\lst@CArg@,\lst@CArg@@}
+% \DoNotIndex{\lst@CBC@,\lst@CBC@@,\lst@CCECUse@,\lst@CCPutMacro@,\lst@DefLang@}
+% \DoNotIndex{\lst@DefLang@@,\lst@DefOther@,\lst@DeleteKeysIn@,\lst@Escape@}
+% \DoNotIndex{\lstframe@,\lst@frameH@,\lst@frameL@,\lst@frameR@}
+% \DoNotIndex{\lst@FillFixed@,\lst@FindAlias@,\lst@FVConvert@}
+% \DoNotIndex{\lst@IfNextChars@,\lst@IfNextChars@@,\lst@InsideConvert@}
+% \DoNotIndex{\lst@InstallKeywords@,\lst@Key@,\lst@KeywordTestI@}
+% \DoNotIndex{\lst@MakeActive@,\lst@MakeMoreKeywords@}
+% \DoNotIndex{\lst@RC@,\lst@RC@@,\lst@ReplaceIn@,\lst@ReplaceInput@}
+% \DoNotIndex{\lst@ReportAllocs@,\lst@SKS@,\lst@SKS@@,\lst@UBC@}
+% \DoNotIndex{\lst@WorkingTestI@,\lstalias@,\lstalias@@,\lstalso@}
+% \DoNotIndex{\lstdefinestyle@,\lstenv@BOLGobble@@}
+% \DoNotIndex{\lstenv@ProcessJ@,\lstinline@,\lstKV@OptArg@,\lstKV@SetIf@}
+% \DoNotIndex{\lstlang@,\lstnewenvironment@,\lst@outputpos,\lstset@}
+%
+%
+% \section{Overture}
+%
+% \paragraph{Registers}
+% For each aspect, the required numbers of registers are listed in section
+% \lstref{dPackageLoading}. Furthermore, the \packagename{keyval} package
+% allocates one token register. The macros, boxes and counters
+% |\@temp|\ldots|a|/|b|, the dimensions |\@tempdim|\ldots, and the macro
+% |\@gtempa| are also used, see the index.
+%
+% \paragraph{Naming conventions}
+% Let's begin with definitions for the user. All these public macros have
+% lower case letters and contain |lst|. Private macros and variables use the
+% following prefixes (not up-to-date?):
+% \begin{itemize}
+% \item |\lst@| for a general macro or variable,
+% \item |\lstenv@| if it is defined for the listing environment,
+% \item |\lsts@| for |s|aved character meanings,
+% \item |\lsthk@|\meta{name of hook} holds hook material,
+% \item |\lst|\meta{prefix}|@| for various kinds of keywords and working
+%       identifiers.
+% \item |\lstlang@|\meta{language}|@|\meta{dialect} contains a language and
+% \item |\lststy@|\meta{the style} contains style definition,
+% \item |\lstpatch@|\meta{aspect} to patch an aspect,
+%
+% \item |\lsta@|\meta{language}|$|\meta{dialect} contains alias,
+% \item |\lsta@|\meta{language} contains alias for all dialects of a language,
+% \item |\lstdd@|\meta{language} contains default dialect of a language
+%       (if present).
+% \end{itemize}
+% To distinguish procedure-like macros from data-macros, the name of procedure
+% macros use upper case letters with each beginning word, e.g.~|\lst@AddTo|.
+% A macro with suffix |@| is the main working-procedure for another definition,
+% for example |\lstinputlisting@| does the main work for |\lstinputlisting|.
+%
+% \paragraph{Preamble}
+% All files generated from this \texttt{listings.dtx} will get a header.
+%    \begin{macrocode}
+%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+%    \end{macrocode}
+%
+% \paragraph{Identification}
+% All files will have same date and version.
+%    \begin{macrocode}
+\def\filedate{2015/06/04}
+\def\fileversion{1.6}
+%    \end{macrocode}
+% What we need and who we are.
+%    \begin{macrocode}
+%<*kernel>
+\NeedsTeXFormat{LaTeX2e}
+\AtEndOfPackage{\ProvidesPackage{listings}
+             [\filedate\space\fileversion\space(Carsten Heinz)]}
+%    \end{macrocode}
+% \begin{macro}{\lst@CheckVersion}
+% can be used by the various driver files to guarantee the correct version.
+%    \begin{macrocode}
+\def\lst@CheckVersion#1{\edef\reserved@a{#1}%
+    \ifx\lst@version\reserved@a \expandafter\@gobble
+                          \else \expandafter\@firstofone \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\let\lst@version\fileversion
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+% For example by the miscellaneous file
+%    \begin{macrocode}
+%<*misc>
+\ProvidesFile{lstmisc.sty}
+             [\filedate\space\fileversion\space(Carsten Heinz)]
+\lst@CheckVersion\fileversion
+    {\typeout{^^J%
+     ***^^J%
+     *** This file requires `listings.sty' version \fileversion.^^J%
+     *** You have a serious problem, so I'm exiting ...^^J%
+     ***^^J}%
+     \batchmode \@@end}
+%</misc>
+%    \end{macrocode}
+% or by the dummy patch.
+%    \begin{macrocode}
+%<*patch>
+\ProvidesFile{lstpatch.sty}
+             [\filedate\space\fileversion\space(Carsten Heinz)]
+\lst@CheckVersion\lst@version{}
+%</patch>
+%    \end{macrocode}
+%    \begin{macrocode}
+%<*doc>
+\ProvidesPackage{lstdoc}
+             [\filedate\space\fileversion\space(Carsten Heinz)]
+%</doc>
+%    \end{macrocode}
+%
+% \paragraph{Category codes}
+% We define two macros to ensure correct catcodes when we input other files of
+% the \packagename{listings} package.
+%
+% \begin{macro}{\lst@InputCatcodes}
+% |@| and |"| become letters. Tabulators and EOLs are ignored; this avoids
+% unwanted spaces---in the case I've forgotten a comment character.
+%    \begin{macrocode}
+%<*kernel>
+\def\lst@InputCatcodes{%
+    \makeatletter \catcode`\"12%
+    \catcode`\^^@\active
+    \catcode`\^^I9%
+    \catcode`\^^L9%
+    \catcode`\^^M9%
+    \catcode`\%14%
+    \catcode`\~\active}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@RestoreCatcodes}
+% To load the kernel, we will change some catcodes and lccodes. We restore them
+% at the end of package loading. \lsthelper{Dr.~Jobst~Hoffmann}{2000/11/17}
+% {incompatibility with typehtml package} reported an incompatibility with the
+% \packagename{typehtml} package, which is resolved by |\lccode`\/`\/| below.
+%    \begin{macrocode}
+\def\lst@RestoreCatcodes#1{%
+    \ifx\relax#1\else
+        \noexpand\catcode`\noexpand#1\the\catcode`#1\relax
+        \expandafter\lst@RestoreCatcodes
+    \fi}
+\edef\lst@RestoreCatcodes{%
+    \noexpand\lccode`\noexpand\/`\noexpand\/%
+    \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax
+    \catcode12\active}
+%    \end{macrocode}
+% Now we are ready for
+%    \begin{macrocode}
+\lst@InputCatcodes
+\AtEndOfPackage{\lst@RestoreCatcodes}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Statistics}
+% \begin{macro}{\lst@GetAllocs}
+% \begin{macro}{\lst@ReportAllocs}
+% are used to show the allocated registers.
+%    \begin{macrocode}
+%<*info>
+\def\lst@GetAllocs{%
+    \edef\lst@allocs{%
+        0\noexpand\count\the\count10,1\noexpand\dimen\the\count11,%
+        2\noexpand\skip\the\count12,3\noexpand\muskip\the\count13,%
+        4\noexpand\box\the\count14,5\noexpand\toks\the\count15,%
+        6\noexpand\read\the\count16,7\noexpand\write\the\count17}}
+\def\lst@ReportAllocs{%
+    \message{^^JAllocs:}\def\lst@temp{none}%
+    \expandafter\lst@ReportAllocs@\lst@allocs,\z@\relax\z@,}
+\def\lst@ReportAllocs@#1#2#3,{%
+    \ifx#2\relax \message{\lst@temp^^J}\else
+        \@tempcnta\count1#1\relax \advance\@tempcnta -#3\relax
+        \ifnum\@tempcnta=\z@\else
+            \let\lst@temp\@empty
+            \message{\the\@tempcnta \string#2,}%
+        \fi
+        \expandafter\lst@ReportAllocs@
+    \fi}
+\lst@GetAllocs
+%    \end{macrocode}
+% \end{macro}\end{macro}
+% \begingroup
+%    \begin{macrocode}
+%</info>
+%    \end{macrocode}
+% \endgroup
+%
+% \paragraph{Miscellaneous}
+% \begin{macro}{\@lst}
+% Just a definition to save memory space.
+%    \begin{macrocode}
+%<*kernel>
+\def\@lst{lst}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \section{General problems}
+%
+% All definitions in this section belong to the kernel.
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+%
+%
+%^^A \subsection{Quick `if parameter empty'}
+%^^A
+%^^A There are many situations where you have to look whether a macro parameter is empty.
+%^^A We have at least two possibilities to test |#1|, for example:
+%^^A \begin{center}
+%^^A \begin{minipage}{0.35\linewidth}
+%^^A \begin{verbatim}
+%^^A\def\test{#1}%
+%^^A\ifx \test\empty
+%^^A        % #1 is empty
+%^^A\else
+%^^A        % #1 is not empty
+%^^A\fi\end{verbatim}
+%^^A \end{minipage}
+%^^A \hskip2em\vrule\hskip2em
+%^^A \begin{minipage}{0.35\linewidth}
+%^^A \begin{verbatim}
+%^^A\ifx \empty#1\empty
+%^^A        % #1 is empty
+%^^A\else
+%^^A        % #1 is not empty
+%^^A\fi\end{verbatim}
+%^^A \end{minipage}
+%^^A \end{center}
+%^^A where |\empty| is defined by |\def\empty{}|, of course.
+%^^A The left variant should be clear and works in any case.
+%^^A The right-hand side works correct if and only if the first token of |#1| is
+%^^A not equivalent to |\empty|.
+%^^A This granted, the |\ifx| is true if and only if |#1| is empty (since |\empty|
+%^^A left from |#1| is (not) compared with |\empty| on the right).
+%^^A The two |\empty|s might be replaced by any other macro, which is not
+%^^A equivalent to the first token of the argument.
+%^^A But the definition of that macro shouldn't be too complex since this would
+%^^A slow down the |\ifx|.
+%^^A The right example needs about $45\%$ of the left's time.
+%^^A Note that this \TeX{}nique lost its importance from version 0.18 on and that
+%^^A other packages use |!| or |\relax| instead of |\empty|, for example.
+%^^A
+%^^A This \TeX nique is described in ``The \TeX book'' on page 376.
+%
+%
+% \subsection{Substring tests}\label{iSubstringTests}
+%
+% \lstset{language=TeX,gobble=4,xleftmargin=20pt,columns=[l]fullflexible,mathescape,keywordstyle=\ttfamily,texcsstyle=\bfseries}
+% \let\texverb\lstinline
+% \lstnewenvironment{texcode}[1][]{\lstset{#1}}{}
+% \lstset{keywords={def,key}}
+%
+% It's easy to decide whether a given character sequence is a substring of
+% another string. For example, for the substring \texverb|def| we could say
+% \begin{texcode}
+%   \def \lst@temp#1def#2\relax{%
+%       \ifx \@empty#2\@empty
+%               % "def" is not a substring
+%       \else
+%               % "def" is a substring
+%       \fi}
+%
+%   \lst@temp $\meta{another\ string}$def\relax
+% \end{texcode}
+% When \TeX\ passes the arguments |#1| and |#2|, the second is empty if
+% and only if \texverb|def| is not a substring. Without the additional
+% \texverb|def\relax|, one would get a ``runaway argument'' error if
+% \meta{another string} doesn't contain \texverb|def|.
+%
+% We use substring tests mainly in the special case of an identifier and a
+% comma separated list of keys or keywords:
+% \begin{texcode}[keywords=key]
+%   \def \lst@temp#1,key,#2\relax{%
+%       \ifx \@empty#2\@empty
+%               % `key' is not a keyword
+%       \else
+%               % `key' is a keyword
+%       \fi}
+%
+%   \lst@temp,$\meta{list\ of\ keywords}$,key,\relax
+% \end{texcode}
+% This works very well and is quite fast. But we can reduce run time in the
+% case that \texttt{key} is a keyword. Then |#2| takes the rest of the string,
+% namely all keywords after \texttt{key}.
+% Since \TeX\ inserts |#2| between the \texverb|\@empty|s, it must drop all of
+% |#2| except the first character---which is compared with \texverb|\@empty|.
+% We can redirect this rest to a third parameter:
+% \begin{texcode}[keywords=key]
+%   \def \lst@temp#1,key,#2#3\relax{%
+%       \ifx \@empty#2%
+%               % "key" is not a keyword
+%       \else
+%               % "key" is a keyword
+%       \fi}
+%
+%   \lst@temp,$\meta{list\ of\ keywords}$,key,\@empty\relax
+% \end{texcode}
+% That's a bit faster and an improvement for version 0.20.
+%
+% \begin{macro}{\lst@IfSubstring}
+% The implementation should be clear from the discussion above.
+%    \begin{macrocode}
+\def\lst@IfSubstring#1#2{%
+    \def\lst@temp##1#1##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp#2#1\@empty\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfOneOf}
+% Ditto.
+%    \begin{macrocode}
+\def\lst@IfOneOf#1\relax#2{%
+    \def\lst@temp##1,#1,##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}
+%    \end{macrocode}
+% \end{macro}
+% \begin{REMOVED}
+% One day, if there is need for a case insensitive key(word) test again, we
+% can use two |\uppercase|s to normalize the first parameter:
+%    \begin{verbatim}
+%\def\lst@IfOneOfInsensitive#1\relax#2{%
+%    \uppercase{\def\lst@temp##1,#1},##2##3\relax{%
+%        \ifx \@empty##2\expandafter\@secondoftwo
+%                 \else \expandafter\@firstoftwo \fi}%
+%    \uppercase{%
+%        \expandafter\lst@temp\expandafter,#2,#1},\@empty\relax}\end{verbatim}
+% Here we assume that macro |#2| already contains capital characters only, see
+% the definition of |\lst@MakeMacroUppercase| at the very end of section
+% \ref{iMakingTests}. If we \emph{must not} assume that, we could simply
+% insert an |\expandafter| between the second |\uppercase| and the following
+% brace. But this slows down the tests!
+% \end{REMOVED}
+%
+% \begin{macro}{\lst@DeleteKeysIn}
+% The submacro does the main work; we only need to expand the second
+% macro---the list of keys to remove---and append the terminator |\relax|.
+%    \begin{macrocode}
+\def\lst@DeleteKeysIn#1#2{%
+    \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,}
+%    \end{macrocode}
+% `Replacing' the very last |\lst@DeleteKeysIn@| by |\lst@RemoveCommas|
+% terminates the loop here. Note: The |\@empty| after |#2| ensures that this
+% macro also works if |#2| is empty.
+%    \begin{macrocode}
+\def\lst@DeleteKeysIn@#1#2,{%
+    \ifx\relax#2\@empty
+        \expandafter\@firstoftwo\expandafter\lst@RemoveCommas
+    \else
+        \ifx\@empty#2\@empty\else
+%    \end{macrocode}
+% If we haven't reached the end of the list and if the key is not empty, we
+% define a temporary macro which removes all appearances.
+%    \begin{macrocode}
+            \def\lst@temp##1,#2,##2{%
+                ##1%
+                \ifx\@empty##2\@empty\else
+                    \expandafter\lst@temp\expandafter,%
+                \fi ##2}%
+            \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}%
+        \fi
+    \fi
+    \lst@DeleteKeysIn@#1}
+%    \end{macrocode}
+% \end{macro}
+% \begin{OLDDEF}
+% The following modification needs about $50\%$ more run time.
+% It doesn't use |\edef| and thus also works with |\{| inside |#1|.
+% However, we don't need that at the moment.
+%    \begin{verbatim}
+%            \def\lst@temp##1,#2,##2{%
+%                \ifx\@empty##2%
+%                    \lst@lAddTo#1{##1}%
+%                \else
+%                    \lst@lAddTo#1{,##1}%
+%                    \expandafter\lst@temp\expandafter,%
+%                \fi ##2}%
+%            \let\@tempa#1\let#1\@empty
+%            \expandafter\lst@temp\expandafter,\@tempa,#2,\@empty\end{verbatim}
+% \end{OLDDEF}
+%
+% \begin{macro}{\lst@RemoveCommas}
+% The macro drops commas at the beginning and assigns the new value to |#1|.
+%    \begin{macrocode}
+\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}}
+\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi}
+%    \end{macrocode}
+% \end{macro}
+% \begin{OLDDEF}
+% The following version works with |\{| inside the macro |#1|.
+%    \begin{verbatim}
+%\def\lst@RemoveCommas#1{\expandafter\lst@RC@#1\@empty #1}
+%\def\lst@RC@#1{%
+%    \ifx,#1\expandafter\lst@RC@
+%      \else\expandafter\lst@RC@@\expandafter#1\fi}
+%\def\lst@RC@@#1\@empty#2{\def#2{#1}}\end{verbatim}
+% \end{OLDDEF}
+%
+% \begin{macro}{\lst@ReplaceIn}
+% \begin{macro}{\lst@ReplaceInArg}
+% These macros are similar to |\lst@DeleteKeysIn|, except that \ldots
+%    \begin{macrocode}
+\def\lst@ReplaceIn#1#2{%
+    \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty}
+\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty}
+%    \end{macrocode}
+% \ldots\space we replace |#2| by |#3| instead of |,#2,| by a single comma
+% (which removed the key |#2| above).
+%    \begin{macrocode}
+\def\lst@ReplaceIn@#1#2#3{%
+    \ifx\@empty#3\relax\else
+        \def\lst@temp##1#2##2{%
+            \ifx\@empty##2%
+                \lst@lAddTo#1{##1}%
+            \else
+                \lst@lAddTo#1{##1#3}\expandafter\lst@temp
+            \fi ##2}%
+        \let\@tempa#1\let#1\@empty
+        \expandafter\lst@temp\@tempa#2\@empty
+        \expandafter\lst@ReplaceIn@\expandafter#1%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Flow of control}
+%
+% \begin{macro}{\@gobblethree}
+% is defined if and only if undefined.
+%    \begin{macrocode}
+\providecommand*\@gobblethree[3]{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@GobbleNil}
+%    \begin{macrocode}
+\def\lst@GobbleNil#1\@nil{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Swap}
+% is just this:
+%    \begin{macrocode}
+\def\lst@Swap#1#2{#2#1}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@if}
+% \begin{macro}{\lst@true}
+% \begin{macro}{\lst@false}
+% A general |\if| for temporary use.
+%    \begin{macrocode}
+\def\lst@true{\let\lst@if\iftrue}
+\def\lst@false{\let\lst@if\iffalse}
+\lst@false
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfNextCharsArg}
+% is quite easy: We define a macro and call |\lst@IfNextChars|.
+%    \begin{macrocode}
+\def\lst@IfNextCharsArg#1{%
+    \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfNextChars}
+% We save the arguments and start a loop.
+%    \begin{macrocode}
+\def\lst@IfNextChars#1#2#3{%
+    \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}%
+    \let\lst@eaten\@empty \lst@IfNextChars@}
+%    \end{macrocode}
+% Expand the characters we are looking for.
+%    \begin{macrocode}
+\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax}
+%    \end{macrocode}
+% Now we can refine |\lst@tofind| and append the input character |#3| to
+% |\lst@eaten|.
+%    \begin{macrocode}
+\def\lst@IfNextChars@@#1#2\relax#3{%
+    \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}%
+    \ifx#1#3%
+%    \end{macrocode}
+% If characters are the same, we either call |\@tempa| or continue the test.
+%    \begin{macrocode}
+        \ifx\lst@tofind\@empty
+            \let\lst@next\@tempa
+        \else
+            \let\lst@next\lst@IfNextChars@
+        \fi
+        \expandafter\lst@next
+    \else
+%    \end{macrocode}
+% If the characters are different, we call |\@tempb|.
+%    \begin{macrocode}
+        \expandafter\@tempb
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfNextCharActive}
+% We compare the character |#3| with its active version |\lowercase{~}|.
+% Note that the right brace between |\ifx~| and |#3| ends the |\lowercase|.
+% The |\endgroup| restores the |\lccode|.
+%    \begin{macrocode}
+\def\lst@IfNextCharActive#1#2#3{%
+    \begingroup \lccode`\~=`#3\lowercase{\endgroup
+    \ifx~}#3%
+        \def\lst@next{#1}%
+    \else
+        \def\lst@next{#2}%
+    \fi \lst@next #3}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@for}
+% A for-loop with expansion of the loop-variable.  This was improved due to
+% a suggestion by \lsthelper{Hendri~Adriaens}{2006/03/31}{speedup of
+% \lst@for}.
+%    \begin{macrocode}
+\def\lst@for#1\do#2{%
+  \def\lst@forbody##1{#2}%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@empty\else\expandafter\lst@f@r#1,\@nil,\fi
+}
+\def\lst@f@r#1,{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@nnil\else\lst@forbody{#1}\expandafter\lst@f@r\fi
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Catcode changes}\label{iCatcodeChanges}
+%
+% A character gets its catcode right after reading it and \TeX\ has no
+% primitive command to change attached catcodes. However, we can replace these
+% characters by characters with same ASCII codes and different catcodes.
+% It's not the same but suffices since the result is the same.
+% Here we treat the very special case that all characters become active.
+% If we want \texverb|\lst@arg| to contain an active version of the character
+% |#1|, a prototype macro could be
+% \begin{texcode}
+%   \def\lst@MakeActive#1{\lccode`\~=`#1\lowercase{\def\lst@arg{~}}}
+% \end{texcode}
+% The |\lowercase| changes the ASCII code of |~| to the one of |#1| since we
+% have said that |#1| is the lower case version of |~|.
+% Fortunately the |\lowercase| doesn't change the catcode, so we have an active
+% version of |#1|.
+% Note that |~| is usually active.
+%
+% \begin{macro}{\lst@MakeActive}
+% We won't do this character by character.
+% To increase speed we change nine characters at the same time (if nine
+% characters are left).
+% \begin{TODO}
+% This was introduced when the delimiters were converted each listings. Now
+% this conversion is done only each language selection. So we might want to
+% implement a character by character conversion again to decrease the memory
+% usage.
+% \end{TODO}
+% We get the argument, empty |\lst@arg| and begin a loop.
+%    \begin{macrocode}
+\def\lst@MakeActive#1{%
+    \let\lst@temp\@empty \lst@MakeActive@#1%
+    \relax\relax\relax\relax\relax\relax\relax\relax\relax}
+%    \end{macrocode}
+% There are nine |\relax|es since |\lst@MakeActive@| has nine parameters and we
+% don't want any problems in the case that |#1| is empty.
+% We need nine active characters now instead of a single |~|.
+% We make these catcode changes local and define the coming macro |\global|.
+%    \begin{macrocode}
+\begingroup
+\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active
+\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active
+\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active
+%    \end{macrocode}
+% First we |\let| the next operation be |\relax|.
+% This aborts our loop for processing all characters (default and possibly
+% changed later).
+% Then we look if we have at least one character.
+% If this is not the case, the loop terminates and all is done.
+%    \begin{macrocode}
+\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax
+    \ifx#1\relax
+    \else \lccode`\^^@=`#1%
+%    \end{macrocode}
+% Otherwise we say that |^^@|=chr(0) is the lower case version of the first
+% character.
+% Then we test the second character.
+% If there is none, we append the lower case |^^@| to |\lst@temp|.
+% Otherwise we say that |^^A|=chr(1) is the lower case version of the second
+% character and we test the next argument, and so on.
+%    \begin{macrocode}
+    \ifx#2\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@}}%
+    \else \lccode`\^^A=`#2%
+    \ifx#3\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}%
+    \else \lccode`\^^B=`#3%
+    \ifx#4\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}%
+    \else \lccode`\^^C=`#4%
+    \ifx#5\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}%
+    \else \lccode`\^^D=`#5%
+    \ifx#6\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}%
+    \else \lccode`\^^E=`#6%
+    \ifx#7\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}%
+    \else \lccode`\^^F=`#7%
+    \ifx#8\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}%
+    \else \lccode`\^^G=`#8%
+    \ifx#9\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}%
+%    \end{macrocode}
+% If nine characters are present, we append (lower case versions of) nine
+% active characters and call this macro again via redefining |\lst@next|.
+%    \begin{macrocode}
+    \else \lccode`\^^H=`#9%
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}%
+        \let\lst@next\lst@MakeActive@
+    \fi \fi \fi \fi \fi \fi \fi \fi \fi
+    \lst@next}
+\endgroup
+%    \end{macrocode}
+% This |\endgroup| restores the catcodes of chr(0)--chr(8), but not the
+% catcodes of the characters inside |\lst@MakeActive@| since they are already
+% read.
+%
+% Note: A conversion from an arbitrary `catcode--character code' table back to
+% \TeX's catcodes is possible if we test against the character codes (either
+% via |\ifnum| or |\ifcase|).
+% But control sequences and begin and end group characters definitely need
+% some special treatment.
+% However I haven't checked the details.
+% So just ignore this and don't bother me for this note. :\,--\,)
+% \end{macro}
+%
+% \begin{macro}{\lst@DefActive}
+% An easy application of |\lst@MakeActive|.
+%    \begin{macrocode}
+\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefOther}
+% We use the fact that |\meaning| produces catcode 12 characters except spaces
+% stay spaces. |\escapechar| is modified locally to suppress the output of an
+% escape character. Finally we remove spaces via \LaTeX's |\zap@space|, which
+% was proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{use \zap@space}---not
+% in this context, but that doesn't matter.
+%    \begin{macrocode}
+\def\lst@DefOther#1#2{%
+    \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup
+    \expandafter\lst@DefOther@\meaning#1\relax#1}
+\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+%\ifhyper
+% \subsection{Applications to \ref*{iCatcodeChanges}}\label{iApplicationsTo}
+%\else
+% \subsection{Applications to \ref{iCatcodeChanges}}\label{iApplicationsTo}
+%\fi
+%
+% If an environment is used inside an argument, the listing is already read and
+% we can do nothing to preserve the catcodes.
+% However, under certain circumstances the environment can be used inside an
+% argument---that's at least what I've said in the User's guide.
+% And now I have to work for it coming true.
+% Moreover we define an analogous conversion macro for the
+% \packagename{fancyvrb} mode.
+% \begin{syntax}
+% \item[0.19] |\lst@InsideConvert{|\meta{\TeX\ material \textup(already read\textup)}|}|
+%
+%       \emph{appends} a verbatim version of the argument to |\lst@arg|, but all
+%       appended characters are active. Since it's not a character to character
+%       conversion, `verbatim' needs to be explained. All characters can be
+%       typed in as they are except |\|, |{|, |}| and |%|. If you want one of
+%       these, you must write |\\|, |\{|, |\}| and |\%| instead.
+%       If two spaces should follow each other, the second (third, fourth,
+%       \ldots) space must be entered with a preceding backslash.
+%
+% \item[0.19] |\lst@XConvert{|\meta{\TeX\ material \textup(already read\textup)}|}|
+%
+%       \emph{appends} a `verbatim' version of the argument to |\lst@arg|.
+%       Here \TeX\ material is allowed to be put inside argument braces like
+%       |{(*}{*)}|. The contents of these arguments are converted, the braces
+%       stay as curly braces.
+%
+%       If |\lst@if| is true, each second argument is treated differently.
+%       Only the first character (of the delimiter) becomes active.
+% \end{syntax}
+%
+% \begin{macro}{\lst@InsideConvert}
+% If \texttt{mathescape} is not on, we call (near the end of this definition) a
+% submacro similar to |\zap@space| to replaced single spaces by active spaces.
+% Otherwise we check whether the code contains a pair |$...$| and call the
+% appropriate macro.
+%    \begin{macrocode}
+\def\lst@InsideConvert#1{%
+   \lst@ifmathescape
+      \lst@InsideConvert@e#1$\@nil
+      \lst@if
+         \lst@InsideConvert@ey#1\@nil
+      \else
+         \lst@InsideConvert@#1 \@empty
+         \expandafter\@gobbletwo
+      \fi
+      \expandafter\lst@next
+   \else
+      \lst@InsideConvert@#1 \@empty
+   \fi}
+\begingroup \lccode`\~=`\ \relax \lowercase{%
+%    \end{macrocode}
+% We make |#1| active and append these characters (plus an active space) to
+% |\lst@arg|.
+% If we haven't found the end |\@empty| of the input, we continue the process.
+%    \begin{macrocode}
+\gdef\lst@InsideConvert@#1 #2{%
+    \lst@MakeActive{#1}%
+    \ifx\@empty#2%
+        \lst@lExtend\lst@arg{\lst@temp}%
+    \else
+        \lst@lExtend\lst@arg{\lst@temp~}%
+        \expandafter\lst@InsideConvert@
+    \fi #2}
+%    \end{macrocode}
+% Finally we end the |\lowercase| and close a group.
+%    \begin{macrocode}
+}\endgroup
+%    \end{macrocode}
+% The next definition has been used above to check for |$...$| and the following
+% one keeps the math contents from being converted. This feature was requested by
+% \lsthelper{Dr.~Jobst~Hoffmann}{}{}.
+%    \begin{macrocode}
+\def\lst@InsideConvert@e#1$#2\@nil{%
+   \ifx\@empty#2\@empty \lst@false \else \lst@true \fi}
+\def\lst@InsideConvert@ey#1$#2$#3\@nil{%
+   \lst@InsideConvert@#1 \@empty
+   \lst@lAddTo\lst@arg{%
+      \lst@ifdropinput\else
+         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
+         \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin
+         #2%
+         \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput
+         \lst@whitespacefalse
+      \fi}%
+   \def\lst@next{\lst@InsideConvert{#3}}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@XConvert}
+% Check for an argument \ldots
+%    \begin{macrocode}
+\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@}
+%    \end{macrocode}
+% \ldots, convert the argument, add it together with group delimiters to
+% |\lst@arg|, and we continue the conversion.
+%    \begin{macrocode}
+\def\lst@XConvertArg#1{%
+    {\lst@false \let\lst@arg\@empty
+     \lst@XConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+    \lst@lExtend\lst@arg{\expandafter{\@gtempa}}%
+    \lst@XConvertNext}
+%    \end{macrocode}
+% Having no |\bgroup|, we look whether we've found the end of the input, and
+% convert one token ((non)active character or control sequence) and continue.
+%    \begin{macrocode}
+\def\lst@XConvert@#1{%
+    \ifx\@nil#1\else
+        \begingroup\lccode`\~=`#1\lowercase{\endgroup
+        \lst@lAddTo\lst@arg~}%
+        \expandafter\lst@XConvertNext
+    \fi}
+\def\lst@XConvertNext{%
+    \lst@if \expandafter\lst@XConvertX
+      \else \expandafter\lst@XConvert \fi}
+%    \end{macrocode}
+% Now we make only the first character active.
+%    \begin{macrocode}
+\def\lst@XConvertX#1{%
+    \ifx\@nil#1\else
+        \lst@XConvertX@#1\relax
+        \expandafter\lst@XConvert
+    \fi}
+\def\lst@XConvertX@#1#2\relax{%
+    \begingroup\lccode`\~=`#1\lowercase{\endgroup
+    \lst@XCConvertX@@~}{#2}}
+\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Driver file handling*}
+%
+% The \packagename{listings} package is split into several driver files,
+% miscellaneous (= aspect) files, and one kernel file.
+% All these files can be loaded partially and on demand---except the kernel
+% which provides this functionality.
+% \begin{syntax}
+% \item[0.21] |\lst@Require|\marg{name}\marg{prefix}\marg{feature list}\meta{alias}\meta{file list macro}
+%
+%       tries to load all items of \meta{feature list} from the files
+%       listed in \meta{file list macro}.
+%       Each item has the form [\oarg{sub}]\meta{feature}.
+%       |\lst@if| equals |\iftrue| if and only if all items were loadable.
+%
+%       The macro \meta{alias} gets an item as argument and must define
+%       appropriate versions of |\lst@oalias| and |\lst@malias|. In fact
+%       the feature associated with these definitions is loaded. You can
+%       use \meta{alias}=|\lst@NoAlias| for no substitution.
+%
+%       \meta{prefix} identifies the type internally and \meta{name} is used
+%       for messages.
+%
+%       For example, |\lstloadaspects| uses the following arguments where |#1|
+%       is the list of aspects: |{aspects}|\allowbreak|a|\allowbreak
+%       |{#1}|\allowbreak|\lst@NoAlias|\allowbreak|\lstaspectfiles|.
+%
+% \item[0.20] |\lst@DefDriver|\marg{name}\marg{prefix}\meta{interface macro}|\if|\alternative{true,false}
+%
+%
+%
+% \item[0.21] |\lst@IfRequired|\oarg{sub}\marg{feature}\marg{then}\marg{else}
+%
+%       is used inside a driver file by the aspect, language, or whatever
+%       else defining commands. \meta{then} is executed if and only if
+%       \oarg{sub}\marg{feature} has been requested via |\lst@Require|.
+%       Otherwise \meta{else} is executed---which is also the case for
+%       subsequent calls with the same \oarg{sub}\marg{feature}.
+%
+%       \meta{then} and \meta{else} may use |\lst@prefix| (read access only).
+%
+%       |\lst@BeginAspect| in section \ref{iAspectCommands} and |\lst@DefDriver|
+%       serve as examples.
+% \end{syntax}
+%
+% \begin{macro}{\lst@Require}
+% Initialize variables (if required items aren't empty), \ldots
+%    \begin{macrocode}
+\def\lst@Require#1#2#3#4#5{%
+    \begingroup
+    \aftergroup\lst@true
+    \ifx\@empty#3\@empty\else
+        \def\lst@prefix{#2}\let\lst@require\@empty
+%    \end{macrocode}
+% \ldots\space and for each nonempty item: determine alias and add it to
+% |\lst@require| if it isn't loaded.
+%    \begin{macrocode}
+        \edef\lst@temp{\expandafter\zap@space#3 \@empty}%
+        \lst@for\lst@temp\do{%
+          \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{%
+            #4[####1]{####2}%
+            \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}%
+            {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}%
+            {}}%
+          \fi}%
+%    \end{macrocode}
+% Init things and input files if and as long as it is necessary.
+%    \begin{macrocode}
+        \global\let\lst@loadaspects\@empty
+        \lst@InputCatcodes
+        \ifx\lst@require\@empty\else
+            \lst@for{#5}\do{%
+                \ifx\lst@require\@empty\else
+                    \InputIfFileExists{##1}{}{}%
+                \fi}%
+        \fi
+%    \end{macrocode}
+% Issue error and call |\lst@false| (after closing the local group) if some
+% items weren't loadable.
+%    \begin{macrocode}
+        \ifx\lst@require\@empty\else
+            \PackageError{Listings}{Couldn't load requested #1}%
+            {The following #1s weren't loadable:^^J\@spaces
+             \lst@require^^JThis may cause errors in the sequel.}%
+            \aftergroup\lst@false
+        \fi
+%    \end{macrocode}
+% Request aspects.
+%    \begin{macrocode}
+        \ifx\lst@loadaspects\@empty\else
+            \lst@RequireAspects\lst@loadaspects
+        \fi
+    \fi
+    \endgroup}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfRequired}
+% uses |\lst@IfOneOf| and adds some code to \meta{then} part:
+% delete the now loaded item from the list and define
+% |\lst|\meta{prefix}|@|\meta{feature}|$|\meta{sub}.
+%    \begin{macrocode}
+\def\lst@IfRequired[#1]#2{%
+    \lst@NormedDef\lst@temp{[#1]#2}%
+    \expandafter\lst@IfRequired@\lst@temp\relax}
+\def\lst@IfRequired@[#1]#2\relax#3{%
+    \lst@IfOneOf #2$#1\relax\lst@require
+        {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,%
+         \global\expandafter\let
+             \csname\@lst\lst@prefix @#2$#1\endcsname\@empty
+         #3}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@require}
+%    \begin{macrocode}
+\let\lst@require\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@NoAlias}
+% just defines |\lst@oalias| and |\lst@malias|.
+%    \begin{macrocode}
+\def\lst@NoAlias[#1]#2{%
+    \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LAS}
+%    \begin{macrocode}
+\gdef\lst@LAS#1#2#3#4#5#6#7{%
+    \lst@Require{#1}{#2}{#3}#4#5%
+    #4#3%
+    \@ifundefined{lst#2@\lst@malias$\lst@oalias}%
+        {\PackageError{Listings}%
+         {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi
+          \lst@malias\space undefined}%
+         {The #1 is not loadable. \@ehc}}%
+        {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@RequireAspects}
+% \begin{macro}{\lstloadaspects}
+% make use of the just developped definitions.
+%    \begin{macrocode}
+\def\lst@RequireAspects#1{%
+    \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles}
+\let\lstloadaspects\lst@RequireAspects
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lstaspectfiles}
+% This macro is defined if and only if it's undefined yet.
+%    \begin{macrocode}
+\@ifundefined{lstaspectfiles}
+    {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefDriver}
+% Test the next character and reinsert the arguments.
+%    \begin{macrocode}
+\gdef\lst@DefDriver#1#2#3#4{%
+    \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}%
+                 {\lst@DefDriver@{#1}{#2}#3#4[]}}
+%    \end{macrocode}
+% We set |\lst@if| locally true if the item has been requested.
+%    \begin{macrocode}
+\gdef\lst@DefDriver@#1#2#3#4[#5]#6{%
+    \def\lst@name{#1}\let\lst@if#4%
+    \lst@NormedDef\lst@driver{\@lst#2@#6$#5}%
+    \lst@IfRequired[#5]{#6}{\begingroup \lst@true}%
+                           {\begingroup}%
+    \lst@setcatcodes
+    \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}}
+%    \end{macrocode}
+% Note that |\lst@XDefDriver| takes optional `base' arguments, but eventually
+% calls |\lst@DefDriver@@|. We define the item (in case of need), and
+% |\endgroup| resets some catcodes and |\lst@if|, i.e.~|\lst@XXDefDriver| knows
+% whether called by a public or internal command.
+%    \begin{macrocode}
+\gdef\lst@DefDriver@@#1#2{%
+    \lst@if
+        \global\@namedef{\lst@driver}{#1{#2}}%
+    \fi
+    \endgroup
+    \@ifnextchar[\lst@XXDefDriver\@empty}
+%    \end{macrocode}
+% We get the aspect argument, and (if not empty) load the aspects immediately
+% if called by a public command or extend the list of required aspects or
+% simply ignore the argument if the item leaves undefined.
+%    \begin{macrocode}
+\gdef\lst@XXDefDriver[#1]{%
+    \ifx\@empty#1\@empty\else
+        \lst@if
+            \lstloadaspects{#1}%
+        \else
+            \@ifundefined{\lst@driver}{}%
+            {\xdef\lst@loadaspects{\lst@loadaspects,#1}}%
+        \fi
+    \fi}
+%    \end{macrocode}
+% We insert an additional `also'key=value pair.
+%    \begin{macrocode}
+\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Aspect commands}\label{iAspectCommands}
+%
+% This section contains commands used in defining `\lst-aspects'.
+% \begin{macro}{\lst@UserCommand}
+% is mainly equivalent to |\gdef|.
+%    \begin{macrocode}
+%<!info>\let\lst@UserCommand\gdef
+%<info>\def\lst@UserCommand#1{\message{\string#1,}\gdef#1}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginAspect}
+% A straight-forward implementation:
+%    \begin{macrocode}
+\newcommand*\lst@BeginAspect[2][]{%
+    \def\lst@curraspect{#2}%
+    \ifx \lst@curraspect\@empty
+        \expandafter\lst@GobbleAspect
+    \else
+%    \end{macrocode}
+% If \meta{aspect name} is not empty, there are certain other conditions not to
+% define the aspect (as described in section \ref{dHowToDefineLstAspects}).
+%    \begin{macrocode}
+%<!info>        \let\lst@next\@empty
+%<info>        \def\lst@next{%
+%<info>            \message{^^JDefine lst-aspect `#2':}\lst@GetAllocs}%
+        \lst@IfRequired[]{#2}%
+            {\lst@RequireAspects{#1}%
+             \lst@if\else \let\lst@next\lst@GobbleAspect \fi}%
+            {\let\lst@next\lst@GobbleAspect}%
+        \expandafter\lst@next
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndAspect}
+% finishes an aspect definition.
+%    \begin{macrocode}
+\def\lst@EndAspect{%
+    \csname\@lst patch@\lst@curraspect\endcsname
+%<info>    \lst@ReportAllocs
+    \let\lst@curraspect\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@GobbleAspect}
+% drops all code up to the next |\lst@EndAspect|.
+%    \begin{macrocode}
+\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Key}
+% The command simply defines the key. But we must take care of an optional
+% parameter and the initialization argument |#2|.
+%    \begin{macrocode}
+\def\lst@Key#1#2{%
+%<info>    \message{#1,}%
+    \@ifnextchar[{\lstKV@def{#1}{#2}}%
+                 {\def\lst@temp{\lst@Key@{#1}{#2}}
+                  \afterassignment\lst@temp
+                  \global\@namedef{KV@\@lst @#1}####1}}
+%    \end{macrocode}
+% Now comes a renamed and modified copy from a \packagename{keyval} macro:
+% We need global key definitions.
+%    \begin{macrocode}
+\def\lstKV@def#1#2[#3]{%
+    \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter
+        {\csname KV@\@lst @#1\endcsname{#3}}%
+    \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp
+    \global\@namedef{KV@\@lst @#1}##1}
+%    \end{macrocode}
+% We initialize the key if the first token of |#2| is not |\relax|.
+%    \begin{macrocode}
+\def\lst@Key@#1#2{%
+    \ifx\relax#2\@empty\else
+        \begingroup \globaldefs\@ne
+        \csname KV@\@lst @#1\endcsname{#2}%
+        \endgroup
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@UseHook}
+% is very, very, \ldots, very (hundreds of times) easy.
+%    \begin{macrocode}
+\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@AddToHook}
+% \begin{macro}{\lst@AddToHookExe}
+% \begin{macro}{\lst@AddToHookAtTop}
+% All use the same submacro.
+%    \begin{macrocode}
+\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo}
+\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo}
+\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop}
+%    \end{macrocode}
+% If and only if the boolean value is true, the hook material is executed
+% globally.
+%    \begin{macrocode}
+\long\def\lst@ATH@#1#2#3#4{%
+    \@ifundefined{\@lst hk@#3}{%
+%<info>        \message{^^Jnew hook `#3',^^J}%
+        \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}%
+    \expandafter#2\csname\@lst hk@#3\endcsname{#4}%
+    \def\lst@temp{#4}%
+    #1% \iftrue|false
+        \begingroup \globaldefs\@ne \lst@temp \endgroup
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@AddTo}
+% Note that the definition is global!
+%    \begin{macrocode}
+\long\def\lst@AddTo#1#2{%
+    \expandafter\gdef\expandafter#1\expandafter{#1#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@AddToAtTop}
+% We need a couple of |\expandafter|s now. Simply note that we have\\
+%   {\small\hspace*{2em}|\expandafter\gdef\expandafter#1\expandafter{\lst@temp|
+%    $\langle$\textit{contents of }|#1|$\rangle$|}|}\\
+% after the `first phase' of expansion.
+%    \begin{macrocode}
+\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}%
+    \expandafter\expandafter\expandafter\gdef
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@lAddTo}
+% A local version of |\lst@AddTo| \ldots
+%    \begin{macrocode}
+\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Extend}
+% \begin{macro}{\lst@lExtend}
+% \ldots\space and here we expand the first token of the second argument first.
+%    \begin{macrocode}
+\def\lst@Extend#1#2{%
+    \expandafter\lst@AddTo\expandafter#1\expandafter{#2}}
+\def\lst@lExtend#1#2{%
+    \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}}
+%    \end{macrocode}
+% \begin{TODO}
+% This should never be changed to
+%    \begin{verbatim}
+%    \def\lst@Extend#1{%
+%        \expandafter\lst@AddTo\expandafter#1\expandafter}
+%    \def\lst@lExtend#1{%
+%        \expandafter\lst@lAddTo\expandafter#1}\end{verbatim}
+% The first is not equivalent in case that the second argument is a single
+% (= non-braced) control sequence, and the second isn't in case of a braced
+% second argument.
+% \end{TODO}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Interfacing with \textsf{keyval}}
+%
+% The \packagename{keyval} package passes the value via the one and only
+% paramater |#1| to the definition part of the key macro. The following
+% commands may be used to analyse the value. Note that we need at least version
+% 1.10 of the \packagename{keyval} package. Note also that the package removes
+% a naming conflict with AMS classes---reported by \lsthelper{Ralf~Quast}
+% {1998/01/08}{\keywords conflicts with AMS classes}.
+% \begingroup
+%    \begin{macrocode}
+\RequirePackage{keyval}[1997/11/10]
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{macro}{\lstKV@TwoArg}
+% \begin{macro}{\lstKV@ThreeArg}
+% \begin{macro}{\lstKV@FourArg}
+% Define temporary macros and call with given arguments |#1|. We add empty
+% arguments for the case that the user doesn't provide enough.
+%    \begin{macrocode}
+\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}}
+\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}}
+\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}}
+%    \end{macrocode}
+% There's one question: What are the global definitions good for? |\lst@Key|
+% might set |\globaldefs| to one and possibly calls this macro. That's the
+% reason why we use global definitions here and below.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lstKV@OptArg}
+% We define the temporary macro |\@gtempa| and insert default argument if
+% necessary.
+%    \begin{macrocode}
+\def\lstKV@OptArg[#1]#2#3{%
+    \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@}
+\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}}
+\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstKV@XOptArg}
+% Here |#3| is already a definition with at least two parameters whose first
+% is enclosed in brackets.
+%    \begin{macrocode}
+\def\lstKV@XOptArg[#1]#2#3{%
+    \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstKV@CSTwoArg}
+% Just define temporary macro and call it.
+%    \begin{macrocode}
+\def\lstKV@CSTwoArg#1#2{%
+    \gdef\@gtempa##1,##2,##3\relax{#2}%
+    \@gtempa#1,,\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstKV@SetIf}
+% We simply test the lower case first character of |#1|.
+%    \begin{macrocode}
+\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax}
+\def\lstKV@SetIf@#1#2\relax#3{\lowercase{%
+    \expandafter\let\expandafter#3%
+        \csname if\ifx #1t}true\else false\fi\endcsname}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstKV@SwitchCases}
+% is implemented as a substring test.
+%    \begin{macrocode}
+\def\lstKV@SwitchCases#1#2#3{%
+    \def\lst@temp##1\\#1&##2\\##3##4\@nil{%
+        \ifx\@empty##3%
+            #3%
+        \else
+            ##2%
+        \fi
+    }%
+    \lst@temp\\#2\\#1&\\\@empty\@nil}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstset}
+% Finally this main user interface macro.
+% We change catcodes for reading the argument.
+%    \begin{macrocode}
+\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@}
+\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@setcatcodes}
+% contains all catcode changes for |\lstset|. The equal-sign has been added
+% after a bug report by \lsthelper{Bekir~Karaoglu}{2003/09/16}{keyval problems
+% with [turkish]{babel}}---babel's active equal sign clashes with keyval's
+% usage. |\catcode`\"=12\relax| has been removed after a bug report by
+% \lsthelper{Heiko~Bauke}{2004/06/27}{listings und ngerman}\,---\,hopefully
+% this introduces no other bugs.
+%    \begin{macrocode}
+\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax}
+%    \end{macrocode}
+% \begin{TODO}
+% Change more catcodes?
+% \end{TODO}
+% \end{macro}
+%
+%
+% \subsection{Internal modes}
+%
+% \begin{macro}{\lst@NewMode}
+% We simply use |\chardef| for a mode definition. The counter |\lst@mode|
+% mainly keeps the current mode number. But it is also used to advance the
+% number in the macro |\lst@newmode|---we don't waste another counter.
+%    \begin{macrocode}
+\def\lst@NewMode#1{%
+    \ifx\@undefined#1%
+        \lst@mode\lst@newmode\relax \advance\lst@mode\@ne
+        \xdef\lst@newmode{\the\lst@mode}%
+        \global\chardef#1=\lst@mode
+        \lst@mode\lst@nomode
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@mode}
+% \begin{macro}{\lst@nomode}
+% We allocate the counter and the first mode.
+%    \begin{macrocode}
+\newcount\lst@mode
+\def\lst@newmode{\m@ne}% init
+\lst@NewMode\lst@nomode % init (of \lst@mode :-)
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@UseDynamicMode}
+% For dynamic modes we must not use the counter |\lst@mode| (since possibly
+% already valued). |\lst@dynamicmode| substitutes |\lst@newmode| and is a local
+% definition here, \ldots
+%    \begin{macrocode}
+\def\lst@UseDynamicMode{%
+    \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne
+    \edef\lst@dynamicmode{\the\@tempcnta}%
+    \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}}
+%    \end{macrocode}
+% \ldots\ initialized each listing with the current `value' of |\lst@newmode|.
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EnterMode}
+% Each mode opens a group level, stores the mode number and execute mode
+% specific tokens. Moreover we keep all these changes in mind (locally) and
+% adjust internal variables if the user wants it.
+%    \begin{macrocode}
+\def\lst@EnterMode#1#2{%
+    \bgroup \lst@mode=#1\relax #2%
+    \lst@FontAdjust
+    \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty}
+\let\lst@entermodes\@empty % init
+%    \end{macrocode}
+% The initialization has been added after a bug report from
+% \lsthelper{Herfried~Karl~Wagner}{2002/05/11}{undefined control sequence
+% \lst@entermodes}.
+% \end{macro}
+%
+% \begin{macro}{\lst@LeaveMode}
+% We simply close the group and call |\lsthk@EndGroup| if and only if the
+% current mode is not |\lst@nomode|.
+%    \begin{macrocode}
+\def\lst@LeaveMode{%
+    \ifnum\lst@mode=\lst@nomode\else
+        \egroup \expandafter\lsthk@EndGroup
+    \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{EndGroup}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InterruptModes}
+% We put the current mode sequence on a stack and leave all modes.
+%    \begin{macrocode}
+\def\lst@InterruptModes{%
+    \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}%
+    \lst@LeaveAllModes}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ReenterModes}
+% If the stack is not empty, we leave all modes and pop the topmost element
+% (which is the last element of |\lst@modestack|).
+%    \begin{macrocode}
+\def\lst@ReenterModes{%
+    \ifx\lst@modestack\@empty\else
+        \lst@LeaveAllModes
+        \global\let\@gtempa\lst@modestack
+        \global\let\lst@modestack\@empty
+        \expandafter\lst@ReenterModes@\@gtempa\relax
+    \fi}
+\def\lst@ReenterModes@#1#2{%
+    \ifx\relax#2\@empty
+%    \end{macrocode}
+% If we've reached |\relax|, we've also found the last element: we execute |#1|
+% and gobble |{#2}|=|{\relax}| after |\fi|.
+%    \begin{macrocode}
+        \gdef\@gtempa##1{#1}%
+        \expandafter\@gtempa
+    \else
+%    \end{macrocode}
+% Otherwise we just add the element to |\lst@modestack| and continue the loop.
+%    \begin{macrocode}
+        \lst@AddTo\lst@modestack{{#1}}%
+        \expandafter\lst@ReenterModes@
+    \fi
+    {#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LeaveAllModes}
+% Leaving all modes means closing groups until the mode equals |\lst@nomode|.
+%    \begin{macrocode}
+\def\lst@LeaveAllModes{%
+    \ifnum\lst@mode=\lst@nomode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveAllModes
+    \fi}
+%    \end{macrocode}
+% We need that macro to end a listing correctly.
+%    \begin{macrocode}
+\lst@AddToHook{ExitVars}{\lst@LeaveAllModes}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Pmode}
+% \begin{macro}{\lst@GPmode}
+% The `processing' and the general purpose mode.
+%    \begin{macrocode}
+\lst@NewMode\lst@Pmode
+\lst@NewMode\lst@GPmode
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@modetrue}
+% The usual macro to value a boolean except that we also execute a hook.
+%    \begin{macrocode}
+\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue}
+\let\lst@ifmode\iffalse % init
+\lst@AddToHook{ModeTrue}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifLmode}
+% Comment lines use a static mode. It terminates at end of line.
+%    \begin{macrocode}
+\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue}
+\let\lst@ifLmode\iffalse % init
+\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Divers helpers}
+%
+% \begin{macro}{\lst@NormedDef}
+% works like |\def| (without any parameters!) but normalizes the replacement
+% text by making all characters lower case and stripping off spaces.
+%    \begin{macrocode}
+\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@NormedNameDef}
+% works like |\global\@namedef| (again without any parameters!) but normalizes
+% both the macro name and the replacement text.
+%    \begin{macrocode}
+\def\lst@NormedNameDef#1#2{%
+    \lowercase{\edef\lst@temp{\zap@space#1 \@empty}%
+    \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@GetFreeMacro}
+% Initialize |\@tempcnta| and |\lst@freemacro|, \ldots
+%    \begin{macrocode}
+\def\lst@GetFreeMacro#1{%
+    \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}%
+    \lst@GFM@}
+%    \end{macrocode}
+% \ldots\space and either build the control sequence or advance the counter and
+% continue.
+%    \begin{macrocode}
+\def\lst@GFM@{%
+    \expandafter\ifx \csname\lst@freemacro\endcsname \relax
+        \edef\lst@freemacro{\csname\lst@freemacro\endcsname}%
+    \else
+        \advance\@tempcnta\@ne
+        \expandafter\lst@GFM@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@gtempboxa}
+%    \begin{macrocode}
+\newbox\lst@gtempboxa
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Doing output}
+%
+%
+% \subsection{Basic registers and keys}
+%
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+%
+% \paragraph{The current character string}
+% is kept in a token register and a counter holds its length.
+% Here we define the macros to put characters into the output queue.
+%
+% \begin{macro}{\lst@token}
+% \begin{macro}{\lst@length}
+% are allocated here. Quite a useful comment, isn't it?
+%    \begin{macrocode}
+\newtoks\lst@token \newcount\lst@length
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@ResetToken}
+% \begin{macro}{\lst@lastother}
+% The two registers get empty respectively zero at the beginning of each line.
+% After receiving a report from \lsthelper{Claus~Atzenbeck}{1999/11/24}{HTML:
+% output unit repeated after >}---I removed such a bug many times---I decided
+% to reset these registers in the \hookname{EndGroup} hook, too.
+%    \begin{macrocode}
+\def\lst@ResetToken{\lst@token{}\lst@length\z@}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty}
+\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty}
+%    \end{macrocode}
+% The macro |\lst@lastother| will be equivalent to the last `other' character,
+% which leads us to |\lst@ifletter|.
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifletter}
+% indicates whether the token contains an identifier or other characters.
+%    \begin{macrocode}
+\def\lst@lettertrue{\let\lst@ifletter\iftrue}
+\def\lst@letterfalse{\let\lst@ifletter\iffalse}
+\lst@AddToHook{InitVars}{\lst@letterfalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Append}
+% puts the argument into the output queue.
+%    \begin{macrocode}
+\def\lst@Append#1{\advance\lst@length\@ne
+                  \lst@token=\expandafter{\the\lst@token#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@AppendOther}
+% Depending on the current state, we first output the character string as an
+% identifier. Then we save the `argument' via |\futurelet| and call the macro
+% |\lst@Append| to do the rest.
+%    \begin{macrocode}
+\def\lst@AppendOther{%
+    \lst@ifletter \lst@Output\lst@letterfalse \fi
+    \futurelet\lst@lastother\lst@Append}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@AppendLetter}
+% We output a non-identifier string if necessary and call |\lst@Append|.
+%    \begin{macrocode}
+\def\lst@AppendLetter{%
+    \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi
+    \lst@Append}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@SaveToken}
+% \begin{macro}{\lst@RestoreToken}
+% If a group end appears and ruins the character string, we can use these
+% macros to save and restore the contents. |\lst@thestyle| is the current
+% printing style and must be saved and restored, too.
+%    \begin{macrocode}
+\def\lst@SaveToken{%
+    \global\let\lst@gthestyle\lst@thestyle
+    \global\let\lst@glastother\lst@lastother
+    \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}%
+                           \noexpand\lst@length\the\lst@length\relax
+                           \noexpand\let\noexpand\lst@thestyle
+                                        \noexpand\lst@gthestyle
+                           \noexpand\let\noexpand\lst@lastother
+                                        \noexpand\lst@glastother}}
+%    \end{macrocode}
+% Now -- that means after a bug report by \lsthelper{Rolf~Niepraschk}
+% {2002/04/12}{\RequirePackage is missing keywordstyle when near the top of
+% a page} -- |\lst@lastother| is also saved and restored.
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfLastOtherOneOf}
+% Finally, this obvious implementation.
+%    \begin{macrocode}
+\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax}
+\def\lst@IfLastOtherOneOf@#1{%
+    \ifx #1\relax
+        \expandafter\@secondoftwo
+    \else
+        \ifx\lst@lastother#1%
+            \lst@IfLastOtherOneOf@t
+        \else
+            \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@
+        \fi
+    \fi}
+\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{The current position}
+% is either the dimension |\lst@currlwidth|, which is the horizontal position
+% without taking the current character string into account, or it's the current
+% column starting with number 0. This is |\lst@column| $-$ |\lst@pos| $+$
+% |\lst@length|. Moreover we have |\lst@lostspace| which is the difference
+% between the current and the desired line width. We define macros to insert
+% this lost space.
+%
+% \begin{macro}{\lst@currlwidth}
+% \begin{macro}{\lst@column}
+% \begin{macro}{\lst@pos}
+% the current line width and two counters.
+%    \begin{macrocode}
+\newdimen\lst@currlwidth % \global
+\newcount\lst@column \newcount\lst@pos % \global
+\lst@AddToHook{InitVarsBOL}
+    {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@CalcColumn}
+% sets |\@tempcnta| to the current column.
+% Note that |\lst@pos| will be nonpositive.
+%    \begin{macrocode}
+\def\lst@CalcColumn{%
+            \@tempcnta\lst@column
+    \advance\@tempcnta\lst@length
+    \advance\@tempcnta-\lst@pos}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@lostspace}
+% Whenever this dimension is positive we can insert space. A negative `lost
+% space' means that the printed line is wider than expected.
+%    \begin{macrocode}
+\newdimen\lst@lostspace % \global
+\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@UseLostSpace}
+% We insert space and reset it if and only if |\lst@lostspace| is positive.
+%    \begin{macrocode}
+\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InsertLostSpace}
+% \begin{macro}{\lst@InsertHalfLostSpace}
+% Ditto, but insert even if negative. |\lst@Kern| will be defined very soon.
+%    \begin{macrocode}
+\def\lst@InsertLostSpace{%
+    \lst@Kern\lst@lostspace \global\lst@lostspace\z@}
+\def\lst@InsertHalfLostSpace{%
+    \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \paragraph{Column widths}
+% Here we deal with the width of a single column, which equals the width of a
+% single character box. Keep in mind that there are fixed and flexible column
+% formats.
+%
+% \begin{macro}{\lst@width}
+% \begin{lstkey}{basewidth}
+% \keyname{basewidth} assigns the values to macros and tests whether they are
+% negative.
+%    \begin{macrocode}
+\newdimen\lst@width
+\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}%
+    {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}%
+     \ifx\lst@widthflexible\@empty
+         \let\lst@widthflexible\lst@widthfixed
+     \fi
+     \def\lst@temp{\PackageError{Listings}%
+                                {Negative value(s) treated as zero}%
+                                \@ehc}%
+     \let\lst@error\@empty
+     \ifdim \lst@widthfixed<\z@
+         \let\lst@error\lst@temp \let\lst@widthfixed\z@
+     \fi
+     \ifdim \lst@widthflexible<\z@
+         \let\lst@error\lst@temp \let\lst@widthflexible\z@
+     \fi
+     \lst@error}}
+%    \end{macrocode}
+% We set the dimension in a special hook.
+%    \begin{macrocode}
+\lst@AddToHook{FontAdjust}
+    {\lst@width=\lst@ifflexible\lst@widthflexible
+                          \else\lst@widthfixed\fi \relax}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+%
+% \begin{lstkey}{fontadjust}
+% \begin{macro}{\lst@FontAdjust}
+% This hook is controlled by a switch and is always executed at
+% \hookname{InitVars}.
+%    \begin{macrocode}
+\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust}
+\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}{\lsthk@FontAdjust}
+%    \end{macrocode}
+% \end{macro}
+% \end{lstkey}
+%
+%
+% \subsection{Low- and mid-level output}
+%
+% \paragraph{Doing the output}
+% means putting the character string into a box register, updating all internal
+% data, and eventually giving the box to \TeX.
+%
+% \begin{macro}{\lst@OutputBox}
+% \begin{macro}{\lst@alloverstyle}
+% The lowest level is the output of a box register.
+% Here we use |\box#1| as argument to |\lst@alloverstyle|.
+%    \begin{macrocode}
+\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}}
+%    \end{macrocode}
+% \begin{ALTERNATIVE}
+% Instead of |\global\advance\lst@currlwidth| |\wd|\meta{box number} in
+% both definitions |\lst@Kern| and |\lst@CalcLostSpaceAndOutput|, we could
+% also advance the dimension here. But I decided not to do so since it
+% simplifies possible redefinitions of |\lst@OutputBox|: we need not to care
+% about |\lst@currlwidth|.
+% \end{ALTERNATIVE}
+%    \begin{macrocode}
+\def\lst@alloverstyle#1{#1}% init
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@Kern}
+% has been used to insert `lost space'.
+% It must not use |\@tempboxa| since that \ldots
+%    \begin{macrocode}
+\def\lst@Kern#1{%
+    \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}%
+    \global\advance\lst@currlwidth \wd\z@
+    \lst@OutputBox\z@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CalcLostSpaceAndOutput}
+% \ldots\space is used here.
+% We keep track of |\lst@lostspace|, |\lst@currlwidth| and |\lst@pos|.
+%    \begin{macrocode}
+\def\lst@CalcLostSpaceAndOutput{%
+    \global\advance\lst@lostspace \lst@length\lst@width
+    \global\advance\lst@lostspace-\wd\@tempboxa
+    \global\advance\lst@currlwidth \wd\@tempboxa
+    \global\advance\lst@pos -\lst@length
+%    \end{macrocode}
+% Before |\@tempboxa| is output, we insert space if there is enough lost space.
+% This possibly invokes |\lst@Kern| via `insert half lost space', which is the
+% reason for why we mustn't use |\@tempboxa| above. By redefinition we prevent
+% |\lst@OutputBox| from using any special style in |\lst@Kern|.
+%    \begin{macrocode}
+    \setbox\@tempboxa\hbox{\let\lst@OutputBox\box
+        \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi
+        \box\@tempboxa
+        \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}%
+%    \end{macrocode}
+% Finally we can output the new box.
+%    \begin{macrocode}
+    \lst@OutputBox\@tempboxa \lsthk@PostOutput}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{PostOutput}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@OutputToken}
+% Now comes a mid-level definition.
+% Here we use |\lst@token| to set |\@tempboxa| and eventually output the box.
+% We take care of font adjustment and special output styles.
+% Yet unknown macros are defined in the following subsections.
+%    \begin{macrocode}
+\def\lst@OutputToken{%
+    \lst@TrackNewLines \lst@OutputLostSpace
+    \lst@ifgobbledws
+        \lst@gobbledwhitespacefalse
+        \lst@@discretionary
+    \fi
+    \lst@CheckMerge
+    {\lst@thestyle{\lst@FontAdjust
+     \setbox\@tempboxa\lst@hbox
+        {\lsthk@OutputBox
+         \lst@lefthss
+         \expandafter\lst@FillOutputBox\the\lst@token\@empty
+         \lst@righthss}%
+     \lst@CalcLostSpaceAndOutput}}%
+    \lst@ResetToken}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{OutputBox}{}% init
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue}
+\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse}
+\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Delaying the output}
+% means saving the character string somewhere and pushing it back when
+% neccessary. We may also attach the string to the next output box without
+% affecting style detection: both will be printed in the style of the upcoming
+% output. We will call this `merging'.
+%
+% \begin{macro}{\lst@Delay}
+% \begin{macro}{\lst@Merge}
+% To delay or merge |#1|, we process it as usual and simply save the state
+% in macros. For delayed characters we also need the currently `active'
+% output routine. Both definitions first check whether there are already
+% delayed or `merged' characters.
+%    \begin{macrocode}
+\def\lst@Delay#1{%
+    \lst@CheckDelay
+    #1%
+    \lst@GetOutputMacro\lst@delayedoutput
+    \edef\lst@delayed{\the\lst@token}%
+    \edef\lst@delayedlength{\the\lst@length}%
+    \lst@ResetToken}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@Merge#1{%
+    \lst@CheckMerge
+    #1%
+    \edef\lst@merged{\the\lst@token}%
+    \edef\lst@mergedlength{\the\lst@length}%
+    \lst@ResetToken}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@MergeToken}
+% Here we put the things together again.
+%    \begin{macrocode}
+\def\lst@MergeToken#1#2{%
+    \advance\lst@length#2%
+    \lst@lExtend#1{\the\lst@token}%
+    \expandafter\lst@token\expandafter{#1}%
+    \let#1\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CheckDelay}
+% We need to print delayed characters. The mode depends on the current output
+% macro. If it equals the saved definition, we put the delayed characters in
+% front of the character string (we merge them) since there has been no
+% letter-to-other or other-to-letter leap. Otherwise we locally reset the
+% current character string, merge this empty string with the delayed one,
+% and output it.
+%    \begin{macrocode}
+\def\lst@CheckDelay{%
+    \ifx\lst@delayed\@empty\else
+        \lst@GetOutputMacro\@gtempa
+        \ifx\lst@delayedoutput\@gtempa
+            \lst@MergeToken\lst@delayed\lst@delayedlength
+        \else
+            {\lst@ResetToken
+             \lst@MergeToken\lst@delayed\lst@delayedlength
+             \lst@delayedoutput}%
+            \let\lst@delayed\@empty
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CheckMerge}
+% All this is easier for |\lst@merged|.
+%    \begin{macrocode}
+\def\lst@CheckMerge{%
+    \ifx\lst@merged\@empty\else
+        \lst@MergeToken\lst@merged\lst@mergedlength
+    \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\let\lst@delayed\@empty % init
+\let\lst@merged\@empty % init
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Column formats}
+%
+% It's time to deal with fixed and flexible column modes.
+% A couple of open definitions are now filled in.
+%
+% \begin{macro}{\lst@column@fixed}
+% switches to the fixed column format. The definitions here control how the
+% output of the above definitions looks like.
+%    \begin{macrocode}
+\def\lst@column@fixed{%
+    \lst@flexiblefalse
+    \lst@width\lst@widthfixed\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\lst@FillFixed
+    \let\lst@hss\hss
+    \def\lst@hbox{\hbox to\lst@length\lst@width}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@FillFixed}
+% Filling up a fixed mode box is easy.
+%    \begin{macrocode}
+\def\lst@FillFixed#1{#1\lst@FillFixed@}
+%    \end{macrocode}
+% While not reaching the end (|\@empty| from above), we insert dynamic space,
+% output the argument and call the submacro again.
+%    \begin{macrocode}
+\def\lst@FillFixed@#1{%
+    \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@column@flexible}
+% The first flexible format.
+%    \begin{macrocode}
+\def\lst@column@flexible{%
+    \lst@flexibletrue
+    \lst@width\lst@widthflexible\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\@empty
+    \let\lst@hss\@empty
+    \let\lst@hbox\hbox}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@column@fullflexible}
+% This column format inserts no lost space except at the beginning of a line.
+%    \begin{macrocode}
+\def\lst@column@fullflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@column@spaceflexible}
+% This column format only inserts lost space by stretching (invisible)
+% existing spaces; it does not insert lost space between identifiers
+% and other characters where the original does not have a space.  It
+% was suggested by \lsthelper{Andrei~Alexandrescu}{-}{2007-02-26}.
+%    \begin{macrocode}
+\def\lst@column@spaceflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{%
+      \lst@ifwhitespace
+        \ifx\lst@outputspace\lst@visiblespace
+        \else
+          \lst@UseLostSpace
+        \fi
+      \else
+        \lst@ifnewline \lst@UseLostSpace\fi
+      \fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% Thus, we have the column formats. Now we define macros to use them.
+%
+% \begin{macro}{\lst@outputpos}
+% This macro sets the `output-box-positioning' parameter (the old key
+% \keyname{outputpos}). We test for |l|, |c| and |r|.
+% The fixed formats use |\lst@lefthss| and |\lst@righthss|, whereas the
+% flexibles need |\lst@leftinsert| and |\lst@rightinsert|.
+%    \begin{macrocode}
+\def\lst@outputpos#1#2\relax{%
+    \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss
+    \let\lst@rightinsert\lst@InsertLostSpace
+    \ifx #1c%
+        \let\lst@leftinsert\lst@InsertHalfLostSpace
+    \else\ifx #1r%
+        \let\lst@righthss\@empty
+        \let\lst@leftinsert\lst@InsertLostSpace
+        \let\lst@rightinsert\@empty
+    \else
+        \let\lst@lefthss\@empty
+        \let\lst@leftinsert\@empty
+        \ifx #1l\else \PackageWarning{Listings}%
+            {Unknown positioning for output boxes}%
+        \fi
+    \fi\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifflexible}
+% indicates the column mode but does not distinguish between different fixed
+% or flexible modes.
+%    \begin{macrocode}
+\def\lst@flexibletrue{\let\lst@ifflexible\iftrue}
+\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{columns}
+% This is done here: check optional parameter and then build the control
+% sequence of the column format.
+%    \begin{macrocode}
+\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{%
+    \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi
+    \expandafter\let\expandafter\lst@arg
+                                \csname\@lst @column@##2\endcsname
+%    \end{macrocode}
+% We issue a warning or save the definition for later.
+%    \begin{macrocode}
+    \lst@arg
+    \ifx\lst@arg\relax
+        \PackageWarning{Listings}{Unknown column format `##2'}%
+    \else
+        \lst@ifflexible
+            \let\lst@columnsflexible\lst@arg
+        \else
+            \let\lst@columnsfixed\lst@arg
+        \fi
+    \fi}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\let\lst@columnsfixed\lst@column@fixed % init
+\let\lst@columnsflexible\lst@column@flexible % init
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{flexiblecolumns}
+% Nothing else but a key to switch between the last flexible and fixed mode.
+%    \begin{macrocode}
+\lst@Key{flexiblecolumns}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@ifflexible
+    \lst@ifflexible \lst@columnsflexible
+              \else \lst@columnsfixed \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+%
+% \subsection{New lines}
+%
+% \begin{macro}{\lst@newlines}
+% This counter holds the number of `new lines' (cr+lf) we have to perform.
+%    \begin{macrocode}
+\newcount\lst@newlines
+\lst@AddToHook{InitVars}{\global\lst@newlines\z@}
+\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@NewLine}
+% This is how we start a new line: begin new paragraph and output an empty
+% box. If low-level definition |\lst@OutputBox| just gobbles the box , we
+% don't start a new line. This is used to drop the whole output.
+%    \begin{macrocode}
+\def\lst@NewLine{%
+    \ifx\lst@OutputBox\@gobble\else
+        \par\noindent \hbox{}%
+    \fi
+    \global\advance\lst@newlines\m@ne
+    \lst@newlinetrue}
+%    \end{macrocode}
+% Define |\lst@newlinetrue| and reset if after output.
+%    \begin{macrocode}
+\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue}
+\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@TrackNewLines}
+% If |\lst@newlines| is positive, we execute the hook and insert the
+% new lines.
+%    \begin{macrocode}
+\def\lst@TrackNewLines{%
+    \ifnum\lst@newlines>\z@
+        \lsthk@OnNewLine
+        \lst@DoNewLines
+    \fi}
+\lst@AddToHook{OnNewLine}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{emptylines}
+% \lsthelper{Adam~Prugel-Bennett}{2001/02/19}{spacing of empty lines} asked for
+% such a key---if I didn't misunderstood him. We check for the optional star
+% and set |\lst@maxempty| and switch.
+%    \begin{macrocode}
+\lst@Key{emptylines}\maxdimen{%
+    \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}%
+            {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil
+    \advance\@tempcnta\@ne
+    \edef\lst@maxempty{\the\@tempcnta\relax}%
+    \let\lst@ifpreservenumber\lst@if}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DoNewLines}
+% First we take care of |\lst@maxempty| and then of the remaining empty lines.
+%    \begin{macrocode}
+\def\lst@DoNewLines{
+    \@whilenum\lst@newlines>\lst@maxempty \do
+        {\lst@ifpreservenumber
+            \lsthk@OnEmptyLine
+            \global\advance\c@lstnumber\lst@advancelstnum
+         \fi
+         \global\advance\lst@newlines\m@ne}%
+    \@whilenum \lst@newlines>\@ne \do
+        {\lsthk@OnEmptyLine \lst@NewLine}%
+    \ifnum\lst@newlines>\z@ \lst@NewLine \fi}
+\lst@AddToHook{OnEmptyLine}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{High-level output}
+%
+% \begin{lstkey}{identifierstyle}
+% A simple key.
+%    \begin{macrocode}
+\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@GotoTabStop}
+% Here we look whether the line already contains printed characters.
+% If true, we output a box with the width of a blank space.
+%    \begin{macrocode}
+\def\lst@GotoTabStop{%
+    \ifnum\lst@newlines=\z@
+        \setbox\@tempboxa\hbox{\lst@outputspace}%
+        \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}%
+        \lst@CalcLostSpaceAndOutput
+%    \end{macrocode}
+% It's probably not clear why it is sufficient to output a single space to go
+% to the next tabulator stop. Just note that the space lost by this process is
+% `lost space' in the sense above and therefore will be inserted before the
+% next characters are output.
+%    \begin{macrocode}
+    \else
+%    \end{macrocode}
+% Otherwise (no printed characters) we only need to advance |\lst@lostspace|,
+% which is inserted by |\lst@OutputToken| above, and update the column.
+%    \begin{macrocode}
+        \global\advance\lst@lostspace \lst@length\lst@width
+        \global\advance\lst@column\lst@length \lst@length\z@
+    \fi}
+%    \end{macrocode}
+% Note that this version works also in flexible column mode.
+% In fact, it's mainly the flexible version of \packagename{listings} 0.20.
+% \begin{TODO}
+% Use |\lst@ifnewline| instead of |\ifnum\lst@newlines=\z@|?
+% \end{TODO}
+% \end{macro}
+%
+% \begin{macro}{\lst@OutputOther}
+% becomes easy with the previous definitions.
+%    \begin{macrocode}
+\def\lst@OutputOther{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \let\lst@thestyle\lst@currstyle
+        \lsthk@OutputOther
+        \lst@OutputToken
+    \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{OutputOther}{}% init
+\let\lst@currstyle\relax % init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Output}
+% We might use identifier style as default.
+%    \begin{macrocode}
+\def\lst@Output{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \ifx\lst@currstyle\relax
+            \let\lst@thestyle\lst@identifierstyle
+        \else
+            \let\lst@thestyle\lst@currstyle
+        \fi
+        \lsthk@Output
+        \lst@OutputToken
+    \fi
+    \let\lst@lastother\relax}
+%    \end{macrocode}
+% Note that |\lst@lastother| becomes equivalent to |\relax| and not equivalent
+% to |\@empty| as everywhere else. I don't know whether this will be important
+% in the future or not.
+%    \begin{macrocode}
+\lst@AddToHook{Output}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@GetOutputMacro}
+% Just saves the output macro to be used.
+%    \begin{macrocode}
+\def\lst@GetOutputMacro#1{%
+    \lst@ifletter \global\let#1\lst@Output
+            \else \global\let#1\lst@OutputOther\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@PrintToken}
+% outputs the current character string in letter or nonletter mode.
+%    \begin{macrocode}
+\def\lst@PrintToken{%
+    \lst@ifletter \lst@Output \lst@letterfalse
+            \else \lst@OutputOther \let\lst@lastother\@empty \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@XPrintToken}
+% is a special definition to print also merged characters.
+%    \begin{macrocode}
+\def\lst@XPrintToken{%
+    \lst@PrintToken \lst@CheckMerge
+    \ifnum\lst@length=\z@\else \lst@PrintToken \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Dropping the whole output}
+%
+% \begin{macro}{\lst@BeginDropOutput}
+% It's sometimes useful to process a part of a listing as usual, but to drop
+% the output. This macro does the main work and gets one argument, namely the
+% internal mode it enters. We save |\lst@newlines|, restore it |\aftergroup|
+% and redefine one macro, namely |\lst@OutputBox|. After a bug report from
+% \lsthelper{Gunther~Schmidl}{2002/02/27}{collapsing empty lines don't work
+% with printpod=false}
+%    \begin{macrocode}
+\def\lst@BeginDropOutput#1{%
+    \xdef\lst@BDOnewlines{\the\lst@newlines}%
+    \global\let\lst@BDOifnewline\lst@ifnewline
+    \lst@EnterMode{#1}%
+        {\lst@modetrue
+         \let\lst@OutputBox\@gobble
+         \aftergroup\lst@BDORestore}}
+%    \end{macrocode}
+% Restoring the date is quite easy:
+%    \begin{macrocode}
+\def\lst@BDORestore{%
+    \global\lst@newlines\lst@BDOnewlines
+    \global\let\lst@ifnewline\lst@BDOifnewline}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndDropOutput}
+% is equivalent to |\lst@LeaveMode|.
+%    \begin{macrocode}
+\let\lst@EndDropOutput\lst@LeaveMode
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Writing to an external file}
+%
+% \begin{aspect}{writefile}
+% Now it would be good to know something about character classes since we need
+% to access the true input characters, for example a tabulator and not the
+% spaces it `expands' to.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{writefile}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@WF}
+% \begin{macro}{\lst@WFtoken}
+% The contents of the token will be written to file.
+%    \begin{macrocode}
+\newtoks\lst@WFtoken % global
+\lst@AddToHook{InitVarsBOL}{\global\lst@WFtoken{}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newwrite\lst@WF
+\global\let\lst@WFifopen\iffalse % init
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@WFWriteToFile}
+% To do this, we have to expand the contents and then expand this via |\edef|.
+% Empty |\lst@UM| ensures that special characters (underscore, dollar, etc.)
+% are written correctly.
+%    \begin{macrocode}
+\gdef\lst@WFWriteToFile{%
+  \begingroup
+   \let\lst@UM\@empty
+   \expandafter\edef\expandafter\lst@temp\expandafter{\the\lst@WFtoken}%
+   \immediate\write\lst@WF{\lst@temp}%
+  \endgroup
+  \global\lst@WFtoken{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@WFAppend}
+% Similar to |\lst@Append| but uses |\lst@WFtoken|.
+%    \begin{macrocode}
+\gdef\lst@WFAppend#1{%
+    \global\lst@WFtoken=\expandafter{\the\lst@WFtoken#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginWriteFile}
+% \begin{macro}{\lst@BeginAlsoWriteFile}
+% use different macros for |\lst@OutputBox| (not) to drop the output.
+%    \begin{macrocode}
+\gdef\lst@BeginWriteFile{\lst@WFBegin\@gobble}
+\gdef\lst@BeginAlsoWriteFile{\lst@WFBegin\lst@OutputBox}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@WFBegin}
+% Here \ldots
+%    \begin{macrocode}
+\begingroup \catcode`\^^I=11
+\gdef\lst@WFBegin#1#2{%
+    \begingroup
+    \let\lst@OutputBox#1%
+%    \end{macrocode}
+% \ldots\space we have to update |\lst@WFtoken| and \ldots
+%    \begin{macrocode}
+    \def\lst@Append##1{%
+        \advance\lst@length\@ne
+        \expandafter\lst@token\expandafter{\the\lst@token##1}%
+        \ifx ##1\lst@outputspace \else
+            \lst@WFAppend##1%
+        \fi}%
+    \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}%
+    \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}%
+%    \end{macrocode}
+% \ldots\space need different `EOL' and `DeInit' definitions to write the
+% token register to file.
+%    \begin{macrocode}
+    \let\lst@DeInit\lst@WFDeInit
+    \let\lst@MProcessListing\lst@WFMProcessListing
+%    \end{macrocode}
+% Finally we open the file if necessary.
+%    \begin{macrocode}
+    \lst@WFifopen\else
+        \immediate\openout\lst@WF=#2\relax
+        \global\let\lst@WFifopen\iftrue
+        \@gobbletwo\fi\fi
+    \fi}
+\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndWriteFile}
+% closes the file and restores original definitions.
+%    \begin{macrocode}
+\gdef\lst@EndWriteFile{%
+    \immediate\closeout\lst@WF \endgroup
+    \global\let\lst@WFifopen\iffalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@WFMProcessListing}
+% \begin{macro}{\lst@WFDeInit}
+% write additionally |\lst@WFtoken| to external file.
+%    \begin{macrocode}
+\global\let\lst@WFMProcessListing\lst@MProcessListing
+\global\let\lst@WFDeInit\lst@DeInit
+\lst@AddToAtTop\lst@WFMProcessListing{\lst@WFWriteToFile}
+\lst@AddToAtTop\lst@WFDeInit{%
+    \ifnum\lst@length=\z@\else \lst@WFWriteToFile \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \section{Character classes}\label{iCharacterClasses}
+%
+% In this section, we define how the basic character classes do behave, before
+% turning over to the selection of character tables and how to specialize
+% characters.
+%
+%
+% \subsection{Letters, digits and others}
+%
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@ProcessLetter}
+% We put the letter, which is not a whitespace, into the output queue.
+%    \begin{macrocode}
+\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ProcessOther}
+% Ditto.
+%    \begin{macrocode}
+\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ProcessDigit}
+% A digit appends the character to the current character string. But we must
+% use the right macro. This allows digits to be part of an identifier or
+% a numerical constant.
+%    \begin{macrocode}
+\def\lst@ProcessDigit{%
+    \lst@whitespacefalse
+    \lst@ifletter \expandafter\lst@AppendLetter
+            \else \expandafter\lst@AppendOther\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifwhitespace}
+% indicates whether the last processed character has been white space.
+%    \begin{macrocode}
+\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue}
+\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse}
+\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Whitespaces}
+%
+% Here we have to take care of two things: dropping empty lines at the end of
+% a listing and the different column formats. Both use |\lst@lostspace|. Lines
+% containing only tabulators and spaces should be viewed as empty. In order to
+% achieve this, tabulators and spaces at the beginning of a line don't output
+% any characters but advance |\lst@lostspace|. Whenever this dimension is
+% positive we insert that space before the character string is output. Thus,
+% if there are only tabulators and spaces, the line is `empty' since we
+% haven't done any output.
+%
+% We have to do more for flexible columns. Whitespaces can fix the column
+% alignment: if the real line is wider than expected, a tabulator is at least
+% one space wide; all remaining space fixes the alignment. If there are two or
+% more space characters, at least one is printed; the others fix the column
+% alignment.
+%
+%
+% \paragraph{Tabulators}
+% are processed in three stages. You have already seen the last stage
+% |\lst@GotoTabStop|. The other two calculate the necessary width and take care
+% of visible tabulators and spaces.
+%
+% \begin{lstkey}{tabsize}
+% We check for a legal argument before saving it. Default tabsize is 8 as
+% proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{tabsize=8}.
+%    \begin{macrocode}
+\lst@Key{tabsize}{8}
+    {\ifnum#1>\z@ \def\lst@tabsize{#1}\else
+         \PackageError{Listings}{Strict positive integer expected}%
+         {You can't use `#1' as tabsize. \@ehc}%
+     \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{showtabs}
+% \begin{lstkey}{tab}
+% Two more user keys for tab control.
+%    \begin{macrocode}
+\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}%
+              \hrulefill\hbox{\vrule\@height.3ex}}
+    {\def\lst@tab{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@ProcessTabulator}
+% A tabulator outputs the preceding characters, which decrements |\lst@pos| by
+% the number of printed characters.
+%    \begin{macrocode}
+\def\lst@ProcessTabulator{%
+    \lst@XPrintToken \lst@whitespacetrue
+%    \end{macrocode}
+% Then we calculate how many columns we need to reach the next tabulator stop:
+% we add |\lst@tabsize| until |\lst@pos| is strict positive. In other words,
+% |\lst@pos| is the column modulo |tabsize| and we're looking for a positive
+% representative. We assign it to |\lst@length| and reset |\lst@pos| in the
+% submacro.
+%    \begin{macrocode}
+    \global\advance\lst@column -\lst@pos
+    \@whilenum \lst@pos<\@ne \do
+        {\global\advance\lst@pos\lst@tabsize}%
+    \lst@length\lst@pos
+    \lst@PreGotoTabStop}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@PreGotoTabStop}
+% Visible tabs print |\lst@tab|.
+%    \begin{macrocode}
+\def\lst@PreGotoTabStop{%
+    \lst@ifshowtabs
+        \lst@TrackNewLines
+        \setbox\@tempboxa\hbox to\lst@length\lst@width
+            {{\lst@currstyle{\hss\lst@tab}}}%
+        \lst@CalcLostSpaceAndOutput
+    \else
+%    \end{macrocode}
+% If we are advised to keep spaces, we insert the correct number of them.
+%    \begin{macrocode}
+        \lst@ifkeepspaces
+            \@tempcnta\lst@length \lst@length\z@
+            \@whilenum \@tempcnta>\z@ \do
+                {\lst@AppendOther\lst@outputspace
+                 \advance\@tempcnta\m@ne}%
+            \lst@OutputOther
+        \else
+            \lst@GotoTabStop
+        \fi
+    \fi
+    \lst@length\z@ \global\lst@pos\z@}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Spaces}
+% are implemented as described at the beginning of this subsection. But first
+% we define some user keys.
+%
+% \begin{macro}{\lst@outputspace}
+% \begin{macro}{\lst@visiblespace}
+% The first macro is a default definition, \ldots
+%    \begin{macrocode}
+\def\lst@outputspace{\ }
+\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{lstkey}{showspaces}
+% \begin{lstkey}{keepspaces}
+% \ldots\space which is modified on user's request.
+%    \begin{macrocode}
+\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces}
+\lst@AddToHook{Init}
+    {\lst@ifshowspaces
+         \let\lst@outputspace\lst@visiblespace
+         \lst@keepspacestrue
+     \fi}
+\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@ProcessSpace}
+% We look whether spaces fix the column alignment or not. In the latter case
+% we append a space; otherwise \ldots
+% \lsthelper{Andrei~Alexandrescu}{-}{2007/02/27} tested the |spaceflexible|
+% column setting and found a bug that resulted from |\lst@PrintToken| and
+% |\lst@whitespacetrue| being out of order here.
+%    \begin{macrocode}
+\def\lst@ProcessSpace{%
+    \lst@ifkeepspaces
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \else \ifnum\lst@newlines=\z@
+%    \end{macrocode}
+% \ldots\space we append a `special space' if the line isn't empty.
+%    \begin{macrocode}
+        \lst@AppendSpecialSpace
+    \else \ifnum\lst@length=\z@
+%    \end{macrocode}
+% If the line is empty, we check whether there are characters in the output
+% queue. If there are no characters we just advance |\lst@lostspace|.
+% Otherwise we append the space.
+%    \begin{macrocode}
+            \global\advance\lst@lostspace\lst@width
+            \global\advance\lst@pos\m@ne
+            \lst@whitespacetrue
+        \else
+            \lst@AppendSpecialSpace
+        \fi
+    \fi \fi}
+%    \end{macrocode}
+% Note that this version works for fixed and flexible column output.
+% \end{macro}
+%
+% \begin{macro}{\lst@AppendSpecialSpace}
+% If there are at least two white spaces, we output preceding characters and
+% advance |\lst@lostspace| to avoid alignment problems. Otherwise we append
+% a space to the current character string.  Also, |\lst@whitespacetrue| has
+% been moved after |\lst@PrintToken| so that the token-printer can correctly
+% check whether it is printing whitespace or not; this was preventing the
+% |spaceflexible| column setting from working correctly.
+%    \begin{macrocode}
+\def\lst@AppendSpecialSpace{%
+    \lst@ifwhitespace
+        \lst@PrintToken
+        \global\advance\lst@lostspace\lst@width
+        \global\advance\lst@pos\m@ne
+        \lst@gobbledwhitespacetrue
+    \else
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Form feeds}
+% has been introduced after communication with
+% \lsthelper{Jan~Braun}{1998/04/27}{formfeed}.
+%
+% \begin{lstkey}{formfeed}
+% let the user make adjustments.
+%    \begin{macrocode}
+\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@ProcessFormFeed}
+% Here we execute some macros according to whether a new line has already
+% begun or not. No |\lst@EOLUpdate| is used in the else branch
+% anymore---\lsthelper{Kalle~Tuulos}{2001/01/14}{form feed gobbles following
+% output unit} sent the bug report.
+%    \begin{macrocode}
+\def\lst@ProcessFormFeed{%
+    \lst@XPrintToken
+    \ifnum\lst@newlines=\z@
+        \lst@EOLUpdate \lsthk@InitVarsBOL
+    \fi
+    \lst@formfeed
+    \lst@whitespacetrue}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Character tables}\label{iCharacterTables}
+%
+%
+% \subsubsection{The standard table}
+%
+% The standard character table is selected by |\lst@SelectStdCharTable|, which
+% expands to a token sequence
+%    \ldots|\def| |A{\lst@ProcessLetter| |A}|\ldots\space
+% where the first A is active and the second has catcode 12. We use the
+% following macros to build the character table.
+% \begin{syntax}
+% \item[0.19] |\lst@CCPut|\meta{class macro}\meta{$c_1$}\ldots\meta{$c_k$}|\z@|
+%
+%       extends the standard character table by the characters with codes
+%       \meta{$c_1$}\ldots\meta{$c_k$} making each character use
+%       \meta{class macro}. All these characters must be printable via
+%       |\char|\meta{$c_i$}.
+%
+% \item[0.20] |\lst@CCPutMacro|\meta{class$_1$}\meta{$c_1$}\meta{definition$_1$}\ldots|\@empty\z@\@empty|
+%
+%       also extends the standard character table: the character \meta{$c_i$}
+%       will use \meta{class$_i$} and is printed via \meta{definition$_i$}.
+%       These definitions must be \meta{spec. token}s in the sense of section
+%       \ref{dCharacterTables}.
+% \end{syntax}
+%
+% \begin{macro}{\lst@Def}
+% \begin{macro}{\lst@Let}
+% For speed we won't use these helpers too often.
+%    \begin{macrocode}
+\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}}
+\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begingroup
+% The definition of the space below doesn't hurt anything. But other aspects,
+% for example \aspectname{lineshape} and \aspectname{formats}, redefine also
+% the macro |\space|. Now, if \LaTeX\ calls |\try@load@fontshape|, the |.log|
+% messages would show some strange things since \LaTeX\ uses |\space| in these
+% messages. The following addition ensures that |\space| expands to a space
+% and not to something different. This was one more bug reported by
+% \lsthelper{Denis~Girou}{1999/09/16}{bad font info message with breaklines}.
+%    \begin{macrocode}
+\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }}
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{macro}{\lst@SelectStdCharTable}
+% The first three standard characters. |\lst@Let| has been replaced by
+% |\lst@Def| after a bug report from \lsthelper{Chris~Edwards}{2002/02/15}
+% {tabulators show up with firstline>1}.
+%    \begin{macrocode}
+\def\lst@SelectStdCharTable{%
+    \lst@Def{9}{\lst@ProcessTabulator}%
+    \lst@Def{12}{\lst@ProcessFormFeed}%
+    \lst@Def{32}{\lst@ProcessSpace}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CCPut}
+% The first argument gives the character class, then follow the codes.
+%    \begin{macrocode}
+\def\lst@CCPut#1#2{%
+    \ifnum#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}%
+    \fi
+    \lst@CCPut#1}
+\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}}
+%    \end{macrocode}
+% Now we insert more standard characters.
+%    \begin{macrocode}
+\lst@CCPut \lst@ProcessOther
+    {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F}
+    {"3A}{"3B}{"3D}{"3F}{"5B}{"5D}
+    \z@
+\lst@CCPut \lst@ProcessDigit
+    {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39}
+    \z@
+\lst@CCPut \lst@ProcessLetter
+    {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47}
+    {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F}
+    {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57}
+    {"58}{"59}{"5A}
+         {"61}{"62}{"63}{"64}{"65}{"66}{"67}
+    {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F}
+    {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77}
+    {"78}{"79}{"7A}
+    \z@
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CCPutMacro}
+% Now we come to a delicate point. The characters not inserted yet aren't
+% printable (|_|, |$|, \ldots) or aren't printed well (|*|, |-|, \ldots) if we
+% enter these characters. Thus we use proper macros to print the characters.
+% Works perfectly. The problem is that the current character string is
+% printable for speed, for example |_| is already replaced by a macro version,
+% but the new keyword tests need the original characters.
+%
+% The solution: We define |\def _{\lst@ProcessLetter\lst@um_}| where the first
+% underscore is active and the second belongs to the control sequence.
+% Moreover we have |\def\lst@um_{\lst@UM _}| where the second underscore has
+% the usual meaning. Now the keyword tests can access the original character
+% simply by making |\lst@UM| empty. The default definition gets the following
+% token and builds the control sequence |\lst@um_@|, which we'll define to
+% print the character. Easy, isn't it?^^A ;-)
+%
+% The following definition does all this for us. The first parameter gives the
+% character class, the second the character code, and the last the definition
+% which actually prints the character. We build the names |\lst@um_| and
+% |\lst@um_@| and give them to a submacro.
+%    \begin{macrocode}
+\def\lst@CCPutMacro#1#2#3{%
+    \ifnum#2=\z@ \else
+        \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax
+        \lowercase{\endgroup\expandafter\lst@CCPutMacro@
+            \csname\@lst @um/\expandafter\endcsname
+            \csname\@lst @um/@\endcsname /~}#1{#3}%
+        \expandafter\lst@CCPutMacro
+    \fi}
+%    \end{macrocode}
+% The arguments are now |\lst@um_|, |\lst@um_@|, nonactive character, active
+% character, character class and printing definition. We add |\def _{|
+% |\lst@ProcessLetter| |\lst@um_}| to |\lst@SelectStdCharTable| (and similarly
+% other special characters), define |\def\lst@um_{\lst@UM _}| and |\lst@um_@|.
+%    \begin{macrocode}
+\def\lst@CCPutMacro@#1#2#3#4#5#6{%
+    \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}%
+    \def#1{\lst@UM#3}%
+    \def#2{#6}}
+%    \end{macrocode}
+% The default definition of |\lst@UM|:
+%    \begin{macrocode}
+\def\lst@UM#1{\csname\@lst @um#1@\endcsname}
+%    \end{macrocode}
+% And all remaining standard characters.
+%    \begin{macrocode}
+\lst@CCPutMacro
+    \lst@ProcessOther {"23}\#
+    \lst@ProcessLetter{"24}\textdollar
+    \lst@ProcessOther {"25}\%
+    \lst@ProcessOther {"26}\&
+    \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle
+                                     \else \char39\relax \fi}
+    \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered}
+    \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}}
+    \lst@ProcessOther {"3C}{\lst@ttfamily<\textless}
+    \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater}
+    \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash}
+    \lst@ProcessOther {"5E}\textasciicircum
+    \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore}
+    \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave
+                                     \else \char96\relax \fi}
+    \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft}
+    \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar}
+    \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright}
+    \lst@ProcessOther {"7E}\textasciitilde
+    \lst@ProcessOther {"7F}-
+    \@empty\z@\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ttfamily}
+% What is this ominous macro? It prints either the first or the second
+% argument. In |\ttfamily| it ensures that |----| is typeset |----| and not
+% $-$$-$$-$$-$ as in version 0.17. Bug encountered by
+% \lsthelper{Dr.~Jobst~Hoffmann}{1998/03/30}{|\lst@minus| and |\ttfamily|}.
+% Furthermore I added |\relax| after receiving an error report from
+% \lsthelper{Magnus~Lewis-Smith}{1999/08/06}{! Bad character code (920).}
+%    \begin{macrocode}
+\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi}
+%    \end{macrocode}
+% |\ttdefault| is defined |\long|, so the |\ifx| doesn't work since |\f@family|
+% isn't |\long|! We go around this problem by redefining |\ttdefault| locally:
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{upquote}
+% is used above to decide which quote to print. We print an error message if
+% the necessary \packagename{textcomp} commands are not available. This key
+% has been added after an email from \lsthelper{Frank~Mittelbach}{2003/06/18}
+% {listings and upquote}.
+%    \begin{macrocode}
+\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote
+    \lst@ifupquote
+       \@ifundefined{textasciigrave}%
+          {\let\KV@lst@upquote\@gobble
+           \lstKV@SetIf f\lst@ifupquote \@gobble\fi
+           \PackageError{Listings}{Option `upquote' requires `textcomp'
+            package.\MessageBreak The option has been disabled}%
+          {Add \string\usepackage{textcomp} to your preamble.}}%
+          {}%
+    \fi}
+%    \end{macrocode}
+% If an \packagename{upquote} package is loaded, the \keyname{upquote} option
+% is enabled by default.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \@ifpackageloaded{upquote}{\RequirePackage{textcomp}%
+                             \lstset{upquote}}{}%
+  \@ifpackageloaded{upquote2}{\lstset{upquote}}{}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@ifactivechars}
+% A simple switch.
+%    \begin{macrocode}
+\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue}
+\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse}
+\lst@activecharstrue
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@SelectCharTable}
+% We select the standard character table and switch to active catcodes.
+%    \begin{macrocode}
+\def\lst@SelectCharTable{%
+    \lst@SelectStdCharTable
+    \lst@ifactivechars
+        \catcode9\active \catcode12\active \catcode13\active
+        \@tempcnta=32\relax
+        \@whilenum\@tempcnta<128\do
+            {\catcode\@tempcnta\active\advance\@tempcnta\@ne}%
+    \fi
+    \lst@ifec \lst@DefEC \fi
+%    \end{macrocode}
+% The following line and the according macros below have been added after a
+% bug report from \lsthelper{Fr\'ed\'eric~Boulanger}{2001/02/27}{ligatures}.
+% The assignment to |\do@noligs| was changed to |\do| after a bug report from
+% \lsthelper{Peter~Ruckdeschel}{2002/04/12}{problems with simultanous use of
+% seminar.sty and listings.sty}. This bugfix was kindly provided by
+% \lsthelper{Timothy~Van~Zandt}{2002/04/13}{Re: ...}.
+%    \begin{macrocode}
+    \let\do\lst@do@noligs \verbatim@nolig@list
+%    \end{macrocode}
+% There are two ways to adjust the standard table: inside the hook or with
+% |\lst@DeveloperSCT|. We use these macros and initialize the backslash if
+% necessary. |\lst@DefRange| has been moved outside the hook after a bug report
+% by \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung
+% m\"oglich...}.
+%    \begin{macrocode}
+    \lsthk@SelectCharTable
+    \lst@DeveloperSCT
+	\lst@DefRange
+    \ifx\lst@Backslash\relax\else
+        \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{SelectCharTable}
+% \begin{lstkey}{MoreSelectCharTable}
+% The keys to adjust |\lst@DeveloperSCT|.
+%    \begin{macrocode}
+\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}}
+\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@do@noligs}
+% To prevent ligatures, this macro inserts the token |\lst@NoLig| in front of
+% |\lst@Process|\meta{whatever}\meta{spec.~token}. This is done by
+% |\verbatim@nolig@list| for certain characters. Note that the submacro is
+% a special kind of a local |\lst@AddToAtTop|. The submacro definition was
+% fixed thanks to \lsthelper{Peter~Bartke}{2002/04/10}{bad `noligs' handling}.
+%    \begin{macrocode}
+\def\lst@do@noligs#1{%
+    \begingroup \lccode`\~=`#1\lowercase{\endgroup
+    \lst@do@noligs@~}}
+\def\lst@do@noligs@#1{%
+    \expandafter\expandafter\expandafter\def
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@NoLig}
+% When this extra macro is processed, it adds |\lst@nolig| to the output queue
+% without increasing its length. For keyword detection this must expand to
+% nothing if |\lst@UM| is empty.
+%    \begin{macrocode}
+\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig}
+\def\lst@nolig{\lst@UM\@empty}%
+%    \end{macrocode}
+% But the usual meaning of |\lst@UM| builds the following control sequence,
+% which prevents ligatures in the manner of \LaTeX's |\do@noligs|.
+%    \begin{macrocode}
+\@namedef{\@lst @um@}{\leavevmode\kern\z@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@SaveOutputDef}
+% To get the \meta{spec.~token} meaning of character |#1|, we look for |\def|
+% `active character |#1|' in |\lst@SelectStdCharTable|, get the replacement
+% text, strip off the character class via |\@gobble|, and assign the meaning.
+% Note that you get a ``runaway argument'' error if an illegal \meta{character
+% code}=|#1| is used.
+%    \begin{macrocode}
+\def\lst@SaveOutputDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup
+    \def\lst@temp##1\def~##2##3\relax}{%
+        \global\expandafter\let\expandafter#2\@gobble##2\relax}%
+    \expandafter\lst@temp\lst@SelectStdCharTable\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstum@backslash}
+% A commonly used character.
+%    \begin{macrocode}
+\lst@SaveOutputDef{"5C}\lstum@backslash
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{National characters}
+%
+% \begin{lstkey}{extendedchars}
+% The user key to activate extended characters 128--255.
+%    \begin{macrocode}
+\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DefEC}
+% Currently each character in the range 128--255 is treated as a letter.
+%    \begin{macrocode}
+\def\lst@DefEC{%
+    \lst@CCECUse \lst@ProcessLetter
+      ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
+      ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
+      ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
+      ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
+      ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
+      ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
+      ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
+      ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
+      ^^00}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CCECUse}
+% Reaching end of list (|^^00|) we terminate the loop.
+% Otherwise we do the same as in |\lst@CCPut| if the character is not active.
+% But if the character is active, we save the meaning before redefinition.
+%    \begin{macrocode}
+\def\lst@CCECUse#1#2{%
+    \ifnum`#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \ifnum\catcode`#2=\active
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}%
+        \else
+            \lst@ifactivechars \catcode`#2=\active \fi
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}%
+        \fi
+    \fi
+    \lst@CCECUse#1}
+%    \end{macrocode}
+% We save the meaning as mentioned. Here we must also use the `|\lst@UM|
+% construction' since extended characters could often appear in words =
+% identifiers. Bug reported by \lsthelper{Denis~Girou}{1999/07/26}
+% {incompatibility with inputenc}.
+%    \begin{macrocode}
+\def\lst@CCECUse@#1#2#3{%
+    \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}%
+    \expandafter\let\csname\@lst @um#3@\endcsname #2%
+    \edef#2{\noexpand#1%
+            \expandafter\noexpand\csname\@lst @EC#3\endcsname}}
+%    \end{macrocode}
+% \lsthelper{Daniel~Gerigk}{2001/10/25}{extendedchars do not work} and
+% \lsthelper{Heiko~Oberdiek}{2001/10/26}{extendedchars do not work: um@\#3@
+% must be @um\#3@} reported an error and a solution, respectively.
+% \end{macro}
+%
+%
+% \subsubsection{Catcode problems}
+%
+% \begin{macro}{\lst@nfss@catcodes}
+% \lsthelper{Anders~Edenbrandt}{1997/04/22}{preload of .fd files} found a bug
+% with \texttt{.fd}-files. Since we change catcodes and these files are read
+% on demand, we must reset the catcodes before the files are input. We use a
+% local redefinition of |\nfss@catcodes|.
+%    \begin{macrocode}
+\lst@AddToHook{Init}
+    {\let\lsts@nfss@catcodes\nfss@catcodes
+     \let\nfss@catcodes\lst@nfss@catcodes}
+%    \end{macrocode}
+% The |&|-character had turned into |\&| after a bug report by \lsthelper
+% {David~Aspinall}{2003/07/17}{loading of .fd file inside tabular produces
+% error}.
+%    \begin{macrocode}
+\def\lst@nfss@catcodes{%
+    \lst@makeletter
+        ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax
+    \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&%
+    \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4%
+    \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9%
+    \@makeother =\lsts@nfss@catcodes}
+%    \end{macrocode}
+% The investigation of a bug reported by \lsthelper{Christian~Gudrian}
+% {2000/11/16}{problems with mathpple} showed that the equal sign needs
+% to have `other' catcode, as assigned above.
+% \lsthelper{Svend~Tollak~Munkejord}{2002/04/17}{package incompatible with
+%  Lucida .fd files} reported problems with Lucida .fd-files, while
+% \lsthelper{Heiko~Oberdiek}{2002/04/17}{Re: listings fails with Lucida
+% font} analysed the bug, which above led to the line starting with
+% |\@makeaother (|.
+%
+% The name of |\lst@makeletter| is an imitation of \LaTeX's |\@makeother|.
+%    \begin{macrocode}
+\def\lst@makeletter#1{%
+    \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{useoutput}
+% \begin{macro}{\output}
+% Another problem was first reported by \lsthelper{Marcin~Kasperski}
+% {1999/04/28}{listings spoil toc}. It is also catcode related and
+% \lsthelper{Donald~Arseneau}{1999/05/13}{comp.text.tex Re: delayed write and
+% catcode changes} let me understand it. The point is that \TeX\ seems to use
+% the \emph{currently} active catcode table when it writes non-|\immediate|
+% |\write|s to file and not the catcodes involved when \emph{reading} the
+% characters.
+% So a section heading |\L a| was written |\La| if a listing was split on two
+% pages since a non-standard catcode table was in use when writing |\La| to
+% file, the previously attached catcodes do not matter. One more bug was that
+% accents in page headings or footers were lost when a listing was split on
+% two pages. \lsthelper{Denis~Girou}{1999/08/03}{Accents lost in heading if
+% listing split on two pages} found this latter bug. A similar problem with
+% the tilde was reported by \lsthelper{Thorsten~Vitt}{2001/06/25}{fancyhdr +
+% listings crossing pages ==> ~ in header, not space}.
+%
+% We can choose between three possibilities.
+% \lsthelper{Donald~Arseneau}{2006/09/14}{cannot select output routine 1}
+% noted a bug here in the |\ifcase| argument.
+%    \begin{macrocode}
+\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase0#1 0\or 1\else 2\fi}}
+%    \end{macrocode}
+% The first does not modify the existing output routine.
+%    \begin{macrocode}
+\lst@AddToHook{Init}
+{\edef\lst@OrgOutput{\the\output}%
+\ifcase\lst@useoutput\relax
+\or
+%    \end{macrocode}
+% The second possibility is as follows: We interrupt the current modes---in
+% particular |\lst@Pmode| with modified catcode table---, call the original
+% output routine and reenter the mode. This must be done with a little care.
+% First we have to close the group which \TeX\ opens at the beginning of the
+% output routine. A single |\egroup| gives an `unbalanced output routine'
+% error. But |\expandafter\egroup| works. Again it was
+% \lsthelper{Donald~Arseneau}{2001/01/10}{comp.text.tex Re: \output puzzle}
+% who gave the explaination: The |\expandafter| set the token type of |\bgroup|
+% to |backed_up|, which prevents \TeX's from recovering from an unbalanced
+% output routine. \lsthelper{Heiko~Oberdiek}{2001/01/05}{comp.text.tex Re:
+% \output puzzle} reported that |\csname| |egroup||\endcsname| does the trick,
+% too.
+%
+% However, since \TeX\ checks the contents of |\box| 255 when we close the
+% group (`output routine didn't use all of |\box| 255'), we have to save it
+% temporaryly.
+%    \begin{macrocode}
+ \output{\global\setbox\lst@gtempboxa\box\@cclv
+         \expandafter\egroup
+%    \end{macrocode}
+% Now we can interrupt the mode, but we have to save the current character
+% string and the current style.
+%    \begin{macrocode}
+         \lst@SaveToken
+     \lst@InterruptModes
+%    \end{macrocode}
+% We restore the contents, use the original output routine, and \ldots
+%    \begin{macrocode}
+     \setbox\@cclv\box\lst@gtempboxa
+     \bgroup\lst@OrgOutput\egroup
+%    \end{macrocode}
+% \ldots\space open a group matching the |}| which \TeX\ inserts at the end of
+% the output routine. We reenter modes and restore the character string and
+% style |\aftergroup|. Moreover we need to reset |\pagegoal|---added after a
+% bug report by \lsthelper{Jochen~Schneider}{2002/03/09}{de.comp.text.tex:
+% Problem mit Listings-Paket 1.0-Beta; unmotivated pagebreak with preceding
+% float}.
+%    \begin{macrocode}
+     \bgroup
+     \aftergroup\pagegoal\aftergroup\vsize
+     \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}%
+\else
+%    \end{macrocode}
+% The third option is to restore all catcodes and meanings inside a modified
+% output routine and to call the original routine afterwards.
+%    \begin{macrocode}
+ \output{\lst@RestoreOrigCatcodes
+         \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi
+         \lst@OrgOutput}%
+\fi}
+%    \end{macrocode}
+% Note that this output routine isn't used too often. It is executed only if
+% it's possible that a listing is split on two pages: if a listing ends at
+% the bottom or begins at the top of a page, or if a listing is really split.
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@GetChars}
+% \begin{macro}{\lst@ScanChars}
+% \begin{lstkey}{rescanchars}
+% To make the third |\output|-option work, we have to scan the catcodes and
+% also the meanings of active characters:
+%    \begin{macrocode}
+\def\lst@GetChars#1#2#3{%
+    \let#1\@empty
+    \@tempcnta#2\relax \@tempcntb#3\relax
+    \loop \ifnum\@tempcnta<\@tempcntb\relax
+        \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}%
+        \lst@lExtend#1{\the\catcode\@tempcnta\relax}%
+        \ifnum\the\catcode\@tempcnta=\active
+            \begingroup\lccode`\~=\@tempcnta
+            \lowercase{\endgroup
+            \lst@lExtend#1{\expandafter\let\expandafter~\csname
+                                    lstecs@\the\@tempcnta\endcsname}%
+            \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}%
+        \fi
+        \advance\@tempcnta\@ne
+    \repeat}
+%    \end{macrocode}
+% As per a bug report by \lsthelper{Benjamin~Lings}{2004/10/15}%
+% {\usepackage{xy,listings} yields: "Forbidden control sequence...."}, we
+% deactivate |\outer| definition of |^^L| temporarily (inside and outside
+% of |\lst@ScanChars|) and restore the catcode at end of package via the
+% |\lst@RestoreCatcodes| command.
+%    \begin{macrocode}
+\begingroup \catcode12=\active\let^^L\@empty
+\gdef\lst@ScanChars{%
+  \let\lsts@ssL^^L%
+  \def^^L{\par}%
+    \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}%
+  \let^^L\lsts@ssL
+    \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}}
+\endgroup
+%    \end{macrocode}
+% The scan can be issued by hand and at the beginning of a document.
+%    \begin{macrocode}
+\lst@Key{rescanchars}\relax{\lst@ScanChars}
+\AtBeginDocument{\lst@ScanChars}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Adjusting the table}
+%
+% We begin with modifiers for the basic character classes.
+%
+% \begin{lstkey}{alsoletter}
+% \begin{lstkey}{alsodigit}
+% \begin{lstkey}{alsoother}
+% The macros |\lst@also|\ldots\space will hold |\def|\meta{char}|{|\ldots|}|
+% sequences, which adjusts the standard character table.
+%    \begin{macrocode}
+\lst@Key{alsoletter}\relax{%
+    \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter}
+\lst@Key{alsodigit}\relax{%
+    \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit}
+\lst@Key{alsoother}\relax{%
+    \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther}
+%    \end{macrocode}
+% This is done at \hookname{SelectCharTable} and every language selection
+% the macros get empty.
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}
+    {\lst@alsoother \lst@alsodigit \lst@alsoletter}
+\lst@AddToHookExe{SetLanguage}% init
+    {\let\lst@alsoletter\@empty
+     \let\lst@alsodigit\@empty
+     \let\lst@alsoother\@empty}
+%    \end{macrocode}
+% The service macro starts a loop and \ldots
+%    \begin{macrocode}
+\def\lst@DoAlso#1#2#3{%
+    \lst@DefOther\lst@arg{#1}\let#2\@empty
+    \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax}
+\def\lst@DoAlso@#1#2#3{%
+    \ifx\relax#3\expandafter\@gobblethree \else
+%    \end{macrocode}
+% \ldots\space while not reaching |\relax| we use the \TeX nique from
+% |\lst@SaveOutputDef| to replace the class by |#2|. Eventually we append
+% the new definition to |#1|.
+%    \begin{macrocode}
+        \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup
+        \def\lst@temp##1\def~##2##3\relax{%
+            \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter
+                                         \noexpand\@gobble##2}}}}%
+        \expandafter\lst@temp\lst@SelectStdCharTable\relax
+        \lst@lExtend#1{\lst@arg}%
+    \fi
+    \lst@DoAlso@#1#2}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@SaveDef}
+% \begin{macro}{\lst@DefSaveDef}
+% \begin{macro}{\lst@LetSaveDef}
+% These macros can be used in language definitions to make special changes.
+% They save the definition and define or assign a new one.
+%    \begin{macrocode}
+\def\lst@SaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}}
+\def\lst@DefSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}}
+\def\lst@LetSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Now we get to the more powerful definitions.
+%
+% \begin{macro}{\lst@CDef}
+% Here we unfold the first parameter \meta{1st}\marg{2nd}\marg{rest} and say
+% that this input string is `replaced' by \meta{save 1st}\marg{2nd}^^A
+% \marg{rest}---plus \meta{execute}, \meta{pre}, and \meta{post}. This main
+% work is done by |\lst@CDefIt|.
+%    \begin{macrocode}
+\def\lst@CDef#1{\lst@CDef@#1}
+\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CDefX}
+% drops the input string.
+%    \begin{macrocode}
+\def\lst@CDefX#1{\lst@CDefX@#1}
+\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CDefIt}
+% is the main working procedure for the previous macros. It redefines the
+% sequence |#1#2#3| of characters. At least |#1| must be active; the other two
+% arguments might be empty, not equivalent to empty!
+%    \begin{macrocode}
+\def\lst@CDefIt#1#2#3#4#5#6#7#8{%
+    \ifx\@empty#2\@empty
+%    \end{macrocode}
+% For a single character we just execute the arguments in the correct order.
+% You might want to go back to section \ref{dCharacterTablesManipulated} to
+% look them up.
+%    \begin{macrocode}
+        \def#1{#6\def\lst@next{#7#4#8}\lst@next}%
+    \else \ifx\@empty#3\@empty
+%    \end{macrocode}
+% For a two character sequence we test whether \meta{pre} and \meta{post}
+% must be executed.
+%    \begin{macrocode}
+        \def#1##1{%
+            #6%
+            \ifx##1#2\def\lst@next{#7#4#8}\else
+                     \def\lst@next{#5##1}\fi
+            \lst@next}%
+    \else
+%    \end{macrocode}
+% We do the same for an arbitrary character sequence---except that we have to
+% use |\lst@IfNextCharsArg| instead of |\ifx|\ldots|\fi|.
+%    \begin{macrocode}
+        \def#1{%
+            #6%
+            \lst@IfNextCharsArg{#2#3}{#7#4#8}%
+                                     {\expandafter#5\lst@eaten}}%
+    \fi \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CArgX}
+% We make |#1#2| active and call |\lst@CArg|.
+%    \begin{macrocode}
+\def\lst@CArgX#1#2\relax{%
+    \lst@DefActive\lst@arg{#1#2}%
+    \expandafter\lst@CArg\lst@arg\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CArg}
+% arranges the first two arguments for |\lst@CDef|[|X|]. We get an undefined
+% macro and use |\@empty\@empty\relax| as delimiter for the submacro.
+%    \begin{macrocode}
+\def\lst@CArg#1#2\relax{%
+    \lccode`\/=`#1\lowercase{\def\lst@temp{/}}%
+    \lst@GetFreeMacro{lst@c\lst@temp}%
+    \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax}
+%    \end{macrocode}
+% Save meaning of \meta{1st}=|#2| in \meta{save 1st}=|#1| and call the macro
+% |#6| with correct arguments. From version 1.0 on, |#2|, |#3| and |#4|
+% (respectively empty arguments) are tied together with group braces.
+% This allows us to save two arguments in other definitions, for example in
+% |\lst@DefDelimB|.
+%    \begin{macrocode}
+\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{%
+    \let#1#2%
+    \ifx\@empty#3\@empty
+        \def\lst@next{#6{#2{}{}}}%
+    \else
+        \def\lst@next{#6{#2#3{#4}}}%
+    \fi
+    \lst@next #1}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CArgEmpty}
+% `executes' an |\@empty|-delimited argument. We will use it for the delimiters.
+%    \begin{macrocode}
+\def\lst@CArgEmpty#1\@empty{#1}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Delimiters}
+%
+% Here we start with general definitions common to all delimiters.
+%
+% \begin{lstkey}{excludedelims}
+% controls which delimiters are not printed in \meta{whatever}style. We just
+% define |\lst@ifex|\meta{whatever} to be true. Such switches are set false
+% in the \hookname{ExcludeDelims} hook and are handled by the individual
+% delimiters.
+%    \begin{macrocode}
+\lst@Key{excludedelims}\relax
+    {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}%
+     \expandafter\lst@for\lst@temp\do
+     {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DelimPrint}
+% And this macro might help in doing so. |#1| is |\lst@ifex|\meta{whatever}
+% (plus |\else|) or just |\iffalse|, and |#2| will be the delimiter. The
+% temporary mode change ensures that the characters can't end the current
+% delimiter or start a new one.
+%    \begin{macrocode}
+\def\lst@DelimPrint#1#2{%
+    #1%
+      \begingroup
+        \lst@mode\lst@nomode \lst@modetrue
+        #2\lst@XPrintToken
+      \endgroup
+      \lst@ResetToken
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DelimOpen}
+% We print preceding characters and the delimiter, enter the appropriate mode,
+% print the delimiter again, and execute |#3|. In fact, the arguments |#1| and
+% |#2| will ensure that the delimiter is printed only once.
+%    \begin{macrocode}
+\def\lst@DelimOpen#1#2#3#4#5#6\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint#1{#6}%
+    \lst@EnterMode{#4}{\def\lst@currstyle#5}%
+    \lst@DelimPrint{#1#2}{#6}%
+    #3}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DelimClose}
+% is the same in reverse order.
+%    \begin{macrocode}
+\def\lst@DelimClose#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint{#1#2}{#3}%
+    \lst@LeaveMode
+    \lst@DelimPrint{#1}{#3}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginDelim}
+% \begin{macro}{\lst@EndDelim}
+% These definitions are applications of |\lst@DelimOpen| and |\lst@DelimClose|:
+% the delimiters have the same style as the delimited text.
+%    \begin{macrocode}
+\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}}
+\def\lst@EndDelim{\lst@DelimClose\iffalse\else}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginIDelim}
+% \begin{macro}{\lst@EndIDelim}
+% Another application: no delimiter is printed.
+%    \begin{macrocode}
+\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}}
+\def\lst@EndIDelim{\lst@DelimClose\iffalse{}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefDelims}
+% This macro defines all delimiters and is therefore reset every language
+% selection.
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}{\lst@DefDelims}
+\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Delim}
+% First we set default values: no |\lst@modetrue|, cumulative style, and no
+% argument to |\lst@Delim|[|DM|]|@|\meta{type}.
+%    \begin{macrocode}
+\def\lst@Delim#1{%
+    \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty
+%    \end{macrocode}
+% These are the correct settings for the double-star-form, so we immediately
+% call the submacro in this case. Otherwise we either just suppress cumulative
+% style, or even indicate the usage of |\lst@modetrue| with |\lst@true|.
+%    \begin{macrocode}
+    \@ifstar{\@ifstar{\lst@Delim@{#1}}%
+                     {\let\lst@cumulative\relax
+                      \lst@Delim@{#1}}}%
+            {\lst@true\lst@Delim@{#1}}}
+%    \end{macrocode}
+% The type argument is saved for later use. We check against the optional
+% \meta{style} argument using |#1| as default, define |\lst@delimstyle| and
+% look for the optional \meta{type option}, which is just saved in |\lst@arg|.
+%    \begin{macrocode}
+\def\lst@Delim@#1[#2]{%
+    \gdef\lst@delimtype{#2}%
+    \@ifnextchar[\lst@Delim@sty
+                 {\lst@Delim@sty[#1]}}
+\def\lst@Delim@sty[#1]{%
+    \def\lst@delimstyle{#1}%
+    \ifx\@empty#1\@empty\else
+        \lst@Delim@sty@ #1\@nil
+    \fi
+    \@ifnextchar[\lst@Delim@option
+                 \lst@Delim@delim}
+\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim}
+%    \end{macrocode}
+% |[| and |]| in the replacement text above have been added after a bug report
+% by \lsthelper{Stephen~Reindl}{2002/05/28}{\inaccessible using Cobol}.
+%
+% The definition of |\lst@delimstyle| depends on whether the first token is a
+% control sequence. Here we possibly build |\lst@|\meta{style}.
+%    \begin{macrocode}
+\def\lst@Delim@sty@#1#2\@nil{%
+    \if\relax\noexpand#1\else
+        \edef\lst@delimstyle{\expandafter\noexpand
+                             \csname\@lst @\lst@delimstyle\endcsname}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Delim@delim}
+% Eventually this macro is called. First we might need to delete a bunch of
+% delimiters. If there is no delimiter, we might delete a subclass.
+%    \begin{macrocode}
+\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{%
+    \ifx #4\@empty \lst@Delim@delall{#2}\fi
+    \ifx\@empty#1\@empty
+        \ifx #4\@nil
+            \@ifundefined{\@lst @#2DM@\lst@delimtype}%
+                {\lst@Delim@delall{#2@\lst@delimtype}}%
+                {\lst@Delim@delall{#2DM@\lst@delimtype}}%
+        \fi
+    \else
+%    \end{macrocode}
+% If the delimiter is not empty, we convert the delimiter and append it to
+% |\lst@arg|. Ditto |\lst@Begin|\ldots, |\lst@End|\ldots, and the style and
+% mode selection.
+%    \begin{macrocode}
+        \expandafter\lst@Delim@args\expandafter
+            {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4%
+%    \end{macrocode}
+% If the type is known, we either choose dynamic or static mode and use the
+% contents of |\lst@arg| as arguments. All this is put into |\lst@delim|.
+%    \begin{macrocode}
+        \let\lst@delim\@empty
+        \expandafter\lst@IfOneOf\lst@delimtype\relax#3%
+        {\@ifundefined{\@lst @#2DM@\lst@delimtype}%
+             {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+             {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode
+                                     \csname\@lst @#2DM@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+%    \end{macrocode}
+% Now, depending on the mode |#4| we either remove this particular delimiter or
+% append it to all current ones.
+%    \begin{macrocode}
+         \ifx #4\@nil
+             \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty
+             \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil
+         \else
+             \lst@lExtend\lst@DefDelims\lst@delim
+         \fi}%
+%    \end{macrocode}
+% An unknown type issues an error.
+%    \begin{macrocode}
+        {\PackageError{Listings}{Illegal type `\lst@delimtype'}%
+                                {#2 types are #3.}}%
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Delim@args}
+% Now let's look how we add the arguments to |\lst@arg|. First we initialize
+% the conversion just to make all characters active. But if the first character
+% of the type equals |#4|, \ldots
+%    \begin{macrocode}
+\def\lst@Delim@args#1#2#3#4#5#6#7{%
+    \begingroup
+    \lst@false \let\lst@next\lst@XConvert
+%    \end{macrocode}
+% \ldots\ we remove that character from |\lst@delimtype|, and |#5| might select
+% a different conversion setting or macro.
+%    \begin{macrocode}
+    \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble
+                                        \lst@delimtype}%
+                    #5\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#6}%
+                    \lst@GobbleNil}%
+%    \end{macrocode}
+% Since we are in the `special' case above, we've also added the special
+% |\lst@Begin|\ldots\space and |\lst@End|\ldots\space macros to |\lst@arg|
+% (and |\@empty| as a brake for the delimiter). No special task must be done
+% if the characters are not equal.
+%    \begin{macrocode}
+                   {\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#3}%
+                    \lst@GobbleNil}%
+                 #1\@nil
+%    \end{macrocode}
+% We always transfer the arguments to the outside of the group and append the
+% style and mode selection if and only if we're not deleting a delimiter.
+% Therefor we expand the delimiter style.
+%    \begin{macrocode}
+    \global\let\@gtempa\lst@arg
+    \endgroup
+    \let\lst@arg\@gtempa
+    \ifx #7\@nil\else
+        \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}%
+    \fi}
+%    \end{macrocode}
+% Recall that the style is `selected' by |\def\lst@currstyle#5|, and this
+% `argument' |#5| is to be added now. Depending on the settings at the very
+% beginning, we use either |{\meta{style}}\lst@modetrue|---which selects the
+% style and deactivates keyword detection---, or |{}\meta{style}|---which
+% defines an empty style macro and executes the style for cumulative styles---,
+% or |{\meta{style}|---which just defines the style macro. Note that we have to
+% use two extra group levels below: one is discarded directly by |\lst@lAddTo|
+% and the other by |\lst@Delim|[|DM|]|@|\meta{type}.
+%    \begin{macrocode}
+\def\lst@Delim@args@#1{%
+    \lst@if
+        \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}%
+    \else
+        \ifx\lst@cumulative\@empty
+            \lst@lAddTo\lst@arg{{{}#1}}%
+        \else
+            \lst@lAddTo\lst@arg{{{#1}}}%
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Delim@del}
+% To delete a particular delimiter, we iterate down the list of delimiters and
+% compare the current item with the user supplied.
+%    \begin{macrocode}
+\def\lst@Delim@del#1\@empty#2#3#4{%
+    \ifx #2\@nil\else
+        \def\lst@temp{#1\@empty#2#3}%
+        \ifx\lst@temp\lst@delim\else
+            \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}%
+        \fi
+        \expandafter\lst@Delim@del
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Delim@delall}
+% To delete a whole class of delimiters, we first expand the control sequence
+% name, init some other data, and call a submacro to do the work.
+%    \begin{macrocode}
+\def\lst@Delim@delall#1{%
+    \begingroup
+    \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}%
+    \lst@false \global\let\@gtempa\@empty
+    \expandafter\lst@Delim@delall@\lst@DefDelims\@empty
+    \endgroup
+    \let\lst@DefDelims\@gtempa}
+%    \end{macrocode}
+% We first discard a preceding |\lst@UseDynamicMode|.
+%    \begin{macrocode}
+\def\lst@Delim@delall@#1{%
+    \ifx #1\@empty\else
+        \ifx #1\lst@UseDynamicMode
+            \lst@true
+            \let\lst@next\lst@Delim@delall@do
+        \else
+            \def\lst@next{\lst@Delim@delall@do#1}%
+        \fi
+        \expandafter\lst@next
+    \fi}
+%    \end{macrocode}
+% Then we can check whether (the following) |\lst@|\meta{delimiter name}\ldots\
+% matches the delimiter class given by |\lst@delim|.
+%    \begin{macrocode}
+\def\lst@Delim@delall@do#1#2\@empty#3#4#5{%
+    \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}%
+      {}%
+      {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi
+       \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}%
+    \lst@false \lst@Delim@delall@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefDelimB}
+% Here we put the arguments together to fit |\lst@CDef|. Note that the very
+% last argument |\@empty| to |\lst@CDef| is a brake for |\lst@CArgEmpty|
+% and |\lst@DelimOpen|.
+%    \begin{macrocode}
+\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \lst@ifmode #4\else
+             #5%
+             \def\lst@bnext{#6{#7}{#8}}%
+         \fi
+         \lst@bnext}%
+        \@empty}
+%    \end{macrocode}
+% After a bug report from \lsthelper{Vespe~Savikko}{2000/11/06}{bad output of
+% doc-strings if HTML and Python are loaded} I added braces around |#7|.
+% \end{macro}
+%
+% \begin{macro}{\lst@DefDelimE}
+% The  |\ifnum #7=\lst@mode| in the 5th line ensures that the delimiters
+% match each other.
+%    \begin{macrocode}
+\gdef\lst@DefDelimE#1#2#3#4#5#6#7{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@enext\lst@CArgEmpty
+         \ifnum #7=\lst@mode%
+             #4%
+             \let\lst@enext#6%
+         \else
+             #5%
+         \fi
+         \lst@enext}%
+        \@empty}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefDelimBE}
+% This service macro will actually define all string delimiters.
+%    \begin{macrocode}
+\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \ifnum #7=\lst@mode
+             #4%
+             \let\lst@bnext#9%
+         \else
+             \lst@ifmode\else
+                 #5%
+                 \def\lst@bnext{#6{#7}{#8}}%
+             \fi
+         \fi
+         \lst@bnext}%
+        \@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@delimtypes}
+% is the list of general delimiter types.
+%    \begin{macrocode}
+\gdef\lst@delimtypes{s,l}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DelimKey}
+% We just put together the arguments for |\lst@Delim|.
+%    \begin{macrocode}
+\gdef\lst@DelimKey#1#2{%
+    \lst@Delim{}#2\relax
+        {Delim}\lst@delimtypes #1%
+                {\lst@BeginDelim\lst@EndDelim}
+        i\@empty{\lst@BeginIDelim\lst@EndIDelim}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{delim}
+% \begin{lstkey}{moredelim}
+% \begin{lstkey}{deletedelim}
+% all use |\lst@DelimKey|.
+%    \begin{macrocode}
+\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}}
+\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}}
+\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DelimDM@l}
+% \begin{macro}{\lst@DelimDM@s}
+% Nohting special here.
+%    \begin{macrocode}
+\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Strings}
+%
+% \begin{aspect}{strings}
+% Just starting a new aspect.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{strings}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@stringtypes}
+% is the list of \ldots\space string types?
+%    \begin{macrocode}
+\gdef\lst@stringtypes{d,b,m,bd,db,s}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@StringKey}
+% We just put together the arguments for |\lst@Delim|.
+%    \begin{macrocode}
+\gdef\lst@StringKey#1#2{%
+    \lst@Delim\lst@stringstyle #2\relax
+        {String}\lst@stringtypes #1%
+                     {\lst@BeginString\lst@EndString}%
+        \@@end\@empty{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{string}
+% \begin{lstkey}{morestring}
+% \begin{lstkey}{deletestring}
+% all use |\lst@StringKey|.
+%    \begin{macrocode}
+\lst@Key{string}\relax{\lst@StringKey\@empty{#1}}
+\lst@Key{morestring}\relax{\lst@StringKey\relax{#1}}
+\lst@Key{deletestring}\relax{\lst@StringKey\@nil{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{stringstyle}
+% You shouldn't need comments on the following two lines, do you?
+%    \begin{macrocode}
+\lst@Key{stringstyle}{}{\def\lst@stringstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{showstringspaces}
+% Thanks to \lsthelper{Knut~M\"uller}{1997/04/28}{\blankstringtrue} for
+% reporting problems with |\blankstringtrue| (now |showstringspaces=false|).
+% The problem has gone.
+%    \begin{macrocode}
+\lst@Key{showstringspaces}t[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BeginString}
+% Note that the tokens after |\lst@DelimOpen| are arguments! The only special
+% here is that we switch to `keepspaces' after starting a string, if necessary.
+% A bug reported by \lsthelper{Vespe~Savikko}{2000/09/27}{stringstyle used also
+% on previous other characters} has gone due to the use of |\lst@DelimOpen|.
+%    \begin{macrocode}
+\gdef\lst@BeginString{%
+    \lst@DelimOpen
+        \lst@ifexstrings\else
+        {\lst@ifshowstringspaces
+             \lst@keepspacestrue
+             \let\lst@outputspace\lst@visiblespace
+         \fi}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexstrings\iffalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndString}
+% Again the two tokens following |\lst@DelimClose| are arguments.
+%    \begin{macrocode}
+\gdef\lst@EndString{\lst@DelimClose\lst@ifexstrings\else}
+%    \end{macrocode}
+% \end{macro}
+%
+% And now all the |\lst@StringDM@|\meta{type} definitions.
+%
+% \begin{macro}{\lst@StringDM@d}
+% `d' means no extra work.; the first three arguments after |\lst@DefDelimBE|
+% are left empty. The others are used to start and end the string.
+%    \begin{macrocode}
+\gdef\lst@StringDM@d#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@StringDM@b}
+% The |\lst@ifletter|\ldots|\fi| has been inserted after bug reports by
+% \lsthelper{Daniel~Gerigk}{2001/10/25}{improper strings in C++} and
+% \lsthelper{Peter~Bartke}{2001/11/01}{improper strings in C++}. If the last
+% other character is a backslash (4th line), we gobble the `end string' token
+% sequence.
+%    \begin{macrocode}
+\gdef\lst@StringDM@b#1#2\@empty#3#4#5{%
+    \let\lst@ifbstring\iftrue
+    \lst@CArg #2\relax\lst@DefDelimBE
+       {\lst@ifletter \lst@Output \lst@letterfalse \fi}%
+       {\ifx\lst@lastother\lstum@backslash
+            \expandafter\@gobblethree
+        \fi}{}#3{#1}{#5}#4}
+%    \end{macrocode}
+%    \begin{macrocode}
+\global\let\lst@ifbstring\iffalse % init
+%    \end{macrocode}
+% \lsthelper{Heiko~Heil}{2002/02/08}{string '\\' does not finish after the
+% delimiter} reported problems with double backslashes. So:
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}{%
+    \lst@ifbstring
+        \lst@CArgX \\\\\relax \lst@CDefX{}%
+           {\lst@ProcessOther\lstum@backslash
+            \lst@ProcessOther\lstum@backslash
+            \let\lst@lastother\relax}%
+           {}%
+    \fi}
+%    \end{macrocode}
+% The reset of |\lst@lastother| has been added after a bug reports by
+% \lsthelper{Hermann~H\"uttler}{2002/10/05}{C++-string "... \\" does not
+% end with second double quote} and \lsthelper{Dan~Luecking}{2003/01/15}
+% {string "\\" doesn't end after the second quote}.
+% \end{macro}
+%
+% \begin{macro}{\lst@StringDM@bd}
+% \begin{macro}{\lst@StringDM@db}
+% are just the same and the same as |\lst@StringDM@b|.
+%    \begin{macrocode}
+\global\let\lst@StringDM@bd\lst@StringDM@b
+\global\let\lst@StringDM@db\lst@StringDM@bd
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@StringDM@m}
+% is for Matlab. We enter string mode only if the last character is not in
+% the following list of exceptional characters: letters, digits, period,
+% quote, right parenthesis, right bracket, and right brace. The first list
+% has been extended after bug reports from \lsthelper{Christian~Kindinger}
+% {2002/03/??}{]' starts a string in Matlab}, \lsthelper{Benjamin~Schubert}
+% {2003/02/05}{.' starts a string in Matlab}, and \lsthelper{Stefan~Stoll}
+% {2003/02/18}{any of 0123456789\}' plus quote start a string in Matlab}.
+%    \begin{macrocode}
+\gdef\lst@StringDM@m#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimBE{}{}%
+        {\let\lst@next\@gobblethree
+         \lst@ifletter\else
+             \lst@IfLastOtherOneOf{)].0123456789\lstum@rbrace'}%
+                 {}%
+                 {\let\lst@next\@empty}%
+         \fi
+         \lst@next}#3{#1}{#5}#4}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@StringDM@s}
+% is for string-delimited strings, just as for comments.  This is needed
+% for Ruby, and possibly other languages.
+%    \begin{macrocode}
+\gdef\lst@StringDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstum@rbrace}
+% This has been used above.
+%    \begin{macrocode}
+\lst@SaveOutputDef{"7D}\lstum@rbrace
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \begin{aspect}{mf}
+% For MetaFont and MetaPost we now define macros to print the input-filenames
+% in stringstyle.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{mf}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@mfinputmode}
+% \begin{macro}{\lst@String@mf}
+%    \begin{macrocode}
+\lst@AddTo\lst@stringtypes{,mf}
+\lst@NewMode\lst@mfinputmode
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@String@mf#1\@empty#2#3#4{%
+  \lst@CArg #1\relax\lst@DefDelimB
+       {}{}{\lst@ifletter \expandafter\@gobblethree \fi}%
+       \lst@BeginStringMFinput\lst@mfinputmode{#4\lst@Lmodetrue}%
+  \@ifundefined{lsts@semicolon}%
+  {\lst@DefSaveDef{`\;}\lsts@semicolon{% ; and space end the filename
+      \ifnum\lst@mode=\lst@mfinputmode
+          \lst@XPrintToken
+          \expandafter\lst@LeaveMode
+      \fi
+      \lsts@semicolon}%
+   \lst@DefSaveDef{`\ }\lsts@space{%
+      \ifnum\lst@mode=\lst@mfinputmode
+          \lst@XPrintToken
+          \expandafter\lst@LeaveMode
+      \fi
+      \lsts@space}%
+  }{}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginStringMFinput}
+% It remains to define this macro. In contrast to |\lst@PrintDelim|, we don't
+% use |\lst@modetrue| to allow keyword detection here.
+%    \begin{macrocode}
+\gdef\lst@BeginStringMFinput#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+      \begingroup
+        \lst@mode\lst@nomode
+        #3\lst@XPrintToken
+      \endgroup
+      \lst@ResetToken
+    \lst@EnterMode{#1}{\def\lst@currstyle#2}%
+    \lst@ifshowstringspaces
+         \lst@keepspacestrue
+         \let\lst@outputspace\lst@visiblespace
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsubsection{Comments}
+%
+% \begin{aspect}{comments}
+% That's what we are working on.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{comments}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@commentmode}
+% is a general purpose mode for comments.
+%    \begin{macrocode}
+\lst@NewMode\lst@commentmode
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@commenttypes}
+% Via \keyname{comment} available comment types: \textbf line, \textbf fixed
+% column, \textbf single, and \textbf nested and all with
+% preceding \textbf i for invisible comments.
+%    \begin{macrocode}
+\gdef\lst@commenttypes{l,f,s,n}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CommentKey}
+% We just put together the arguments for |\lst@Delim|.
+%    \begin{macrocode}
+\gdef\lst@CommentKey#1#2{%
+    \lst@Delim\lst@commentstyle #2\relax
+        {Comment}\lst@commenttypes #1%
+                {\lst@BeginComment\lst@EndComment}%
+        i\@empty{\lst@BeginInvisible\lst@EndInvisible}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{comment}
+% \begin{lstkey}{morecomment}
+% \begin{lstkey}{deletecomment}
+% The keys are easy since defined in terms of |\lst@CommentKey|.
+%    \begin{macrocode}
+\lst@Key{comment}\relax{\lst@CommentKey\@empty{#1}}
+\lst@Key{morecomment}\relax{\lst@CommentKey\relax{#1}}
+\lst@Key{deletecomment}\relax{\lst@CommentKey\@nil{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{commentstyle}
+% Any hints necessary?
+%    \begin{macrocode}
+\lst@Key{commentstyle}{}{\def\lst@commentstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\itshape}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BeginComment}
+% \begin{macro}{\lst@EndComment}
+% Once more the three tokens following |\lst@DelimOpen| are arguments.
+%    \begin{macrocode}
+\gdef\lst@BeginComment{%
+    \lst@DelimOpen
+        \lst@ifexcomments\else
+        \lsthk@AfterBeginComment}
+%    \end{macrocode}
+% Ditto.
+%    \begin{macrocode}
+\gdef\lst@EndComment{\lst@DelimClose\lst@ifexcomments\else}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{AfterBeginComment}{}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexcomments\iffalse}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginInvisible}
+% \begin{macro}{\lst@EndInvisible}
+% Print preceding characters and begin dropping the output.
+%    \begin{macrocode}
+\gdef\lst@BeginInvisible#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@BeginDropOutput{#1}}
+%    \end{macrocode}
+% Don't print the delimiter and end dropping the output.
+%    \begin{macrocode}
+\gdef\lst@EndInvisible#1\@empty{\lst@EndDropOutput}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now we provide all |\lst@Comment|[|DM|]|@|\meta{type} macros.
+%
+% \begin{macro}{\lst@CommentDM@l}
+% is easy---thanks to |\lst@CArg| and |\lst@DefDelimB|. Note that the
+% `end comment' argument |#4| is not used here.
+%    \begin{macrocode}
+\gdef\lst@CommentDM@l#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CommentDM@f}
+% is slightly more work. First we provide the number of preceding columns.
+%    \begin{macrocode}
+\gdef\lst@CommentDM@f#1{%
+    \@ifnextchar[{\lst@Comment@@f{#1}}%
+                 {\lst@Comment@@f{#1}[0]}}
+%    \end{macrocode}
+% We define the comment in the same way as above, but we enter comment mode
+% if and only if the character is in column |#2| (counting from zero).
+%    \begin{macrocode}
+\gdef\lst@Comment@@f#1[#2]#3\@empty#4#5#6{%
+    \lst@CArg #3\relax\lst@DefDelimB{}{}%
+        {\lst@CalcColumn
+         \ifnum #2=\@tempcnta\else
+             \expandafter\@gobblethree
+         \fi}%
+        #4{#1}{#6\lst@Lmodetrue}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CommentDM@s}
+% Nothing special here.
+%    \begin{macrocode}
+\gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@CommentDM@n}
+% We either give an error message or define the nested comment.
+%    \begin{macrocode}
+\gdef\lst@CommentDM@n#1#2#3\@empty#4#5#6{%
+    \ifx\@empty#3\@empty\else
+        \def\@tempa{#2}\def\@tempb{#3}%
+        \ifx\@tempa\@tempb
+            \PackageError{Listings}{Identical delimiters}%
+            {These delimiters make no sense with nested comments.}%
+        \else
+            \lst@CArg #2\relax\lst@DefDelimB
+                {}%
+%    \end{macrocode}
+% Note that the following |\@gobble| eats an |\else| from |\lst@DefDelimB|.
+%    \begin{macrocode}
+                {\ifnum\lst@mode=#1\relax \expandafter\@gobble \fi}%
+                {}#4{#1}{#6}%
+            \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}%
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsubsection{PODs}
+%
+% \begin{aspect}{pod}
+% PODs are defined as a separate aspect.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{pod}
+%    \end{macrocode}
+%
+% \begin{lstkey}{printpod}
+% \begin{lstkey}{podcomment}
+% We begin with the user keys, which I introduced after communication with
+% \lsthelper{Michael~Piotrowski}{1997/11/11}{printpod}.
+%    \begin{macrocode}
+\lst@Key{printpod}{false}[t]{\lstKV@SetIf{#1}\lst@ifprintpod}
+\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{#1}\lst@ifpodcomment}
+\lst@AddToHookExe{SetLanguage}{\let\lst@ifpodcomment\iffalse}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@PODmode}
+% is the static mode for PODs.
+%    \begin{macrocode}
+\lst@NewMode\lst@PODmode
+%    \end{macrocode}
+% \end{macro}
+%
+% We adjust some characters if the user has selected |podcomment=true|.
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifpodcomment
+         \lst@CArgX =\relax\lst@DefDelimB{}{}%
+%    \end{macrocode}
+% The following code is executed if we've found an equality sign and haven't
+% entered a mode (in fact if mode changes are allowed): We `begin drop output'
+% and gobble the usual begin of comment sequence (via |\@gobblethree|) if PODs
+% aren't be printed. Moreover we gobble it if the current column number is not
+% zero---|\@tempcnta| is valued below.
+%    \begin{macrocode}
+           {\ifnum\@tempcnta=\z@
+                \lst@ifprintpod\else
+                    \def\lst@bnext{\lst@BeginDropOutput\lst@PODmode}%
+                    \expandafter\expandafter\expandafter\@gobblethree
+                \fi
+            \else
+               \expandafter\@gobblethree
+            \fi}%
+           \lst@BeginComment\lst@PODmode{{\lst@commentstyle}}%
+%    \end{macrocode}
+% If we come to |=|, we calculate the current column number (zero based).
+%    \begin{macrocode}
+         \lst@CArgX =cut\^^M\relax\lst@DefDelimE
+           {\lst@CalcColumn}%
+%    \end{macrocode}
+% If there is additionally |cut|+EOL and if we are in |\lst@PODmode| but not in
+% column one, we must gobble the `end comment sequence'.
+%    \begin{macrocode}
+           {\ifnum\@tempcnta=\z@\else
+                \expandafter\@gobblethree
+            \fi}%
+           {}%
+           \lst@EndComment\lst@PODmode
+     \fi}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsubsection{Tags}
+%
+% \begin{aspect}{html}
+% Support for HTML and other `markup languages'.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{html}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@tagtypes}
+% Again we begin with the list of tag types. It's rather short.
+%    \begin{macrocode}
+\gdef\lst@tagtypes{s}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@TagKey}
+% Again we just put together the arguments for |\lst@Delim| and \ldots
+%    \begin{macrocode}
+\gdef\lst@TagKey#1#2{%
+    \lst@Delim\lst@tagstyle #2\relax
+        {Tag}\lst@tagtypes #1%
+                     {\lst@BeginTag\lst@EndTag}%
+        \@@end\@empty{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{tag}
+% \ldots\ we use the definition here.
+%    \begin{macrocode}
+\lst@Key{tag}\relax{\lst@TagKey\@empty{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{tagstyle}
+% You shouldn't need comments on the following two lines, do you?
+%    \begin{macrocode}
+\lst@Key{tagstyle}{}{\def\lst@tagstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@tagstyle\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BeginTag}
+% The special things here are: (1) We activate keyword detection inside tags
+% and (2) we initialize the switch |\lst@iffirstintag| if necessary.
+%    \begin{macrocode}
+\gdef\lst@BeginTag{%
+    \lst@DelimOpen
+        \lst@ifextags\else
+        {\let\lst@ifkeywords\iftrue
+         \lst@ifmarkfirstintag \lst@firstintagtrue \fi}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifextags\iffalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndTag}
+% is just like the other |\lst@End|\meta{whatever} definitions.
+%    \begin{macrocode}
+\gdef\lst@EndTag{\lst@DelimClose\lst@ifextags\else}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{usekeywordsintag}
+% \begin{lstkey}{markfirstintag}
+% The second key has already been `used'.
+%    \begin{macrocode}
+\lst@Key{usekeywordsintag}t[t]{\lstKV@SetIf{#1}\lst@ifusekeysintag}
+\lst@Key{markfirstintag}f[t]{\lstKV@SetIf{#1}\lst@ifmarkfirstintag}
+%    \end{macrocode}
+% For this, we install a (global) switch, \ldots
+%    \begin{macrocode}
+\gdef\lst@firstintagtrue{\global\let\lst@iffirstintag\iftrue}
+\global\let\lst@iffirstintag\iffalse
+%    \end{macrocode}
+% \ldots\ which is reset by the output of an identifier but not by other
+% output.
+%    \begin{macrocode}
+\lst@AddToHook{PostOutput}{\lst@tagresetfirst}
+\lst@AddToHook{Output}
+    {\gdef\lst@tagresetfirst{\global\let\lst@iffirstintag\iffalse}}
+\lst@AddToHook{OutputOther}{\gdef\lst@tagresetfirst{}}
+%    \end{macrocode}
+% Now we only need to test against this switch in the \hookname{Output} hook.
+%    \begin{macrocode}
+\lst@AddToHook{Output}
+    {\ifnum\lst@mode=\lst@tagmode
+         \lst@iffirstintag \let\lst@thestyle\lst@gkeywords@sty \fi
+%    \end{macrocode}
+% Moreover we check here, whether the keyword style is always to be used.
+%    \begin{macrocode}
+         \lst@ifusekeysintag\else \let\lst@thestyle\lst@gkeywords@sty\fi
+     \fi}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@tagmode}
+% We allocate the mode and \ldots
+%    \begin{macrocode}
+\lst@NewMode\lst@tagmode
+%    \end{macrocode}
+% deactivate keyword detection if any tag delimiter is defined (see below).
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\global\let\lst@ifnotag\iftrue}
+\lst@AddToHook{SelectCharTable}{\let\lst@ifkeywords\lst@ifnotag}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Tag@s}
+% The definition of the one and only delimiter type is not that interesting.
+% Compared with the others we set |\lst@ifnotag| and enter tag mode only if
+% we aren't in tag mode.
+%    \begin{macrocode}
+\gdef\lst@Tag@s#1#2\@empty#3#4#5{%
+    \global\let\lst@ifnotag\iffalse
+    \lst@CArg #1\relax\lst@DefDelimB {}{}%
+        {\ifnum\lst@mode=\lst@tagmode \expandafter\@gobblethree \fi}%
+        #3\lst@tagmode{#5}%
+    \lst@CArg #2\relax\lst@DefDelimE {}{}{}#4\lst@tagmode}%
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BeginCDATA}
+% This macro is used by the XML language definition.
+%    \begin{macrocode}
+\gdef\lst@BeginCDATA#1\@empty{%
+    \lst@TrackNewLines \lst@PrintToken
+    \lst@EnterMode\lst@GPmode{}\let\lst@ifmode\iffalse
+    \lst@mode\lst@tagmode #1\lst@mode\lst@GPmode\relax\lst@modetrue}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Replacing input}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{macro}{\lst@ReplaceInput}
+% is defined in terms of |\lst@CArgX| and |\lst@CDefX|.
+%    \begin{macrocode}
+\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{literate}
+% \lsthelper{Jason~Alexander}{1999/03/10}{literate programming} asked for
+% something like that. The key looks for a star and saves the argument.
+%    \begin{macrocode}
+\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if
+                             \def\lst@literate{#1}}
+\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey}
+                             {\lst@false\lst@Literatekey}#1\@nil@}
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@literate\@empty\else
+         \expandafter\lst@Literate\lst@literate{}\relax\z@
+     \fi}
+%    \end{macrocode}
+% Internally we don't make use of the `replace input' feature any more.
+%^^A We print the preceding text, assign token and length, and output it.
+%    \begin{macrocode}
+\def\lst@Literate#1#2#3{%
+    \ifx\relax#2\@empty\else
+        \lst@CArgX #1\relax\lst@CDef
+            {}
+            {\let\lst@next\@empty
+             \lst@ifxliterate
+                \lst@ifmode \let\lst@next\lst@CArgEmpty \fi
+             \fi
+             \ifx\lst@next\@empty
+                 \ifx\lst@OutputBox\@gobble\else
+                   \lst@XPrintToken \let\lst@scanmode\lst@scan@m
+                   \lst@token{#2}\lst@length#3\relax
+                   \lst@XPrintToken
+                 \fi
+                 \let\lst@next\lst@CArgEmptyGobble
+             \fi
+             \lst@next}%
+            \@empty
+        \expandafter\lst@Literate
+    \fi}
+\def\lst@CArgEmptyGobble#1\@empty{}
+%    \end{macrocode}
+% Note that we check |\lst@OutputBox| for being |\@gobble|. This is due to
+% a bug report by \lsthelper{Jared~Warren}{2003/07/10}{literate replacement
+% produces "ghosts"}.
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BeginDropInput}
+% We deactivate all `process' macros. |\lst@modetrue| does this for all
+% up-coming string delimiters, comments, and so on.
+%    \begin{macrocode}
+\def\lst@BeginDropInput#1{%
+    \lst@EnterMode{#1}%
+    {\lst@modetrue
+     \let\lst@OutputBox\@gobble
+     \let\lst@ifdropinput\iftrue
+     \let\lst@ProcessLetter\@gobble
+     \let\lst@ProcessDigit\@gobble
+     \let\lst@ProcessOther\@gobble
+     \let\lst@ProcessSpace\@empty
+     \let\lst@ProcessTabulator\@empty
+     \let\lst@ProcessFormFeed\@empty}}
+\let\lst@ifdropinput\iffalse % init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begingroup
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Escaping to \LaTeX}
+%
+% \begin{aspect}{escape}
+% We now define the \ldots\ damned \ldots\ the aspect has escaped!
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{escape}
+%    \end{macrocode}
+%
+% \begin{lstkey}{texcl}
+% Communication with \lsthelper{J\"orn~Wilms}{1997/07/07}{\TeX\ comments} is
+% responsible for this key. The definition and the first hooks are easy.
+%    \begin{macrocode}
+\lst@Key{texcl}{false}[t]{\lstKV@SetIf{#1}\lst@iftexcl}
+\lst@AddToHook{TextStyle}{\let\lst@iftexcl\iffalse}
+\lst@AddToHook{EOL}
+    {\ifnum\lst@mode=\lst@TeXLmode
+         \expandafter\lst@escapeend
+         \expandafter\lst@LeaveAllModes
+         \expandafter\lst@ReenterModes
+     \fi}
+%    \end{macrocode}
+% If the user wants \TeX\ comment lines, we print the comment separator and
+% interrupt the normal processing.
+%    \begin{macrocode}
+\lst@AddToHook{AfterBeginComment}
+    {\lst@iftexcl \lst@ifLmode \lst@ifdropinput\else
+         \lst@PrintToken
+         \lst@LeaveMode \lst@InterruptModes
+         \lst@EnterMode{\lst@TeXLmode}{\lst@modetrue\lst@commentstyle}%
+         \expandafter\expandafter\expandafter\lst@escapebegin
+     \fi \fi \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@NewMode\lst@TeXLmode
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@ActiveCDefX}
+% Same as |\lst@CDefX| but we both make |#1| active and assign a new catcode.
+%    \begin{macrocode}
+\gdef\lst@ActiveCDefX#1{\lst@ActiveCDefX@#1}
+\gdef\lst@ActiveCDefX@#1#2#3{
+    \catcode`#1\active\lccode`\~=`#1%
+    \lowercase{\lst@CDefIt~}{#2}{#3}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@Escape}
+% gets four arguments all in all. The first and second are the `begin' and
+% `end' escape sequences, the third is executed when the escape starts, and the
+% fourth right before ending it. We use the same mechanism as for \TeX\ comment
+% lines. The |\lst@ifdropinput| test has been added after a bug report by
+% \lsthelper{Michael~Weber}{2002/03/26}{escape on lines < firstline corrupts
+% output}.  The |\lst@newlines\z@| was added due to a bug report by
+% \lsthelper{Frank~Atanassow}{2004/10/07}{space after mathescape is not
+% preserved}.
+%    \begin{macrocode}
+\gdef\lst@Escape#1#2#3#4{%
+    \lst@CArgX #1\relax\lst@CDefX
+        {}%
+        {\lst@ifdropinput\else
+         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
+         \lst@InterruptModes
+         \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}%
+%    \end{macrocode}
+% Now we must define the character sequence to end the escape.
+%    \begin{macrocode}
+         \ifx\^^M#2%
+             \lst@CArg #2\relax\lst@ActiveCDefX
+                 {}%
+                 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}%
+                 {\lst@MProcessListing}%
+         \else
+             \lst@CArg #2\relax\lst@ActiveCDefX
+                 {}%
+                 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes
+                  \lst@newlines\z@ \lst@whitespacefalse}%
+                 {}%
+         \fi
+         #3\lst@escapebegin
+         \fi}%
+        {}}
+%    \end{macrocode}
+% The |\lst@whitespacefalse| above was added after a bug report from
+% \lsthelper{Martin~Steffen}{2001/04/07}{mathescape drops subsequent space}.
+%    \begin{macrocode}
+\lst@NewMode\lst@TeXmode
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{escapebegin}
+% \begin{lstkey}{escapeend}
+% The keys simply store the arguments.
+%    \begin{macrocode}
+\lst@Key{escapebegin}{}{\def\lst@escapebegin{#1}}
+\lst@Key{escapeend}{}{\def\lst@escapeend{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{escapechar}
+% The introduction of this key is due to a communication with \lsthelper
+% {Rui~Oliveira}{1998/06/05}{escape characters}. We define |\lst@DefEsc| and
+% execute it after selecting the standard character table.
+%    \begin{macrocode}
+\lst@Key{escapechar}{}
+    {\ifx\@empty#1\@empty
+         \let\lst@DefEsc\relax
+     \else
+         \def\lst@DefEsc{\lst@Escape{#1}{#1}{}{}}%
+     \fi}
+\lst@AddToHook{TextStyle}{\let\lst@DefEsc\@empty}
+\lst@AddToHook{SelectCharTable}{\lst@DefEsc}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{escapeinside}
+% Nearly the same.
+%    \begin{macrocode}
+\lst@Key{escapeinside}{}{\lstKV@TwoArg{#1}%
+    {\let\lst@DefEsc\@empty
+     \ifx\@empty##1@empty\else \ifx\@empty##2\@empty\else
+         \def\lst@DefEsc{\lst@Escape{##1}{##2}{}{}}%
+     \fi\fi}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{mathescape}
+% This is a switch and checked after character table selection. We use
+% |\lst@Escape| with math shifts as arguments, but all inside |\hbox|
+% to determine the correct width.
+%    \begin{macrocode}
+\lst@Key{mathescape}{false}[t]{\lstKV@SetIf{#1}\lst@ifmathescape}
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifmathescape \lst@Escape{\$}{\$}%
+        {\setbox\@tempboxa=\hbox\bgroup$}%
+        {$\egroup \lst@CalcLostSpaceAndOutput}\fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \section{Keywords}
+%
+%
+% \subsection{Making tests}\label{iMakingTests}
+%
+% \begin{aspect}{keywords}
+% We begin a new and very important aspect.
+% First of all we need to initialize some variables in order to work around a
+% bug reported by \lsthelper{Beat~Birkhofer}{2001/06/15}{savemem doesn't work}.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{keywords}
+%    \end{macrocode}
+%    \begin{macrocode}
+\global\let\lst@ifsensitive\iftrue % init
+\global\let\lst@ifsensitivedefed\iffalse % init % \global
+%    \end{macrocode}
+% All keyword tests take the following three arguments.
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@|\meta{name}|@list| (a list of macros which contain the keywords)
+% \item |\lst@g|\meta{name}|@sty| (global style macro)
+% \end{macroargs}
+% We begin with non memory-saving tests.
+% \begingroup
+%    \begin{macrocode}
+\lst@ifsavemem\else
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{macro}{\lst@KeywordTest}
+% Fast keyword tests take advance of the |\lst@UM| construction in section
+% \ref{iCharacterTables}. If |\lst@UM| is empty, all `use macro' characters
+% expand to their original characters. Since |\lst|\meta{prefix}|@|\meta{keyword}
+% will be equivalent to the appropriate style, we only need to build the control
+% sequence |\lst|\meta{prefix}|@|\meta{current token} and assign it to
+% |\lst@thestyle|.
+%    \begin{macrocode}
+\gdef\lst@KeywordTest#1#2#3{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#1@\the\lst@token\endcsname
+    \endgroup
+    \ifx\@gtempa\relax\else
+        \let\lst@thestyle\@gtempa
+    \fi}
+%    \end{macrocode}
+% Note that we need neither |#2| nor |#3| here.
+% \end{macro}
+%
+% \begin{macro}{\lst@KEYWORDTEST}
+% Case insensitive tests make the current character string upper case and give
+% it to a submacro similar to |\lst@KeywordTest|.
+%    \begin{macrocode}
+\gdef\lst@KEYWORDTEST{%
+    \uppercase\expandafter{\expandafter
+        \lst@KEYWORDTEST@\the\lst@token}\relax}
+\gdef\lst@KEYWORDTEST@#1\relax#2#3#4{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#2@#1\endcsname
+    \endgroup
+    \ifx\@gtempa\relax\else
+        \let\lst@thestyle\@gtempa
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@WorkingTest}
+% \begin{macro}{\lst@WORKINGTEST}
+% The same except that |\lst|\meta{prefix}|@|\meta{current token} might be
+% a working procedure; it is executed.
+%    \begin{macrocode}
+\gdef\lst@WorkingTest#1#2#3{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#1@\the\lst@token\endcsname
+    \endgroup
+    \@gtempa}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@WORKINGTEST{%
+    \uppercase\expandafter{\expandafter
+        \lst@WORKINGTEST@\the\lst@token}\relax}
+\gdef\lst@WORKINGTEST@#1\relax#2#3#4{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#2@#1\endcsname
+    \endgroup
+    \@gtempa}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@DefineKeywords}
+% Eventually we need macros which define and undefine
+% |\lst|\meta{prefix}|@|\meta{keyword}. Here the arguments are
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@|\meta{name} (a keyword list)
+% \item |\lst@g|\meta{name}|@sty|
+% \end{macroargs}
+% We make the keywords upper case if necessary, \ldots
+%    \begin{macrocode}
+\gdef\lst@DefineKeywords#1#2#3{%
+    \lst@ifsensitive
+        \def\lst@next{\lst@for#2}%
+    \else
+        \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}%
+    \fi
+    \lst@next\do
+%    \end{macrocode}
+% \ldots\space iterate through the list, and make
+% |\lst|\meta{prefix}|@|\meta{keyword} (if undefined) equivalent to
+% |\lst@g|\meta{name}|@sty| which is possibly a working macro.
+%    \begin{macrocode}
+    {\expandafter\ifx\csname\@lst#1@##1\endcsname\relax
+        \global\expandafter\let\csname\@lst#1@##1\endcsname#3%
+     \fi}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@UndefineKeywords}
+% We make the keywords upper case if necessary, \ldots
+%    \begin{macrocode}
+\gdef\lst@UndefineKeywords#1#2#3{%
+    \lst@ifsensitivedefed
+        \def\lst@next{\lst@for#2}%
+    \else
+        \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}%
+    \fi
+    \lst@next\do
+%    \end{macrocode}
+% \ldots\space iterate through the list, and `undefine'
+% |\lst|\meta{prefix}|@|\meta{keyword} if it's equivalent to
+% |\lst@g|\meta{name}|@sty|.
+%    \begin{macrocode}
+    {\expandafter\ifx\csname\@lst#1@##1\endcsname#3%
+        \global\expandafter\let\csname\@lst#1@##1\endcsname\relax
+     \fi}}
+%    \end{macrocode}
+% Thanks to \lsthelper{Magnus~Lewis-Smith}{1999/09/08}{keywords do not
+% undefine} a wrong |#2| in the replacement text could be changed to |#3|.
+% \end{macro}
+%
+% \begingroup
+% And now memory-saving tests.
+%    \begin{macrocode}
+\fi
+\lst@ifsavemem
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{macro}{\lst@IfOneOutOf}
+% The definition here is similar to |\lst@IfOneOf|, but its second argument
+% is a |\lst@|\meta{name}|@list|. Therefore we test a list of macros here.
+%    \begin{macrocode}
+\gdef\lst@IfOneOutOf#1\relax#2{%
+    \def\lst@temp##1,#1,##2##3\relax{%
+        \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}%
+    \def\lst@next{\lst@IfOneOutOf@#1\relax}%
+    \expandafter\lst@next#2\relax\relax}
+%    \end{macrocode}
+% We either execute the \meta{else} part or make the next test.
+%    \begin{macrocode}
+\gdef\lst@IfOneOutOf@#1\relax#2#3{%
+    \ifx#2\relax
+        \expandafter\@secondoftwo
+    \else
+        \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax
+        \expandafter\lst@next
+    \fi}
+\ifx\iffalse\else\fi
+\gdef\lst@IOOOfirst#1\relax#2#3{\fi#2}
+%    \end{macrocode}
+% The line |\ifx\iffalse\else\fi| balances the |\fi| inside |\lst@IOOOfirst|.
+% \end{macro}
+%
+% \begin{macro}{\lst@IFONEOUTOF}
+% As in |\lst@IFONEOF| we need two |\uppercase|s here.
+%    \begin{macrocode}
+\gdef\lst@IFONEOUTOF#1\relax#2{%
+    \uppercase{\def\lst@temp##1,#1},##2##3\relax{%
+        \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}%
+    \def\lst@next{\lst@IFONEOUTOF@#1\relax}%
+    \expandafter\lst@next#2\relax}
+\gdef\lst@IFONEOUTOF@#1\relax#2#3{%
+    \ifx#2\relax
+        \expandafter\@secondoftwo
+    \else
+        \uppercase
+            {\expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}%
+        \expandafter\lst@next
+    \fi}
+%    \end{macrocode}
+% Note: The third last line uses the fact that keyword lists (not the list
+% of keyword lists) are already made upper case if keywords are insensitive.
+% \end{macro}
+%
+% \begin{macro}{\lst@KWTest}
+% is a helper for the keyword and working identifier tests. We expand the
+% token and call |\lst@IfOneOf|. The tests below will append appropriate
+% \meta{then} and \meta{else} arguments.
+%    \begin{macrocode}
+\gdef\lst@KWTest{%
+    \begingroup \let\lst@UM\@empty
+    \expandafter\xdef\expandafter\@gtempa\expandafter{\the\lst@token}%
+    \endgroup
+    \expandafter\lst@IfOneOutOf\@gtempa\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@KeywordTest}
+% \begin{macro}{\lst@KEYWORDTEST}
+% are fairly easy now. Note that we don't need |#1|=\meta{prefix} here.
+%    \begin{macrocode}
+\gdef\lst@KeywordTest#1#2#3{\lst@KWTest #2{\let\lst@thestyle#3}{}}
+\global\let\lst@KEYWORDTEST\lst@KeywordTest
+%    \end{macrocode}
+% For case insensitive tests we assign the insensitive version to
+% |\lst@IfOneOutOf|. Thus we need no extra definition here.
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@WorkingTest}
+% \begin{macro}{\lst@WORKINGTEST}
+% Ditto.
+%    \begin{macrocode}
+\gdef\lst@WorkingTest#1#2#3{\lst@KWTest #2#3{}}
+\global\let\lst@WORKINGTEST\lst@WorkingTest
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begingroup
+%    \begin{macrocode}
+\fi
+%    \end{macrocode}
+% \endgroup
+%
+% \begin{lstkey}{sensitive}
+% is a switch, preset \texttt{true} every language selection.
+%    \begin{macrocode}
+\lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive}
+\lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}
+%    \end{macrocode}
+% We select case insensitive definitions if necessary.
+%    \begin{macrocode}
+\lst@AddToHook{Init}
+    {\lst@ifsensitive\else
+         \let\lst@KeywordTest\lst@KEYWORDTEST
+         \let\lst@WorkingTest\lst@WORKINGTEST
+         \let\lst@IfOneOutOf\lst@IFONEOUTOF
+     \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@MakeMacroUppercase}
+% makes the contents of |#1| (if defined) upper case.
+%    \begin{macrocode}
+\gdef\lst@MakeMacroUppercase#1{%
+    \ifx\@undefined#1\else \uppercase\expandafter
+        {\expandafter\def\expandafter#1\expandafter{#1}}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Installing tests}
+%
+% \begin{macro}{\lst@InstallTest}
+% The arguments are
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@|\meta{name}|@list|
+% \item |\lst@|\meta{name}
+% \item |\lst@g|\meta{name}|@list|
+% \item |\lst@g|\meta{name}
+% \item |\lst@g|\meta{name}|@sty|
+% \item \alternative{w,s} (working procedure or style)
+% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook)
+% \end{macroargs}
+% We just insert hook material. The tests will be inserted on demand.
+%    \begin{macrocode}
+\gdef\lst@InstallTest#1#2#3#4#5#6#7#8{%
+    \lst@AddToHook{TrackKeywords}{\lst@TrackKeywords{#1}#2#4#6#7#8}%
+    \lst@AddToHook{PostTrackKeywords}{\lst@PostTrackKeywords#2#3#4#5}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\lsthk@TrackKeywords\lsthk@PostTrackKeywords}
+\lst@AddToHook{TrackKeywords}
+    {\global\let\lst@DoDefineKeywords\@empty}% init
+\lst@AddToHook{PostTrackKeywords}
+    {\lst@DoDefineKeywords
+     \global\let\lst@DoDefineKeywords\@empty}% init
+%    \end{macrocode}
+% We have to detect the keywords somewhere.
+%    \begin{macrocode}
+\lst@AddToHook{Output}{\lst@ifkeywords \lsthk@DetectKeywords \fi}
+\lst@AddToHook{DetectKeywords}{}% init
+\lst@AddToHook{ModeTrue}{\let\lst@ifkeywords\iffalse}
+\lst@AddToHookExe{Init}{\let\lst@ifkeywords\iftrue}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InstallTestNow}
+% actually inserts a test.
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@|\meta{name}|@list|
+% \item |\lst@g|\meta{name}|@sty|
+% \item \alternative{w,s} (working procedure or style)
+% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook)
+% \end{macroargs}
+% For example, |#4#5|=|sd| will add
+%    |\lst@KeywordTest{|\meta{prefix}|}|
+%       |\lst@|\meta{name}|@list| |\lst@g|\meta{name}|@sty|
+% to the \hookname{DetectKeywords} hook.
+%    \begin{macrocode}
+\gdef\lst@InstallTestNow#1#2#3#4#5{%
+    \@ifundefined{\string#2#1}%
+    {\global\@namedef{\string#2#1}{}%
+     \edef\@tempa{%
+         \noexpand\lst@AddToHook{\ifx#5dDetectKeywords\else Output\fi}%
+         {\ifx #4w\noexpand\lst@WorkingTest
+             \else\noexpand\lst@KeywordTest \fi
+          {#1}\noexpand#2\noexpand#3}}%
+%    \end{macrocode}
+% If we are advised to save memory, we insert a test for each \meta{name}.
+% Otherwise we install the tests according to \meta{prefix}.
+%    \begin{macrocode}
+     \lst@ifsavemem
+         \@tempa
+     \else
+         \@ifundefined{\@lst#1@if@ins}%
+             {\@tempa \global\@namedef{\@lst#1@if@ins}{}}%
+             {}%
+     \fi}
+    {}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@TrackKeywords}
+% Now it gets a bit tricky. We expand the class list |\lst@|\meta{name}|@list|
+% behind |\lst@TK@{|\meta{prefix}|}||\lst@g|\meta{name}|@sty| and use two
+% |\relax|es as terminators. This will define the keywords of all the classes
+% as keywords of type \meta{prefix}. More details come soon.
+%    \begin{macrocode}
+\gdef\lst@TrackKeywords#1#2#3#4#5#6{%
+    \lst@false
+    \def\lst@arg{{#1}#4}%
+    \expandafter\expandafter\expandafter\lst@TK@
+        \expandafter\lst@arg#2\relax\relax
+%    \end{macrocode}
+% And nearly the same to undefine all out-dated keywords, which is necessary
+% only if we don't save memory.
+%    \begin{macrocode}
+    \lst@ifsavemem\else
+        \def\lst@arg{{#1}#4#2}%
+        \expandafter\expandafter\expandafter\lst@TK@@
+            \expandafter\lst@arg#3\relax\relax
+    \fi
+%    \end{macrocode}
+% Finally we install the keyword test if keywords changed, in particular if
+% they are defined the first time. Note that |\lst@InstallTestNow| inserts a
+% test only once.
+%    \begin{macrocode}
+    \lst@if \lst@InstallTestNow{#1}#2#4#5#6\fi}
+%    \end{macrocode}
+% Back to the current keywords. Global macros |\lst@g|\meta{id} contain
+% globally defined keywords, whereas |\lst@|\meta{id} conatin the true
+% keywords. This way we can keep track of the keywords: If keywords or
+% \keyname{sensitive} changed, we undefine the old (= globally defined)
+% keywords and define the true ones. The arguments of |\lst@TK@| are
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@g|\meta{name}|@sty|
+% \item |\lst@|\meta{id}
+% \item |\lst@g|\meta{id}
+% \end{macroargs}
+% Thanks to \lsthelper{Holger~Arndt}{2004/05/27}{bad \lst@UndefineKeywords
+% \lst@DefineKeywords sequence if keyword crosses orders in two languages}
+% the definition of keywords is now delayed via |\lst@DoDefineKeywords|.
+%    \begin{macrocode}
+\gdef\lst@TK@#1#2#3#4{%
+  \ifx\lst@ifsensitive\lst@ifsensitivedefed
+    \ifx#3#4\else
+      \lst@true
+      \lst@ifsavemem\else
+          \lst@UndefineKeywords{#1}#4#2%
+          \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}%
+      \fi
+    \fi
+  \else
+    \ifx#3\relax\else
+      \lst@true
+      \lst@ifsavemem\else
+          \lst@UndefineKeywords{#1}#4#2%
+          \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}%
+      \fi
+    \fi
+  \fi
+%    \end{macrocode}
+% We don't define and undefine keywords if we try to save memory. But we
+% possibly need to make them upper case, which again wastes some memory.
+%    \begin{macrocode}
+  \lst@ifsavemem \ifx#3\relax\else
+      \lst@ifsensitive\else \lst@MakeMacroUppercase#3\fi
+  \fi \fi
+%    \end{macrocode}
+% Reaching the end of the class list, we end the loop.
+%    \begin{macrocode}
+  \ifx#3\relax
+      \expandafter\@gobblethree
+  \fi
+  \lst@TK@{#1}#2}
+%    \end{macrocode}
+% Here now we undefine the out-dated keywords. While not reaching the end of
+% the global list, we look whether the keyword class |#4#5| is still in use or
+% needs to be undefined. Our arguments are
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item |\lst@g|\meta{name}|@sty|
+% \item |\lst@|\meta{name}|@list|
+% \item |\lst@|\meta{id}
+% \item |\lst@g|\meta{id}
+% \end{macroargs}
+%    \begin{macrocode}
+\gdef\lst@TK@@#1#2#3#4#5{%
+    \ifx#4\relax
+        \expandafter\@gobblefour
+    \else
+        \lst@IfSubstring{#4#5}#3{}{\lst@UndefineKeywords{#1}#5#2}%
+    \fi
+    \lst@TK@@{#1}#2#3}
+%    \end{macrocode}
+% Keywords are up-to-date after \hookname{InitVars}.
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}
+    {\global\let\lst@ifsensitivedefed\lst@ifsensitive}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@PostTrackKeywords}
+% After updating all the keywords, the global keywords and the global list
+% become equivalent to the local ones.
+%    \begin{macrocode}
+\gdef\lst@PostTrackKeywords#1#2#3#4{%
+    \lst@ifsavemem\else
+        \global\let#3#1%
+        \global\let#4#2%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Classes and families}
+%
+% \begin{lstkey}{classoffset}
+% just stores the argument in a macro.
+%    \begin{macrocode}
+\lst@Key{classoffset}\z@{\def\lst@classoffset{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@InstallFamily}
+% Recall the parameters
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item \meta{name}
+% \item \meta{style name}
+% \item \meta{style init}
+% \item \meta{default style name}
+% \item \meta{working procedure}
+% \item \alternative{l,o} (language or other key)
+% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook)
+% \end{macroargs}
+% First we define the keys and the style key \meta{style name} if and only if
+% the name is not empty.
+%    \begin{macrocode}
+\gdef\lst@InstallFamily#1#2#3#4#5{%
+    \lst@Key{#2}\relax{\lst@UseFamily{#2}##1\relax\lst@MakeKeywords}%
+    \lst@Key{more#2}\relax
+        {\lst@UseFamily{#2}##1\relax\lst@MakeMoreKeywords}%
+    \lst@Key{delete#2}\relax
+        {\lst@UseFamily{#2}##1\relax\lst@DeleteKeywords}%
+    \ifx\@empty#3\@empty\else
+        \lst@Key{#3}{#4}{\lstKV@OptArg[\@ne]{##1}%
+            {\@tempcnta\lst@classoffset \advance\@tempcnta####1\relax
+             \@namedef{lst@#3\ifnum\@tempcnta=\@ne\else \the\@tempcnta
+                             \fi}{####2}}}%
+    \fi
+    \expandafter\lst@InstallFamily@
+        \csname\@lst @#2@data\expandafter\endcsname
+        \csname\@lst @#5\endcsname {#1}{#2}{#3}}
+%    \end{macrocode}
+% Now we check whether \meta{working procedure} is empty. Accordingly we use
+% \texttt working procedure or \texttt style in the `data' definition.
+% The working procedure is defined right here if necessary.
+%    \begin{macrocode}
+\gdef\lst@InstallFamily@#1#2#3#4#5#6#7#8{%
+    \gdef#1{{#3}{#4}{#5}#2#7}%
+    \long\def\lst@temp##1{#6}%
+    \ifx\lst@temp\@gobble
+        \lst@AddTo#1{s#8}%
+    \else
+        \lst@AddTo#1{w#8}%
+        \global\@namedef{lst@g#4@wp}##1{#6}%
+    \fi}
+%    \end{macrocode}
+% Nothing else is defined here, all the rest is done on demand.
+% \end{macro}
+%
+% \begin{macro}{\lst@UseFamily}
+% We look for the optional class number, provide this member, \ldots
+%    \begin{macrocode}
+\gdef\lst@UseFamily#1{%
+    \def\lst@family{#1}%
+    \@ifnextchar[\lst@UseFamily@{\lst@UseFamily@[\@ne]}}
+\gdef\lst@UseFamily@[#1]{%
+    \@tempcnta\lst@classoffset \advance\@tempcnta#1\relax
+    \lst@ProvideFamily\lst@family
+%    \end{macrocode}
+% \ldots\space and build the control sequences \ldots
+%    \begin{macrocode}
+    \lst@UseFamily@a
+        {\lst@family\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}
+\gdef\lst@UseFamily@a#1{%
+    \expandafter\lst@UseFamily@b
+       \csname\@lst @#1@list\expandafter\endcsname
+       \csname\@lst @#1\expandafter\endcsname
+       \csname\@lst @#1@also\expandafter\endcsname
+       \csname\@lst @g#1\endcsname}
+%    \end{macrocode}
+% \ldots\space required for |\lst@MakeKeywords| and |#6|.
+%    \begin{macrocode}
+\gdef\lst@UseFamily@b#1#2#3#4#5\relax#6{\lstKV@XOptArg[]{#5}#6#1#2#3#4}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ProvideFamily}
+% provides the member `|\the\@tempcnta|' of the family |#1|. We do nothing if
+% the member already exists. Otherwise we expand the data macro defined above.
+% Note that we don't use the counter if it equals one. Since a bug report by
+% \lsthelper{Kris~Luyten}{2002/08/03}{Undefined control sequence \lst@thestyle}
+% keyword families use the prefix |lstfam| instead of |lst|. The marker
+% |\lstfam@#1|\oarg{number} is defined globally since a bug report by
+% \lsthelper{Edsko~de~Vries}{2003/07/20}{bad keywords with language selections
+% only in optional arguments}.
+%    \begin{macrocode}
+\gdef\lst@ProvideFamily#1{%
+    \@ifundefined{lstfam@#1\ifnum\@tempcnta=\@ne\else\the\@tempcnta\fi}%
+    {\global\@namedef{lstfam@#1\ifnum\@tempcnta=\@ne\else
+                                        \the\@tempcnta\fi}{}%
+     \expandafter\expandafter\expandafter\lst@ProvideFamily@
+         \csname\@lst @#1@data\endcsname
+         {\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}%
+    {}}%
+%    \end{macrocode}
+% Now we have the following arguments
+% \begin{macroargs}
+% \item \meta{prefix}
+% \item \meta{name}
+% \item \meta{style name}
+% \item \meta{default style name}
+% \item \alternative{l,o} (language or other key)
+% \item \alternative{w,s} (working procedure or style)
+% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook)
+% \item |\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi|
+% \end{macroargs}
+% We define |\lst@g|\meta{name}\meta{number}|@sty| to call either
+% |\lst@g|\meta{name}|@wp| with the number as argument or
+% |\lst@|\meta{style name}\meta{number} where the number belongs to the control
+% sequence.
+%    \begin{macrocode}
+\gdef\lst@ProvideFamily@#1#2#3#4#5#6#7#8{%
+    \expandafter\xdef\csname\@lst @g#2#8@sty\endcsname
+    {\if #6w%
+         \expandafter\noexpand\csname\@lst @g#2@wp\endcsname{#8}%
+     \else
+         \expandafter\noexpand\csname\@lst @#3#8\endcsname
+     \fi}%
+%    \end{macrocode}
+% We ensure the existence of the style macro. This is done in the
+% \hookname{Init} hook by assigning the default style if necessary.
+%    \begin{macrocode}
+    \ifx\@empty#3\@empty\else
+        \edef\lst@temp{\noexpand\lst@AddToHook{Init}{%
+            \noexpand\lst@ProvideStyle\expandafter\noexpand
+                \csname\@lst @#3#8\endcsname\noexpand#4}}%
+        \lst@temp
+    \fi
+%    \end{macrocode}
+% We call a submacro to do the rest. It requires some control sequences.
+%    \begin{macrocode}
+    \expandafter\lst@ProvideFamily@@
+         \csname\@lst @#2#8@list\expandafter\endcsname
+         \csname\@lst @#2#8\expandafter\endcsname
+         \csname\@lst @#2#8@also\expandafter\endcsname
+         \csname\@lst @g#2#8@list\expandafter\endcsname
+         \csname\@lst @g#2#8\expandafter\endcsname
+         \csname\@lst @g#2#8@sty\expandafter\endcsname
+         {#1}#5#6#7}
+%    \end{macrocode}
+% Now we have (except that \meta{number} is possibly always missing)
+% \begin{macroargs}
+% \item |\lst@|\meta{name}\meta{number}|@list|
+% \item |\lst@|\meta{name}\meta{number}
+% \item |\lst@|\meta{name}\meta{number}|@also|
+% \item |\lst@g|\meta{name}\meta{number}|@list|
+% \item |\lst@g|\meta{name}\meta{number}
+% \item |\lst@g|\meta{name}\meta{number}|@sty|
+% \item \meta{prefix}
+% \item \alternative{l,o} (language or other key)
+% \item \alternative{w,s} (working procedure or style)
+% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook)
+% \end{macroargs}
+% Note that |#9| and `|#10|' are read by |\lst@InstallTest|. We initialize all
+% required `variables' (at \hookname{SetLanguage}) and install the test (which
+% definition is in fact also delayed).
+%    \begin{macrocode}
+\gdef\lst@ProvideFamily@@#1#2#3#4#5#6#7#8{%
+    \gdef#1{#2#5}\global\let#2\@empty \global\let#3\@empty % init
+    \gdef#4{#2#5}\global\let#5\@empty % init
+    \if #8l\relax
+        \lst@AddToHook{SetLanguage}{\def#1{#2#5}\let#2\@empty}%
+    \fi
+    \lst@InstallTest{#7}#1#2#4#5#6}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InstallKeywords}
+% Now we take advance of the optional argument construction above. Thus, we
+% just insert |[\@ne]| as \meta{number} in the definitions of the keys.
+%    \begin{macrocode}
+\gdef\lst@InstallKeywords#1#2#3#4#5{%
+    \lst@Key{#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeKeywords}%
+    \lst@Key{more#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeMoreKeywords}%
+    \lst@Key{delete#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@DeleteKeywords}%
+    \ifx\@empty#3\@empty\else
+        \lst@Key{#3}{#4}{\@namedef{lst@#3}{##1}}%
+    \fi
+    \expandafter\lst@InstallFamily@
+        \csname\@lst @#2@data\expandafter\endcsname
+        \csname\@lst @#5\endcsname {#1}{#2}{#3}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ProvideStyle}
+% If the style macro |#1| is not defined, it becomes equivalent to |#2|.
+%    \begin{macrocode}
+\gdef\lst@ProvideStyle#1#2{%
+    \ifx#1\@undefined \let#1#2%
+    \else\ifx#1\relax \let#1#2\fi\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% Finally we define |\lst@MakeKeywords|, \ldots, |\lst@DeleteKeywords|.
+% We begin with two helper.
+%
+% \begin{macro}{\lst@BuildClassList}
+% After |#1| follows a comma separated list of keyword classes terminated by
+% |,\relax,|, e.g.~|keywords2,emph1,\relax,|. For each \meta{item} in this
+% list we \emph{append} the two macros |\lst@|\meta{item}|\lst@g|\meta{item}
+% to |#1|.
+%    \begin{macrocode}
+\gdef\lst@BuildClassList#1#2,{%
+    \ifx\relax#2\@empty\else
+        \ifx\@empty#2\@empty\else
+            \lst@lExtend#1{\csname\@lst @#2\expandafter\endcsname
+                           \csname\@lst @g#2\endcsname}%
+        \fi
+        \expandafter\lst@BuildClassList\expandafter#1
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DeleteClassesIn}
+% deletes pairs of tokens, namely the arguments |#2#3| to the submacro.
+%    \begin{macrocode}
+\gdef\lst@DeleteClassesIn#1#2{%
+    \expandafter\lst@DCI@\expandafter#1#2\relax\relax}
+\gdef\lst@DCI@#1#2#3{%
+    \ifx#2\relax
+        \expandafter\@gobbletwo
+    \else
+%    \end{macrocode}
+% If we haven't reached the end of the class list, we define a temporary macro
+% which removes all appearances.
+%    \begin{macrocode}
+        \def\lst@temp##1#2#3##2{%
+            \lst@lAddTo#1{##1}%
+            \ifx ##2\relax\else
+                \expandafter\lst@temp
+            \fi ##2}%
+        \let\@tempa#1\let#1\@empty
+        \expandafter\lst@temp\@tempa#2#3\relax
+    \fi
+    \lst@DCI@#1}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MakeKeywords}
+% We empty some macros and make use of |\lst@MakeMoreKeywords|.
+% Note that this and the next two definitions have the following arguments:
+% \begin{macroargs}
+% \item class list (in brackets)
+% \item keyword list
+% \item |\lst@|\meta{name}|@list|
+% \item |\lst@|\meta{name}
+% \item |\lst@|\meta{name}|@also|
+% \item |\lst@g|\meta{name}
+% \end{macroargs}
+%    \begin{macrocode}
+\gdef\lst@MakeKeywords[#1]#2#3#4#5#6{%
+    \def#3{#4#6}\let#4\@empty \let#5\@empty
+    \lst@MakeMoreKeywords[#1]{#2}#3#4#5#6}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MakeMoreKeywords}
+% We append classes and keywords.
+%    \begin{macrocode}
+\gdef\lst@MakeMoreKeywords[#1]#2#3#4#5#6{%
+    \lst@BuildClassList#3#1,\relax,%
+    \lst@DefOther\lst@temp{,#2}\lst@lExtend#4\lst@temp}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@DeleteKeywords}
+% We convert the keyword arguments via |\lst@MakeKeywords| and remove the
+% classes and keywords.
+%    \begin{macrocode}
+\gdef\lst@DeleteKeywords[#1]#2#3#4#5#6{%
+    \lst@MakeKeywords[#1]{#2}\@tempa\@tempb#5#6%
+    \lst@DeleteClassesIn#3\@tempa
+    \lst@DeleteKeysIn#4\@tempb}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Main families and classes}
+%
+%
+% \paragraph{Keywords}
+%
+% \begin{lstkey}{keywords}
+% Defining the keyword family gets very, very easy.
+%    \begin{macrocode}
+\lst@InstallFamily k{keywords}{keywordstyle}\bfseries{keywordstyle}{}ld
+%    \end{macrocode}
+% The following macro sets a keywordstyle, which \ldots
+%    \begin{macrocode}
+\gdef\lst@DefKeywordstyle#1#2\@nil@{%
+   \@namedef{lst@keywordstyle\ifnum\@tempcnta=\@ne\else\the\@tempcnta
+                             \fi}{#1#2}}%
+%    \end{macrocode}
+% \ldots\space is put together here. If we detect a star after the class
+% number, we insert code to make the keyword uppercase.
+%    \begin{macrocode}
+\lst@Key{keywordstyle}{\bfseries}{\lstKV@OptArg[\@ne]{#1}%
+  {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax
+   \@ifstar{\lst@DefKeywordstyle{\uppercase\expandafter{%
+                                 \expandafter\lst@token
+                                 \expandafter{\the\lst@token}}}}%
+           {\lst@DefKeywordstyle{}}##2\@nil@}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{ndkeywords}
+% Second order keywords use the same trick as |\lst@InstallKeywords|.
+%    \begin{macrocode}
+\lst@Key{ndkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeKeywords}%
+\lst@Key{morendkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeMoreKeywords}%
+\lst@Key{deletendkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@DeleteKeywords}%
+\lst@Key{ndkeywordstyle}\relax{\@namedef{lst@keywordstyle2}{#1}}%
+%    \end{macrocode}
+% \lsthelper{Dr.~Peter~Leibner}{1999/11/05}{undefined \lst@UseKeywords,
+% Illegal parameter number (##1)} reported two bugs: |\lst@UseKeywords| and
+% |##1| became |\lst@UseFamily| and |#1|.
+% \end{lstkey}
+%
+% \begin{lstkey}{keywordsprefix}
+% is implemented experimentally. The one and only prefix indicates its
+% presence by making |\lst@prefixkeyword| empty. We can catch this information
+% in the \keyname{Output} hook.
+%    \begin{macrocode}
+\lst@Key{keywordsprefix}\relax{\lst@DefActive\lst@keywordsprefix{#1}}
+\global\let\lst@keywordsprefix\@empty
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@keywordsprefix\@empty\else
+         \expandafter\lst@CArg\lst@keywordsprefix\relax
+             \lst@CDef{}%
+                      {\lst@ifletter\else
+                           \global\let\lst@prefixkeyword\@empty
+                       \fi}%
+                      {}%
+     \fi}
+\lst@AddToHook{Init}{\global\let\lst@prefixkeyword\relax}
+\lst@AddToHook{Output}
+    {\ifx\lst@prefixkeyword\@empty
+         \let\lst@thestyle\lst@gkeywords@sty
+         \global\let\lst@prefixkeyword\relax
+     \fi}%
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{otherkeywords}
+% Thanks to \lsthelper{Bradford~Chamberlain}{2001/07/07}{otherkeywords={@,@^}
+% does not work} we now iterate down the list of `other keywords' and make each
+% active---instead of making the whole argument active. We append the active
+% token sequence to |\lst@otherkeywords| to define each `other' keyword.
+%    \begin{macrocode}
+\lst@Key{otherkeywords}{}{%
+    \let\lst@otherkeywords\@empty
+    \lst@for{#1}\do{%
+      \lst@MakeActive{##1}%
+      \lst@lExtend\lst@otherkeywords{%
+          \expandafter\lst@CArg\lst@temp\relax\lst@CDef
+              {}\lst@PrintOtherKeyword\@empty}}}
+\lst@AddToHook{SelectCharTable}{\lst@otherkeywords}
+%    \end{macrocode}
+% |\lst@PrintOtherkeyword| has been changed to |\lst@PrintOtherKeyword| after a
+% bug report by \lsthelper{Peter~Bartke}{2001/11/06}{undefined control sequence
+% \lst@PrintOtherkeyword}.
+% \end{lstkey}
+%
+% \begin{macro}{\lst@PrintOtherKeyword}
+% print preceding characters, prepare the output and typeset the argument in
+% keyword style. \lsthelper{James~Willans}{2004/07/23}{problem: otherkeywords}
+% reported problems when the output routine is invoked within |\begingroup| and
+% |\endgroup|. Now the definition is restructured.
+%    \begin{macrocode}
+\gdef\lst@PrintOtherKeyword#1\@empty{%
+    \lst@XPrintToken
+    \begingroup
+      \lst@modetrue \lsthk@TextStyle
+      \let\lst@ProcessDigit\lst@ProcessLetter
+      \let\lst@ProcessOther\lst@ProcessLetter
+      \lst@lettertrue
+      #1%
+	  \lst@SaveToken
+    \endgroup
+	\lst@RestoreToken
+	\global\let\lst@savedcurrstyle\lst@currstyle
+	\let\lst@currstyle\lst@gkeywords@sty
+    \lst@Output
+	\let\lst@currstyle\lst@savedcurrstyle}
+%    \end{macrocode}
+% \begin{TODO}
+% Which part of \hookname{TextStyle} hook is required? Is it required anymore,
+% i.e.after the restruction? Need to move it elsewhere?
+% \end{TODO}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \paragraph{The emphasize family}
+%
+% \begin{aspect}{emph}
+% is just one macro call here.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{emph}
+\lst@InstallFamily e{emph}{emphstyle}{}{emphstyle}{}od
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \paragraph{\TeX\ control sequences}
+%
+% \begin{aspect}{tex}
+% Here we check the last `other' processed token.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{tex}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@InstallFamily {cs}{texcs}{texcsstyle}\relax{keywordstyle}
+    {\ifx\lst@lastother\lstum@backslash
+         \expandafter\let\expandafter\lst@thestyle
+                         \csname lst@texcsstyle#1\endcsname
+     \fi}
+    ld
+%    \end{macrocode}
+% The style-key checks for the optional star (which must be in front of
+% the optional class argument).
+%    \begin{macrocode}
+\lst@Key{texcsstyle}\relax
+  {\@ifstar{\lst@true\lst@DefTexcsstyle}%
+           {\lst@false\lst@DefTexcsstyle}#1\@nil@}
+\gdef\lst@DefTexcsstyle#1\@nil@{%
+    \let\lst@iftexcsincludebs\lst@if
+    \lstKV@OptArg[\@ne]{#1}%
+    {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax
+     \@namedef{lst@texcsstyle\ifnum\@tempcnta=\@ne\else
+                                   \the\@tempcnta \fi}{##2}}}%
+\global\let\lst@iftexcsincludebs\iffalse
+%    \end{macrocode}
+% To make the backslash belong to the control sequence, it is merged with
+% the following token. This option was suggested by \lsthelper{Morten~H\o gholm}
+% {2004/07/16}{defining new (colored) texcs}.
+% \lsthelper{Christian~Schneider}{-}{2006/09/08} pointed out that the original
+% implementation was broken when the identifier was preceded by an ``other''
+% character.  To fix this (and other bugs), we first output whatever is in the
+% current token before merging.
+%    \begin{macrocode}
+\let\lst@iftexcsincludebs\iffalse
+\lst@AddToHook{SelectCharTable}
+{\lst@iftexcsincludebs \ifx\@empty\lst@texcs\else
+     \lst@DefSaveDef{`\\}\lsts@texcsbs
+      {\lst@ifletter
+           \lst@Output
+       \else
+           \lst@OutputOther
+       \fi
+       \lst@Merge\lsts@texcsbs}%
+ \fi \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \paragraph{Compiler directives}
+%
+% \begin{aspect}{directives}
+% \begin{lstkey}{directives}
+% First some usual stuff.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{directives}
+%    \end{macrocode}
+% The initialization of |\lst@directives| has been added after a bug report
+% from \lsthelper{Kris~Luyten}{2002/07/30}{Undefined control sequence
+% \lst@thestyle caused by undefined \lst@directives after loading C}.
+%    \begin{macrocode}
+\lst@NewMode\lst@CDmode
+\lst@AddToHook{EOL}{\ifnum\lst@mode=\lst@CDmode \lst@LeaveMode \fi}
+\lst@InstallKeywords{d}{directives}{directivestyle}\relax{keywordstyle}
+    {\ifnum\lst@mode=\lst@CDmode
+         \let\lst@thestyle\lst@directivestyle
+     \fi}
+    ld
+\global\let\lst@directives\@empty % init
+%    \end{macrocode}
+% Now we define a new delimiter for directives: We enter `directive mode'
+% only in the first column.
+%    \begin{macrocode}
+\lst@AddTo\lst@delimtypes{,directive}
+\gdef\lst@Delim@directive#1\@empty#2#3#4{%
+    \lst@CArg #1\relax\lst@DefDelimB
+        {\lst@CalcColumn}%
+        {}%
+        {\ifnum\@tempcnta=\z@
+             \def\lst@bnext{#2\lst@CDmode{#4\lst@Lmodetrue}%
+			                \let\lst@currstyle\lst@directivestyle}%
+		 \fi
+		 \@gobblethree}%
+        #2\lst@CDmode{#4\lst@Lmodetrue}}
+%    \end{macrocode}
+% We introduce a new string type (thanks to \lsthelper{R.~Isernhagen}
+% {1999/11/12}{float isn't keyword in #include <float>}), which \ldots
+%    \begin{macrocode}
+\lst@AddTo\lst@stringtypes{,directive}
+\gdef\lst@StringDM@directive#1#2#3\@empty{%
+    \lst@CArg #2\relax\lst@CDef
+        {}%
+%    \end{macrocode}
+% \ldots\space is active only in |\lst@CDmode|:
+%    \begin{macrocode}
+        {\let\lst@bnext\lst@CArgEmpty
+         \ifnum\lst@mode=\lst@CDmode
+             \def\lst@bnext{\lst@BeginString{#1}}%
+         \fi
+         \lst@bnext}%
+        \@empty
+    \lst@CArg #3\relax\lst@CDef
+        {}%
+        {\let\lst@enext\lst@CArgEmpty
+         \ifnum #1=\lst@mode
+             \let\lst@bnext\lst@EndString
+         \fi
+         \lst@bnext}%
+        \@empty}
+%    \end{macrocode}
+% \end{lstkey}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Keyword comments}
+%
+% \begin{aspect}{keywordcomments}
+% includes both comment types and is possibly split into this and |dkcs|.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords,comments]{keywordcomments}
+%    \end{macrocode}
+%
+% \begin{macro}{\lst@BeginKC}
+% \begin{macro}{\lst@BeginKCS}
+% Starting a keyword comment is easy, but: (1) The submacros are called
+% outside of two group levels, and \ldots
+%    \begin{macrocode}
+\lst@NewMode\lst@KCmode \lst@NewMode\lst@KCSmode
+\gdef\lst@BeginKC{\aftergroup\aftergroup\aftergroup\lst@BeginKC@}%
+\gdef\lst@BeginKC@{%
+    \lst@ResetToken
+    \lst@BeginComment\lst@KCmode{{\lst@commentstyle}\lst@modetrue}%
+                     \@empty}%
+\gdef\lst@BeginKCS{\aftergroup\aftergroup\aftergroup\lst@BeginKCS@}%
+\gdef\lst@BeginKCS@{%
+    \lst@ResetToken
+    \lst@BeginComment\lst@KCSmode{{\lst@commentstyle}\lst@modetrue}%
+                     \@empty}%
+%    \end{macrocode}
+% (2) we must ensure that the comment starts after printing the comment
+% delimiter since it could be a keyword. We assign |\lst@BeginKC|[|S|] to
+% |\lst@KCpost|, which is executed and reset in \hookname{PostOutput}.
+%    \begin{macrocode}
+\lst@AddToHook{PostOutput}{\lst@KCpost \global\let\lst@KCpost\@empty}
+\global\let\lst@KCpost\@empty % init
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndKC}
+% leaves the comment mode before the (temporaryly saved) comment delimiter is
+% printed.
+%    \begin{macrocode}
+\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken
+    \let\lst@thestyle\lst@identifierstyle \lsthk@Output}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{keywordcomment}
+% The delimiters must be identical here, thus we use |\lst@KCmatch|. Note the
+% last argument |o| to |\lst@InstallKeywords|: The working test is installed
+% in the \hookname{Output} hook and not in \hookname{DetectKeywords}.
+% Otherwise we couldn't detect the ending delimiter since keyword detection is
+% done if and only if mode changes are allowed.
+%    \begin{macrocode}
+\lst@InstallKeywords{kc}{keywordcomment}{}\relax{}
+    {\ifnum\lst@mode=\lst@KCmode
+         \edef\lst@temp{\the\lst@token}%
+         \ifx\lst@temp\lst@KCmatch
+             \lst@EndKC
+         \fi
+     \else
+         \lst@ifmode\else
+             \xdef\lst@KCmatch{\the\lst@token}%
+             \global\let\lst@KCpost\lst@BeginKC
+         \fi
+     \fi}
+    lo
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{keywordcommentsemicolon}
+% The key simply stores the keywords. After a bug report by \lsthelper
+% {Norbert~Eisinger}{2002/11/26}{keywordcommentsemicolon active after
+% language change} the initialization in \hookname{SetLanguage} has been
+% added.
+%    \begin{macrocode}
+\lst@Key{keywordcommentsemicolon}{}{\lstKV@ThreeArg{#1}%
+    {\def\lst@KCAkeywordsB{##1}%
+     \def\lst@KCAkeywordsE{##2}%
+     \def\lst@KCBkeywordsB{##3}%
+     \def\lst@KCkeywords{##1##2##3}}}
+\lst@AddToHook{SetLanguage}{%
+    \let\lst@KCAkeywordsB\@empty \let\lst@KCAkeywordsE\@empty
+    \let\lst@KCBkeywordsB\@empty \let\lst@KCkeywords\@empty}
+%    \end{macrocode}
+% We define an appropriate semicolon if this keyword comment type is defined.
+% Appropriate means that we leave any keyword comment mode if active.
+% \lsthelper{Oldrich~Jedlicka}{2001/12/12}{keywordcomment(semicolon) fails}
+% reported a bug and provided the fix, the two |\@empty|s.
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@KCkeywords\@empty\else
+        \lst@DefSaveDef{`\;}\lsts@EKC
+            {\lst@XPrintToken
+             \ifnum\lst@mode=\lst@KCmode \lst@EndComment\@empty \else
+             \ifnum\lst@mode=\lst@KCSmode \lst@EndComment\@empty
+             \fi \fi
+             \lsts@EKC}%
+     \fi}
+%    \end{macrocode}
+% The `working identifier' macros enter respectively leave comment mode.
+%    \begin{macrocode}
+\gdef\lst@KCAWorkB{%
+    \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKC \fi}
+\gdef\lst@KCBWorkB{%
+    \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKCS \fi}
+\gdef\lst@KCAWorkE{\ifnum\lst@mode=\lst@KCmode \lst@EndKC \fi}
+%    \end{macrocode}
+% Now we install the tests and initialize the given macros.
+%    \begin{macrocode}
+\lst@ProvideFamily@@
+    \lst@KCAkeywordsB@list\lst@KCAkeywordsB \lst@KC@also
+    \lst@gKCAkeywordsB@list\lst@gKCAkeywordsB \lst@KCAWorkB
+    {kcb}owo % prefix, other key, working procedure, Output hook
+\lst@ProvideFamily@@
+    \lst@KCAkeywordsE@list\lst@KCAkeywordsE \lst@KC@also
+    \lst@gKCAkeywordsE@list\lst@gKCAkeywordsE \lst@KCAWorkE
+    {kce}owo
+\lst@ProvideFamily@@
+    \lst@KCBkeywordsB@list\lst@KCBkeywordsB \lst@KC@also
+    \lst@gKCBkeywordsB@list\lst@gKCBkeywordsB \lst@KCBWorkB
+    {kcs}owo
+%    \end{macrocode}
+% \end{lstkey}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Export of identifiers}
+%
+% \begin{aspect}{index}
+% \begin{macro}{\lstindexmacro}
+% One more `keyword' class.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{index}
+\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle}
+    {\csname\@lst @indexstyle#1\expandafter\endcsname
+         \expandafter{\the\lst@token}}
+    od
+\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{macro}
+% \end{aspect}
+%
+% \begin{aspect}{procnames}
+% \begin{lstkey}{procnamestyle}
+% \begin{lstkey}{procnamekeys}
+% \begin{lstkey}{indexprocnames}
+% The `idea' here is the usage of a global |\lst@ifprocname|, indicating a
+% preceding `procedure keyword'. All the other is known stuff.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{procnames}
+\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue}
+\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse}
+\lst@AddToHook{Init}{\lst@procnamefalse}
+\lst@AddToHook{DetectKeywords}
+    {\lst@ifprocname
+         \let\lst@thestyle\lst@procnamestyle
+         \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi
+         \lst@procnamefalse
+     \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}}
+\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc}
+\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi}
+\gdef\lst@indexproc{%
+    \@ifundefined{lst@indexstyle1}%
+        {\@namedef{lst@indexstyle1}##1{}}%
+        {}}
+%    \end{macrocode}
+% The default definition of |\lst@indexstyle| above has been moved outside the
+% hook after a bug report from \lsthelper{Ulrich~G.~Wortmann}{2002/01/22}
+% {procnames doesn't work}.
+%    \begin{macrocode}
+\lst@InstallKeywords w{procnamekeys}{}\relax{}
+    {\global\let\lst@PNpost\lst@procnametrue}
+    od
+\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty}
+\global\let\lst@PNpost\@empty % init
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{aspect}
+%
+%
+% \section{More aspects and keys}
+%
+% \begin{lstkey}{basicstyle}
+% \begin{lstkey}{inputencoding}
+% There is no better place to define these keys, I think.
+%    \begin{macrocode}
+%<*kernel>
+\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}}
+\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}}
+\lst@AddToHook{Init}
+    {\lst@basicstyle
+     \ifx\lst@inputenc\@empty\else
+         \@ifundefined{inputencoding}{}%
+            {\inputencoding\lst@inputenc}%
+     \fi}
+\lst@AddToHookExe{EmptyStyle}
+    {\let\lst@basicstyle\@empty
+     \let\lst@inputenc\@empty}
+\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}
+%</kernel>
+%    \end{macrocode}
+% Michael Niedermair asked for a key like \keyname{inputencoding}.
+% \end{lstkey}
+% \end{lstkey}
+%
+%
+% \subsection{Styles and languages}
+%
+% \begin{aspect}{style}
+% We begin with style definition and selection.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{style}
+%    \end{macrocode}
+%
+% \begin{macro}{\lststylefiles}
+% This macro is defined if and only if it's undefined yet.
+%    \begin{macrocode}
+\@ifundefined{lststylefiles}
+    {\lst@UserCommand\lststylefiles{lststy0.sty}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstdefinestyle}
+% \begin{macro}{\lst@definestyle}
+% \begin{macro}{\lst@DefStyle}
+% are defined in terms of |\lst@DefStyle|, which is defined via
+% |\lst@DefDriver|.
+%    \begin{macrocode}
+\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue}
+\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse}
+\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset}
+%    \end{macrocode}
+% The `empty' style calls the initial empty hook \hookname{EmptyStyle}.
+%    \begin{macrocode}
+\global\@namedef{lststy@$}{\lsthk@EmptyStyle}
+\lst@AddToHook{EmptyStyle}{}% init
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{lstkey}{style}
+% is an application of |\lst@LAS|. We just specify the hook and an empty
+% argument as `pre' and `post' code.
+%    \begin{macrocode}
+\lst@Key{style}\relax{%
+    \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles
+        \lsthk@SetStyle
+        {}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SetStyle}{}% init
+%    \end{macrocode}
+% \end{lstkey}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+% \begin{aspect}{language}
+% Now we deal with commands used in defining and selecting programming
+% languages, in particular with aliases.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{language}
+%    \end{macrocode}
+%
+% \begin{macro}{\lstlanguagefiles}
+% This macro is defined if and only if it's undefined yet.
+%    \begin{macrocode}
+\@ifundefined{lstdriverfiles}
+    {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstdefinelanguage}
+% \begin{macro}{\lst@definelanguage}
+% \begin{macro}{\lst@DefLang}
+% are defined in terms of |\lst@DefLang|, which is defined via
+% |\lst@DefDriver|.
+%    \begin{macrocode}
+\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue}
+\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse}
+\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset}
+%    \end{macrocode}
+% Now we can provide the `empty' language.
+%    \begin{macrocode}
+\lstdefinelanguage{}{}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{lstkey}{language}
+% \begin{lstkey}{alsolanguage}
+% is mainly an application of |\lst@LAS|.
+%    \begin{macrocode}
+\lst@Key{language}\relax{\lstKV@OptArg[]{#1}%
+    {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
+         \lsthk@SetLanguage
+         {\lst@FindAlias[##1]{##2}%
+          \let\lst@language\lst@malias
+          \let\lst@dialect\lst@oalias}}}
+%    \end{macrocode}
+% Ditto, we simply don't execute |\lsthk@SetLanguage|.
+%    \begin{macrocode}
+\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}%
+    {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
+         {}%
+         {\lst@FindAlias[##1]{##2}%
+          \let\lst@language\lst@malias
+          \let\lst@dialect\lst@oalias}}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SetLanguage}{}% init
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lstalias}
+% Now we concentrate on aliases and default dialects.
+% |\lsta@|\meta{language}|$|\meta{dialect} and |\lsta@|\meta{language} contain
+% the aliases of a particular dialect respectively a complete language.
+% We'll use a |$|-character to separate a language name from its dialect.
+% Thanks to \lsthelper{Walter~E.~Brown}{2004/02/25}{\lstalias
+% (+\lstdefinelanguage) fails} for reporting a problem with the argument
+% delimiter `[' in a previous definition of |\lstalias@|.
+%    \begin{macrocode}
+\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@}
+\gdef\lstalias@[#1]#2{\lstalias@b #2$#1}
+\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}}
+\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{defaultdialect}
+% We simply store the dialect.
+%    \begin{macrocode}
+\lst@Key{defaultdialect}\relax
+    {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@FindAlias}
+% Now we have to find a language. First we test for a complete language alias,
+% then we set the default dialect if necessary.
+%    \begin{macrocode}
+\gdef\lst@FindAlias[#1]#2{%
+    \lst@NormedDef\lst@oalias{#1}%
+    \lst@NormedDef\lst@malias{#2}%
+    \@ifundefined{lsta@\lst@malias}{}%
+        {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+    \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%
+        {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%
+    \fi
+%    \end{macrocode}
+% Now we are ready for an alias of a single dialect.
+%    \begin{macrocode}
+    \edef\lst@temp{\lst@malias $\lst@oalias}%
+    \@ifundefined{lsta@\lst@temp}{}%
+        {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}%
+%    \end{macrocode}
+% Finally we again set the default dialect---for the case of a dialect alias.
+%    \begin{macrocode}
+    \expandafter\lst@FindAlias@\lst@temp $}
+\gdef\lst@FindAlias@#1$#2${%
+    \def\lst@malias{#1}\def\lst@oalias{#2}%
+    \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%
+        {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@RequireLanguages}
+% This definition will be equivalent to |\lstloadlanguages|. We requested the
+% given list of languages and load additionally required aspects.
+%    \begin{macrocode}
+\gdef\lst@RequireLanguages#1{%
+    \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles
+    \ifx\lst@loadaspects\@empty\else
+        \lst@RequireAspects\lst@loadaspects
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstloadlanguages}
+% is the same as |\lst@RequireLanguages|.
+%    \begin{macrocode}
+\global\let\lstloadlanguages\lst@RequireLanguages
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Format definitions*}
+%
+% \begin{aspect}{formats}
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{formats}
+%    \end{macrocode}
+%
+% \begin{macro}{\lstformatfiles}
+% This macro is defined if and only if it's undefined yet.
+%    \begin{macrocode}
+\@ifundefined{lstformatfiles}
+    {\lst@UserCommand\lstformatfiles{lstfmt0.sty}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstdefineformat}
+% \begin{macro}{\lst@defineformat}
+% \begin{macro}{\lst@DefFormat}
+% are defined in terms of |\lst@DefFormat|, which is defined via
+% |\lst@DefDriver|.
+%    \begin{macrocode}
+\lst@UserCommand\lstdefineformat{\lst@DefFormat\iftrue}
+\lst@UserCommand\lst@defineformat{\lst@DefFormat\iffalse}
+\gdef\lst@DefFormat{\lst@DefDriver{format}{fmt}\lst@UseFormat}
+%    \end{macrocode}
+% We provide the `empty' format.
+%    \begin{macrocode}
+\lstdefineformat{}{}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{lstkey}{format}
+% is an application of |\lst@LAS|. We just specify the hook as `pre' and an
+% empty argument as  `post' code.
+%    \begin{macrocode}
+\lst@Key{format}\relax{%
+    \lst@LAS{format}{fmt}{[]{#1}}\lst@NoAlias\lstformatfiles
+        \lsthk@SetFormat
+        {}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SetFormat}{\let\lst@fmtformat\@empty}% init
+%    \end{macrocode}
+% \end{lstkey}
+%
+%
+% \paragraph{Helpers}
+% Our goal is to define the yet unkown |\lst@UseFormat|. This definition
+% will parse the user supplied format. We start with some general macros.
+%
+% \begin{macro}{\lst@fmtSplit}
+% splits the content of the macro |#1| at |#2| in the preceding characters
+% |\lst@fmta| and the following ones |\lst@fmtb|. |\lst@if| is false if and
+% only if |#1| doesn't contain |#2|.
+%    \begin{macrocode}
+\gdef\lst@fmtSplit#1#2{%
+    \def\lst@temp##1#2##2\relax##3{%
+        \ifnum##3=\z@
+            \ifx\@empty##2\@empty
+                \lst@false
+                \let\lst@fmta#1%
+                \let\lst@fmtb\@empty
+            \else
+                \expandafter\lst@temp#1\relax\@ne
+            \fi
+        \else
+            \def\lst@fmta{##1}\def\lst@fmtb{##2}%
+        \fi}%
+    \lst@true
+    \expandafter\lst@temp#1#2\relax\z@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@IfNextCharWhitespace}
+% is defined in terms of |\lst@IfSubstring|.
+%    \begin{macrocode}
+\gdef\lst@IfNextCharWhitespace#1#2#3{%
+    \lst@IfSubstring#3\lst@whitespaces{#1}{#2}#3}
+%    \end{macrocode}
+% And here come all white space characters.
+%    \begin{macrocode}
+\begingroup
+\catcode`\^^I=12\catcode`\^^J=12\catcode`\^^M=12\catcode`\^^L=12\relax%
+\lst@DefActive\lst@whitespaces{\ ^^I^^J^^M}% add ^^L
+\global\let\lst@whitespaces\lst@whitespaces%
+\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtIfIdentifier}
+% tests the first character of |#1|
+%    \begin{macrocode}
+\gdef\lst@fmtIfIdentifier#1{%
+    \ifx\relax#1\@empty
+        \expandafter\@secondoftwo
+    \else
+        \expandafter\lst@fmtIfIdentifier@\expandafter#1%
+    \fi}
+%    \end{macrocode}
+% against the `letters' |_|, |@|, |A|,\ldots,|Z| and |a|,\ldots,|z|.
+%    \begin{macrocode}
+\gdef\lst@fmtIfIdentifier@#1#2\relax{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1=`_\else
+    \ifnum`#1<64\else
+    \ifnum`#1<91\let\lst@next\@firstoftwo\else
+    \ifnum`#1<97\else
+    \ifnum`#1<123\let\lst@next\@firstoftwo\else
+    \fi \fi \fi \fi \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtIfNextCharIn}
+% is required for the optional \meta{exceptional characters}.
+% The implementation is easy---refer section \ref{iSubstringTests}.
+%    \begin{macrocode}
+\gdef\lst@fmtIfNextCharIn#1{%
+    \ifx\@empty#1\@empty \expandafter\@secondoftwo \else
+                         \def\lst@next{\lst@fmtIfNextCharIn@{#1}}%
+                         \expandafter\lst@next\fi}
+\gdef\lst@fmtIfNextCharIn@#1#2#3#4{%
+    \def\lst@temp##1#4##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \lst@temp#1#4\@empty\relax{#2}{#3}#4}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtCDef}
+% We need derivations of |\lst@CDef| and |\lst@CDefX|: we have to test the
+% next character against the sequence |#5| of exceptional characters.
+% These tests are inserted here.
+%    \begin{macrocode}
+\gdef\lst@fmtCDef#1{\lst@fmtCDef@#1}
+\gdef\lst@fmtCDef@#1#2#3#4#5#6#7{%
+    \lst@CDefIt#1{#2}{#3}%
+               {\lst@fmtIfNextCharIn{#5}{#4#2#3}{#6#4#2#3#7}}%
+               #4%
+               {}{}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtCDefX}
+% The same but `drop input'.
+%    \begin{macrocode}
+\gdef\lst@fmtCDefX#1{\lst@fmtCDefX@#1}
+\gdef\lst@fmtCDefX@#1#2#3#4#5#6#7{%
+    \let#4#1%
+    \ifx\@empty#2\@empty
+        \def#1{\lst@fmtIfNextCharIn{#5}{#4}{#6#7}}%
+    \else \ifx\@empty#3\@empty
+        \def#1##1{%
+            \ifx##1#2%
+                \def\lst@next{\lst@fmtIfNextCharIn{#5}{#4##1}%
+                                                      {#6#7}}%
+            \else
+                 \def\lst@next{#4##1}%
+            \fi
+            \lst@next}%
+    \else
+        \def#1{%
+            \lst@IfNextCharsArg{#2#3}%
+                {\lst@fmtIfNextCharIn{#5}{\expandafter#4\lst@eaten}%
+                                         {#6#7}}%
+                {\expandafter#4\lst@eaten}}%
+    \fi \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{The parser}
+% applies |\lst@fmtSplit| to cut a format definition into items, items into
+% `input' and `output', and `output' into `pre' and 'post'. This should be
+% clear if you are in touch with format definitions.
+%
+% \begin{macro}{\lst@UseFormat}
+% Now we can start with the parser.
+%    \begin{macrocode}
+\gdef\lst@UseFormat#1{%
+    \def\lst@fmtwhole{#1}%
+    \lst@UseFormat@}
+\gdef\lst@UseFormat@{%
+    \lst@fmtSplit\lst@fmtwhole,%
+%    \end{macrocode}
+% We assign the rest of the format definition, \ldots
+%    \begin{macrocode}
+    \let\lst@fmtwhole\lst@fmtb
+    \ifx\lst@fmta\@empty\else
+%    \end{macrocode}
+% \ldots\space split the item at the equal sign, and work on the item.
+%    \begin{macrocode}
+        \lst@fmtSplit\lst@fmta=%
+        \ifx\@empty\lst@fmta\else
+%    \end{macrocode}
+% \begin{TODO}
+% Insert |\let\lst@arg\@empty| |\expandafter\lst@XConvert\lst@fmtb\@nil|
+% |\let\lst@fmtb\lst@arg|.
+% \end{TODO}
+%    \begin{macrocode}
+            \expandafter\lstKV@XOptArg\expandafter[\expandafter]%
+                \expandafter{\lst@fmtb}\lst@UseFormat@b
+        \fi
+    \fi
+%    \end{macrocode}
+% Finally we process the next item if the rest is not empty.
+%    \begin{macrocode}
+    \ifx\lst@fmtwhole\@empty\else
+        \expandafter\lst@UseFormat@
+    \fi}
+%    \end{macrocode}
+% We make |\lst@fmtc| contain the preceding characters as a braced argument.
+% To add more arguments, we first split the replacement tokens at the control
+% sequence |\string|.
+%    \begin{macrocode}
+\gdef\lst@UseFormat@b[#1]#2{%
+    \def\lst@fmtc{{#1}}\lst@lExtend\lst@fmtc{\expandafter{\lst@fmta}}%
+    \def\lst@fmtb{#2}%
+    \lst@fmtSplit\lst@fmtb\string
+%    \end{macrocode}
+% We append an empty argument or |\lst@fmtPre| with `|\string|-preceding'
+% tokens as argument. We do the same for the tokens after |\string|.
+%    \begin{macrocode}
+    \ifx\@empty\lst@fmta
+        \lst@lAddTo\lst@fmtc{{}}%
+    \else
+        \lst@lExtend\lst@fmtc{\expandafter
+            {\expandafter\lst@fmtPre\expandafter{\lst@fmta}}}%
+    \fi
+    \ifx\@empty\lst@fmtb
+        \lst@lAddTo\lst@fmtc{{}}%
+    \else
+        \lst@lExtend\lst@fmtc{\expandafter
+            {\expandafter\lst@fmtPost\expandafter{\lst@fmtb}}}%
+    \fi
+%    \end{macrocode}
+% Eventually we extend |\lst@fmtformat| appropriately. Note that |\lst@if|
+% still indicates whether the replacement tokens contain |\string|.
+%    \begin{macrocode}
+    \expandafter\lst@UseFormat@c\lst@fmtc}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@UseFormat@c#1#2#3#4{%
+    \lst@fmtIfIdentifier#2\relax
+    {\lst@fmtIdentifier{#2}%
+     \lst@if\else \PackageWarning{Listings}%
+         {Cannot drop identifier in format definition}%
+     \fi}%
+    {\lst@if
+         \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDef}%
+     \else
+         \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDefX}%
+     \fi
+     \lst@DefActive\lst@fmtc{#1}%
+     \lst@lExtend\lst@fmtformat{\expandafter{\lst@fmtc}{#3}{#4}}}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}{\lst@fmtformat}
+\global\let\lst@fmtformat\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{The formatting}
+%
+% \begin{macro}{\lst@fmtPre}
+%    \begin{macrocode}
+\gdef\lst@fmtPre#1{%
+    \lst@PrintToken
+    \begingroup
+    \let\newline\lst@fmtEnsureNewLine
+    \let\space\lst@fmtEnsureSpace
+    \let\indent\lst@fmtIndent
+    \let\noindent\lst@fmtNoindent
+    #1%
+    \endgroup}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtPost}
+%    \begin{macrocode}
+\gdef\lst@fmtPost#1{%
+    \global\let\lst@fmtPostOutput\@empty
+    \begingroup
+    \def\newline{\lst@AddTo\lst@fmtPostOutput\lst@fmtEnsureNewLine}%
+    \def\space{\aftergroup\lst@fmtEnsurePostSpace}%
+    \def\indent{\lst@AddTo\lst@fmtPostOutput\lst@fmtIndent}%
+    \def\noindent{\lst@AddTo\lst@fmtPostOutput\lst@fmtNoindent}%
+    \aftergroup\lst@PrintToken
+    #1%
+    \endgroup}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\global\let\lst@fmtPostOutput\@empty}
+\lst@AddToHook{PostOutput}
+    {\lst@fmtPostOutput \global\let\lst@fmtPostOutput\@empty}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtEnsureSpace}
+% \begin{macro}{\lst@fmtEnsurePostSpace}
+%    \begin{macrocode}
+\gdef\lst@fmtEnsureSpace{%
+    \lst@ifwhitespace\else \expandafter\lst@ProcessSpace \fi}
+\gdef\lst@fmtEnsurePostSpace{%
+    \lst@IfNextCharWhitespace{}{\lst@ProcessSpace}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{lstkey}{fmtindent}
+% \begin{macro}{\lst@fmtIndent}
+% \begin{macro}{\lst@fmtNoindent}
+%    \begin{macrocode}
+\lst@Key{fmtindent}{20pt}{\def\lst@fmtindent{#1}}
+\newdimen\lst@fmtcurrindent
+\lst@AddToHook{InitVars}{\global\lst@fmtcurrindent\z@}
+\gdef\lst@fmtIndent{\global\advance\lst@fmtcurrindent\lst@fmtindent}
+\gdef\lst@fmtNoindent{\global\advance\lst@fmtcurrindent-\lst@fmtindent}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@fmtEnsureNewLine}
+%    \begin{macrocode}
+\gdef\lst@fmtEnsureNewLine{%
+    \global\advance\lst@newlines\@ne
+    \global\advance\lst@newlinesensured\@ne
+    \lst@fmtignoretrue}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToAtTop\lst@DoNewLines{%
+    \ifnum\lst@newlines>\lst@newlinesensured
+        \global\advance\lst@newlines-\lst@newlinesensured
+    \fi
+    \global\lst@newlinesensured\z@}
+\newcount\lst@newlinesensured % global
+\lst@AddToHook{Init}{\global\lst@newlinesensured\z@}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@fmtignoretrue{\let\lst@fmtifignore\iftrue}
+\gdef\lst@fmtignorefalse{\let\lst@fmtifignore\iffalse}
+\lst@AddToHook{InitVars}{\lst@fmtignorefalse}
+\lst@AddToHook{Output}{\lst@fmtignorefalse}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtUseLostSpace}
+%    \begin{macrocode}
+\gdef\lst@fmtUseLostSpace{%
+    \lst@ifnewline \kern\lst@fmtcurrindent \global\lst@lostspace\z@
+    \else
+        \lst@OldOLS
+    \fi}
+\lst@AddToHook{Init}
+    {\lst@true
+     \ifx\lst@fmtformat\@empty \ifx\lst@fmt\@empty \lst@false \fi\fi
+     \lst@if
+        \let\lst@OldOLS\lst@OutputLostSpace
+        \let\lst@OutputLostSpace\lst@fmtUseLostSpace
+        \let\lst@ProcessSpace\lst@fmtProcessSpace
+     \fi}
+%    \end{macrocode}
+% \begin{TODO}
+% This `lost space' doesn't use |\lst@alloverstyle| yet!
+% \end{TODO}
+% \end{macro}
+%
+% \begin{macro}{\lst@fmtProcessSpace}
+%    \begin{macrocode}
+\gdef\lst@fmtProcessSpace{%
+    \lst@ifletter
+        \lst@Output
+        \lst@fmtifignore\else
+            \lst@AppendOther\lst@outputspace
+        \fi
+    \else \lst@ifkeepspaces
+        \lst@AppendOther\lst@outputspace
+    \else \ifnum\lst@newlines=\z@
+        \lst@AppendSpecialSpace
+    \else \ifnum\lst@length=\z@
+            \global\advance\lst@lostspace\lst@width
+            \global\advance\lst@pos\m@ne
+        \else
+            \lst@AppendSpecialSpace
+        \fi
+    \fi \fi \fi
+    \lst@whitespacetrue}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \paragraph{Formatting identifiers}
+%
+% \begin{macro}{\lst@fmtIdentifier}
+% We install a (keyword) test for the `format identifiers'.
+%    \begin{macrocode}
+\lst@InstallTest{f}
+    \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt
+    \lst@gfmt@wp
+    wd
+\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty
+\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty
+%    \end{macrocode}
+% The working procedure expands |\lst@fmt$|\meta{string} (and defines
+% |\lst@PrintToken| to do nothing).
+%    \begin{macrocode}
+\gdef\lst@gfmt@wp{%
+    \begingroup \let\lst@UM\@empty
+    \let\lst@PrintToken\@empty
+    \csname\@lst @fmt$\the\lst@token\endcsname
+    \endgroup}
+%    \end{macrocode}
+% This control sequence is probably defined as `working identifier'.
+%    \begin{macrocode}
+\gdef\lst@fmtIdentifier#1#2#3#4{%
+    \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}%
+    \@namedef{\@lst @fmt$\lst@fmta}{#3#4}}
+%    \end{macrocode}
+% |\lst@fmt$|\meta{identifier} expands to a |\lst@fmtPre|/|\lst@fmtPost|
+% sequence defined by |#2| and |#3|.
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+%
+% \subsection{Line numbers}
+%
+% \begin{aspect}{labels}
+% \lsthelper{Rolf~Niepraschk}{1997/04/24}{line numbers} asked for line numbers.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{labels}
+%    \end{macrocode}
+%
+% \begin{lstkey}{numbers}
+% Depending on the argument we define |\lst@PlaceNumber| to print the line
+% number.
+%    \begin{macrocode}
+\lst@Key{numbers}{none}{%
+    \let\lst@PlaceNumber\@empty
+    \lstKV@SwitchCases{#1}%
+    {none&\\%
+     left&\def\lst@PlaceNumber{\llap{\normalfont
+                \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\%
+     right&\def\lst@PlaceNumber{\rlap{\normalfont
+                \kern\linewidth \kern\lst@numbersep
+                \lst@numberstyle{\thelstnumber}}}%
+    }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{numberstyle}
+% \begin{lstkey}{numbersep}
+% \begin{lstkey}{stepnumber}
+% \begin{lstkey}{numberblanklines}
+% \begin{lstkey}{numberfirstline}
+% Definition of the keys.
+%    \begin{macrocode}
+\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}}
+\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}}
+\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}}
+\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{numberblanklines}{true}[t]
+    {\lstKV@SetIf{#1}\lst@ifnumberblanklines}
+\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline}
+\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{firstnumber}
+% We select the first number according to the argument.
+%    \begin{macrocode}
+\lst@Key{firstnumber}{auto}{%
+    \lstKV@SwitchCases{#1}%
+    {auto&\let\lst@firstnumber\@undefined\\%
+     last&\let\lst@firstnumber\c@lstnumber
+    }{\def\lst@firstnumber{#1\relax}}}
+\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@}
+%    \end{macrocode}
+% |\lst@firstnumber| now set to |\lst@lineno| instead of |\lst@firstline|,
+% as per changes in |lstpatch.sty| from 1.3b pertaining to linerange markers.
+%    \begin{macrocode}
+\lst@AddToHook{PreInit}
+    {\ifx\lst@firstnumber\@undefined
+         \def\lst@firstnumber{\lst@lineno}%
+     \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@SetFirstNumber}
+% \begin{macro}{\lst@SaveFirstNumber}
+% \lsthelper{Boris~Veytsman}{1998/03/25}{continue line numbering: a.c b.c a.c}
+% proposed to continue line numbers according to listing names. We define the
+% label number of the first printing line here. A bug reported by
+% \lsthelper{Jens~Schwarzer}{2001/05/29}{wrong line numbering of lstlisting
+% with first>1} has been removed by replacing |\@ne| by |\lst@firstline|.
+%    \begin{macrocode}
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline
+                       \else \lst@nololtrue \fi
+        \advance\@tempcnta\lst@advancenumber
+        \edef\lst@firstnumber{\the\@tempcnta\relax}%
+    \fi}
+%    \end{macrocode}
+% The current label is stored in|\lstno@|\meta{name}. If the name is empty,
+% we use a space instead, which leaves |\lstno@| undefined.
+%    \begin{macrocode}
+\gdef\lst@SaveFirstNumber{%
+    \expandafter\xdef
+        \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi
+        \endcsname{\the\c@lstnumber}}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@lstnumber}
+% This counter keeps the current label number. We use it as current label to
+% make line numbers referenced by |\ref|. This was proposed by
+% \lsthelper{Boris~Veytsman}{1998/03/25}{make line numbers referenced via
+% \label and \ref}. We now use |\refstepcounter| to do the job---thanks to a
+% bug report from \lsthelper{Christian~Gudrian}{2000/11/13}{\ref{lst:line}
+% jumps to top of listing and not to the line}.
+%    \begin{macrocode}
+\newcounter{lstnumber}% \global
+\global\c@lstnumber\@ne % init
+\renewcommand*\thelstnumber{\@arabic\c@lstnumber}
+\lst@AddToHook{EveryPar}
+    {\global\advance\c@lstnumber\lst@advancelstnum
+     \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}%
+     \lst@SkipOrPrintLabel}%
+\global\let\lst@advancelstnum\@ne
+%    \end{macrocode}
+% Note that the counter advances \emph{before} the label is printed and not
+% afterwards. Otherwise we have wrong references---reported by
+% \lsthelper{Gregory~Van~Vooren}{1999/06/04}{reference one unit too large}.
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}}
+%    \end{macrocode}
+% The label number is initialized and we ensure correct line numbers for
+% continued listings.  An apparently-extraneous advancement of the line
+% number by \verb|-\lst@advancelstnum| when \texttt{firstnumber=last} is
+% specified was removed, following a bug report by \lsthelper{Joachim~Breitner}%
+% {2006/05/14}{failure to continue counting correctly}.
+%    \begin{macrocode}
+\lst@AddToHook{InitVars}
+    {\global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum}
+\lst@AddToHook{ExitVars}
+    {\global\advance\c@lstnumber\lst@advancelstnum}
+%    \end{macrocode}
+% \lsthelper{Walter~E.~Brown}{2001/05/22}{pdftex 3.14159-14f warning:
+% destination with the same identifier} reported problems with pdftex and
+% \packagename{hyperref}. A bad default of |\theHlstlabel| was the reason.
+% \lsthelper{Heiko~Oberdiek}{2001/11/08}{pdftex warning: destination with
+% the same identifier} found another bug which was due to the localization
+% of |\lst@neglisting|. He also provided the following fix, replacing
+% |\thelstlisting| with the |\ifx| \ldots\ |\fi| construction.
+%    \begin{macrocode}
+\AtBeginDocument{%
+    \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting
+                                          \else \thelstlisting \fi
+                       .\thelstnumber}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@skipnumbers}
+% There are more things to do. We calculate how many lines must skip their
+% label. The formula is
+%	$$|\lst@skipnumbers|=
+%		\textrm{\emph{first printing line}}\bmod|\lst@stepnumber|.$$
+% Note that we use a nonpositive representative for |\lst@skipnumbers|.
+%    \begin{macrocode}
+\newcount\lst@skipnumbers % \global
+\lst@AddToHook{Init}
+    {\ifnum \z@>\lst@stepnumber
+         \let\lst@advancelstnum\m@ne
+         \edef\lst@stepnumber{-\lst@stepnumber}%
+     \fi
+     \ifnum \z@<\lst@stepnumber
+         \global\lst@skipnumbers\lst@firstnumber
+         \global\divide\lst@skipnumbers\lst@stepnumber
+         \global\multiply\lst@skipnumbers-\lst@stepnumber
+         \global\advance\lst@skipnumbers\lst@firstnumber
+         \ifnum\lst@skipnumbers>\z@
+             \global\advance\lst@skipnumbers -\lst@stepnumber
+         \fi
+%    \end{macrocode}
+% If |\lst@stepnumber| is zero, no line numbers are printed:
+%    \begin{macrocode}
+     \else
+         \let\lst@SkipOrPrintLabel\relax
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@SkipOrPrintLabel}
+% But default is this. We use the fact that |\lst@skipnumbers| is nonpositive.
+% The counter advances every line and if that counter is zero, we print a line
+% number and decrement the counter by |\lst@stepnumber|.
+%    \begin{macrocode}
+\gdef\lst@SkipOrPrintLabel{%
+    \ifnum\lst@skipnumbers=\z@
+        \global\advance\lst@skipnumbers-\lst@stepnumber\relax
+        \lst@PlaceNumber
+        \lst@numberfirstlinefalse
+    \else
+%    \end{macrocode}
+% If the first line of a listing should get a number, it gets it here.
+%    \begin{macrocode}
+        \lst@ifnumberfirstline
+            \lst@PlaceNumber
+            \lst@numberfirstlinefalse
+        \fi
+    \fi
+    \global\advance\lst@skipnumbers\@ne}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{OnEmptyLine}{%
+    \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@
+        \global\advance\lst@skipnumbers-\lst@stepnumber\relax
+    \fi\fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Line shape and line breaking}
+%
+% \begin{macro}{\lst@parshape}
+% We define a default version of |\lst@parshape| for the case that the
+% \aspectname{lineshape} aspect is not loaded. We use this parshape every line
+% (in fact every paragraph). Furthermore we must repeat the parshape if we
+% close a group level---or the shape is forgotten.
+%    \begin{macrocode}
+%<*kernel>
+\def\lst@parshape{\parshape\@ne \z@ \linewidth}
+\lst@AddToHookAtTop{EveryLine}{\lst@parshape}
+\lst@AddToHookAtTop{EndGroup}{\lst@parshape}
+%</kernel>
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{aspect}{lineshape}
+% Our first aspect in this section.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{lineshape}
+%    \end{macrocode}
+%
+% \begin{lstkey}{xleftmargin}
+% \begin{lstkey}{xrightmargin}
+% \begin{lstkey}{resetmargins}
+% \begin{lstkey}{linewidth}
+% Usual stuff.
+%    \begin{macrocode}
+\lst@Key{xleftmargin}{\z@}{\def\lst@xleftmargin{#1}}
+\lst@Key{xrightmargin}{\z@}{\def\lst@xrightmargin{#1}}
+\lst@Key{resetmargins}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins}
+%    \end{macrocode}
+% The margins become zero if we make an exact box around the listing.
+%    \begin{macrocode}
+\lst@AddToHook{BoxUnsafe}{\let\lst@xleftmargin\z@
+                          \let\lst@xrightmargin\z@}
+\lst@AddToHook{TextStyle}{%
+    \let\lst@xleftmargin\z@ \let\lst@xrightmargin\z@
+    \let\lst@ifresetmargins\iftrue}
+%    \end{macrocode}
+% Added above hook after bug report from \lsthelper{Magnus~Lewis-Smith}
+%{1999/08/06}{|\lstinline| indented} and \lsthelper{Jos\'e~Romildo~Malaquias}
+%{2000/08/22}{|\lstinline| indented (resetmargins)} respectively.
+%    \begin{macrocode}
+\lst@Key{linewidth}\linewidth{\def\lst@linewidth{#1}}
+\lst@AddToHook{PreInit}{\linewidth\lst@linewidth\relax}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@parshape}
+% The definition itself is easy.
+%    \begin{macrocode}
+\gdef\lst@parshape{%
+    \parshape\@ne \@totalleftmargin \linewidth}
+%    \end{macrocode}
+% We calculate the line width and (inner/outer) indent for a listing.
+%    \begin{macrocode}
+\lst@AddToHook{Init}
+    {\lst@ifresetmargins
+         \advance\linewidth\@totalleftmargin
+         \advance\linewidth\rightmargin
+         \@totalleftmargin\z@
+     \fi
+     \advance\linewidth-\lst@xleftmargin
+     \advance\linewidth-\lst@xrightmargin
+     \advance\@totalleftmargin\lst@xleftmargin\relax}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{lineskip}
+% The introduction of this key is due to communication with
+% \lsthelper{Andreas~Bartelt}{1997/09/11}{problem with redefed \parskip;
+% \lstlineskip introduced}. Version 1.0 implements this feature by
+% redefining |\baselinestretch|.
+%    \begin{macrocode}
+\lst@Key{lineskip}{\z@}{\def\lst@lineskip{#1\relax}}
+\lst@AddToHook{Init}
+    {\parskip\z@
+     \ifdim\z@=\lst@lineskip\else
+         \@tempdima\baselineskip
+         \advance\@tempdima\lst@lineskip
+%    \end{macrocode}
+% The following three lines simulate the `bad' |\divide| |\@tempdima|
+% |\strip@pt| |\baselineskip| |\relax|. Thanks to \lsthelper{Peter~Bartke}
+% {2002/04/10}{bad use of \strip@pt} for the bug report.
+%    \begin{macrocode}
+         \multiply\@tempdima\@cclvi
+         \divide\@tempdima\baselineskip\relax
+         \multiply\@tempdima\@cclvi
+%    \end{macrocode}
+%    \begin{macrocode}
+         \edef\baselinestretch{\strip@pt\@tempdima}%
+         \selectfont
+     \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{breaklines}
+% \begin{lstkey}{breakindent}
+% \begin{lstkey}{breakautoindent}
+% \begin{lstkey}{breakatwhitespace}
+% \begin{lstkey}{prebreak}
+% \begin{lstkey}{postbreak}
+% As usual we have no problems in announcing more keys.
+% \keyname{breakatwhitespace} is due to \lsthelper{Javier~Bezos}{2003/09/23}
+% {breaklines breaks at odd places}. Unfortunately a previous definition of
+% that key was wrong as \lsthelper{Franz~Rinnerthaler}{2004/03/12}
+% {breakatwhitespace has no effect} and \lsthelper{Ulrike~Fischer}{2004/07/11}
+% {breakatwhitespace has no effect} reported.
+%    \begin{macrocode}
+\lst@Key{breaklines}{false}[t]{\lstKV@SetIf{#1}\lst@ifbreaklines}
+\lst@Key{breakindent}{20pt}{\def\lst@breakindent{#1}}
+\lst@Key{breakautoindent}{t}[t]{\lstKV@SetIf{#1}\lst@ifbreakautoindent}
+\lst@Key{breakatwhitespace}{false}[t]%
+    {\lstKV@SetIf{#1}\lst@ifbreakatwhitespace}
+\lst@Key{prebreak}{}{\def\lst@prebreak{#1}}
+\lst@Key{postbreak}{}{\def\lst@postbreak{#1}}
+%    \end{macrocode}
+% We assign some different macros and (if necessary) suppress ``underfull
+% |\hbox|'' messages (and use different pretolerance):
+%    \begin{macrocode}
+\lst@AddToHook{Init}
+    {\lst@ifbreaklines
+         \hbadness\@M \pretolerance\@M
+         \@rightskip\@flushglue \rightskip\@rightskip % \raggedright
+         \leftskip\z@skip \parindent\z@
+%    \end{macrocode}
+% A |\raggedright| above has been replaced by setting the values by hand after
+% a bug report from \lsthelper{Morten~H\o gholm}{2004/09/06}{ltugboat.cls and
+% listings}.
+%
+% We use the normal parshape and the calculated |\lst@breakshape| (see below).
+%    \begin{macrocode}
+         \def\lst@parshape{\parshape\tw@ \@totalleftmargin\linewidth
+                           \lst@breakshape}%
+     \else
+         \let\lst@discretionary\@empty
+     \fi}
+\lst@AddToHook{OnNewLine}
+    {\lst@ifbreaklines \lst@breakNewLine \fi}
+%    \end{macrocode}
+% \end{lstkey}\end{lstkey}\end{lstkey}\end{lstkey}
+% \end{lstkey}\end{lstkey}
+%
+% \begin{macro}{\lst@discretionary}
+% \begin{macro}{\lst@spacekern}
+% Here comes the whole magic: We set a discretionary break after each `output
+% unit'. However we redefine |\space| to be used inside |\discretionary| and
+% use \hookname{EveryLine} hook. After a bug report by \lsthelper{Carsten~Hamm}
+% {2002/04/19}{wrong frame rules with breaklines and xleftmargin>0pt} I've
+% added |\kern-\lst@xleftmargin|, which became |\kern-\@totalleftmargin| after
+% a bug report by \lsthelper{Christian~Kaiser}{2002/12/13}{wrong frame inside
+% itemize with breaklines=true}.
+%    \begin{macrocode}
+\gdef\lst@discretionary{%
+    \lst@ifbreakatwhitespace
+        \lst@ifwhitespace \lst@@discretionary \fi
+    \else
+        \lst@@discretionary
+    \fi}%
+\gdef\lst@@discretionary{%
+    \discretionary{\let\space\lst@spacekern\lst@prebreak}%
+                  {\llap{\lsthk@EveryLine
+                   \kern\lst@breakcurrindent \kern-\@totalleftmargin}%
+                   \let\space\lst@spacekern\lst@postbreak}{}}
+\lst@AddToHook{PostOutput}{\lst@discretionary}
+\gdef\lst@spacekern{\kern\lst@width}
+%    \end{macrocode}
+% \begin{ALTERNATIVE}
+% |\penalty\@M \hskip\z@ plus 1fil \penalty0\hskip\z@ plus-1fil| \emph{before}
+% each `output unit' (i.e.~before |\hbox{...}| in the output macros) also break
+% the lines as desired. But we wouldn't have |prebreak| and |postbreak|.
+% \end{ALTERNATIVE}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@breakNewLine}
+% We use \keyname{breakindent}, and additionally the current line indention
+% (coming from white spaces at the beginning of the line) if `auto indent' is
+% on.
+%    \begin{macrocode}
+\gdef\lst@breakNewLine{%
+    \@tempdima\lst@breakindent\relax
+    \lst@ifbreakautoindent \advance\@tempdima\lst@lostspace \fi
+%    \end{macrocode}
+% Now we calculate the margin and line width of the wrapped part \ldots
+%    \begin{macrocode}
+    \@tempdimc-\@tempdima \advance\@tempdimc\linewidth
+                          \advance\@tempdima\@totalleftmargin
+%    \end{macrocode}
+% \ldots\space and store it in |\lst@breakshape|.
+%    \begin{macrocode}
+    \xdef\lst@breakshape{\noexpand\lst@breakcurrindent \the\@tempdimc}%
+    \xdef\lst@breakcurrindent{\the\@tempdima}}
+\global\let\lst@breakcurrindent\z@ % init
+%    \end{macrocode}
+% The initialization of |\lst@breakcurrindent| has been added after a bug
+% report by \lsthelper{Alvaro~Herrera}{2002/12/09}{`undefined control
+% sequence \lst@breakcurrindent' with fancyvrb and breaklines}.
+% \begin{TODO}
+% We could speed this up by allocating two global dimensions.
+% \end{TODO}
+% \end{macro}
+%
+% \begin{macro}{\lst@breakshape}
+% \lsthelper{Andreas~Deininger}{2000/08/25}{`breaklines,first>1' leads to
+% ``undefined control sequence'' error} reported a problem which is resolved
+% by providing a default break shape.
+%    \begin{macrocode}
+\gdef\lst@breakshape{\@totalleftmargin \linewidth}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@breakProcessOther}
+% is the same as |\lst@ProcessOther| except that it also outputs the current
+% token string. This inserts a potential linebreak point.
+% Only the closing parenthesis uses this macro yet.
+%    \begin{macrocode}
+\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther}
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi}
+%    \end{macrocode}
+% A bug reported by \lsthelper{Gabriel~Tauro}{2001/04/18}{unexpected `)' if
+% the character appears before first printed line} has been removed by using
+% |\lst@ProcessOther| instead of |\lst@AppendOther|.
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Frames}
+%
+% \begin{aspect}{frames}
+% Another aspect.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[lineshape]{frames}
+%    \end{macrocode}
+%
+% \begin{lstkey}{framexleftmargin}
+% \begin{lstkey}{framexrightmargin}
+% \begin{lstkey}{framextopmargin}
+% \begin{lstkey}{framexbottommargin}
+% These keys just save the argument.
+%    \begin{macrocode}
+\lst@Key{framexleftmargin}{\z@}{\def\lst@framexleftmargin{#1}}
+\lst@Key{framexrightmargin}{\z@}{\def\lst@framexrightmargin{#1}}
+\lst@Key{framextopmargin}{\z@}{\def\lst@framextopmargin{#1}}
+\lst@Key{framexbottommargin}{\z@}{\def\lst@framexbottommargin{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{backgroundcolor}
+% \lsthelper{Ralf~Imh\"auser}{2000/01/08}{coloured background} inspired the
+% key \keyname{backgroundcolor}. All keys save the argument, and \ldots
+%    \begin{macrocode}
+\lst@Key{backgroundcolor}{}{\def\lst@bkgcolor{#1}}
+\lst@Key{fillcolor}{}{\def\lst@fillcolor{#1}}
+\lst@Key{rulecolor}{}{\def\lst@rulecolor{#1}}
+\lst@Key{rulesepcolor}{}{\def\lst@rulesepcolor{#1}}
+%    \end{macrocode}
+% \ldots\space some have default settings if they are empty.
+%    \begin{macrocode}
+\lst@AddToHook{Init}{%
+    \ifx\lst@fillcolor\@empty
+        \let\lst@fillcolor\lst@bkgcolor
+    \fi
+    \ifx\lst@rulesepcolor\@empty
+        \let\lst@rulesepcolor\lst@fillcolor
+    \fi}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{lstkey}{rulesep}
+% \begin{lstkey}{framerule}
+% \begin{lstkey}{framesep}
+% \begin{lstkey}{frameshape}
+% Another set of keys, which mainly save their respective argument.
+% \keyname{frameshape} capitalizes all letters, and checks whether at least one
+% round corner is specified. Eventually we define |\lst@frame| to be empty if
+% and only if there is no frameshape.
+%    \begin{macrocode}
+\lst@Key{rulesep}{2pt}{\def\lst@rulesep{#1}}
+\lst@Key{framerule}{.4pt}{\def\lst@framerulewidth{#1}}
+\lst@Key{framesep}{3pt}{\def\lst@frametextsep{#1}}
+\lst@Key{frameshape}{}{%
+    \let\lst@xrulecolor\@empty
+    \lstKV@FourArg{#1}%
+    {\uppercase{\def\lst@frametshape{##1}}%
+     \uppercase{\def\lst@framelshape{##2}}%
+     \uppercase{\def\lst@framershape{##3}}%
+     \uppercase{\def\lst@framebshape{##4}}%
+     \let\lst@ifframeround\iffalse
+     \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}%
+     \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}%
+     \def\lst@frame{##1##2##3##4}}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{lstkey}{frameround}
+% \begin{lstkey}{frame}
+% We have to do some conversion here.
+%    \begin{macrocode}
+\lst@Key{frameround}\relax
+    {\uppercase{\def\lst@frameround{#1}}%
+     \expandafter\lstframe@\lst@frameround ffff\relax}
+\global\let\lst@frameround\@empty
+%    \end{macrocode}
+% In case of an verbose argument, we use the |trbl|-subset replacement.
+%    \begin{macrocode}
+\lst@Key{frame}\relax{%
+    \let\lst@xrulecolor\@empty
+    \lstKV@SwitchCases{#1}%
+    {none&\let\lst@frame\@empty\\%
+     leftline&\def\lst@frame{l}\\%
+     topline&\def\lst@frame{t}\\%
+     bottomline&\def\lst@frame{b}\\%
+     lines&\def\lst@frame{tb}\\%
+     single&\def\lst@frame{trbl}\\%
+     shadowbox&\def\lst@frame{tRBl}%
+            \def\lst@xrulecolor{\lst@rulesepcolor}%
+            \def\lst@rulesep{\lst@frametextsep}%
+    }{\def\lst@frame{#1}}%
+    \expandafter\lstframe@\lst@frameround ffff\relax}
+%    \end{macrocode}
+% Adding |t|, |r|, |b|, and |l| in case of their upper case versions makes
+% later tests easier.
+%    \begin{macrocode}
+\gdef\lstframe@#1#2#3#4#5\relax{%
+    \lst@IfSubstring T\lst@frame{\edef\lst@frame{t\lst@frame}}{}%
+    \lst@IfSubstring R\lst@frame{\edef\lst@frame{r\lst@frame}}{}%
+    \lst@IfSubstring B\lst@frame{\edef\lst@frame{b\lst@frame}}{}%
+    \lst@IfSubstring L\lst@frame{\edef\lst@frame{l\lst@frame}}{}%
+%    \end{macrocode}
+% We now check top and bottom frame rules, \ldots
+%    \begin{macrocode}
+    \let\lst@frametshape\@empty \let\lst@framebshape\@empty
+    \lst@frameCheck
+        ltr\lst@framelshape\lst@frametshape\lst@framershape #4#1%
+    \lst@frameCheck
+        LTR\lst@framelshape\lst@frametshape\lst@framershape #4#1%
+    \lst@frameCheck
+        lbr\lst@framelshape\lst@framebshape\lst@framershape #3#2%
+    \lst@frameCheck
+        LBR\lst@framelshape\lst@framebshape\lst@framershape #3#2%
+%    \end{macrocode}
+% \ldots\space look for round corners \ldots
+%    \begin{macrocode}
+    \let\lst@ifframeround\iffalse
+    \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}%
+    \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}%
+%    \end{macrocode}
+% and define left and right frame shape.
+%    \begin{macrocode}
+    \let\lst@framelshape\@empty \let\lst@framershape\@empty
+    \lst@IfSubstring L\lst@frame
+        {\def\lst@framelshape{YY}}%
+        {\lst@IfSubstring l\lst@frame{\def\lst@framelshape{Y}}{}}%
+    \lst@IfSubstring R\lst@frame
+        {\def\lst@framershape{YY}}%
+        {\lst@IfSubstring r\lst@frame{\def\lst@framershape{Y}}{}}}
+%    \end{macrocode}
+% Now comes the macro used to define top and bottom frame shape.
+% It extends the macro |#5|.
+% The last two arguments show whether left and right corners are round.
+% |#4| and |#6| are temporary macros.
+% |#1#2#3| are the three characters we test for.
+%    \begin{macrocode}
+\gdef\lst@frameCheck#1#2#3#4#5#6#7#8{%
+    \lst@IfSubstring #1\lst@frame
+        {\if #7T\def#4{R}\else \def#4{Y}\fi}%
+        {\def#4{N}}%
+    \lst@IfSubstring #3\lst@frame
+        {\if #8T\def#6{R}\else \def#6{Y}\fi}%
+        {\def#6{N}}%
+    \lst@IfSubstring #2\lst@frame{\edef#5{#5#4Y#6}}{}}
+%    \end{macrocode}
+% For text style listings all frames and the background color are
+% deactivated -- added after bug reports by \lsthelper{Stephen~Reindl}%
+% {2002/06/04}{frames not deactivated for text style listings} and
+% \lsthelper{Thomas~ten~Cate}{2006/07/14}{inline listings get background
+% color after a line break}
+%    \begin{macrocode}
+\lst@AddToHook{TextStyle}
+   {\let\lst@frame\@empty
+    \let\lst@frametshape\@empty
+    \let\lst@framershape\@empty
+    \let\lst@framebshape\@empty
+    \let\lst@framelshape\@empty
+    \let\lst@bkgcolor\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% As per a bug report by \lsthelper{Ignacio~Fern\'andez~Galv\'an}{2006/07/26}%
+% {Frame with background color has slight hole on left side}, the small section
+% of background color to the left of the margin is now drawn before the left
+% side of the frame is drawn, so that they overlap correctly in Acrobat.
+%
+% \begin{macro}{\lst@frameMakeVBox}
+%    \begin{macrocode}
+\gdef\lst@frameMakeBoxV#1#2#3{%
+    \setbox#1\hbox{%
+      \color@begingroup \lst@rulecolor
+      \ifx\lst@framelshape\@empty
+      \else
+            \llap{%
+                \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}%
+                \kern\lst@framexleftmargin}%
+      \fi
+      \llap{\setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3%
+                            \lst@frameL}%
+            \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}%
+                                                  {\ht\z@}{\dp\z@}}%
+            \box\z@
+            \kern\lst@frametextsep\relax
+            \kern\lst@framexleftmargin}%
+      \rlap{\kern-\lst@framexleftmargin
+                    \@tempdima\linewidth
+            \advance\@tempdima\lst@framexleftmargin
+            \advance\@tempdima\lst@framexrightmargin
+            \lst@frameBlock\lst@bkgcolor\@tempdima{#2}{#3}%
+            \ifx\lst@framershape\@empty
+                \kern\lst@frametextsep\relax
+            \else
+                \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}%
+            \fi
+            \setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3%
+                            \lst@frameR}%
+            \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}%
+                                                  {\ht\z@}{\dp\z@}}%
+            \box\z@}%
+      \color@endgroup}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameBlock}
+%    \begin{macrocode}
+\gdef\lst@frameBlock#1#2#3#4{%
+    \color@begingroup
+      #1%
+      \setbox\z@\hbox{\vrule\@height#3\@depth#4%
+                      \ifx#1\@empty \@width\z@ \kern#2\relax
+                              \else \@width#2\relax \fi}%
+      \box\z@
+    \color@endgroup}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameR}
+% typesets right rules.
+% We only need to iterate through |\lst@framershape|.
+%    \begin{macrocode}
+\gdef\lst@frameR{%
+    \expandafter\lst@frameR@\lst@framershape\relax
+    \kern-\lst@rulesep}
+\gdef\lst@frameR@#1{%
+    \ifx\relax#1\@empty\else
+        \if #1Y\lst@framevrule \else \kern\lst@framerulewidth \fi
+        \kern\lst@rulesep
+        \expandafter\lst@frameR@b
+    \fi}
+\gdef\lst@frameR@b#1{%
+    \ifx\relax#1\@empty
+    \else
+        \if #1Y\color@begingroup
+               \lst@xrulecolor
+               \lst@framevrule
+               \color@endgroup
+        \else
+               \kern\lst@framerulewidth
+        \fi
+        \kern\lst@rulesep
+        \expandafter\lst@frameR@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameL}
+% Ditto left rules.
+%    \begin{macrocode}
+\gdef\lst@frameL{%
+    \kern-\lst@rulesep
+    \expandafter\lst@frameL@\lst@framelshape\relax}
+\gdef\lst@frameL@#1{%
+    \ifx\relax#1\@empty\else
+        \kern\lst@rulesep
+        \if#1Y\lst@framevrule \else \kern\lst@framerulewidth \fi
+        \expandafter\lst@frameL@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameH}
+% This is the central macro used to draw top and bottom frame rules.
+% The first argument is either |T| or |B| and the second contains the shape.
+% We use |\@tempcntb| as size counter.
+%    \begin{macrocode}
+\gdef\lst@frameH#1#2{%
+    \global\let\lst@framediml\z@ \global\let\lst@framedimr\z@
+    \setbox\z@\hbox{}\@tempcntb\z@
+    \expandafter\lst@frameH@\expandafter#1#2\relax\relax\relax
+            \@tempdimb\lst@frametextsep\relax
+    \advance\@tempdimb\lst@framerulewidth\relax
+            \@tempdimc-\@tempdimb
+    \advance\@tempdimc\ht\z@
+    \advance\@tempdimc\dp\z@
+    \setbox\z@=\hbox{%
+      \lst@frameHBkg\lst@fillcolor\@tempdimb\@firstoftwo
+      \if#1T\rlap{\raise\dp\@tempboxa\box\@tempboxa}%
+       \else\rlap{\lower\ht\@tempboxa\box\@tempboxa}\fi
+      \lst@frameHBkg\lst@rulesepcolor\@tempdimc\@secondoftwo
+      \advance\@tempdimb\ht\@tempboxa
+      \if#1T\rlap{\raise\lst@frametextsep\box\@tempboxa}%
+       \else\rlap{\lower\@tempdimb\box\@tempboxa}\fi
+      \rlap{\box\z@}%
+    }}
+\gdef\lst@frameH@#1#2#3#4{%
+    \ifx\relax#4\@empty\else
+        \lst@frameh \@tempcntb#1#2#3#4%
+        \advance\@tempcntb\@ne
+        \expandafter\lst@frameH@\expandafter#1%
+    \fi}
+\gdef\lst@frameHBkg#1#2#3{%
+    \setbox\@tempboxa\hbox{%
+        \kern-\lst@framexleftmargin
+        #3{\kern-\lst@framediml\relax}{\@tempdima\z@}%
+        \ifdim\lst@framediml>\@tempdimb
+            #3{\@tempdima\lst@framediml \advance\@tempdima-\@tempdimb
+               \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@}%
+              {\kern-\lst@framediml
+               \advance\@tempdima\lst@framediml\relax}%
+        \fi
+        #3{\@tempdima\z@
+           \ifx\lst@framelshape\@empty\else
+               \advance\@tempdima\@tempdimb
+           \fi
+           \ifx\lst@framershape\@empty\else
+               \advance\@tempdima\@tempdimb
+           \fi}%
+          {\ifdim\lst@framedimr>\@tempdimb
+              \advance\@tempdima\lst@framedimr\relax
+           \fi}%
+        \advance\@tempdima\linewidth
+        \advance\@tempdima\lst@framexleftmargin
+        \advance\@tempdima\lst@framexrightmargin
+        \lst@frameBlock#1\@tempdima#2\z@
+        #3{\ifdim\lst@framedimr>\@tempdimb
+               \@tempdima-\@tempdimb
+               \advance\@tempdima\lst@framedimr\relax
+               \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@
+           \fi}{}%
+        }}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameh}
+% This is the low-level macro used to draw top and bottom frame rules.
+% It \emph{adds} one rule plus corners to box 0.
+% The first parameter gives the size of the corners and the second is either
+% |T| or |B|.
+% |#3#4#5| is a left-to-right description of the frame and is in
+% $\{$\texttt{Y,N,R}$\}\times\{$\texttt{Y,N}$\}\times\{$\texttt{Y,N,R}$\}$.
+% We move to the correct horizontal position, set the left corner, the
+% horizontal line, and the right corner.
+%    \begin{macrocode}
+\gdef\lst@frameh#1#2#3#4#5{%
+    \lst@frameCalcDimA#1%
+    \lst@ifframeround \@getcirc\@tempdima \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \setbox\z@\hbox{%
+      \begingroup
+      \setbox\z@\hbox{%
+        \kern-\lst@framexleftmargin
+        \color@begingroup
+        \ifnum#1=\z@ \lst@rulecolor \else \lst@xrulecolor \fi
+%    \end{macrocode}
+% |\lst@frameCorner| gets four arguments:
+% |\llap|, |TL| or |BL|, the corner type $\in\{$\texttt{Y,N,R}$\}$, and the
+% size |#1|.
+%    \begin{macrocode}
+        \lst@frameCornerX\llap{#2L}#3#1%
+        \ifdim\lst@framediml<\@tempdimb
+            \xdef\lst@framediml{\the\@tempdimb}%
+        \fi
+        \begingroup
+        \if#4Y\else \let\lst@framerulewidth\z@ \fi
+                \@tempdima\lst@framexleftmargin
+        \advance\@tempdima\lst@framexrightmargin
+        \advance\@tempdima\linewidth
+        \vrule\@width\@tempdima\@height\lst@framerulewidth \@depth\z@
+        \endgroup
+        \lst@frameCornerX\rlap{#2R}#5#1%
+        \ifdim\lst@framedimr<\@tempdimb
+            \xdef\lst@framedimr{\the\@tempdimb}%
+        \fi
+        \color@endgroup}%
+%    \end{macrocode}
+%    \begin{macrocode}
+      \if#2T\rlap{\raise\dp\z@\box\z@}%
+       \else\rlap{\lower\ht\z@\box\z@}\fi
+      \endgroup
+      \box\z@}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameCornerX}
+% typesets a single corner and returns |\@tempdimb|, the width of the corner.
+%    \begin{macrocode}
+\gdef\lst@frameCornerX#1#2#3#4{%
+    \setbox\@tempboxa\hbox{\csname\@lst @frame\if#3RR\fi #2\endcsname}%
+    \@tempdimb\wd\@tempboxa
+    \if #3R%
+        #1{\box\@tempboxa}%
+    \else
+        \if #3Y\expandafter#1\else
+               \@tempdimb\z@ \expandafter\vphantom \fi
+        {\box\@tempboxa}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameCalcDimA}
+% calculates an all over width; used by |\lst@frameh| and |\lst@frameInit|.
+%    \begin{macrocode}
+\gdef\lst@frameCalcDimA#1{%
+            \@tempdima\lst@rulesep
+    \advance\@tempdima\lst@framerulewidth
+    \multiply\@tempdima#1\relax
+    \advance\@tempdima\lst@frametextsep
+    \advance\@tempdima\lst@framerulewidth
+    \multiply\@tempdima\tw@}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameInit}
+% First we look which frame types we have on the left and on the right.
+% We speed up things if there are no vertical rules.
+%    \begin{macrocode}
+\lst@AddToHook{Init}{\lst@frameInit}
+\newbox\lst@framebox
+\gdef\lst@frameInit{%
+    \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi
+    \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi
+    \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}%
+%    \end{macrocode}
+% We adjust values to round corners if necessary.
+%    \begin{macrocode}
+    \lst@ifframeround
+        \lst@frameCalcDimA\z@ \@getcirc\@tempdima
+        \@tempdimb\@tempdima \divide\@tempdimb\tw@
+        \advance\@tempdimb -\@wholewidth
+        \edef\lst@frametextsep{\the\@tempdimb}%
+        \edef\lst@framerulewidth{\the\@wholewidth}%
+%    \end{macrocode}
+%    \begin{macrocode}
+        \lst@frameCalcDimA\@ne \@getcirc\@tempdima
+        \@tempdimb\@tempdima \divide\@tempdimb\tw@
+        \advance\@tempdimb -\tw@\@wholewidth
+        \advance\@tempdimb -\lst@frametextsep
+        \edef\lst@rulesep{\the\@tempdimb}%
+    \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}%
+    \def\lst@framelr{\copy\lst@framebox}%
+%    \end{macrocode}
+% Finally we typeset the rules (+ corners).
+% We possibly need to insert negative |\vskip| to remove space between
+% preceding text and top rule.
+% \begin{TODO}
+% Use |\vspace| instead of |\vskip|?
+% \end{TODO}
+%    \begin{macrocode}
+    \ifx\lst@frametshape\@empty\else
+        \lst@frameH T\lst@frametshape
+        \ifvoid\z@\else
+            \par\lst@parshape
+            \@tempdima-\baselineskip \advance\@tempdima\ht\z@
+            \ifdim\prevdepth<\@cclvi\p@\else
+                \advance\@tempdima\prevdepth
+            \fi
+            \ifdim\@tempdima<\z@
+                \vskip\@tempdima\vskip\lineskip
+            \fi
+            \noindent\box\z@\par
+            \lineskiplimit\maxdimen \lineskip\z@
+        \fi
+        \lst@frameSpreadV\lst@framextopmargin
+    \fi}
+%    \end{macrocode}
+% |\parshape\lst@parshape| ensures that the top rules correctly indented.
+% The bug was reported by \lsthelper{Marcin~Kasperski}{1999/04/28}{top rules
+% indented right inside itemize}.
+%
+% We typeset left and right rules every line.
+%    \begin{macrocode}
+\lst@AddToHook{EveryLine}{\lst@framelr}
+\global\let\lst@framelr\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameExit}
+% The rules at the bottom.
+%    \begin{macrocode}
+\lst@AddToHook{DeInit}
+    {\ifx\lst@framebshape\@empty\else \lst@frameExit \fi}
+\gdef\lst@frameExit{%
+    \lst@frameSpreadV\lst@framexbottommargin
+    \lst@frameH B\lst@framebshape
+    \ifvoid\z@\else
+        \everypar{}\par\lst@parshape\nointerlineskip\noindent\box\z@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameSpreadV}
+% sets rules for vertical spread.
+%    \begin{macrocode}
+\gdef\lst@frameSpreadV#1{%
+    \ifdim\z@=#1\else
+        \everypar{}\par\lst@parshape\nointerlineskip\noindent
+        \lst@frameMakeBoxV\z@{#1}{\z@}%
+        \box\z@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameTR}
+% \begin{macro}{\lst@frameBR}
+% \begin{macro}{\lst@frameBL}
+% \begin{macro}{\lst@frameTL}
+% These macros make a vertical and horizontal rule.
+% The implicit argument |\@tempdima| gives the size of two corners and is
+% provided by |\lst@frameh|.
+%    \begin{macrocode}
+\gdef\lst@frameTR{%
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@
+    \kern-\lst@framerulewidth
+    \raise\lst@framerulewidth\hbox{%
+        \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}}
+\gdef\lst@frameBR{%
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@
+    \kern-\lst@framerulewidth
+    \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@}
+\gdef\lst@frameBL{%
+    \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@
+    \kern-\lst@framerulewidth
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@}
+\gdef\lst@frameTL{%
+    \raise\lst@framerulewidth\hbox{%
+        \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}%
+    \kern-\lst@framerulewidth
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{\lst@frameRoundT}
+% \begin{macro}{\lst@frameRoundB}
+% are helper macros to typeset round corners. We set height and depth to
+% the visible parts of the circle font.
+%    \begin{macrocode}
+\gdef\lst@frameRoundT{%
+    \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}%
+    \ht\@tempboxa\lst@framerulewidth
+    \box\@tempboxa}
+\gdef\lst@frameRoundB{%
+    \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}%
+    \dp\@tempboxa\z@
+    \box\@tempboxa}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@frameRTR}
+% \begin{macro}{\lst@frameRBR}
+% \begin{macro}{\lst@frameRBL}
+% \begin{macro}{\lst@frameRTL}
+% The round corners.
+%    \begin{macrocode}
+\gdef\lst@frameRTR{%
+    \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth
+                           \kern.5\@tempdima \lst@frameRoundT \hss}}
+\gdef\lst@frameRBR{%
+    \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth
+    \advance\@tempcnta\@ne \kern.5\@tempdima \lst@frameRoundB \hss}}
+\gdef\lst@frameRBL{%
+    \advance\@tempcnta\tw@ \lst@frameRoundB
+    \kern-.5\@tempdima}
+\gdef\lst@frameRTL{%
+    \advance\@tempcnta\thr@@\lst@frameRoundT
+    \kern-.5\@tempdima}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Macro use for make}
+%
+% \begin{aspect}{make}
+% \begin{macro}{\lst@makemode}
+% \begin{macro}{\lst@ifmakekey}
+% If we've entered the special mode for Make, we save whether the last
+% identifier has been a first order keyword.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{make}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@NewMode\lst@makemode
+\lst@AddToHook{Output}{%
+    \ifnum\lst@mode=\lst@makemode
+        \ifx\lst@thestyle\lst@gkeywords@sty
+            \lst@makekeytrue
+        \fi
+    \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@makekeytrue{\let\lst@ifmakekey\iftrue}
+\gdef\lst@makekeyfalse{\let\lst@ifmakekey\iffalse}
+\global\lst@makekeyfalse % init
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{lstkey}{makemacrouse}
+% adjusts the character table if necessary
+%    \begin{macrocode}
+\lst@Key{makemacrouse}f[t]{\lstKV@SetIf{#1}\lst@ifmakemacrouse}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@MakeSCT}
+% If `macro use' is on, the opening |$(| prints preceding characters, enters
+% the special mode and merges the two characters with the following output.
+%
+%    \begin{macrocode}
+\gdef\lst@MakeSCT{%
+    \lst@ifmakemacrouse
+        \lst@ReplaceInput{$(}{%
+            \lst@PrintToken
+            \lst@EnterMode\lst@makemode{\lst@makekeyfalse}%
+            \lst@Merge{\lst@ProcessOther\$\lst@ProcessOther(}}%
+%    \end{macrocode}
+% The closing parenthesis tests for the mode and either processes |)| as usual
+% or outputs it right here (in keyword style if a keyword was between |$(| and
+% |)|).
+%    \begin{macrocode}
+        \lst@ReplaceInput{)}{%
+            \ifnum\lst@mode=\lst@makemode
+                \lst@PrintToken
+                \begingroup
+                    \lst@ProcessOther)%
+                    \lst@ifmakekey
+                        \let\lst@currstyle\lst@gkeywords@sty
+                    \fi
+                    \lst@OutputOther
+                \endgroup
+                \lst@LeaveMode
+            \else
+                \expandafter\lst@ProcessOther\expandafter)%
+            \fi}%
+%    \end{macrocode}
+% If \keyname{makemacrouse} is off then both |$(| are just `others'.
+%    \begin{macrocode}
+    \else
+        \lst@ReplaceInput{$(}{\lst@ProcessOther\$\lst@ProcessOther(}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \section{Typesetting a listing}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+% \endgroup
+% \begin{macro}{\lst@lineno}
+% \begin{lstkey}{print}
+% \begin{lstkey}{firstline}
+% \begin{lstkey}{lastline}
+% \begin{lstkey}{linerange}
+% The `current line' counter and three keys.
+%    \begin{macrocode}
+\newcount\lst@lineno % \global
+\lst@AddToHook{InitVars}{\global\lst@lineno\@ne}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint}
+\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{PreSet}
+    {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}\end{lstkey}\end{lstkey}\end{macro}
+% The following code is just copied from the current development version, and
+% from the |lstpatch.sty| file that Carsten left in version 1.3b for doing
+% line ranges with numbers and range markers.
+%
+% First, the options that control the line-range handling.
+%    \begin{macrocode}
+\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{%
+    \def\lst@interrange{##1}\def\lst@linerange{##2,}}}
+\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}%
+                            \def\lst@rangeendprefix{#1}}
+\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}%
+                            \def\lst@rangeendsuffix{#1}}
+\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}}
+\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}}
+\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}}
+\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}}
+\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker}
+\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}%
+                       \let\lst@linerange\@empty}
+\lst@AddToHook{Init}
+{\ifx\lst@linerange\@empty
+     \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}%
+ \fi
+ \lst@GetLineInterval}%
+\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil}
+\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil}
+\def\lst@GLI@#1-#2-#3\@nil{%
+    \lst@IfNumber{#1}%
+    {\ifx\@empty#1\@empty
+         \let\lst@firstline\@ne
+     \else
+         \def\lst@firstline{#1\relax}%
+     \fi
+     \ifx\@empty#3\@empty
+         \def\lst@lastline{9999999\relax}%
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@lastline\lst@firstline
+         \else
+             \def\lst@lastline{#2\relax}%
+         \fi
+     \fi}%
+%    \end{macrocode}
+%    If we've found a general marker, we set firstline and lastline to 9999999.
+%    This prevents (almost) anything from being printed for now.
+%    \begin{macrocode}
+    {\def\lst@firstline{9999999\relax}%
+     \let\lst@lastline\lst@firstline
+%    \end{macrocode}
+%    We add the prefixes and suffixes to the markers.
+%    \begin{macrocode}
+     \let\lst@rangebegin\lst@rangebeginprefix
+     \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix
+     \ifx\@empty#3\@empty
+         \let\lst@rangeend\lst@rangeendprefix
+         \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@rangeend\@empty
+         \else
+             \let\lst@rangeend\lst@rangeendprefix
+             \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+         \fi
+     \fi
+%    \end{macrocode}
+%    The following definition will be executed in the SelectCharTable hook
+%    and here right now if we are already processing a listing.
+%    \begin{macrocode}
+     \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}%
+     \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}}
+%    \end{macrocode}
+%    \lst@DefRange is not inserted via a hook anymore. Instead it is now called
+%    directly from \lst@SelectCharTable. This was necessary to get rid of an
+%    interference with the escape-to-LaTeX-feature. The bug was reported by
+%    \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung
+%    m\"oglich...}. Another chance is due to the same bug: \lst@DefRange is
+%    redefined globally when the begin of code is found, see below. The bug was
+%    reported by \lsthelper{Tobias~Rapp}{2004/04/06}{undetected end of range if
+%    listing crosses page break} \lsthelper{Markus~Luisser}{2004/08/13}{Bug mit
+%    'linerangemarker' in umgebrochenen listings}
+%    \begin{macrocode}
+\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty}
+%    \end{macrocode}
+%
+%    Actually defining the marker (via \lst@GLI@, \lst@DefRange, \lst@CArgX as
+%    seen above) is similar to \lst@DefDelimB---except that we unfold the first
+%    parameter and use different <execute>, <pre>, and <post> statements.
+%    \begin{macrocode}
+\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}
+\def\lst@DefRangeB@#1#2#3#4{%
+    \lst@CDef{#1{#2}{#3}}#4{}%
+    {\lst@ifincluderangemarker
+         \lst@LeaveMode
+         \let#1#4%
+         \lst@DefRangeEnd
+         \lst@InitLstNumber
+     \else
+         \@tempcnta\lst@lineno \advance\@tempcnta\@ne
+         \edef\lst@firstline{\the\@tempcnta\relax}%
+         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%
+         \lst@InitLstNumber
+     \fi
+	 \global\let\lst@DefRange\lst@DefRangeEnd
+     \lst@CArgEmpty}%
+    \@empty}
+%    \end{macrocode}
+%
+% Modify labels and define |\lst@InitLstNumber| used above.
+% \lsthelper{Omair-Inam~Abdul-Matin}{2004/05/10}{experimental linerange
+% feature does not work with firstnumber}
+%    \begin{macrocode}
+\def\lstpatch@labels{%
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \else
+            \lst@nololtrue
+            \advance\@tempcnta\lst@advancenumber
+            \edef\lst@firstnumber{\the\@tempcnta\relax}%
+        \fi
+    \fi}%
+}
+\def\lst@InitLstNumber{%
+     \global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum
+     \ifx \lst@firstnumber\c@lstnumber
+         \global\advance\c@lstnumber-\lst@advancelstnum
+     \fi%
+%    \end{macrocode}
+% \lstthanks{Byron~K.~Boulton}{bkboulton@berriehill.com}{2013/11/21}
+% reported, that the line numbers are off by one, if the are displayed when
+% a linerange is given by patterns and |includerangemarker=false| is
+% set. Adding this test corrects this behaviour.
+%    \begin{macrocode}
+     \lst@ifincluderangemarker\else%
+         \global\advance\c@lstnumber by 1%
+     \fi%
+     }
+%    \end{macrocode}
+%
+%    The end-marker is defined if and only if it's not empty. The definition is
+%    similar to \lst@DefDelimE---with the above exceptions and except that we
+%    define the re-entry point \lst@DefRangeE@@ as it is defined in the new
+%    version of \lst@MProcessListing above.
+%    \begin{macrocode}
+\def\lst@DefRangeEnd{%
+    \ifx\lst@rangeend\@empty\else
+        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE
+    \fi}
+\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}
+\def\lst@DefRangeE@#1#2#3#4{%
+    \lst@CDef{#1#2{#3}}#4{}%
+    {\let#1#4%
+     \edef\lst@lastline{\the\lst@lineno\relax}%
+     \lst@DefRangeE@@}%
+    \@empty}
+\def\lst@DefRangeE@@#1\@empty{%
+    \lst@ifincluderangemarker
+        #1\lst@XPrintToken
+    \fi
+    \lst@LeaveModeToPmode
+    \lst@BeginDropInput{\lst@Pmode}}
+\def\lst@LeaveModeToPmode{%
+    \ifnum\lst@mode=\lst@Pmode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveModeToPmode
+    \fi}
+%    \end{macrocode}
+%
+%    Eventually we shouldn't forget to install \lst@OnceAtEOL, which must
+%    also be called in \lst@MSkipToFirst.
+%    \begin{macrocode}
+\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}
+\gdef\lst@OnceAtEOL{}% Init
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@
+        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty
+        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.
+        \lsthk@InitVarsBOL
+        \lst@BOLGobble}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \def\lst@next{\lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst}%
+        \expandafter\lst@next
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+%
+%    Finally the service macro \lst@IfNumber:
+%    \begin{macrocode}
+\def\lst@IfNumber#1{%
+    \ifx\@empty#1\@empty
+        \let\lst@next\@firstoftwo
+    \else
+        \lst@IfNumber@#1\@nil
+    \fi
+    \lst@next}
+\def\lst@IfNumber@#1#2\@nil{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1>47\relax \ifnum`#1>57\relax\else
+        \let\lst@next\@firstoftwo
+    \fi\fi}
+%    \end{macrocode}
+%
+% \begin{lstkey}{nolol}
+% is just a key here. We'll use it below, of course.
+%    \begin{macrocode}
+\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol}
+\def\lst@nololtrue{\let\lst@ifnolol\iftrue}
+\let\lst@ifnolol\iffalse % init
+%    \end{macrocode}
+% \end{lstkey}
+%
+%
+% \subsection{Floats, boxes and captions}
+%
+% \begin{lstkey}{captionpos}
+% \begin{lstkey}{abovecaptionskip}
+% \begin{lstkey}{belowcaptionskip}
+% \begin{lstkey}{label}
+% \begin{lstkey}{title}
+% \begin{lstkey}{caption}
+% Some keys and \ldots
+%    \begin{macrocode}
+\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}}
+\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}}
+\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}}
+%    \end{macrocode}
+% \lsthelper{Rolf~Niepraschk}{2000/01/10}{key: title} proposed \keyname{title}.
+%    \begin{macrocode}
+\lst@Key{label}\relax{\def\lst@label{#1}}
+\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax}
+\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}%
+    {\def\lst@caption{##2}\def\lst@@caption{##1}}%
+     \let\lst@title\@empty}
+\lst@AddToHookExe{TextStyle}
+    {\let\lst@caption\@empty \let\lst@@caption\@empty
+     \let\lst@title\@empty \let\lst@label\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\thelstlisting}
+% \begin{macro}{\lstlistingname}
+% \begin{lstkey}{numberbychapter}
+% \ldots\space and how the caption numbers look like. I switched to
+% |\@ifundefined| (instead of |\ifx| |\@undefined|) after an error report from
+% \lsthelper{Denis~Girou}{1999/07/26}{incompatible if hyperref loaded before
+% listings}.
+%
+% This is set |\AtBeginDocument| so that the user can specify whether or not
+% the counter should be reset at each chapter before the counter is defined,
+% using the |numberbychapter| key.
+%    \begin{macrocode}
+\AtBeginDocument{
+  \@ifundefined{thechapter}{\let\lst@ifnumberbychapter\iffalse}{}
+  \lst@ifnumberbychapter
+      \newcounter{lstlisting}[chapter]
+      \gdef\thelstlisting%
+           {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}
+  \else
+      \newcounter{lstlisting}
+      \gdef\thelstlisting{\@arabic\c@lstlisting}
+  \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@UserCommand\lstlistingname{Listing}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{numberbychapter}{true}[t]{\lstKV@SetIf{#1}\lst@ifnumberbychapter}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@MakeCaption}
+% Before defining this macro, we ensure that some other control sequences
+% exist---\lsthelper{Adam~Prugel-Bennett}{2001/02/19}{\abovecaptionskip
+% undefined in slides.cls} reported problems with the slides document class.
+% In particular we allocate above- and belowcaption skip registers and define
+% |\@makecaption|, which is an exact copy of the definition in the article
+% class. To respect the LPPL: you should have a copy of this class on your
+% \TeX\ system or you can obtain a copy from the CTAN, e.g.~from the ftp-server
+% \texttt{ftp.dante.de}.
+%
+% Axel Sommerfeldt proposed a couple of improvements regarding captions and
+% titles. The first is to separate the definitions of the skip registers and
+% |\@makecaption|.
+%    \begin{macrocode}
+\@ifundefined{abovecaptionskip}
+{\newskip\abovecaptionskip
+ \newskip\belowcaptionskip}{}
+\@ifundefined{@makecaption}
+{\long\def\@makecaption#1#2{%
+   \vskip\abovecaptionskip
+   \sbox\@tempboxa{#1: #2}%
+   \ifdim \wd\@tempboxa >\hsize
+     #1: #2\par
+   \else
+     \global \@minipagefalse
+     \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+   \fi
+   \vskip\belowcaptionskip}%
+}{}
+%    \end{macrocode}
+% The introduction of |\fnum@lstlisting| is also due to Axel. Previously the
+% replacement text was used directly in |\lst@MakeCaption|. A |\noindent| has
+% been moved elsewhere and became |\@parboxrestore| after a bug report from
+% \lsthelper{Frank~Mittelbach}{2004/02/13}{Re: Info: Inkompatibilit\"at
+% zwischen caption und listings}.
+%    \begin{macrocode}
+\def\fnum@lstlisting{%
+  \lstlistingname
+  \ifx\lst@@caption\@empty\else~\thelstlisting\fi}%
+%    \end{macrocode}
+% Captions are set only for display style listings -- thanks to
+% \lsthelper{Peter~L\"offler}{2004/04/24}{pdfTeX warning (dest): name{figure.1}
+% has been referenced but does not exist} for reporting the bug and to
+% \lsthelper{Axel~Sommerfeldt}{2004/02/27}{Re: caption + listings + hyperref}
+% for analyzing the bug.
+% We |\refstepcounter| the listing counter if and only if |\lst@@caption| is
+% not empty. Otherwise we ensure correct hyper-references,
+% see |\lst@HRefStepCounter| below. We do this once a listing, namely at the
+% top.
+%    \begin{macrocode}
+\def\lst@MakeCaption#1{%
+  \lst@ifdisplaystyle
+    \ifx #1t%
+        \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else
+                                \expandafter\refstepcounter
+        \fi {lstlisting}%
+        \ifx\lst@label\@empty\else \label{\lst@label}\fi
+%    \end{macrocode}
+% The following code has been moved here from the \hookname{Init} hook after
+% a bug report from \lsthelper{Rolf~Niepraschk}{2003/06/11}{pagebreak between
+% caption and listing}. Moreover the initialization of |\lst@name| et al have
+% been inserted here after a bug report from \lsthelper{Werner~Struckmann}
+% {2003/06/25}{undefined control sequence \lst@name}.
+% We make a `lol' entry if the name is neither empty nor a single space. But
+% we test |\lst@|(|@|)|caption| and |\lst@ifnolol| first.
+%    \begin{macrocode}
+        \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+        \global\let\lst@name\lst@arg \global\let\lstname\lst@name
+        \lst@ifnolol\else
+            \ifx\lst@@caption\@empty
+                \ifx\lst@caption\@empty
+                    \ifx\lst@intname\@empty \else \def\lst@temp{ }%
+                    \ifx\lst@intname\lst@temp \else
+                        \addcontentsline{lol}{lstlisting}\lst@name
+                    \fi\fi
+                \fi
+            \else
+                \addcontentsline{lol}{lstlisting}%
+                    {\protect\numberline{\thelstlisting}\lst@@caption}%
+            \fi
+         \fi
+     \fi
+%    \end{macrocode}
+% We make a caption if and only if the caption is not empty and the user
+% requested a caption at |#1| $\in\{\mathtt t,\mathtt b\}$. To disallow
+% pagebreaks between caption (or title) and a listing, we redefine the
+% primitive |\vskip| locally to insert |\nobreak|s. Note that we allow
+% pagebreaks in front of a `top-caption' and after a `bottom-caption'.
+% Also, the |\ignorespaces| in the |\@makecaption| call is added to match
+% what \LaTeX\ does in |\@caption|; the AMSbook class (and perhaps others)
+% assume this is present and attempt to strip it off when testing for an
+% empty caption, causing a bug noted by \lsthelper{Xiaobo~Peng}{2006/06/29}%
+% {captions not shown with amsbook class}.
+% \begin{TODO}
+% This redefinition is a brute force method. Is there a better one?
+% \end{TODO}
+%    \begin{macrocode}
+    \ifx\lst@caption\@empty\else
+        \lst@IfSubstring #1\lst@captionpos
+            {\begingroup \let\@@vskip\vskip
+             \def\vskip{\afterassignment\lst@vskip \@tempskipa}%
+             \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}%
+             \par\@parboxrestore\normalsize\normalfont % \noindent (AS)
+             \ifx #1t\allowbreak \fi
+             \ifx\lst@title\@empty
+                 \lst@makecaption\fnum@lstlisting{\ignorespaces \lst@caption}
+             \else
+                 \lst@maketitle\lst@title % (AS)
+             \fi
+             \ifx #1b\allowbreak \fi
+             \endgroup}{}%
+    \fi
+  \fi}
+%    \end{macrocode}
+% I've inserted |\normalsize| after a bug report from
+% \lsthelper{Andreas~Matthias}{2000/01/04}{caption affected by basicstyle}
+% and moved it in front of |\@makecaption| after receiving another from
+% \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages
+% not compatible}.
+% \end{macro}
+%
+% \begin{macro}{\lst@makecaption}
+% \begin{macro}{\lst@maketitle}
+% Axel proposed the first definition. The other two are default definitions.
+% They may be adjusted to make \packagename{listings} compatible with other
+% packages and classes.
+%    \begin{macrocode}
+\def\lst@makecaption{\@makecaption}
+\def\lst@maketitle{\@makecaption\lst@title@dropdelim}
+\def\lst@title@dropdelim#1{\ignorespaces}
+%    \end{macrocode}
+% The following \packagename{caption}(\packagename{2}) support comes also from
+% Axel.
+%    \begin{macrocode}
+\AtBeginDocument{%
+\@ifundefined{captionlabelfalse}{}{%
+  \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}%
+\@ifundefined{caption@startrue}{}{%
+  \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}%
+}
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@HRefStepCounter}
+% This macro sets the listing number to a negative value since the user
+% shouldn't refer to such a listing. If the \packagename{hyperref} package
+% is present, we use `lstlisting' (argument from above) to hyperref to.
+% The groups have been added to prevent other packages (namely
+% \packagename{tabularx}) from reading the locally changed counter
+% and writing it back globally. Thanks to \lsthelper{Michael~Niedermair}
+% {2001/09/18}{strange numbering of listings} for the report. Unfortunately
+% this localization led to another bug, see |\theHlstnumber|.
+%    \begin{macrocode}
+\def\lst@HRefStepCounter#1{%
+    \begingroup
+    \c@lstlisting\lst@neglisting
+    \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}%
+    \ifx\hyper@refstepcounter\@undefined\else
+        \hyper@refstepcounter{#1}%
+    \fi
+    \endgroup}
+\gdef\lst@neglisting{\z@}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{boxpos}
+% \begin{macro}{\lst@boxtrue}
+% sets the vertical alignment of the (possibly) used box respectively indicates
+% that a box is used.
+%    \begin{macrocode}
+\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@boxtrue{\let\lst@ifbox\iftrue}
+\let\lst@ifbox\iffalse
+%    \end{macrocode}
+% \end{macro}\end{lstkey}
+%
+% \begin{lstkey}{float}
+% \begin{lstkey}{floatplacement}
+% Matthias Zenger asked for double-column floats, so I've inserted some code.
+% We first check for a star \ldots
+%    \begin{macrocode}
+\lst@Key{float}\relax[\lst@floatplacement]{%
+    \lstKV@SwitchCases{#1}%
+    {true&\let\lst@floatdefault\lst@floatplacement
+          \let\lst@float\lst@floatdefault\\%
+     false&\let\lst@floatdefault\relax
+           \let\lst@float\lst@floatdefault
+    }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat
+                             \let\lst@endfloat\end@dblfloat
+                             \lst@KFloat}%
+                            {\let\lst@beginfloat\@float
+                             \let\lst@endfloat\end@float
+                             \lst@KFloat}}
+      \edef\lst@float{#1}%
+      \expandafter\lst@next\lst@float\relax}}
+%    \end{macrocode}
+% \ldots\ and define |\lst@float|.
+%    \begin{macrocode}
+\def\lst@KFloat#1\relax{%
+    \ifx\@empty#1\@empty
+        \let\lst@float\lst@floatplacement
+    \else
+        \def\lst@float{#1}%
+    \fi}
+%    \end{macrocode}
+% The setting |\lst@AddToHook{PreSet}{\let\lst@float\relax}| has been
+% changed on request of \lsthelper{Tanguy~Fautr\'e}{2004/02/02}{listings
+% not following float directive?}. This also led to some adjustments above.
+%    \begin{macrocode}
+\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}}
+\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault}
+\lst@AddToHook{TextStyle}{\let\lst@float\relax}
+\let\lst@floatdefault\relax % init
+%    \end{macrocode}
+% |\lst@doendpe| is set according to |\lst@float| -- thanks to
+% \lsthelper{Andreas~Schmidt}{2004/05/15}{wrong spacing when a floating listing
+% follows \section} and \lsthelper{Heiko~Oberdiek}{2004/05/18}{dito}.
+%    \begin{macrocode}
+\lst@AddToHook{DeInit}{%
+    \ifx\lst@float\relax
+        \global\let\lst@doendpe\@doendpe
+    \else
+        \global\let\lst@doendpe\@empty
+    \fi}
+%    \end{macrocode}
+% The float type |\ftype@lstlisting| is set according to whether the
+% \packagename{float} package is loaded and whether \texttt{figure} and
+% \texttt{table} floats are defined. This is done at |\begin{document}| to
+% make the code independent of the order of package loading.
+%    \begin{macrocode}
+\AtBeginDocument{%
+\@ifundefined{c@float@type}%
+    {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}}
+    {\edef\ftype@lstlisting{\the\c@float@type}%
+     \addtocounter{float@type}{\value{float@type}}}%
+}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+%
+% \subsection{Init and EOL}
+%
+% \begin{lstkey}{aboveskip}
+% \begin{lstkey}{belowskip}
+% We define and initialize these keys and prevent extra spacing for `inline'
+% listings (in particular if \packagename{fancyvrb} interface is active,
+% problem reported by \lsthelper{Denis~Girou}{1999/08/03}{wrong spacing}).
+%    \begin{macrocode}
+\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}}
+\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}}
+\lst@AddToHook{TextStyle}
+    {\let\lst@aboveskip\z@ \let\lst@belowskip\z@}
+%    \end{macrocode}
+% \end{lstkey}\end{lstkey}
+%
+% \begin{lstkey}{everydisplay}
+% \begin{macro}{\lst@ifdisplaystyle}
+% Some things depend on display-style listings.
+%    \begin{macrocode}
+\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}}
+\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse}
+\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue}
+\let\lst@ifdisplaystyle\iffalse
+%    \end{macrocode}
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@Init}
+% Begin a float or multicolumn environment if requested.
+%    \begin{macrocode}
+\def\lst@Init#1{%
+    \begingroup
+    \ifx\lst@float\relax\else
+        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
+        \expandafter\@tempa
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
+        \expandafter\lst@next
+    \fi
+%    \end{macrocode}
+% In restricted horizontal \TeX\ mode we switch to |\lst@boxtrue|.
+% In that case we make appropriate box(es) around the listing.
+%    \begin{macrocode}
+    \ifhmode\ifinner \lst@boxtrue \fi\fi
+    \lst@ifbox
+        \lsthk@BoxUnsafe
+        \hbox to\z@\bgroup
+             $\if t\lst@boxpos \vtop
+        \else \if b\lst@boxpos \vbox
+        \else \vcenter \fi\fi
+        \bgroup \par\noindent
+    \else
+        \lst@ifdisplaystyle
+            \lst@EveryDisplay
+            \par\penalty-50\relax
+            \vspace\lst@aboveskip
+        \fi
+    \fi
+%    \end{macrocode}
+% Moved |\vspace| after |\par|---or we can get an empty line atop listings.
+% Bug reported by \lsthelper{Jim~Hefferon}{1999/08/27}{empty line before
+% listings with |\lstinputlisting|}.
+%
+% Now make the top caption.
+%    \begin{macrocode}
+    \normalbaselines
+    \abovecaptionskip\lst@abovecaption\relax
+    \belowcaptionskip\lst@belowcaption\relax
+    \lst@MakeCaption t%
+%    \end{macrocode}
+% Some initialization.
+% I removed |\par\nointerlineskip| |\normalbaselines| after bug report from
+% \lsthelper{Jim~Hefferon}{1999/08/23}{bad vertical space after lstlisting}.
+% He reported the same problem as Aidan Philip Heerdegen (see below), but I
+% immediately saw the bug here since Jim used |\parskip|$\,\neq0$.
+%    \begin{macrocode}
+    \lsthk@PreInit \lsthk@Init
+    \lst@ifdisplaystyle
+        \global\let\lst@ltxlabel\@empty
+        \if@inlabel
+            \lst@ifresetmargins
+                \leavevmode
+            \else
+                \xdef\lst@ltxlabel{\the\everypar}%
+                \lst@AddTo\lst@ltxlabel{%
+                    \global\let\lst@ltxlabel\@empty
+                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%
+            \fi
+        \fi
+        \everypar\expandafter{\lst@ltxlabel
+                              \lsthk@EveryLine\lsthk@EveryPar}%
+    \else
+        \everypar{}\let\lst@NewLine\@empty
+    \fi
+    \lsthk@InitVars \lsthk@InitVarsBOL
+%    \end{macrocode}
+% The end of line character chr(13)=|^^M| controls the processing, see the
+% definition of |\lst@MProcessListing| below.
+% The argument |#1| is either |\relax| or |\lstenv@backslash|.
+%    \begin{macrocode}
+    \lst@Let{13}\lst@MProcessListing
+    \let\lst@Backslash#1%
+    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
+    \lst@InitFinalize}
+%    \end{macrocode}
+% Note: From version 0.19 on `listing processing' is implemented as an internal
+% mode, namely a mode with special character table. Since a bug report from
+% \lsthelper{Fermin~Reig}{2002/09/04}{bad top frame inside figure+centering}
+% |\rightskip| and the others are reset via \hookname{PreInit} and not via
+% \hookname{InitVars}.
+%    \begin{macrocode}
+\let\lst@InitFinalize\@empty % init
+\lst@AddToHook{PreInit}
+    {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil
+     \let\par\@@par}
+\lst@AddToHook{EveryLine}{}% init
+\lst@AddToHook{EveryPar}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{showlines}
+% lets the user control whether empty lines at the end of a listing are
+% printed. But you know that if you've read the User's guide.
+%    \begin{macrocode}
+\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DeInit}
+% Output the remaining characters and update all things. First I missed to
+% to use |\lst@ifdisplaystyle| here, but then \lsthelper{KP~Gores}{2001/07/11}
+% {\csname{par} after each \lstinline} reported a problem.
+% The |\everypar| has been put behind |\lsthk@ExitVars| after a bug report by
+% \lsthelper{Michael~Niedermair}{2002/05/14}{listings.sty und caption} and
+% I've added |\normalbaselines| after a bug report by \lsthelper{Georg~Rehm}
+% {2002/05/14}{listings.sty und lange captions} and |\normalcolor| after a
+% report by \lsthelper{Walter~E.~Brown}{2004/03/01}{captions at bottom of
+% listings inherit color from basicstyle}.
+%    \begin{macrocode}
+\def\lst@DeInit{%
+    \lst@XPrintToken \lst@EOLUpdate
+    \global\advance\lst@newlines\m@ne
+    \lst@ifshowlines
+        \lst@DoNewLines
+    \else
+        \setbox\@tempboxa\vbox{\lst@DoNewLines}%
+    \fi
+    \lst@ifdisplaystyle \par\removelastskip \fi
+    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor
+%    \end{macrocode}
+% Place the bottom caption.
+%    \begin{macrocode}
+    \lst@MakeCaption b%
+%    \end{macrocode}
+% Close the boxes if necessary and make a rule to get the right width.
+% I added the |\par\nointerlineskip| (and removed |\nointerlineskip| later
+% again) after receiving a bug report from \lsthelper{Aidan~Philip~Heerdegen}
+% {1999/07/23}{wrong vertical spacing}. |\everypar{}| is due to a bug report
+% from \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages
+% not compatible}.
+%    \begin{macrocode}
+    \lst@ifbox
+        \egroup $\hss \egroup
+        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
+    \else
+        \lst@ifdisplaystyle
+            \par\penalty-50\vspace\lst@belowskip
+        \fi
+    \fi
+%    \end{macrocode}
+% End the multicolumn environment and/or float if necessary.
+%    \begin{macrocode}
+    \ifx\lst@multicols\@empty\else
+        \def\lst@next{\global\let\@checkend\@gobble
+                      \endmulticols
+                      \global\let\@checkend\lst@@checkend}
+        \expandafter\lst@next
+    \fi
+    \ifx\lst@float\relax\else
+        \expandafter\lst@endfloat
+    \fi
+    \endgroup}
+\let\lst@@checkend\@checkend
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@maxwidth}
+% is to be allocated, initialized and updated.
+%    \begin{macrocode}
+\newdimen\lst@maxwidth % \global
+\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@}
+\lst@AddToHook{InitVarsEOL}
+    {\ifdim\lst@currlwidth>\lst@maxwidth
+         \global\lst@maxwidth\lst@currlwidth
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EOLUpdate}
+% What do you think this macro does?
+%    \begin{macrocode}
+\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MProcessListing}
+% This is what we have to do at EOL while processing a listing.
+% We output all remaining characters and update the variables.
+% If we've reached the last line, we check whether there is a next line
+% interval to input or not.
+%    \begin{macrocode}
+\def\lst@MProcessListing{%
+    \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno>\lst@lastline
+        \lst@ifdropinput \lst@LeaveMode \fi
+        \ifx\lst@linerange\@empty
+            \expandafter\expandafter\expandafter\lst@EndProcessListing
+        \else
+            \lst@interrange
+            \lst@GetLineInterval
+            \expandafter\expandafter\expandafter\lst@SkipToFirst
+        \fi
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndProcessListing}
+% Default definition is |\endinput|.
+% This works for |\lstinputlisting|.
+%    \begin{macrocode}
+\let\lst@EndProcessListing\endinput
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{gobble}
+% The key sets the number of characters to gobble each line.
+%    \begin{macrocode}
+\lst@Key{gobble}{0}{\def\lst@gobble{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BOLGobble}
+% If the number is positive, we set a temporary counter and start a loop.
+%    \begin{macrocode}
+\def\lst@BOLGobble{%
+    \ifnum\lst@gobble>\z@
+        \@tempcnta\lst@gobble\relax
+        \expandafter\lst@BOLGobble@
+	\fi}
+%    \end{macrocode}
+% A nonpositive number terminates the loop (by not continuing).
+% Note: This is not the macro just used in |\lst@BOLGobble|.
+%    \begin{macrocode}
+\def\lst@BOLGobble@@{%
+    \ifnum\@tempcnta>\z@
+        \expandafter\lst@BOLGobble@
+    \fi}
+%    \end{macrocode}
+% If we gobble a backslash, we have to look whether this backslash ends an
+% environment. Whether the coming characters equal e.g.~|end{lstlisting}|,
+% we either end the environment or insert all just eaten characters after the
+% `continue loop' macro.
+%    \begin{macrocode}
+\def\lstenv@BOLGobble@@{%
+    \lst@IfNextChars\lstenv@endstring{\lstenv@End}%
+    {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}}
+%    \end{macrocode}
+% Now comes the loop: if we read |\relax|, EOL or FF, the next operation is
+% exactly the same token. Note that for FF (and tabs below) we test against
+% a macro which contains |\lst@ProcessFormFeed|. This was a bug analyzed by
+% \lsthelper{Heiko~Oberdiek}{2002/04/16}{Re: first experience ...}.
+%    \begin{macrocode}
+\def\lst@BOLGobble@#1{%
+    \let\lst@next#1%
+    \ifx \lst@next\relax\else
+    \ifx \lst@next\lst@MProcessListing\else
+    \ifx \lst@next\lst@processformfeed\else
+%    \end{macrocode}
+% Otherwise we use one of the two submacros.
+%    \begin{macrocode}
+    \ifx \lst@next\lstenv@backslash
+        \let\lst@next\lstenv@BOLGobble@@
+    \else
+        \let\lst@next\lst@BOLGobble@@
+%    \end{macrocode}
+% Now we really gobble characters. A tabulator decreases the temporary counter
+% by |\lst@tabsize| (and deals with remaining amounts, if necessary), \ldots
+%    \begin{macrocode}
+        \ifx #1\lst@processtabulator
+            \advance\@tempcnta-\lst@tabsize\relax
+            \ifnum\@tempcnta<\z@
+                \lst@length-\@tempcnta \lst@PreGotoTabStop
+            \fi
+%    \end{macrocode}
+% \ldots\space whereas any other character decreases the counter by one.
+%    \begin{macrocode}
+        \else
+            \advance\@tempcnta\m@ne
+        \fi
+    \fi \fi \fi \fi
+    \lst@next}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@processformfeed{\lst@ProcessFormFeed}
+\def\lst@processtabulator{\lst@ProcessTabulator}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{List of listings}
+%
+% \begin{lstkey}{name}
+% \begin{macro}{\lstname}
+% \begin{macro}{\lst@name}
+% \begin{macro}{\lst@intname}
+% Each pretty-printing command values |\lst@intname| before setting any keys.
+%    \begin{macrocode}
+\lst@Key{name}\relax{\def\lst@intname{#1}}
+\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty}
+\lst@AddToHook{PreInit}{%
+    \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+    \global\let\lst@name\lst@arg \global\let\lstname\lst@name}
+%    \end{macrocode}
+% Use of |\lst@ReplaceIn| removes a bug first reported by
+% \lsthelper{Magne~Rudshaug}{1998/01/09}{_ and list of listings}.
+% Here is the replacement list.
+%    \begin{macrocode}
+\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\l@lstlisting}
+% prints one `lol' line.
+%    \begin{macrocode}
+\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstlistlistingname}
+% contains simply the header name.
+%    \begin{macrocode}
+\lst@UserCommand\lstlistlistingname{Listings}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstlistoflistings}
+% We make local adjustments and call |\tableofcontents|. This way,
+% redefinitions of that macro (e.g.~without any |\MakeUppercase| inside)
+% also take effect on the list of listings.
+%    \begin{macrocode}
+\lst@UserCommand\lstlistoflistings{\bgroup
+    \let\contentsname\lstlistlistingname
+    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
+    \tableofcontents \egroup}
+%    \end{macrocode}
+% For KOMA-script classes, we define it a la KOMA thanks to a bug report by
+% \lsthelper{Tino~Langer}{2003/11/01}{koma-script's listsleft option does not
+% affect lol}.  \lsthelper{Markus~Kohm}{2006/08/12}{koma-script support is
+% broken} suggested a much-improved version of this, which also works with
+% the \packagename{float} package.  The following few comments are from Markus.
+%
+% Make use of |\float@listhead| if defined (e.g. using float or KOMA-Script)
+%    \begin{macrocode}
+\@ifundefined{float@listhead}{}{%
+  \renewcommand*{\lstlistoflistings}{%
+    \begingroup
+%    \end{macrocode}
+% Switch to one-column mode if the switch for switching is available.
+%    \begin{macrocode}
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@twocolumn
+          \@restonecoltrue\onecolumn
+        \else
+          \@restonecolfalse
+        \fi
+      }%
+      \float@listhead{\lstlistlistingname}%
+%    \end{macrocode}
+% Set |\parskip| to 0pt (should be!), |\parindent| to 0pt (better but not always
+% needed), |\parfillskip| to 0pt plus 1fil (should be!).
+%    \begin{macrocode}
+      \parskip\z@\parindent\z@\parfillskip \z@ \@plus 1fil%
+      \@starttoc{lol}%
+%    \end{macrocode}
+% Switch back to twocolumn (see above).
+%    \begin{macrocode}
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@restonecol\twocolumn\fi
+      }%
+    \endgroup
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\float@addtolists}
+% The \packagename{float} package defines a generic way for packages to add
+% things (such as chapter names) to all of the lists of floats other than the
+% standard figure and table lists.  Each package that defines a list of
+% floats adds a command to |\float@addtolists|, and then packages (such as
+% the KOMA-script document classes) which wish to add things to all lists of
+% floats can then use it, without needing to be aware of all of the possible
+% lists that could exist.  Thanks to \lsthelper{Markus~Kohm}{-}{2007/02/25}
+% for the suggestion.
+%
+% Unfortunately, \packagename{float} defines this with |\newcommand|; thus,
+% to avoid conflict, we have to redefine it after \packagename{float} is
+% loaded.  |\AtBeginDocument| is the easiest way to do this.  Again, thanks
+% to Markus for the advice.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \@ifundefined{float@addtolists}%
+    {\gdef\float@addtolists#1{\addtocontents{lol}{#1}}}%
+    {\let\orig@float@addtolists\float@addtolists
+     \gdef\float@addtolists#1{%
+       \addtocontents{lol}{#1}%
+       \orig@float@addtolists{#1}}}%
+}%
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Inline listings}\label{iInlineListings}
+%
+% \subsubsection{Processing inline listings}\label{uProcessingInline}
+%
+% \begin{macro}{\lstinline}
+% In addition to |\lsthk@PreSet|, we use |boxpos=b| and flexiblecolumns.
+% I've inserted |\leavevmode| after bug report from \lsthelper{Michael~Weber}
+% {1999/12/16}{wrong spacing in list environments}. \lsthelper{Olivier~Lecarme}
+% {2001/07/30}{inconsistent `break' when \lstinline is used inside caption}
+% reported a problem which has gone after removing |\let| |\lst@newlines|
+% |\@empty| (now |\lst@newlines| is a counter!). Unfortunately I don't know
+% the reason for inserting this code some time ago! At the end of the macro we
+% check the delimiter.
+%    \begin{macrocode}
+\newcommand\lstinline[1][]{%
+    \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+      \def\lst@boxpos{b}%
+      \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+      \lsthk@TextStyle
+      \@ifnextchar\bgroup{%
+%    \end{macrocode}
+% \lstthanks{Luc~Van~Eycken}{Luc.VanEycken@esat.kuleuven.be}{2014/01/22}
+% reported, that the experimental implementation of |\lstinline| with
+% braces instead of characters surrounding the source code resulted in an
+% error if used in a tabular environment. He found that this error comes
+% from the master counter (cf. appendix D (Dirty Tricks), item 5. (Brace
+% hacks), of the TeXbook (p. 385-386)). Adding the following line at this
+% point
+% \begin{verbatim}
+%         \ifnum`{=0}\fi%
+% \end{verbatim}
+% remedies the wrong behaviour. But \lstthanks{Qing Lee}{2014/06/28} pointed out,
+% that this breaks code like the one showed in \ref{uListingsArguments} on
+% \pageref{uListingsArguments} and proposed another
+% solution which in turn broke the code needed by Luc:
+% \begin{verbatim}
+% % \renewcommand\lstinline[1][]{%
+% %   \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+% %   \def\lst@boxpos{b}%
+% %   \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+% %   \lsthk@TextStyle
+% %   \ifnum\iffalse{\fi`}=\z@\fi
+% %   \@ifnextchar\bgroup{%
+% %     \ifnum`{=\z@}\fi%
+% %     \afterassignment\lst@InlineG \let\@let@token}{%
+% %     \ifnum`{=\z@}\fi\lstinline@}}
+% \end{verbatim}
+% So finally the old code comes back and the people, who need a
+% |\lstinline| with braces, should use the workaround from section
+% \ref{uListingsArguments} on page \pageref{uListingsArguments}.
+%    \begin{macrocode}
+        \afterassignment\lst@InlineG \let\@let@token}%
+                         \lstinline@}
+\def\lstinline@#1{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
+\lst@AddToHook{TextStyle}{}% init
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}{\lst@inlinechars}
+\global\let\lst@inlinechars\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InlineM}
+% \begin{macro}{\lst@InlineJ}
+% treat the cases of `normal' inlines and inline listings inside an argument.
+% In the first case the given character ends the inline listing and EOL within
+% such a listing immediately ends it and produces an error message.
+%    \begin{macrocode}
+\def\lst@InlineM#1{\gdef\lst@inlinechars{%
+    \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}%
+    \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty
+        \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
+    \lst@inlinechars}
+%    \end{macrocode}
+% In the other case we get all characters up to |#1|, make these characters
+% active, execute (typeset) them and end the listing (all via temporary macro).
+% That's all about it.
+%    \begin{macrocode}
+\def\lst@InlineJ#1{%
+    \def\lst@temp##1#1{%
+        \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
+        \lst@DeInit\egroup}%
+    \lst@temp}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@InlineG}
+% is experimental.
+%    \begin{macrocode}
+\def\lst@InlineG{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM\}}%
+                         {\let\lst@arg\@empty \lst@InlineGJ}}
+\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest}
+\def\lst@InlineGJTest{%
+    \ifx\@let@token\egroup
+        \afterassignment\lst@InlineGJEnd
+        \expandafter\let\expandafter\@let@token
+    \else
+        \ifx\@let@token\@sptoken
+            \let\lst@next\lst@InlineGJReadSp
+        \else
+            \let\lst@next\lst@InlineGJRead
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup}
+\def\lst@InlineGJRead#1{%
+    \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ}
+\def\lst@InlineGJReadSp#1{%
+    \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ#1}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Short inline listing environments}
+%
+% The implementation in this section is based on the \packagename{shortvrb}
+% package, which is part of |doc.dtx| from the Standard \LaTeX\ documentation
+% package, version 2006/02/02 v2.1d.  Portions of it are thus copyright
+% 1993--2006 by The \LaTeX3 Project and copyright 1989--1999 by Frank
+% Mittelbach.
+%
+% \begin{macro}{\lstMakeShortInline}
+% \begin{macro}{\lstMakeShortInline@}
+% First, we supply an optional argument if it's omitted.
+%    \begin{macrocode}
+\newcommand\lstMakeShortInline[1][]{%
+  \def\lst@shortinlinedef{\lstinline[#1]}%
+  \lstMakeShortInline@}%
+\def\lstMakeShortInline@#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \lst@shortlstinlineinfo{Made }{#1}%
+    \lst@add@special{#1}%
+%    \end{macrocode}
+% The character's current catcode is stored in
+% |\lst@ShortInlineOldCatcode\|\meta{c}.
+%    \begin{macrocode}
+    \expandafter
+    \xdef\csname lst@ShortInlineOldCatcode\string#1\endcsname{\the\catcode`#1}%
+%    \end{macrocode}
+% The character is spliced into the definition using the same trick as
+% used in |\verb| (for instance), having activated |~| in a group.
+%    \begin{macrocode}
+    \begingroup
+      \catcode`\~\active  \lccode`\~`#1%
+      \lowercase{%
+%    \end{macrocode}
+% The character's old meaning is recorded
+% in |\lst@ShortInlineOldMeaning\|\meta{c} prior to assigning it a new one.
+%    \begin{macrocode}
+        \global\expandafter\let
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname~%
+          \expandafter\gdef\expandafter~\expandafter{\lst@shortinlinedef#1}}%
+    \endgroup
+%    \end{macrocode}
+% Finally the character is made active.
+%    \begin{macrocode}
+    \global\catcode`#1\active
+%    \end{macrocode}
+% If we suspect that \meta{c} is already a short reference, we tell
+% the user. Now he or she is responsible if anything goes wrong\,\dots
+% (Change in \packagename{listings}: We give a proper error here.)
+%    \begin{macrocode}
+  \else
+    \PackageError{Listings}%
+    {\string\lstMakeShorterInline\ definitions cannot be nested}%
+    {Use \string\lstDeleteShortInline first.}%
+    {}%
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\lstDeleteShortInline}
+%    \begin{macrocode}
+\def\lstDeleteShortInline#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \PackageError{Listings}%
+    {#1 is not a short reference for \string\lstinline}%
+    {Use \string\lstMakeShortInline first.}%
+    {}%
+  \else
+    \lst@shortlstinlineinfo{Deleted }{#1 as}%
+    \lst@rem@special{#1}%
+    \global\catcode`#1\csname lst@ShortInlineOldCatcode\string#1\endcsname
+    \global \expandafter\let%
+      \csname lst@ShortInlineOldCatcode\string#1\endcsname \relax
+    \ifnum\catcode`#1=\active
+      \begingroup
+        \catcode`\~\active  \lccode`\~`#1%
+        \lowercase{%
+          \global\expandafter\let\expandafter~%
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname}%
+      \endgroup
+    \fi
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@shortlstinlineinfo}
+%    \begin{macrocode}
+\def\lst@shortlstinlineinfo#1#2{%
+     \PackageInfo{Listings}{%
+       #1\string#2 a short reference for \string\lstinline}}
+%    \end{macrocode}
+%  \end{macro}
+%
+% \begin{macro}{\lst@add@special}
+% This helper macro adds its argument to the
+% |\dospecials| macro which is conventionally used by verbatim macros
+% to alter the catcodes of the currently active characters.  We need
+% to add |\do\|\meta{c} to the expansion of |\dospecials| after
+% removing the character if it was already there to avoid multiple
+% copies building up should |\lstMakeShortInline| not be balanced by
+% |\lstDeleteShortInline| (in case anything that uses |\dospecials|
+% cares about repetitions).
+%    \begin{macrocode}
+\def\lst@add@special#1{%
+  \lst@rem@special{#1}%
+  \expandafter\gdef\expandafter\dospecials\expandafter
+    {\dospecials \do #1}%
+%    \end{macrocode}
+% Similarly we have to add |\@makeother\|\meta{c} to |\@sanitize|
+% (which is used in things like "\index" to re-catcode all special
+% characters except braces).
+%    \begin{macrocode}
+  \expandafter\gdef\expandafter\@sanitize\expandafter
+    {\@sanitize \@makeother #1}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\lst@rem@special}
+% The inverse of |\lst@add@special| is slightly trickier.  |\do| is
+% re-defined to expand to nothing if its argument is the character of
+% interest, otherwise to expand simply to the argument.  We can then
+% re-define |\dospecials| to be the expansion of itself.  The space
+% after |=`##1| prevents an expansion to |\relax|!
+%    \begin{macrocode}
+\def\lst@rem@special#1{%
+  \def\do##1{%
+    \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+  \xdef\dospecials{\dospecials}%
+%    \end{macrocode}
+% Fixing |\@sanitize| is the same except that we need to re-define
+% |\@makeother| which obviously needs to be done in a group.
+%    \begin{macrocode}
+  \begingroup
+    \def\@makeother##1{%
+      \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+    \xdef\@sanitize{\@sanitize}%
+  \endgroup}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The input command}\label{iTheInputCommand}
+%
+% \begin{macro}{\lst@MakePath}
+% \begin{lstkey}{inputpath}
+% The macro appends a slash to a path if necessary.
+%    \begin{macrocode}
+\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi}
+\def\lst@MakePath@#1/{#1/\lst@MakePath@@}
+\def\lst@MakePath@@#1/{%
+    \ifx\@nil#1\expandafter\@gobble
+         \else \ifx\@empty#1\else #1/\fi \fi
+    \lst@MakePath@@}
+%    \end{macrocode}
+% Now we can empty the path or use |\lst@MakePath|.
+%    \begin{macrocode}
+\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+%
+% \begin{macro}{\lstinputlisting}
+% inputs the listing or asks the user for a new file name.
+%    \begin{macrocode}
+\def\lstinputlisting{%
+    \begingroup \lst@setcatcodes \lst@inputlisting}
+\newcommand\lst@inputlisting[2][]{%
+    \endgroup
+    \def\lst@set{#1}%
+    \IfFileExists{\lst@inputpath#2}%
+        {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}%
+        {\filename@parse{\lst@inputpath#2}%
+         \edef\reserved@a{\noexpand\lst@MissingFileError
+             {\filename@area\filename@base}%
+             {\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+         \reserved@a}%
+    \lst@doendpe \@newlistfalse \ignorespaces}
+%    \end{macrocode}
+% We use |\lst@doendpe| to remove indention at the beginning of the next
+% line---except there is an empty line after |\lstinputlisting|. Bug was
+% reported by \lsthelper{David~John~Evans}{1999/06/08}{indention after
+% listings} and \lsthelper{David~Carlisle}{1999/06/08}{LaTeX `display
+% environment' code} pointed me to the solution.
+% \end{macro}
+%
+% \begin{macro}{\lst@MissingFileError}
+% is a derivation of \LaTeX's |\@missingfileerror|. The parenthesis have been
+% added after \lsthelper{Heiko~Oberdiek}{2003/01/14}{File `Makefile.tex' not
+% found} reported about a problem discussed on TEX-D-L.
+%    \begin{macrocode}
+\def\lst@MissingFileError#1#2{%
+    \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J%
+        ^^JType X to quit or <RETURN> to proceed,^^J%
+        or enter new name. (Default extension: #2)^^J}%
+    \message{Enter file name: }%
+    {\endlinechar\m@ne \global\read\m@ne to\@gtempa}%
+%    \end{macrocode}
+% Typing |x| or |X| exits.
+%    \begin{macrocode}
+    \ifx\@gtempa\@empty \else
+        \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+%    \end{macrocode}
+% In all other cases we try the new file name.
+%    \begin{macrocode}
+        \filename@parse\@gtempa
+        \edef\filename@ext{%
+            \ifx\filename@ext\relax#2\else\filename@ext\fi}%
+        \edef\reserved@a{\noexpand\IfFileExists %
+                {\filename@area\filename@base.\filename@ext}%
+            {\noexpand\lst@InputListing %
+                {\filename@area\filename@base.\filename@ext}}%
+            {\noexpand\lst@MissingFileError
+                {\filename@area\filename@base}{\filename@ext}}}%
+        \expandafter\reserved@a %
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifdraft}
+% makes use of |\lst@ifprint|. \lsthelper{Enrico~Straube}{2002/02/12}
+% {de.comp.text.tex: listings und draft Modus} requested the final option.
+%    \begin{macrocode}
+\let\lst@ifdraft\iffalse
+\DeclareOption{draft}{\let\lst@ifdraft\iftrue}
+\DeclareOption{final}{\let\lst@ifdraft\iffalse}
+\lst@AddToHook{PreSet}
+    {\lst@ifdraft
+         \let\lst@ifprint\iffalse
+         \@gobbletwo\fi\fi
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InputListing}
+% The one and only argument is the file name, but we have the `implicit'
+% argument |\lst@set|. Note that |\lst@Init| takes |\relax| as argument.
+%    \begin{macrocode}
+\def\lst@InputListing#1{%
+    \begingroup
+      \lsthk@PreSet \gdef\lst@intname{#1}%
+      \expandafter\lstset\expandafter{\lst@set}%
+      \lsthk@DisplayStyle
+      \catcode\active=\active
+      \lst@Init\relax \let\lst@gobble\z@
+      \lst@SkipToFirst
+      \lst@ifprint \def\lst@next{\input{#1}}%
+             \else \let\lst@next\@empty \fi
+      \lst@next
+      \lst@DeInit
+    \endgroup}
+%    \end{macrocode}
+% The line |\catcode\active=\active|, which makes the CR-character active,
+% has been added after a bug report by \lsthelper{Rene~H.~Larsen}{2002/04/15}
+% {\lstinputlistings and texcl conflict}.
+% \end{macro}
+%
+% \begin{macro}{\lst@SkipToFirst}
+% The end of line character either processes the listing or is responsible for
+% dropping lines up to first printing line.
+%    \begin{macrocode}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+%    \end{macrocode}
+% We drop the input and redefine the end of line characters.
+%    \begin{macrocode}
+        \lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MSkipToFirst}
+% We just look whether to drop more lines or to leave the mode which restores
+% the definition of chr(13) and chr(10).
+%    \begin{macrocode}
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \lst@LeaveMode \global\lst@newlines\z@
+        \lsthk@InitVarsBOL
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The environment}
+%
+%
+% \subsubsection{Low-level processing}
+%
+% \begin{macro}{\lstenv@DroppedWarning}
+% gives a warning if characters have been dropped.
+%    \begin{macrocode}
+\def\lstenv@DroppedWarning{%
+    \ifx\lst@dropped\@undefined\else
+        \PackageWarning{Listings}{Text dropped after begin of listing}%
+    \fi}
+\let\lst@dropped\@undefined % init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@Process}
+% We execute `|\lstenv@ProcessM|' or |\lstenv@ProcessJ| according to whether we
+% find an active EOL or a nonactive |^^J|.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lstenv@Process#1{%
+    \ifx~#1%
+%    \end{macrocode}
+% We make no extra |\lstenv@ProcessM| definition since there is nothing to do
+% at all if we've found an active EOL.
+%    \begin{macrocode}
+        \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst
+    \else\ifx^^J#1%
+        \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ
+    \else
+        \let\lst@dropped#1\let\lst@next\lstenv@Process
+    \fi \fi
+    \lst@next}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@ProcessJ}
+% Now comes the horrible scenario: a listing inside an argument. We've
+% already worked in section \ref{iApplicationsTo} for this. Here we must get
+% all characters up to `end environment'. We distinguish the cases `command
+% fashion' and `true environment'.
+%    \begin{macrocode}
+\def\lstenv@ProcessJ{%
+    \let\lst@arg\@empty
+    \ifx\@currenvir\lstenv@name
+        \expandafter\lstenv@ProcessJEnv
+    \else
+%    \end{macrocode}
+% The first case is pretty simple: The code is terminated by
+% |\end|\meta{name of environment}. Thus we expand that control sequence
+% before defining a temporary macro, which gets the listing and does all
+% the rest. Back to the definition of |\lstenv@ProcessJ| we call the
+% temporary macro after expanding |\fi|.
+%    \begin{macrocode}
+        \expandafter\def\expandafter\lst@temp\expandafter##1%
+            \csname end\lstenv@name\endcsname
+                {\lst@InsideConvert{##1}\lstenv@ProcessJ@}%
+        \expandafter\lst@temp
+    \fi}
+%    \end{macrocode}
+% We must append an active backslash and the `end string' to |\lst@arg|. So all
+% (in fact most) other processing won't notice that the code has been inside
+% an argument. But the EOL character is chr(10)=|^^J| now and not chr(13).
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@ProcessJ@{%
+    \lst@lExtend\lst@arg
+        {\expandafter\ \expandafter~\lstenv@endstring}%
+    \catcode10=\active \lst@Let{10}\lst@MProcessListing
+%    \end{macrocode}
+% We execute |\lst@arg| to typeset the listing.
+%    \begin{macrocode}
+    \lst@SkipToFirst \lst@arg}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@ProcessJEnv}
+% The `true environment' case is more complicated. We get all characters up to
+% an |\end| and the following argument. If that equals |\lstenv@name|, we have
+% found the end of environment and start typesetting.
+%    \begin{macrocode}
+\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}%
+    \ifx\lstenv@name\lst@temp
+        \lst@InsideConvert{#1}%
+        \expandafter\lstenv@ProcessJ@
+    \else
+%    \end{macrocode}
+% Otherwise we append the characters including the eaten |\end| and the eaten
+% argument to current |\lst@arg|. And we look for the end of environment again.
+%    \begin{macrocode}
+        \lst@InsideConvert{#1\\end\{#2\}}%
+        \expandafter\lstenv@ProcessJEnv
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@backslash}
+% Coming to a backslash we either end the listing or process a backslash and
+% insert the eaten characters again.
+%    \begin{macrocode}
+\def\lstenv@backslash{%
+    \lst@IfNextChars\lstenv@endstring
+        {\lstenv@End}%
+        {\expandafter\lsts@backslash \lst@eaten}}%
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@End}
+% This macro has just been used and terminates a listing environment:
+% We call the `end environment' macro using |\end| or as a command.
+%    \begin{macrocode}
+\def\lstenv@End{%
+    \ifx\@currenvir\lstenv@name
+        \edef\lst@next{\noexpand\end{\lstenv@name}}%
+    \else
+        \def\lst@next{\csname end\lstenv@name\endcsname}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Defining new environments}
+%
+% \begin{macro}{\lstnewenvironment}
+% Now comes the main command. We define undefined environments only. On the
+% parameter text |#1#2#| (in particular the last sharp) see the paragraph
+% following example 20.5 on page 204 of `The \TeX book'.
+%    \begin{macrocode}
+\lst@UserCommand\lstnewenvironment#1#2#{%
+    \@ifundefined{#1}%
+        {\let\lst@arg\@empty
+         \lst@XConvert{#1}\@nil
+         \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}%
+        {\PackageError{Listings}{Environment `#1' already defined}\@eha
+         \@gobbletwo}}
+\def\@tempa#1#2#3{%
+\gdef\lstnewenvironment@##1##2##3##4##5{%
+    \begingroup
+%    \end{macrocode}
+% A lonely `end environment' produces an error.
+%    \begin{macrocode}
+    \global\@namedef{end##2}{\lstenv@Error{##2}}%
+%    \end{macrocode}
+% The `main' environment macro defines the environment name for later use and
+% calls a submacro getting all arguments. We open a group and make EOL active.
+% This ensures |\@ifnextchar[| not to read characters of the listing---it reads
+% the active EOL instead.
+%    \begin{macrocode}
+    \global\@namedef{##2}{\def\lstenv@name{##2}%
+        \begingroup \lst@setcatcodes \catcode\active=\active
+        \csname##2@\endcsname}%
+%    \end{macrocode}
+% The submacro is defined via |\new@command|. We misuse |\l@ngrel@x| to make
+% the definition |\global| and refine \LaTeX's |\@xargdef|.
+%    \begin{macrocode}
+    \let\l@ngrel@x\global
+    \let\@xargdef\lstenv@xargdef
+    \expandafter\new@command\csname##2@\endcsname##3%
+%    \end{macrocode}
+% First we execute |##4|=\meta{begin code}. Then follows the definition of
+% the terminating string (|end{lstlisting}| or |endlstlisting|, for example):
+%    \begin{macrocode}
+        {\lsthk@PreSet ##4%
+         \ifx\@currenvir\lstenv@name
+             \def\lstenv@endstring{#1#2##1#3}%
+         \else
+             \def\lstenv@endstring{#1##1}%
+         \fi
+%    \end{macrocode}
+% We redefine (locally) `end environment' since ending is legal now.
+% Note that the redefinition also works inside a \TeX\ comment line.
+%    \begin{macrocode}
+         \@namedef{end##2}{\lst@DeInit ##5\endgroup
+                          \lst@doendpe \@ignoretrue}%
+%    \end{macrocode}
+% |\lst@doendpe| again removes the indention problem.
+%
+% Finally we start the processing. The |\lst@EndProcessListing| assignment
+% has been moved in front of |\lst@Init| after a bug report by
+% \lsthelper{Andreas~Deininger}{2002/11/11}{Compiling just stops}.
+%    \begin{macrocode}
+         \lsthk@DisplayStyle
+         \let\lst@EndProcessListing\lstenv@SkipToEnd
+         \lst@Init\lstenv@backslash
+         \lst@ifprint
+             \expandafter\expandafter\expandafter\lstenv@Process
+         \else
+             \expandafter\lstenv@SkipToEnd
+         \fi
+         \lst@insertargs}%
+    \endgroup}%
+}
+\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil
+\expandafter\@tempa\lst@arg
+\let\lst@insertargs\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@xargdef}
+% This is a derivation of \LaTeX's |\@xargdef|. We expand the submacro's name,
+% use |\gdef| instead of |\def|, and hard code a kind of |\@protected@testopt|.
+%    \begin{macrocode}
+\def\lstenv@xargdef#1{
+    \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1}
+\def\lstenv@xargdef@#1#2[#3][#4]#5{%
+  \@ifdefinable#2{%
+       \gdef#2{%
+          \ifx\protect\@typeset@protect
+            \expandafter\lstenv@testopt
+          \else
+            \@x@protect#2%
+          \fi
+          #1%
+          {#4}}%
+       \@yargdef
+          #1%
+           \tw@
+           {#3}%
+           {#5}}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@testopt}
+% The difference between this macro and |\@testopt| is that we temporaryly
+% reset the catcode of the EOL character |^^M| to read the optional argument.
+%    \begin{macrocode}
+\long\def\lstenv@testopt#1#2{%
+  \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}%
+               {#1[{#2}]}}
+\def\lstenv@testopt@#1[#2]{%
+    \catcode\active\active
+    #1[#2]}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@SkipToEnd}
+% We use the temporary definition
+% \begin{itemize}\item[]
+%    |\long\def\lst@temp##1\|\meta{content of \textup{\cs{lstenv@endstring}}}|{\lstenv@End}|
+% \end{itemize}
+% which gobbles all characters up to the end of environment and finishes it.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@SkipToEnd{%
+    \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter
+        1\expandafter~\lstenv@endstring{\lstenv@End}%
+    \lst@temp}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@Error}
+% is called by a lonely `end environment'.
+%    \begin{macrocode}
+\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}%
+    {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@TestEOLChar}
+% Here we test for the two possible EOL characters.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lst@TestEOLChar#1{%
+    \def\lst@insertargs{#1}%
+    \ifx ~#1\@empty \else
+    \ifx^^J#1\@empty \else
+        \global\let\lst@intname\lst@insertargs
+        \let\lst@insertargs\@empty
+    \fi \fi}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{lstlisting}
+% The awkward work is done, the definition is quite easy now. We test whether
+% the user has given the name argument, set the keys, and deal with
+% continued line numbering.
+%    \begin{macrocode}
+\lstnewenvironment{lstlisting}[2][]
+    {\lst@TestEOLChar{#2}%
+     \lstset{#1}%
+     \csname\@lst @SetFirstNumber\endcsname}
+    {\csname\@lst @SaveFirstNumber\endcsname}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \end{environment}
+%
+%
+% \section{Documentation support}
+%
+% \begin{syntax}
+% \item[0.19]
+%   |\begin{lstsample}|\marg{point list}\marg{left}\marg{right}
+%
+%   \leavevmode\hspace*{-\leftmargini}|\end{lstsample}|
+%
+%       Roughly speaking all material in between this environment is executed
+%       `on the left side' and typeset verbatim on the right. \meta{left} is
+%       executed before the left side is typeset, and similarly \meta{right}
+%       before the right-hand side.
+%
+%       \meta{point list} is used as argument to the \keyname{point} key.
+%       This is a special key used to highlight the keys in the examples.
+%
+% \item[1.0]
+%   |\begin{lstxsample}|\marg{point list}
+%
+%   \leavevmode\hspace*{-\leftmargini}|\end{lstxsample}|
+%
+%       The material in between is (a) added to the left side of the next
+%       \texttt{lstsample} environment and (b) typeset verbatim using the
+%       whole line width.
+%
+% \item[0.21] |\newdocenvironment|\marg{name}\marg{short name}\marg{begin code}\marg{end code}
+%
+%       The \meta{name} environment can be used in the same way as `macro'.
+%       The provided(!) definitions
+%           |\Print|\meta{short name}|Name|
+%       and |\SpecialMain|\meta{short name}|Index|
+%       control printing in the margin and indexing as the defaults
+%       |\PrintMacroName| and |\SpecialMainIndex| do.
+%
+%       This command is used to define the `aspect' and `lstkey' environments.
+%
+%\item[0.21] \texttt{macroargs} environment
+%
+%       This `enumerate' environment uses as labels `|#1| =', `|#2| =',
+%       and so on.
+%
+% \item \texttt{TODO} environment
+% \item \texttt{ALTERNATIVE} environment
+% \item \texttt{REMOVED} environment
+% \item \texttt{OLDDEF} environment
+%
+%       These environments enclose comments on `to do's', alternatives and
+%       removed or old definitions.
+%
+% \item[0.21] |\lstscanlanguages|\meta{list macro}\marg{input files}\marg{don't input}
+%
+%       scans \marg{input files}$\setminus$\marg{don't input} for language
+%       definitions. The available languages are stored in \meta{list macro}
+%       using the form \meta{language}|(|\meta{dialect}|),|.
+%
+% \item[0.21] |\lstprintlanguages|\meta{list macro}
+%
+%       prints the languages in two column format.
+% \end{syntax}
+% and a lot of more simple commands.
+%
+%
+% \subsection{Required packages}
+%
+% Most of the `required' packages are optional.
+% \lsthelper{Stephan~Hennig}{2006-09-25}{documentation incompatible with algorithmic}
+% noted a bug where |\ifalgorithmic| conflicts with an update to |algorithmic.sty|, so
+% this has been changed to |\ifalgorithmicpkg|.
+%    \begin{macrocode}
+%<*doc>
+\let\lstdoc@currversion\fileversion
+\RequirePackage[writefile]{listings}[2004/09/07]
+\newif\iffancyvrb \IfFileExists{fancyvrb.sty}{\fancyvrbtrue}{}
+\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{}
+\lst@false
+\newif\ifhyper
+\@ifundefined{pdfoutput}
+    {}
+    {\ifnum\pdfoutput>\z@ \lst@true \fi}
+\@ifundefined{VTeXversion}
+    {}
+    {\ifnum\OpMode>\z@ \lst@true \fi}
+\lst@if \IfFileExists{hyperref.sty}{\hypertrue}{}\fi
+\newif\ifalgorithmicpkg \IfFileExists{algorithmic.sty}{\algorithmicpkgtrue}{}
+\newif\iflgrind \IfFileExists{lgrind.sty}{\lgrindtrue}{}
+\iffancyvrb \RequirePackage{fancyvrb}\fi
+\ifhyper \RequirePackage[colorlinks]{hyperref}\else
+    \def\href#1{\texttt}\fi
+\ifcolor \RequirePackage{color}\fi
+\ifalgorithmicpkg \RequirePackage{algorithmic}\fi
+\iflgrind \RequirePackage{lgrind}\fi
+\RequirePackage{nameref}
+\RequirePackage{url}
+\renewcommand\ref{\protect\T@ref}
+\renewcommand\pageref{\protect\T@pageref}
+%    \end{macrocode}
+%
+%
+% \subsection{Environments for notes}
+%
+% \begin{macro}{\lst@BeginRemark}
+% \begin{macro}{\lst@EndRemark}
+% We begin with two simple definitions \ldots
+%    \begin{macrocode}
+\def\lst@BeginRemark#1{%
+    \begin{quote}\topsep0pt\let\small\footnotesize\small#1:}
+\def\lst@EndRemark{\end{quote}}
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{environment}{TODO}
+% \begin{environment}{ALTERNATIVE}
+% \begin{environment}{REMOVED}
+% \begin{environment}{OLDDEF}
+% \ldots\space used to define some environments.
+%    \begin{macrocode}
+\newenvironment{TODO}
+    {\lst@BeginRemark{To do}}{\lst@EndRemark}
+\newenvironment{ALTERNATIVE}
+    {\lst@BeginRemark{Alternative}}{\lst@EndRemark}
+\newenvironment{REMOVED}
+    {\lst@BeginRemark{Removed}}{\lst@EndRemark}
+\newenvironment{OLDDEF}
+    {\lst@BeginRemark{Old definition}}{\lst@EndRemark}
+%    \end{macrocode}
+% \end{environment}\end{environment}\end{environment}\end{environment}
+%
+% \begin{environment}{advise}
+% \begin{macro}{\advisespace}
+% The environment uses |\@listi|.
+%    \begin{macrocode}
+\def\advise{\par\list\labeladvise
+    {\advance\linewidth\@totalleftmargin
+     \@totalleftmargin\z@
+     \@listi
+     \let\small\footnotesize \small\sffamily
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep6\p@ \@plus1\p@\@minus2\p@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\let\endadvise\endlist
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\advisespace{\hbox{}\qquad}
+\def\labeladvise{$\to$}
+%    \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% \begin{environment}{syntax}
+% \begin{macro}{\syntaxbreak}
+% \begin{macro}{\syntaxnewline}
+% \begin{macro}{\syntaxor}
+% This environment uses |\list| with a special |\makelabel|, \ldots
+%    \begin{macrocode}
+\newenvironment{syntax}
+   {\list{}{\itemindent-\leftmargin
+    \def\makelabel##1{\hss\lst@syntaxlabel##1,,,,\relax}}}
+   {\endlist}
+%    \end{macrocode}
+% \ldots\ which is defined here. The comma separated items are placed as
+% needed.
+%    \begin{macrocode}
+\def\lst@syntaxlabel#1,#2,#3,#4\relax{%
+    \llap{\scriptsize\itshape#3}%
+    \def\lst@temp{#2}%
+    \expandafter\lst@syntaxlabel@\meaning\lst@temp\relax
+    \rlap{\hskip-\itemindent\hskip\itemsep\hskip\linewidth
+          \llap{\ttfamily\lst@temp}\hskip\labelwidth
+          \def\lst@temp{#1}%
+          \ifx\lst@temp\lstdoc@currversion#1\fi}}
+\def\lst@syntaxlabel@#1>#2\relax
+    {\edef\lst@temp{\zap@space#2 \@empty}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newcommand*\syntaxnewline{\newline\hbox{}\kern\labelwidth}
+\newcommand*\syntaxor{\qquad or\qquad}
+\newcommand*\syntaxbreak
+    {\hfill\kern0pt\discretionary{}{\kern\labelwidth}{}}
+\let\syntaxfill\hfill
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{environment}
+%
+% \begin{macro}{\alternative}
+% iterates down the list and inserts vertical rule(s).
+%    \begin{macrocode}
+\def\alternative#1{\lst@true \alternative@#1,\relax,}
+\def\alternative@#1,{%
+    \ifx\relax#1\@empty
+        \expandafter\@gobble
+    \else
+        \ifx\@empty#1\@empty\else
+            \lst@if \lst@false \else $\vert$\fi
+            \textup{\texttt{#1}}%
+        \fi
+    \fi
+    \alternative@}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Extensions to \textsf{doc}}
+%
+% \begin{macro}{\m@cro@}
+% We need a slight modification of \packagename{doc}'s internal macro.
+% The former argument |#2| has become |#3|. This change is not marked below.
+% The second argument is now \meta{short name}.
+%    \begin{macrocode}
+\long\def\m@cro@#1#2#3{\endgroup \topsep\MacroTopsep \trivlist
+  \edef\saved@macroname{\string#3}%
+  \def\makelabel##1{\llap{##1}}%
+  \if@inlabel
+    \let\@tempa\@empty \count@\macro@cnt
+    \loop \ifnum\count@>\z@
+      \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+    \edef\makelabel##1{\llap{\vtop to\baselineskip
+                               {\@tempa\hbox{##1}\vss}}}%
+    \advance \macro@cnt \@ne
+  \else  \macro@cnt\@ne  \fi
+  \edef\@tempa{\noexpand\item[%
+     #1%
+       \noexpand\PrintMacroName
+     \else
+%    \end{macrocode}
+% The next line has been modified.
+%    \begin{macrocode}
+       \expandafter\noexpand\csname Print#2Name\endcsname % MODIFIED
+     \fi
+     {\string#3}]}%
+  \@tempa
+  \global\advance\c@CodelineNo\@ne
+   #1%
+      \SpecialMainIndex{#3}\nobreak
+      \DoNotIndex{#3}%
+   \else
+%    \end{macrocode}
+% Ditto.
+%    \begin{macrocode}
+      \csname SpecialMain#2Index\endcsname{#3}\nobreak % MODIFIED
+   \fi
+  \global\advance\c@CodelineNo\m@ne
+  \ignorespaces}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\macro}
+% \begin{macro}{\environment}
+% These two definitions need small adjustments due to the modified |\m@cro@|.
+%    \begin{macrocode}
+\def\macro{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iftrue {Macro}}% MODIFIED
+\def\environment{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iffalse {Env}}% MODIFIED
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\newdocenvironment}
+% This command simply makes definitions similar to `environment' and provides
+% the printing and indexing commands.
+%    \begin{macrocode}
+\def\newdocenvironment#1#2#3#4{%
+    \@namedef{#1}{#3\begingroup \catcode`\\12\relax
+                  \MakePrivateLetters \m@cro@ \iffalse {#2}}%
+    \@namedef{end#1}{#4\endmacro}%
+    \@ifundefined{Print#2Name}{\expandafter
+        \let\csname Print#2Name\endcsname\PrintMacroName}{}%
+    \@ifundefined{SpecialMain#2Index}{\expandafter
+        \let\csname SpecialMain#2Index\endcsname\SpecialMainIndex}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{aspect}
+% \begin{macro}{\PrintAspectName}
+% \begin{macro}{\SpecialMainAspectIndex}
+% The environment and its `print' and `index' commands.
+%    \begin{macrocode}
+\newdocenvironment{aspect}{Aspect}{}{}
+\def\PrintAspectName#1{}
+\def\SpecialMainAspectIndex#1{%
+    \@bsphack
+    \index{aspects:\levelchar\protect\aspectname{#1}}%
+    \@esphack}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{environment}
+%
+% \begin{environment}{lstkey}
+% \begin{macro}{\PrintKeyName}
+% \begin{macro}{\SpecialMainKeyIndex}
+% One more environment with its `print' and `index' commands.
+%    \begin{macrocode}
+\newdocenvironment{lstkey}{Key}{}{}
+\def\PrintKeyName#1{\strut\keyname{#1}\ }
+\def\SpecialMainKeyIndex#1{%
+    \@bsphack
+    \index{keys\levelchar\protect\keyname{#1}}%
+    \@esphack}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{environment}
+%
+% \begin{macro}{\labelargcount}
+% \begin{environment}{macroargs}
+% We just allocate a counter and use \LaTeX's |\list| to implement this
+% environment.
+%    \begin{macrocode}
+\newcounter{argcount}
+\def\labelargcount{\texttt{\#\arabic{argcount}}\hskip\labelsep$=$}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\macroargs{\list\labelargcount
+    {\usecounter{argcount}\leftmargin=2\leftmargin
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep4\p@ \@plus\p@ \@minus2\p@
+     \itemsep\z@ \@plus\z@ \@minus\z@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\def\endmacroargs{\endlist\@endparenv}
+%    \end{macrocode}
+% \end{environment}\end{macro}
+%
+%
+% \subsection{The \texttt{lstsample} environment}
+%
+% \begin{environment}{lstsample}
+% We store the verbatim part and write the source code also to file.
+%    \begin{macrocode}
+\lst@RequireAspects{writefile}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newbox\lst@samplebox
+\lstnewenvironment{lstsample}[3][]
+    {\global\let\lst@intname\@empty
+     \gdef\lst@sample{#2}%
+     \setbox\lst@samplebox=\hbox\bgroup
+         \setkeys{lst}{language={},style={},tabsize=4,gobble=5,%
+             basicstyle=\small\ttfamily,basewidth=0.51em,point={#1}}
+         #3%
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\lst@EndWriteFile\egroup
+%    \end{macrocode}
+% Now |\lst@samplebox| contains the verbatim part.
+% If it's too wide, we use atop and below instead of left and right.
+%    \begin{macrocode}
+     \ifdim \wd\lst@samplebox>.5\linewidth
+         \begin{center}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{center}%
+         \lst@sampleInput
+     \else
+         \begin{center}%
+         \begin{minipage}{0.45\linewidth}\lst@sampleInput\end{minipage}%
+         \qquad
+         \begin{minipage}{0.45\linewidth}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{minipage}%
+         \end{center}%
+     \fi}
+%    \end{macrocode}
+% The new keyword class \keyname{point}.
+%    \begin{macrocode}
+\lst@InstallKeywords{p}{point}{pointstyle}\relax{keywordstyle}{}ld
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{lstxsample}
+% Omitting |\lst@EndWriteFile| leaves the file open.
+%    \begin{macrocode}
+\lstnewenvironment{lstxsample}[1][]
+    {\begingroup
+         \setkeys{lst}{belowskip=-\medskipamount,language={},style={},%
+             tabsize=4,gobble=5,basicstyle=\small\ttfamily,%
+             basewidth=0.51em,point={#1}}
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\endgroup
+     \endgroup}
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\lst@sampleInput}
+% inputs the `left-hand' side.
+%    \begin{macrocode}
+\def\lst@sampleInput{%
+    \MakePercentComment\catcode`\^^M=10\relax
+    \small\lst@sample
+    {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}%
+                                  {\lst@ProcessTabulator}}%
+     \leavevmode \input{\jobname.tmp}}\MakePercentIgnore}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Miscellaneous}
+%
+% \paragraph{Sectioning and cross referencing}
+% We begin with a redefinition paragraph.
+%    \begin{macrocode}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+                                      {1.25ex \@plus1ex \@minus.2ex}%
+                                      {-1em}%
+                                      {\normalfont\normalsize\bfseries}}
+%    \end{macrocode}
+% We introduce |\lstref| which prints section number together with its name.
+%    \begin{macrocode}
+\def\lstref#1{\emph{\ref{#1} \nameref{#1}}}
+%    \end{macrocode}
+% Moreover we adjust the table of contents.  The |\phantomsection| before
+% adding the contents line provides \packagename{hyperref} with an appropriate
+% destination for the contents line link, thereby ensuring that the contents
+% line is at the right level in the PDF bookmark tree.
+%    \begin{macrocode}
+\def\@part[#1]#2{\ifhyper\phantomsection\fi
+    \addcontentsline{toc}{part}{#1}%
+    {\parindent\z@ \raggedright \interlinepenalty\@M
+     \normalfont \huge \bfseries #2\markboth{}{}\par}%
+    \nobreak\vskip 3ex\@afterheading}
+\renewcommand*\l@section[2]{%
+    \addpenalty\@secpenalty
+    \addvspace{.25em \@plus\p@}%
+    \setlength\@tempdima{1.5em}%
+    \begingroup
+      \parindent \z@ \rightskip \@pnumwidth
+      \parfillskip -\@pnumwidth
+      \leavevmode
+      \advance\leftskip\@tempdima
+      \hskip -\leftskip
+      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+    \endgroup}
+\renewcommand*\l@subsection{\@dottedtocline{2}{0pt}{2.3em}}
+\renewcommand*\l@subsubsection{\@dottedtocline{3}{0pt}{3.2em}}
+%    \end{macrocode}
+%
+% \paragraph{Indexing}
+% The `user' commands. |\rstyle| is defined below.
+%    \begin{macrocode}
+\newcommand\ikeyname[1]{%
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \keyname{#1}}
+\newcommand\ekeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack}
+\newcommand\rkeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack{\rstyle\keyname{#1}}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newcommand\icmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\string#1}}
+\newcommand\rcmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\rstyle\string#1}}
+%    \end{macrocode}
+% One of the two yet unknown `index'-macros is empty, the other looks up
+% the aspect name for the given argument.
+%    \begin{macrocode}
+\def\lstaspectindex#1#2{%
+    \global\@namedef{lstkandc@\string#1}{}%
+    \@ifundefined{lstisaspect@\string#1}
+        {\index{unknown\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+        {\index{\@nameuse{lstisaspect@\string#1}\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+}
+\def\lstkeyindex#1#2{%
+%    \index{key\levelchar\protect\keyname{#1}#2}%
+}
+%    \end{macrocode}
+% The key/command to aspect relation is defined near the top of this file using
+% the following command. In future the package should read this information
+% from the aspect files.
+%    \begin{macrocode}
+\def\lstisaspect[#1]#2{%
+    \global\@namedef{lstaspect@#1}{#2}%
+    \lst@AddTo\lst@allkeysandcmds{,#2}%
+    \@for\lst@temp:=#2\do
+    {\ifx\@empty\lst@temp\else
+         \global\@namedef{lstisaspect@\lst@temp}{#1}%
+     \fi}}
+\gdef\lst@allkeysandcmds{}
+%    \end{macrocode}
+% This relation is also good to print all keys and commands of a particular
+% aspect \ldots
+%    \begin{macrocode}
+\def\lstprintaspectkeysandcmds#1{%
+    \lst@true
+    \expandafter\@for\expandafter\lst@temp
+    \expandafter:\expandafter=\csname lstaspect@#1\endcsname\do
+    {\lst@if\lst@false\else, \fi \texttt{\lst@temp}}}
+%    \end{macrocode}
+% \ldots\ or to check the reference. Note that we've defined
+% |\lstkandc@|\meta{name} in |\lstaspectindex|.
+%    \begin{macrocode}
+\def\lstcheckreference{%
+   \@for\lst@temp:=\lst@allkeysandcmds\do
+   {\ifx\lst@temp\@empty\else
+        \@ifundefined{lstkandc@\lst@temp}
+        {\typeout{\lst@temp\space not in reference guide?}}{}%
+    \fi}}
+%    \end{macrocode}
+%
+% \paragraph{Unique styles}
+%    \begin{macrocode}
+\newcommand*\lst{\texttt{lst}}
+\newcommand*\Cpp{C\texttt{++}}
+\let\keyname\texttt
+\let\keyvalue\texttt
+\let\hookname\texttt
+\newcommand*\aspectname[1]{{\normalfont\sffamily#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\DeclareRobustCommand\packagename[1]{%
+    {\leavevmode\text@command{#1}%
+     \switchfontfamily\sfdefault\rmdefault
+     \check@icl #1\check@icr
+     \expandafter}}%
+\renewcommand\packagename[1]{{\normalfont\sffamily#1}}
+\def\switchfontfamily#1#2{%
+    \begingroup\xdef\@gtempa{#1}\endgroup
+    \ifx\f@family\@gtempa\fontfamily#2%
+                    \else\fontfamily#1\fi
+    \selectfont}
+%    \end{macrocode}
+% The color mainly for keys and commands in the reference guide.
+%    \begin{macrocode}
+\ifcolor
+    \definecolor{darkgreen}{rgb}{0,0.5,0}
+    \def\rstyle{\color{darkgreen}}
+\else
+    \let\rstyle\empty
+\fi
+%    \end{macrocode}
+%
+% \paragraph{Commands for credits and helpers}
+%    \begin{macrocode}
+\gdef\lst@emails{}
+\newcommand*\lstthanks[2]
+    {#1\lst@AddTo\lst@emails{,#1,<#2>}%
+     \ifx\@empty#2\@empty\typeout{Missing email for #1}\fi}
+\newcommand*\lsthelper[3]
+    {{\let~\ #1}%
+     \lst@IfOneOf#1\relax\lst@emails
+     {}{\typeout{^^JWarning: Unknown helper #1.^^J}}}
+%    \end{macrocode}
+%
+% \paragraph{Languages and styles}
+%    \begin{macrocode}
+\lstdefinelanguage[doc]{Pascal}{%
+  morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+     do,downto,else,end,false,file,for,function,get,goto,if,in,%
+     integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+     procedure,put,read,readln,real,record,repeat,reset,rewrite,set,%
+     text,then,to,true,type,unpack,until,var,while,with,write,writeln},%
+  sensitive=false,%
+  morecomment=[s]{(*}{*)},%
+  morecomment=[s]{\{}{\}},%
+  morestring=[d]{'}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lstdefinestyle{}
+    {basicstyle={},%
+     keywordstyle=\bfseries,identifierstyle={},%
+     commentstyle=\itshape,stringstyle={},%
+     numberstyle={},stepnumber=1,%
+     pointstyle=\pointstyle}
+\def\pointstyle{%
+    {\let\lst@um\@empty \xdef\@gtempa{\the\lst@token}}%
+    \expandafter\lstkeyindex\expandafter{\@gtempa}{}%
+    \expandafter\lstaspectindex\expandafter{\@gtempa}{}%
+    \rstyle}
+\lstset{defaultdialect=[doc]Pascal,language=Pascal,style={}}
+%    \end{macrocode}
+%
+%
+% \subsection{Scanning languages}
+%
+% \begin{macro}{\lstscanlanguages}
+% We modify some internal definitions and input the files.
+%    \begin{macrocode}
+\def\lstscanlanguages#1#2#3{%
+    \begingroup
+        \def\lst@DefDriver@##1##2##3##4[##5]##6{%
+           \lst@false
+           \lst@lAddTo\lst@scan{##6(##5),}%
+           \begingroup
+           \@ifnextchar[{\lst@XDefDriver{##1}##3}{\lst@DefDriver@@##3}}%
+        \def\lst@XXDefDriver[##1]{}%
+        \lst@InputCatcodes
+        \def\lst@dontinput{#3}%
+        \let\lst@scan\@empty
+        \lst@for{#2}\do{%
+            \lst@IfOneOf##1\relax\lst@dontinput
+                {}%
+                {\InputIfFileExists{##1}{}{}}}%
+        \global\let\@gtempa\lst@scan
+    \endgroup
+    \let#1\@gtempa}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstprintlanguages}
+% |\do| creates a box of width 0.5|\linewidth| or |\linewidth| depending
+% on how wide the argument is. This leads to `two column' output.
+% The other main thing is sorting the list and begin with the output.
+%    \begin{macrocode}
+\def\lstprintlanguages#1{%
+    \def\do##1{\setbox\@tempboxa\hbox{##1\space\space}%
+        \ifdim\wd\@tempboxa<.5\linewidth \wd\@tempboxa.5\linewidth
+                                   \else \wd\@tempboxa\linewidth \fi
+        \box\@tempboxa\allowbreak}%
+    \begin{quote}
+      \par\noindent
+      \hyphenpenalty=\@M \rightskip=\z@\@plus\linewidth\relax
+      \lst@BubbleSort#1%
+      \expandafter\lst@NextLanguage#1\relax(\relax),%
+    \end{quote}}
+%    \end{macrocode}
+% We get and define the current language and \ldots
+%    \begin{macrocode}
+\def\lst@NextLanguage#1(#2),{%
+    \ifx\relax#1\else
+        \def\lst@language{#1}\def\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \fi}
+%    \end{macrocode}
+% \ldots\space gather all available dialect of this language (note that the
+% list has been sorted)
+%    \begin{macrocode}
+\def\lst@NextLanguage@#1(#2),{%
+    \def\lst@temp{#1}%
+    \ifx\lst@temp\lst@language
+        \lst@lAddTo\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \else
+%    \end{macrocode}
+% or begin to print this language with all its dialects. Therefor we sort the
+% dialects
+%    \begin{macrocode}
+        \do{\lst@language
+        \ifx\lst@dialects\lst@emptydialect\else
+            \expandafter\lst@NormedDef\expandafter\lst@language
+                \expandafter{\lst@language}%
+            \space(%
+            \lst@BubbleSort\lst@dialects
+            \expandafter\lst@PrintDialects\lst@dialects(\relax),%
+            )%
+        \fi}%
+        \def\lst@next{\lst@NextLanguage#1(#2),}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@emptydialect{(),}
+%    \end{macrocode}
+% and print the dialect with appropriate commas in between.
+%    \begin{macrocode}
+\def\lst@PrintDialects(#1),{%
+    \ifx\@empty#1\@empty empty\else
+        \lst@PrintDialect{#1}%
+    \fi
+    \lst@PrintDialects@}
+\def\lst@PrintDialects@(#1),{%
+    \ifx\relax#1\else
+        , \lst@PrintDialect{#1}%
+        \expandafter\lst@PrintDialects@
+    \fi}
+%    \end{macrocode}
+% Here we take care of default dialects.
+%    \begin{macrocode}
+\def\lst@PrintDialect#1{%
+    \lst@NormedDef\lst@temp{#1}%
+    \expandafter\ifx\csname\@lst dd@\lst@language\endcsname\lst@temp
+        \texttt{\underbar{#1}}%
+    \else
+        \texttt{#1}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Bubble sort}
+%
+% \begin{macro}{\lst@IfLE}
+% \meta{string 1}|\relax\@empty|\meta{string 2}|\relax\@empty|\marg{then}\meta{else}.
+% If \meta{string 1} $\leq$ \meta{string 2}, we execute \meta{then} and
+% \meta{else} otherwise.
+% Note that this comparision is case insensitive.
+%    \begin{macrocode}
+\def\lst@IfLE#1#2\@empty#3#4\@empty{%
+    \ifx #1\relax
+        \let\lst@next\@firstoftwo
+    \else \ifx #3\relax
+        \let\lst@next\@secondoftwo
+    \else
+        \lowercase{\ifx#1#3}%
+            \def\lst@next{\lst@IfLE#2\@empty#4\@empty}%
+        \else
+            \lowercase{\ifnum`#1<`#3}\relax
+                \let\lst@next\@firstoftwo
+            \else
+                \let\lst@next\@secondoftwo
+            \fi
+        \fi
+    \fi \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BubbleSort}
+% is in fact a derivation of bubble sort.
+%    \begin{macrocode}
+\def\lst@BubbleSort#1{%
+    \ifx\@empty#1\else
+        \lst@false
+%    \end{macrocode}
+% We `bubble sort' the first, second, \ldots\ elements and \ldots
+%    \begin{macrocode}
+        \expandafter\lst@BubbleSort@#1\relax,\relax,%
+%    \end{macrocode}
+% \ldots\space then the second, third, \ldots\ elements until no elemets have
+% been swapped.
+%    \begin{macrocode}
+        \expandafter\lst@BubbleSort@\expandafter,\lst@sorted
+                                      \relax,\relax,%
+        \let#1\lst@sorted
+        \lst@if
+            \def\lst@next{\lst@BubbleSort#1}%
+            \expandafter\expandafter\expandafter\lst@next
+        \fi
+    \fi}
+\def\lst@BubbleSort@#1,#2,{%
+    \ifx\@empty#1\@empty
+        \def\lst@sorted{#2,}%
+        \def\lst@next{\lst@BubbleSort@@}%
+    \else
+        \let\lst@sorted\@empty
+        \def\lst@next{\lst@BubbleSort@@#1,#2,}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% But the bubbles rise only one step per call. Putting the elements at their
+% top most place would be inefficient (since \TeX\ had to read much more
+% parameters in this case).
+%    \begin{macrocode}
+\def\lst@BubbleSort@@#1,#2,{%
+    \ifx\relax#1\else
+        \ifx\relax#2%
+            \lst@lAddTo\lst@sorted{#1,}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@@
+        \else
+            \lst@IfLE #1\relax\@empty #2\relax\@empty
+                          {\lst@lAddTo\lst@sorted{#1,#2,}}%
+                {\lst@true \lst@lAddTo\lst@sorted{#2,#1,}}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@
+        \fi
+    \fi}
+\def\lst@BubbleSort@@@#1\relax,{}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</doc>
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Interfaces to other programs}
+%
+%
+% \subsection{0.21 compatibility}
+%
+% \begin{aspect}{0.21}
+% Some keys have just been renamed.
+%    \begin{macrocode}
+%<*0.21>
+\lst@BeginAspect{0.21}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@Key{labelstyle}{}{\def\lst@numberstyle{#1}}
+\lst@Key{labelsep}{10pt}{\def\lst@numbersep{#1}}
+\lst@Key{labelstep}{0}{%
+    \ifnum #1=\z@ \KV@lst@numbers{none}%
+            \else \KV@lst@numbers{left}\fi
+    \def\lst@stepnumber{#1\relax}}
+\lst@Key{firstlabel}\relax{\def\lst@firstnumber{#1\relax}}
+\lst@Key{advancelabel}\relax{\def\lst@advancenumber{#1\relax}}
+\let\c@lstlabel\c@lstnumber
+\lst@AddToHook{Init}{\def\thelstnumber{\thelstlabel}}
+\newcommand*\thelstlabel{\@arabic\c@lstlabel}
+%    \end{macrocode}
+% A |\let| in the second last line has been changed to |\def| after a bug
+% report by \lsthelper{Venkatesh~Prasad~Ranganath}{2002/08/31}{Undefined
+% control sequence \thelstnumber with 0.21-option}.
+%    \begin{macrocode}
+\lst@Key{first}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{last}\relax{\def\lst@lastline{#1\relax}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{framerulewidth}{.4pt}{\def\lst@framerulewidth{#1}}
+\lst@Key{framerulesep}{2pt}{\def\lst@rulesep{#1}}
+\lst@Key{frametextsep}{3pt}{\def\lst@frametextsep{#1}}
+\lst@Key{framerulecolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@rulecolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@rulecolor{\color{##2}}%
+         \else
+             \def\lst@rulecolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{backgroundcolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@bkgcolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@bkgcolor{\color{##2}}%
+         \else
+             \def\lst@bkgcolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{framespread}{\z@}{\def\lst@framespread{#1}}
+\lst@AddToHook{PreInit}
+    {\@tempdima\lst@framespread\relax \divide\@tempdima\tw@
+     \edef\lst@framextopmargin{\the\@tempdima}%
+     \let\lst@framexrightmargin\lst@framextopmargin
+     \let\lst@framexbottommargin\lst@framextopmargin
+     \advance\@tempdima\lst@xleftmargin\relax
+     \edef\lst@framexleftmargin{\the\@tempdima}}
+%    \end{macrocode}
+% \lsthelper{Harald~Harders}{1998/03/30}{inner- and outerspread} had the idea
+% of two spreads (inner and outer). We either divide the dimension by two or
+% assign the two dimensions to inner- and outerspread.
+%    \begin{macrocode}
+\newdimen\lst@innerspread \newdimen\lst@outerspread
+\lst@Key{spread}{\z@,\z@}{\lstKV@CSTwoArg{#1}%
+    {\lst@innerspread##1\relax
+     \ifx\@empty##2\@empty
+         \divide\lst@innerspread\tw@\relax
+         \lst@outerspread\lst@innerspread
+     \else
+         \lst@outerspread##2\relax
+     \fi}}
+\lst@AddToHook{BoxUnsafe}{\lst@outerspread\z@ \lst@innerspread\z@}
+\lst@Key{wholeline}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins}
+\lst@Key{indent}{\z@}{\def\lst@xleftmargin{#1}}
+\lst@AddToHook{PreInit}
+    {\lst@innerspread=-\lst@innerspread
+     \lst@outerspread=-\lst@outerspread
+     \ifodd\c@page \advance\lst@innerspread\lst@xleftmargin
+             \else \advance\lst@outerspread\lst@xleftmargin \fi
+     \ifodd\c@page
+         \edef\lst@xleftmargin{\the\lst@innerspread}%
+         \edef\lst@xrightmargin{\the\lst@outerspread}%
+     \else
+         \edef\lst@xleftmargin{\the\lst@outerspread}%
+         \edef\lst@xrightmargin{\the\lst@innerspread}%
+     \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{defaultclass}\relax{\def\lst@classoffset{#1}}
+\lst@Key{stringtest}\relax{}% dummy
+\lst@Key{outputpos}\relax{\lst@outputpos#1\relax\relax}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{stringspaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces}
+\lst@Key{visiblespaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{visibletabs}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</0.21>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{\textsf{fancyvrb}}
+%
+% \lsthelper{Denis~Girou}{1998/07/26}{fancyvrb} asked whether
+% \packagename{fancyvrb} and \packagename{listings} could work together.
+%
+% \begin{lstkey}{fancyvrb}
+% We set the boolean and call a submacro.
+%    \begin{macrocode}
+%<*kernel>
+\lst@Key{fancyvrb}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@iffancyvrb
+    \lstFV@fancyvrb}
+\ifx\lstFV@fancyvrb\@undefined
+    \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb}
+\fi
+%</kernel>
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{aspect}{fancyvrb}
+% We end the job if \packagename{fancyvrb} is not present.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{fancyvrb}
+%    \end{macrocode}
+%    \begin{macrocode}
+\@ifundefined{FancyVerbFormatLine}
+    {\typeout{^^J%
+     ***^^J%
+     *** `listings.sty' needs `fancyvrb.sty' right now.^^J%
+     *** Please ensure its availability and try again.^^J%
+     ***^^J}%
+     \batchmode \@@end}{}
+%    \end{macrocode}
+%
+% \begin{macro}{\lstFV@fancyvrb}
+% We assign the correct |\FancyVerbFormatLine| macro.
+%    \begin{macrocode}
+\gdef\lstFV@fancyvrb{%
+    \lst@iffancyvrb
+        \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine\else
+            \let\lstFV@FVFL\FancyVerbFormatLine
+            \let\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \fi
+    \else
+        \ifx\lstFV@FVFL\@undefined\else
+            \let\FancyVerbFormatLine\lstFV@FVFL
+            \let\lstFV@FVFL\@undefined
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstFV@VerbatimBegin}
+% We initialize things if necessary.
+%    \begin{macrocode}
+\gdef\lstFV@VerbatimBegin{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \lsthk@TextStyle \lsthk@BoxUnsafe
+        \lsthk@PreSet
+        \lst@activecharsfalse
+        \let\normalbaselines\relax
+%    \end{macrocode}
+% \begin{TODO}
+% Is this |\let| bad?
+% \end{TODO}
+% I inserted |\lst@ifresetmargins|\ldots|\fi| after a bug report from
+% \lsthelper{Peter~Bartke}{1999/11/18}{wrong fancyvrb frame}. The linewidth
+% is saved and restored since a bug report by \lsthelper{Denis~Girou}
+% {2003/07/04}{problem in list environments with fancyvrb=true}.
+%    \begin{macrocode}
+\xdef\lstFV@RestoreData{\noexpand\linewidth\the\linewidth\relax}%
+        \lst@Init\relax
+        \lst@ifresetmargins \advance\linewidth-\@totalleftmargin \fi
+\lstFV@RestoreData
+        \everypar{}\global\lst@newlines\z@
+        \lst@mode\lst@nomode \let\lst@entermodes\@empty
+        \lst@InterruptModes
+%    \end{macrocode}
+% \lsthelper{Rolf~Niepraschk}{1998/11/25}{ligatures problem} reported a bug
+% concerning ligatures to \lsthelper{Denis~Girou}{1998/11/27}{use |\@noligs|}.
+%    \begin{macrocode}
+%% D.G. modification begin - Nov. 25, 1998
+        \let\@noligs\relax
+%% D.G. modification end
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstFV@VerbatimEnd}
+% A box and macro must exist after |\lst@DeInit|.
+% We store them globally.
+%    \begin{macrocode}
+\gdef\lstFV@VerbatimEnd{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \global\setbox\lstFV@gtempboxa\box\@tempboxa
+        \global\let\@gtempa\FV@ProcessLine
+        \lst@mode\lst@Pmode
+        \lst@DeInit
+        \let\FV@ProcessLine\@gtempa
+        \setbox\@tempboxa\box\lstFV@gtempboxa
+        \par
+    \fi}
+%    \end{macrocode}
+% The |\par| has been added after a bug report by \lsthelper{Peter~Bartke}
+% {2002/04/10}{TeX is not in vertical mode when leaving "Verbatim"}.
+%    \begin{macrocode}
+\newbox\lstFV@gtempboxa
+%    \end{macrocode}
+% \end{macro}
+%
+% \noindent
+% We insert |\lstFV@VerbatimBegin| and |\lstFV@VerbatimEnd| where necessary.
+%    \begin{macrocode}
+\lst@AddTo\FV@VerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@VerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@LVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@LVerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@BVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@BVerbatimEnd\lstFV@VerbatimEnd
+%    \end{macrocode}
+%
+% \begin{macro}{\lstFV@FancyVerbFormatLine}
+% `@' terminates the argument of |\lst@FVConvert|.
+% Moreover |\lst@ReenterModes| and |\lst@InterruptModes| encloses some code.
+% This ensures that we have same group level at the beginning and at the end of
+% the macro---even if the user begins but doesn't end a comment, which means
+% one open group.
+% Furthermore we use |\vtop| and reset |\lst@newlines| to allow line breaking.
+%    \begin{macrocode}
+\gdef\lstFV@FancyVerbFormatLine#1{%
+    \let\lst@arg\@empty \lst@FVConvert#1\@nil
+    \global\lst@newlines\z@
+    \vtop{\noindent\lst@parshape
+          \lst@ReenterModes
+          \lst@arg \lst@PrintToken\lst@EOLUpdate\lsthk@InitVarsBOL
+          \lst@InterruptModes}}
+%    \end{macrocode}
+% The |\lst@parshape| inside |\vtop| is due to a bug report from
+% \lsthelper{Peter~Bartke}{1999/11/18}{wrong par indention with fancyvrb}.
+% A |\leavevmode| became |\noindent|.
+% \end{macro}
+%
+% \begin{lstkey}{fvcmdparams}
+% \begin{lstkey}{morefvcmdparams}
+% These keys adjust \lst@FVcmdparams, which will be used by the following
+% conversion macro. The base set of commands and parameter numbers was
+% provided by \lsthelper{Denis~Girou}{2002/05/31}{init of fvcmdparams}.
+%    \begin{macrocode}
+\lst@Key{fvcmdparams}%
+    {\overlay\@ne}%
+    {\def\lst@FVcmdparams{,#1}}
+\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@FVConvert}
+% We do conversion or \ldots
+%    \begin{macrocode}
+\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}%
+\gdef\lst@FVConvertO@{%
+    \ifcase\@tempcnta
+        \expandafter\futurelet\expandafter\@let@token
+        \expandafter\lst@FVConvert@@
+    \else
+%    \end{macrocode}
+% \ldots\ we append arguments without conversion, argument by argument,
+% |\@tempcnta| times.
+%    \begin{macrocode}
+        \expandafter\lst@FVConvertO@a
+    \fi}
+\gdef\lst@FVConvertO@a#1{%
+    \lst@lAddTo\lst@arg{{#1}}\advance\@tempcnta\m@ne
+    \lst@FVConvertO@}%
+%    \end{macrocode}
+% Since |\@ifnextchar\bgroup| might fail, we have to use |\ifcat| here.
+% Bug reported by \lsthelper{Denis~Girou}{1999/07/26}{fancyvrb=true + `second
+% commandchar' other than \{ doesn't work}.
+% However we don't gobble space tokens as |\@ifnextchar| does.
+%    \begin{macrocode}
+\gdef\lst@FVConvert@@{%
+    \ifcat\noexpand\@let@token\bgroup \expandafter\lst@FVConvertArg
+                                \else \expandafter\lst@FVConvert@ \fi}
+%    \end{macrocode}
+% Coming to such a catcode${}={}$1 character we convert the argument and add
+% it together with group delimiters to |\lst@arg|.
+% We also add |\lst@PrintToken|, which prints all collected characters before
+% we forget them.
+% Finally we continue the conversion.
+%    \begin{macrocode}
+\gdef\lst@FVConvertArg#1{%
+    {\let\lst@arg\@empty
+     \lst@FVConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+     \lst@lExtend\lst@arg{\expandafter{\@gtempa\lst@PrintToken}}%
+     \lst@FVConvert}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvert
+    \fi}
+%    \end{macrocode}
+% Having no |\bgroup|, we look whether we've found the end of the input, and
+% convert one token ((non)active character or control sequence).
+%    \begin{macrocode}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+%    \end{macrocode}
+% Here we check for registered commands with arguments and set the value of
+% |\@tempcnta| as required.
+%    \begin{macrocode}
+          \def\lst@temp##1,#1##2,##3##4\relax{%
+              \ifx##3\@empty \else \@tempcnta##2\relax \fi}%
+          \expandafter\lst@temp\lst@FVcmdparams,#1\z@,\@empty\relax
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvertO@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Omega support}
+%
+% \begingroup
+% $\Omega$ support looks easy---I hope it works at least in some cases.
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+%    \begin{macrocode}
+\@ifundefined{ocp}{}
+    {\lst@AddToHook{OutputBox}%
+         {\let\lst@ProcessLetter\@firstofone
+          \let\lst@ProcessDigit\@firstofone
+          \let\lst@ProcessOther\@firstofone}}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{\textsf{LGrind}}
+%
+% \begin{aspect}{lgrind}
+% \begin{macro}{\lst@LGGetNames}
+% is used to extract the language names from |\lst@arg| (the
+% \packagename{LGrind} definition).
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords,comments,strings,language]{lgrind}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@LGGetNames#1:#2\relax{%
+    \lst@NormedDef\lstlang@{#1}\lst@ReplaceInArg\lstlang@{|,}%
+    \def\lst@arg{:#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetValue}
+% returns in |\lst@LGvalue| the value of capability |#1| given by the list
+% |\lst@arg|. If |#1| is not found, we have |\lst@if|=|\iffalse|.
+% Otherwise it is true and the ``cap=value'' pair is removed from the list.
+% First we test for |#1| and
+%    \begin{macrocode}
+\gdef\lst@LGGetValue#1{%
+    \lst@false
+    \def\lst@temp##1:#1##2##3\relax{%
+        \ifx\@empty##2\else \lst@LGGetValue@{#1}\fi}
+    \expandafter\lst@temp\lst@arg:#1\@empty\relax}
+%    \end{macrocode}
+% remove the pair if necessary.
+%    \begin{macrocode}
+\gdef\lst@LGGetValue@#1{%
+    \lst@true
+    \def\lst@temp##1:#1##2:##3\relax{%
+        \@ifnextchar=\lst@LGGetValue@@{\lst@LGGetValue@@=}##2\relax
+        \def\lst@arg{##1:##3}}%
+    \expandafter\lst@temp\lst@arg\relax}
+\gdef\lst@LGGetValue@@=#1\relax{\def\lst@LGvalue{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetComment}
+% stores the comment delimiters (enclosed in braces) in |#2| if comment of type
+% |#1| is present and not a comment line. Otherwise |#2| is empty.
+%    \begin{macrocode}
+\gdef\lst@LGGetComment#1#2{%
+    \let#2\@empty
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,commentline={#2}}%
+            \let#2\@empty
+        \else
+            \edef#2{{#2}{\lst@LGvalue}}%
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetString}
+% does the same for string delimiters, but it doesn't `return' any value.
+%    \begin{macrocode}
+\gdef\lst@LGGetString#1#2{%
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,morestringizer=[l]{#2}}%
+        \else
+%    \end{macrocode}
+% we must check for |\e|, i.e.~whether we have to use \texttt doubled or
+% \texttt backslashed stringizer.
+%    \begin{macrocode}
+            \ifx #2\lst@LGvalue
+                \edef\lstlang@{\lstlang@,morestringizer=[d]{#2}}%
+            \else
+                \edef\lst@temp{\lst@LGe#2}%
+                \ifx \lst@temp\lst@LGvalue
+                    \edef\lstlang@{\lstlang@,morestringizer=[b]{#2}}%
+                \else
+                    \PackageWarning{Listings}%
+                    {String #2...\lst@LGvalue\space not supported}%
+                \fi
+            \fi
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGDefLang}
+% defines the language given by |\lst@arg|, the definition part, and
+% |\lst@language@|, the language name. First we remove unwanted stuff from
+% |\lst@arg|, e.g.~we replace |:\ :| by |:|.
+%    \begin{macrocode}
+\gdef\lst@LGDefLang{%
+    \lst@LGReplace
+    \let\lstlang@\empty
+%    \end{macrocode}
+% Get the keywords and values of friends.
+%    \begin{macrocode}
+    \lst@LGGetValue{kw}%
+    \lst@if
+        \lst@ReplaceInArg\lst@LGvalue{{ },}%
+        \edef\lstlang@{\lstlang@,keywords={\lst@LGvalue}}%
+    \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \lst@LGGetValue{oc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,sensitive=f}%
+    \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \lst@LGGetValue{id}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,alsoletter=\lst@LGvalue}%
+    \fi
+%    \end{macrocode}
+% Now we get the comment delimiters and use them as single or double comments
+% according to whether there are two or four delimiters.
+% Note that |\lst@LGGetComment| takes care of comment lines.
+%    \begin{macrocode}
+    \lst@LGGetComment a\lst@LGa
+    \lst@LGGetComment c\lst@LGc
+    \ifx\lst@LGa\@empty
+        \ifx\lst@LGc\@empty\else
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGc}%
+        \fi
+    \else
+        \ifx\lst@LGc\@empty
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGa}%
+        \else
+            \edef\lstlang@{\lstlang@,doublecomment=\lst@LGc\lst@LGa}%
+        \fi
+    \fi
+%    \end{macrocode}
+% Now we parse the stringizers.
+%    \begin{macrocode}
+    \lst@LGGetString s\lst@LGa
+    \lst@LGGetString l\lst@LGa
+%    \end{macrocode}
+% We test for the continuation capability and
+%    \begin{macrocode}
+    \lst@LGGetValue{tc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,lgrindef=\lst@LGvalue}%
+    \fi
+%    \end{macrocode}
+% define the language.
+%    \begin{macrocode}
+    \expandafter\xdef\csname\@lst LGlang@\lst@language@\endcsname
+        {\noexpand\lstset{\lstlang@}}%
+%    \end{macrocode}
+% Finally we inform the user of all ignored capabilities.
+%    \begin{macrocode}
+    \lst@ReplaceInArg\lst@arg{{: :}:}\let\lst@LGvalue\@empty
+    \expandafter\lst@LGDroppedCaps\lst@arg\relax\relax
+    \ifx\lst@LGvalue\@empty\else
+        \PackageWarningNoLine{Listings}{Ignored capabilities for
+            \space `\lst@language@' are\MessageBreak\lst@LGvalue}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGDroppedCaps}
+% just drops a previous value and appends the next capabilty name to
+% |\lst@LGvalue|.
+%    \begin{macrocode}
+\gdef\lst@LGDroppedCaps#1:#2#3{%
+    \ifx#2\relax
+        \lst@RemoveCommas\lst@LGvalue
+    \else
+        \edef\lst@LGvalue{\lst@LGvalue,#2#3}%
+        \expandafter\lst@LGDroppedCaps
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGReplace}
+% \begin{macro}{\lst@LGe}
+% We replace `escaped \verb!:^$|!' by catcode 11 versions, and other strings
+% by some kind of short versions (which is necessary to get the above
+% definitions work).
+%    \begin{macrocode}
+\begingroup
+\catcode`\/=0
+\lccode`\z=`\:\lccode`\y=`\^\lccode`\x=`\$\lccode`\v=`\|
+\catcode`\\=12\relax
+/lowercase{%
+/gdef/lst@LGReplace{/lst@ReplaceInArg/lst@arg
+    {{\:}{z }{\^}{y}{\$}{x}{\|}{v}{ \ }{ }{:\ :}{:}{\ }{ }{\(}({\)})}}
+/gdef/lst@LGe{\e}
+}
+/endgroup
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@LGRead}
+% reads one language definition and defines the language if the correct one
+% is found.
+%    \begin{macrocode}
+\gdef\lst@LGRead#1\par{%
+    \lst@LGGetNames#1:\relax
+    \def\lst@temp{endoflanguagedefinitions}%
+    \ifx\lstlang@\lst@temp
+        \let\lst@next\endinput
+    \else
+        \expandafter\lst@IfOneOf\lst@language@\relax\lstlang@
+            {\lst@LGDefLang \let\lst@next\endinput}%
+            {\let\lst@next\lst@LGRead}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{lgrindef}
+% We only have to request the language and
+%    \begin{macrocode}
+\lst@Key{lgrindef}\relax{%
+    \lst@NormedDef\lst@language@{#1}%
+    \begingroup
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\everypar{\lst@LGRead}%
+         \catcode`\\=12\catcode`\{=12\catcode`\}=12\catcode`\%=12%
+         \catcode`\#=14\catcode`\$=12\catcode`\^=12\catcode`\_=12\relax
+         \input{\lstlgrindeffile}%
+        }{}%
+    \endgroup
+%    \end{macrocode}
+% select it or issue an error message.
+%    \begin{macrocode}
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\PackageError{Listings}%
+         {LGrind language \lst@language@\space undefined}%
+         {The language is not loadable. \@ehc}}%
+        {\lsthk@SetLanguage
+         \csname\@lst LGlang@\lst@language@\endcsname}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lstlgrindeffile}
+% contains just the file name.
+%    \begin{macrocode}
+\@ifundefined{lstlgrindeffile}
+    {\lst@UserCommand\lstlgrindeffile{lgrindef.}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{\textsf{hyperref}}
+%
+% \begin{aspect}{hyper}
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{hyper}
+%    \end{macrocode}
+%
+% \begin{lstkey}{hyperanchor}
+% \begin{lstkey}{hyperlink}
+% determine the macro to set an anchor and a link, respectively.
+%    \begin{macrocode}
+\lst@Key{hyperanchor}\hyper@@anchor{\let\lst@hyperanchor#1}
+\lst@Key{hyperlink}\hyperlink{\let\lst@hyperlink#1}
+%    \end{macrocode}
+% \end{lstkey}\end{lstkey}
+% Again, the main thing is a special working procedure. First we extract the
+% contents of |\lst@token| and get a free macro name for this current character
+% string (using prefix |lstHR@| and a number as suffix). Then we make this
+% free macro equivalent to |\@empty|, so it is not used the next time.
+%    \begin{macrocode}
+\lst@InstallKeywords{h}{hyperref}{}\relax{}
+    {\begingroup
+         \let\lst@UM\@empty \xdef\@gtempa{\the\lst@token}%
+     \endgroup
+     \lst@GetFreeMacro{lstHR@\@gtempa}%
+     \global\expandafter\let\lst@freemacro\@empty
+%    \end{macrocode}
+% |\@tempcnta| is the suffix of the free macro. We use it here to refer to
+% the last occurence of the same string. To do this, we redefine the output
+% macro |\lst@alloverstyle| to set an anchor \ldots
+%    \begin{macrocode}
+     \@tempcntb\@tempcnta \advance\@tempcntb\m@ne
+     \edef\lst@alloverstyle##1{%
+         \let\noexpand\lst@alloverstyle\noexpand\@empty
+         \noexpand\smash{\raise\baselineskip\hbox
+             {\noexpand\lst@hyperanchor{lst.\@gtempa\the\@tempcnta}%
+                                       {\relax}}}%
+%    \end{macrocode}
+% \ldots\space and a link to the last occurence (if there is any).
+%    \begin{macrocode}
+         \ifnum\@tempcnta=\z@ ##1\else
+             \noexpand\lst@hyperlink{lst.\@gtempa\the\@tempcntb}{##1}%
+         \fi}%
+    }
+    od
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%</misc>
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \section{Epilogue}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+% Each option adds the aspect name to |\lst@loadaspects| or removes it from that data macro.
+%    \begin{macrocode}
+\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax}
+\def\lst@ProcessOption#1#2\relax{%
+    \ifx #1!%
+        \lst@DeleteKeysIn\lst@loadaspects{#2}%
+    \else
+        \lst@lAddTo\lst@loadaspects{,#1#2}%
+    \fi}
+%    \end{macrocode}
+% The following aspects are loaded by default.
+%    \begin{macrocode}
+\@ifundefined{lst@loadaspects}
+  {\def\lst@loadaspects{strings,comments,escape,style,language,%
+      keywords,labels,lineshape,frames,emph,index}%
+  }{}
+%    \end{macrocode}
+% We load the patch file, \ldots
+%    \begin{macrocode}
+\InputIfFileExists{lstpatch.sty}{}{}
+%    \end{macrocode}
+% \ldots\ process the options, \ldots
+%    \begin{macrocode}
+\let\lst@ifsavemem\iffalse
+\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue}
+\DeclareOption{noaspects}{\let\lst@loadaspects\@empty}
+\ProcessOptions
+%    \end{macrocode}
+% \ldots\ and load the aspects.
+%    \begin{macrocode}
+\lst@RequireAspects\lst@loadaspects
+\let\lst@loadaspects\@empty
+%    \end{macrocode}
+% If present we select the empty style and language.
+%    \begin{macrocode}
+\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle}
+\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage}
+%    \end{macrocode}
+% Finally we load the configuration files.
+%    \begin{macrocode}
+\InputIfFileExists{listings.cfg}{}{}
+\InputIfFileExists{lstlocal.cfg}{}{}
+%<info>\lst@ReportAllocs
+%    \end{macrocode}
+%    \begin{macrocode}
+%</kernel>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \section{History}
+% \begingroup\small
+% Only major changes are listed here. Introductory version numbers of commands
+% and keys are in the sources of the guides, which makes this history fairly
+% short.
+% \renewcommand\labelitemi{--}
+% \begin{itemize}
+% \item[0.1] from 1996/03/09
+%   \item test version to look whether package is possible or not
+% \item[0.11] from 1996/08/19
+%\iffalse
+%   \item additional blank option (= language)
+%\fi
+%   \item improved alignment
+% \item[0.12] from 1997/01/16
+%   \item nearly `perfect' alignment
+% \item[0.13] from 1997/02/11
+%\iffalse
+%   \item additional languages: Eiffel, Fortran 90, Modula-2, Pascal XSC
+%\fi
+%   \item load on demand: language specific macros moved to driver files
+%   \item comments are declared now and not implemented for each language again
+%         (this makes the \TeX\ sources easier to read)
+% \item[0.14] from 1997/02/18
+%   \item User's guide rewritten, Implementation guide uses macro environment
+%   \item (non) case sensitivity implemented and multiple string types,
+%         i.e.~Modula-2 handles both string types: quotes and double quotes
+%\iffalse
+%   \item comment declaration is user-accessible
+%   \item package compatible to \verb!german.sty!
+%\fi
+% \item[0.15] from 1997/04/18
+%\iffalse
+%   \item additional languages: Java, Turbo Pascal
+%\fi
+%   \item package renamed from \packagename{listing} to \packagename{listings}
+%         since the first already exists
+% \item[0.16] from 1997/06/01
+%\iffalse
+%   \item changed `$<$' to `$>$' in |\lst@SkipToFirst|
+%   \item bug removed: |\lst@Init| must be placed before |\lst@SkipToFirst|
+%\fi
+%   \item listing environment rewritten
+% \item[0.17] from 1997/09/29
+%\iffalse
+%   \item |\spreadlisting| works correct now (e.g.~page numbers don't move right)
+%\fi
+%   \item speed up things (quick `if parameter empty', all |\long| except one
+%         removed, faster \verb!\lst@GotoNextTabStop!, etc.)
+%   \item improved alignment of wide other characters (e.g.~$==$)
+%\iffalse
+%   \item many new languages: Ada, Algol, Cobol, Comal 80, Elan, Fortran 77,
+%         Lisp, Logo, Matlab, Oberon, Perl, PL/I, Simula, SQL, \TeX
+%\fi
+% \item[pre-0.18] from 1998/03/24 (unpublished)
+%\iffalse
+%   \item bug concerning |\labelstyle| (becomes \keyname{numberstyle}) removed
+%         (now oldstylenum example works)
+%\fi
+%   \item experimental implementation of character classes
+% \item[0.19] from 1998/11/09
+%   \item character classes and new \lst-aspects seem to be good
+%   \item user interface uses \packagename{keyval} package
+%   \item \packagename{fancyvrb} support
+% \item[0.20] from 1999/07/12
+%   \item new keyword detection mechanism
+%   \item new aspects: \aspectname{writefile}, \aspectname{breaklines},
+%         captions, \aspectname{html}
+%\iffalse
+%   \item improved \packagename{fancyvrb} support
+%\fi
+%   \item all aspects reside in a single file and the language drivers in
+%         currently two files
+% \item[0.21] 2000/08/23
+%   \item completely new User's guide
+%   \item experimental format definitions
+%   \item keyword classes replaced by families
+%   \item dynamic modes
+% \item[1.0$\beta$] 2001/09/21
+%   \item key names synchronized with \packagename{fancyvrb}
+%   \item \aspectname{frames} aspect extended
+%   \item new output concept (delaying and merging)
+% \item[1.0] 2002/04/01
+%   \item update of all documentation sections including Developer's guide
+%   \item delimiters unified
+% \item[1.1] 2003/06/21
+%   \item bugfix-release with some new keys
+% \item[1.2] 2004/02/13
+%   \item bugfix-release with two new keys and new section \ref{rArbitraryLinerangeMarkers}
+% \item[1.3] 2004/09/07
+%   \item another bugfix-release with LPPL-1.3-compliance
+% \item[1.4] 2007/02/26
+%   \item many bugfixes, and new maintainership
+%   \item several new and updated language definitions
+%   \item many small documentation improvements
+%   \item new keys, multicharacter string delimiters, short inline listings, and more.
+% \item[1.5] 2013/06/27
+%   \item new maintainership
+% \end{itemize}
+% \endgroup
+%
+%
+% \Finale
+%
+\endinput
Index: doc/LaTeXmacros/listings/listings.ins
===================================================================
--- doc/LaTeXmacros/listings/listings.ins	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.ins	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,50 @@
+%%
+%% This file generates files required to use the listings package.
+%% At your command prompt write
+%%
+%%     tex listings.ins
+%%
+%%
+%% (w)(c) 1996--1999,2002--2004 Carsten Heinz
+%%
+%% $Id: listings.ins 25 2013-06-05 08:04:03Z j_hoffmann $
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+\input docstrip
+\preamble
+\endpreamble
+
+\usedir{tex/latex/listings}
+\keepsilent
+\askforoverwritefalse
+
+
+%
+% generate base package
+%
+\generate{
+    \file{listings.sty}{\from{listings.dtx}{kernel}}
+    \file{lstmisc.sty}{\from{listings.dtx}{misc,0.21}}
+    \file{lstdoc.sty}{\from{listings.dtx}{doc}}
+    \file{lstdrvrs.ins}{\from{lstdrvrs.dtx}{install}}
+    \file{listings.cfg}{\from{lstdrvrs.dtx}{config}}
+}
+
+%
+% generate language driver files
+%
+\batchinput{lstdrvrs.ins}
+
+
+\Msg{*}
+\Msg{* You probably need to move all created `.sty' and `.cfg'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{*}
+\Msg{* And don't forget to refresh your filename database}
+\Msg{* if your TeX distribution uses such a database.}
+\Msg{*}
+
+\endbatchfile
Index: doc/LaTeXmacros/listings/listings.log
===================================================================
--- doc/LaTeXmacros/listings/listings.log	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.log	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,142 @@
+This is TeX, Version 3.1415926 (TeX Live 2009/Debian) (format=tex 2013.4.9)  27 MAY 2016 08:04
+**listings.ins
+(./listings.ins (/usr/share/texmf-texlive/tex/latex/base/docstrip.tex
+\blockLevel=\count26
+\emptyLines=\count27
+\processedLines=\count28
+\commentsRemoved=\count29
+\commentsPassed=\count30
+\codeLinesPassed=\count31
+\TotalprocessedLines=\count32
+\TotalcommentsRemoved=\count33
+\TotalcommentsPassed=\count34
+\TotalcodeLinesPassed=\count35
+\NumberOfFiles=\count36
+\inFile=\read0
+\inputcheck=\read1
+\@tempcnta=\count37
+\off@0=\count38
+\off@1=\count39
+\off@2=\count40
+\off@3=\count41
+\off@4=\count42
+\off@5=\count43
+\off@6=\count44
+\off@7=\count45
+\off@8=\count46
+\off@9=\count47
+\off@10=\count48
+\off@11=\count49
+\off@12=\count50
+\off@13=\count51
+\off@14=\count52
+\off@15=\count53
+\@temptokena=\toks12
+\@maxfiles=\count54
+\@maxoutfiles=\count55
+
+Utility: `docstrip' 2.5d <2005/07/29>
+English documentation    <1999/03/31>
+
+**********************************************************
+* This program converts documented macro-files into fast *
+* loadable files by stripping off (nearly) all comments! *
+**********************************************************
+
+********************************************************
+* No Configuration file found, using default settings. *
+********************************************************
+
+)
+
+Generating file(s) listings.sty lstmisc.sty lstdoc.sty lstdrvrs.ins listings.cf
+g 
+\openout0 = `listings.sty'.
+
+\openout1 = `lstmisc.sty'.
+
+\openout2 = `lstdoc.sty'.
+
+
+Processing file listings.dtx (kernel) -> listings.sty
+                             (misc,0.21) -> lstmisc.sty
+                             (doc) -> lstdoc.sty
+File listings.dtx ended by \endinput.
+Lines  processed: 16659
+Comments removed: 11804
+Comments  passed: 12
+Codelines passed: 4746
+
+\openout0 = `lstdrvrs.ins'.
+
+\openout1 = `listings.cfg'.
+
+
+Processing file lstdrvrs.dtx (install) -> lstdrvrs.ins
+                             (config) -> listings.cfg
+File lstdrvrs.dtx ended by \endinput.
+Lines  processed: 7491
+Comments removed: 2105
+Comments  passed: 293
+Codelines passed: 4882
+
+(./lstdrvrs.ins
+
+Generating file(s) lstlang1.sty lstlang2.sty lstlang3.sty 
+\openout0 = `lstlang1.sty'.
+
+\openout1 = `lstlang2.sty'.
+
+\openout2 = `lstlang3.sty'.
+
+
+Processing file lstdrvrs.dtx (lang1) -> lstlang1.sty
+                             (lang2) -> lstlang2.sty
+                             (lang3) -> lstlang3.sty
+File lstdrvrs.dtx ended by \endinput.
+Lines  processed: 7491
+Comments removed: 2105
+Comments  passed: 293
+Codelines passed: 4882
+
+
+Generating file(s) listings-acm.prf listings-bash.prf listings-fortran.prf list
+ings-lua.prf listings-python.prf 
+\openout0 = `listings-acm.prf'.
+
+\openout1 = `listings-bash.prf'.
+
+\openout2 = `listings-fortran.prf'.
+
+\openout3 = `listings-lua.prf'.
+
+\openout4 = `listings-python.prf'.
+
+
+Processing file lstdrvrs.dtx (acm-prf) -> listings-acm.prf
+                             (bash-prf) -> listings-bash.prf
+                             (fortran-prf) -> listings-fortran.prf
+                             (lua-prf) -> listings-lua.prf
+                             (python-prf) -> listings-python.prf
+File lstdrvrs.dtx ended by \endinput.
+Lines  processed: 7491
+Comments removed: 2105
+Comments  passed: 293
+Codelines passed: 4882
+
+)
+*
+* You probably need to move all created `.sty' and `.cfg'
+* files into a directory searched by TeX.
+*
+* And don't forget to refresh your filename database
+* if your TeX distribution uses such a database.
+*
+Overall statistics:
+Files  processed: 4
+Lines  processed: 39132
+Comments removed: 18119
+Comments  passed: 891
+Codelines passed: 19392
+ )
+No pages of output.
Index: doc/LaTeXmacros/listings/listings.sty
===================================================================
--- doc/LaTeXmacros/listings/listings.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,2243 @@
+%%
+%% This is file `listings.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% listings.dtx  (with options: `kernel')
+%% 
+%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\def\filedate{2015/06/04}
+\def\fileversion{1.6}
+\NeedsTeXFormat{LaTeX2e}
+\AtEndOfPackage{\ProvidesPackage{listings}
+             [\filedate\space\fileversion\space(Carsten Heinz)]}
+\def\lst@CheckVersion#1{\edef\reserved@a{#1}%
+    \ifx\lst@version\reserved@a \expandafter\@gobble
+                          \else \expandafter\@firstofone \fi}
+\let\lst@version\fileversion
+\def\lst@InputCatcodes{%
+    \makeatletter \catcode`\"12%
+    \catcode`\^^@\active
+    \catcode`\^^I9%
+    \catcode`\^^L9%
+    \catcode`\^^M9%
+    \catcode`\%14%
+    \catcode`\~\active}
+\def\lst@RestoreCatcodes#1{%
+    \ifx\relax#1\else
+        \noexpand\catcode`\noexpand#1\the\catcode`#1\relax
+        \expandafter\lst@RestoreCatcodes
+    \fi}
+\edef\lst@RestoreCatcodes{%
+    \noexpand\lccode`\noexpand\/`\noexpand\/%
+    \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax
+    \catcode12\active}
+\lst@InputCatcodes
+\AtEndOfPackage{\lst@RestoreCatcodes}
+\def\@lst{lst}
+\def\lst@IfSubstring#1#2{%
+    \def\lst@temp##1#1##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp#2#1\@empty\relax}
+\def\lst@IfOneOf#1\relax#2{%
+    \def\lst@temp##1,#1,##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}
+\def\lst@DeleteKeysIn#1#2{%
+    \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,}
+\def\lst@DeleteKeysIn@#1#2,{%
+    \ifx\relax#2\@empty
+        \expandafter\@firstoftwo\expandafter\lst@RemoveCommas
+    \else
+        \ifx\@empty#2\@empty\else
+            \def\lst@temp##1,#2,##2{%
+                ##1%
+                \ifx\@empty##2\@empty\else
+                    \expandafter\lst@temp\expandafter,%
+                \fi ##2}%
+            \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}%
+        \fi
+    \fi
+    \lst@DeleteKeysIn@#1}
+\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}}
+\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi}
+\def\lst@ReplaceIn#1#2{%
+    \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty}
+\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty}
+\def\lst@ReplaceIn@#1#2#3{%
+    \ifx\@empty#3\relax\else
+        \def\lst@temp##1#2##2{%
+            \ifx\@empty##2%
+                \lst@lAddTo#1{##1}%
+            \else
+                \lst@lAddTo#1{##1#3}\expandafter\lst@temp
+            \fi ##2}%
+        \let\@tempa#1\let#1\@empty
+        \expandafter\lst@temp\@tempa#2\@empty
+        \expandafter\lst@ReplaceIn@\expandafter#1%
+    \fi}
+\providecommand*\@gobblethree[3]{}
+\def\lst@GobbleNil#1\@nil{}
+\def\lst@Swap#1#2{#2#1}
+\def\lst@true{\let\lst@if\iftrue}
+\def\lst@false{\let\lst@if\iffalse}
+\lst@false
+\def\lst@IfNextCharsArg#1{%
+    \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind}
+\def\lst@IfNextChars#1#2#3{%
+    \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}%
+    \let\lst@eaten\@empty \lst@IfNextChars@}
+\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax}
+\def\lst@IfNextChars@@#1#2\relax#3{%
+    \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}%
+    \ifx#1#3%
+        \ifx\lst@tofind\@empty
+            \let\lst@next\@tempa
+        \else
+            \let\lst@next\lst@IfNextChars@
+        \fi
+        \expandafter\lst@next
+    \else
+        \expandafter\@tempb
+    \fi}
+\def\lst@IfNextCharActive#1#2#3{%
+    \begingroup \lccode`\~=`#3\lowercase{\endgroup
+    \ifx~}#3%
+        \def\lst@next{#1}%
+    \else
+        \def\lst@next{#2}%
+    \fi \lst@next #3}
+\def\lst@for#1\do#2{%
+  \def\lst@forbody##1{#2}%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@empty\else\expandafter\lst@f@r#1,\@nil,\fi
+}
+\def\lst@f@r#1,{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@nnil\else\lst@forbody{#1}\expandafter\lst@f@r\fi
+}
+\def\lst@MakeActive#1{%
+    \let\lst@temp\@empty \lst@MakeActive@#1%
+    \relax\relax\relax\relax\relax\relax\relax\relax\relax}
+\begingroup
+\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active
+\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active
+\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active
+\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax
+    \ifx#1\relax
+    \else \lccode`\^^@=`#1%
+    \ifx#2\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@}}%
+    \else \lccode`\^^A=`#2%
+    \ifx#3\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}%
+    \else \lccode`\^^B=`#3%
+    \ifx#4\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}%
+    \else \lccode`\^^C=`#4%
+    \ifx#5\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}%
+    \else \lccode`\^^D=`#5%
+    \ifx#6\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}%
+    \else \lccode`\^^E=`#6%
+    \ifx#7\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}%
+    \else \lccode`\^^F=`#7%
+    \ifx#8\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}%
+    \else \lccode`\^^G=`#8%
+    \ifx#9\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}%
+    \else \lccode`\^^H=`#9%
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}%
+        \let\lst@next\lst@MakeActive@
+    \fi \fi \fi \fi \fi \fi \fi \fi \fi
+    \lst@next}
+\endgroup
+\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp}
+\def\lst@DefOther#1#2{%
+    \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup
+    \expandafter\lst@DefOther@\meaning#1\relax#1}
+\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}}
+\def\lst@InsideConvert#1{%
+   \lst@ifmathescape
+      \lst@InsideConvert@e#1$\@nil
+      \lst@if
+         \lst@InsideConvert@ey#1\@nil
+      \else
+         \lst@InsideConvert@#1 \@empty
+         \expandafter\@gobbletwo
+      \fi
+      \expandafter\lst@next
+   \else
+      \lst@InsideConvert@#1 \@empty
+   \fi}
+\begingroup \lccode`\~=`\ \relax \lowercase{%
+\gdef\lst@InsideConvert@#1 #2{%
+    \lst@MakeActive{#1}%
+    \ifx\@empty#2%
+        \lst@lExtend\lst@arg{\lst@temp}%
+    \else
+        \lst@lExtend\lst@arg{\lst@temp~}%
+        \expandafter\lst@InsideConvert@
+    \fi #2}
+}\endgroup
+\def\lst@InsideConvert@e#1$#2\@nil{%
+   \ifx\@empty#2\@empty \lst@false \else \lst@true \fi}
+\def\lst@InsideConvert@ey#1$#2$#3\@nil{%
+   \lst@InsideConvert@#1 \@empty
+   \lst@lAddTo\lst@arg{%
+      \lst@ifdropinput\else
+         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
+         \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin
+         #2%
+         \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput
+         \lst@whitespacefalse
+      \fi}%
+   \def\lst@next{\lst@InsideConvert{#3}}%
+}
+\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@}
+\def\lst@XConvertArg#1{%
+    {\lst@false \let\lst@arg\@empty
+     \lst@XConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+    \lst@lExtend\lst@arg{\expandafter{\@gtempa}}%
+    \lst@XConvertNext}
+\def\lst@XConvert@#1{%
+    \ifx\@nil#1\else
+        \begingroup\lccode`\~=`#1\lowercase{\endgroup
+        \lst@lAddTo\lst@arg~}%
+        \expandafter\lst@XConvertNext
+    \fi}
+\def\lst@XConvertNext{%
+    \lst@if \expandafter\lst@XConvertX
+      \else \expandafter\lst@XConvert \fi}
+\def\lst@XConvertX#1{%
+    \ifx\@nil#1\else
+        \lst@XConvertX@#1\relax
+        \expandafter\lst@XConvert
+    \fi}
+\def\lst@XConvertX@#1#2\relax{%
+    \begingroup\lccode`\~=`#1\lowercase{\endgroup
+    \lst@XCConvertX@@~}{#2}}
+\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}}
+\def\lst@Require#1#2#3#4#5{%
+    \begingroup
+    \aftergroup\lst@true
+    \ifx\@empty#3\@empty\else
+        \def\lst@prefix{#2}\let\lst@require\@empty
+        \edef\lst@temp{\expandafter\zap@space#3 \@empty}%
+        \lst@for\lst@temp\do{%
+          \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{%
+            #4[####1]{####2}%
+            \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}%
+            {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}%
+            {}}%
+          \fi}%
+        \global\let\lst@loadaspects\@empty
+        \lst@InputCatcodes
+        \ifx\lst@require\@empty\else
+            \lst@for{#5}\do{%
+                \ifx\lst@require\@empty\else
+                    \InputIfFileExists{##1}{}{}%
+                \fi}%
+        \fi
+        \ifx\lst@require\@empty\else
+            \PackageError{Listings}{Couldn't load requested #1}%
+            {The following #1s weren't loadable:^^J\@spaces
+             \lst@require^^JThis may cause errors in the sequel.}%
+            \aftergroup\lst@false
+        \fi
+        \ifx\lst@loadaspects\@empty\else
+            \lst@RequireAspects\lst@loadaspects
+        \fi
+    \fi
+    \endgroup}
+\def\lst@IfRequired[#1]#2{%
+    \lst@NormedDef\lst@temp{[#1]#2}%
+    \expandafter\lst@IfRequired@\lst@temp\relax}
+\def\lst@IfRequired@[#1]#2\relax#3{%
+    \lst@IfOneOf #2$#1\relax\lst@require
+        {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,%
+         \global\expandafter\let
+             \csname\@lst\lst@prefix @#2$#1\endcsname\@empty
+         #3}}
+\let\lst@require\@empty
+\def\lst@NoAlias[#1]#2{%
+    \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}}
+\gdef\lst@LAS#1#2#3#4#5#6#7{%
+    \lst@Require{#1}{#2}{#3}#4#5%
+    #4#3%
+    \@ifundefined{lst#2@\lst@malias$\lst@oalias}%
+        {\PackageError{Listings}%
+         {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi
+          \lst@malias\space undefined}%
+         {The #1 is not loadable. \@ehc}}%
+        {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}}
+\def\lst@RequireAspects#1{%
+    \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles}
+\let\lstloadaspects\lst@RequireAspects
+\@ifundefined{lstaspectfiles}
+    {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{}
+\gdef\lst@DefDriver#1#2#3#4{%
+    \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}%
+                 {\lst@DefDriver@{#1}{#2}#3#4[]}}
+\gdef\lst@DefDriver@#1#2#3#4[#5]#6{%
+    \def\lst@name{#1}\let\lst@if#4%
+    \lst@NormedDef\lst@driver{\@lst#2@#6$#5}%
+    \lst@IfRequired[#5]{#6}{\begingroup \lst@true}%
+                           {\begingroup}%
+    \lst@setcatcodes
+    \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}}
+\gdef\lst@DefDriver@@#1#2{%
+    \lst@if
+        \global\@namedef{\lst@driver}{#1{#2}}%
+    \fi
+    \endgroup
+    \@ifnextchar[\lst@XXDefDriver\@empty}
+\gdef\lst@XXDefDriver[#1]{%
+    \ifx\@empty#1\@empty\else
+        \lst@if
+            \lstloadaspects{#1}%
+        \else
+            \@ifundefined{\lst@driver}{}%
+            {\xdef\lst@loadaspects{\lst@loadaspects,#1}}%
+        \fi
+    \fi}
+\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}}
+\let\lst@UserCommand\gdef
+\newcommand*\lst@BeginAspect[2][]{%
+    \def\lst@curraspect{#2}%
+    \ifx \lst@curraspect\@empty
+        \expandafter\lst@GobbleAspect
+    \else
+        \let\lst@next\@empty
+        \lst@IfRequired[]{#2}%
+            {\lst@RequireAspects{#1}%
+             \lst@if\else \let\lst@next\lst@GobbleAspect \fi}%
+            {\let\lst@next\lst@GobbleAspect}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@EndAspect{%
+    \csname\@lst patch@\lst@curraspect\endcsname
+    \let\lst@curraspect\@empty}
+\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty}
+\def\lst@Key#1#2{%
+    \@ifnextchar[{\lstKV@def{#1}{#2}}%
+                 {\def\lst@temp{\lst@Key@{#1}{#2}}
+                  \afterassignment\lst@temp
+                  \global\@namedef{KV@\@lst @#1}####1}}
+\def\lstKV@def#1#2[#3]{%
+    \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter
+        {\csname KV@\@lst @#1\endcsname{#3}}%
+    \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp
+    \global\@namedef{KV@\@lst @#1}##1}
+\def\lst@Key@#1#2{%
+    \ifx\relax#2\@empty\else
+        \begingroup \globaldefs\@ne
+        \csname KV@\@lst @#1\endcsname{#2}%
+        \endgroup
+    \fi}
+\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname}
+\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo}
+\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo}
+\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop}
+\long\def\lst@ATH@#1#2#3#4{%
+    \@ifundefined{\@lst hk@#3}{%
+        \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}%
+    \expandafter#2\csname\@lst hk@#3\endcsname{#4}%
+    \def\lst@temp{#4}%
+    #1% \iftrue|false
+        \begingroup \globaldefs\@ne \lst@temp \endgroup
+    \fi}
+\long\def\lst@AddTo#1#2{%
+    \expandafter\gdef\expandafter#1\expandafter{#1#2}}
+\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}%
+    \expandafter\expandafter\expandafter\gdef
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}}
+\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+\def\lst@Extend#1#2{%
+    \expandafter\lst@AddTo\expandafter#1\expandafter{#2}}
+\def\lst@lExtend#1#2{%
+    \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}}
+\RequirePackage{keyval}[1997/11/10]
+\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}}
+\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}}
+\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}}
+\def\lstKV@OptArg[#1]#2#3{%
+    \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@}
+\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}}
+\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}}
+\def\lstKV@XOptArg[#1]#2#3{%
+    \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@}
+\def\lstKV@CSTwoArg#1#2{%
+    \gdef\@gtempa##1,##2,##3\relax{#2}%
+    \@gtempa#1,,\relax}
+\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax}
+\def\lstKV@SetIf@#1#2\relax#3{\lowercase{%
+    \expandafter\let\expandafter#3%
+        \csname if\ifx #1t}true\else false\fi\endcsname}
+\def\lstKV@SwitchCases#1#2#3{%
+    \def\lst@temp##1\\#1&##2\\##3##4\@nil{%
+        \ifx\@empty##3%
+            #3%
+        \else
+            ##2%
+        \fi
+    }%
+    \lst@temp\\#2\\#1&\\\@empty\@nil}
+\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@}
+\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi}
+\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax}
+\def\lst@NewMode#1{%
+    \ifx\@undefined#1%
+        \lst@mode\lst@newmode\relax \advance\lst@mode\@ne
+        \xdef\lst@newmode{\the\lst@mode}%
+        \global\chardef#1=\lst@mode
+        \lst@mode\lst@nomode
+    \fi}
+\newcount\lst@mode
+\def\lst@newmode{\m@ne}% init
+\lst@NewMode\lst@nomode % init (of \lst@mode :-)
+\def\lst@UseDynamicMode{%
+    \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne
+    \edef\lst@dynamicmode{\the\@tempcnta}%
+    \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}}
+\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode}
+\def\lst@EnterMode#1#2{%
+    \bgroup \lst@mode=#1\relax #2%
+    \lst@FontAdjust
+    \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}}
+\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty}
+\let\lst@entermodes\@empty % init
+\def\lst@LeaveMode{%
+    \ifnum\lst@mode=\lst@nomode\else
+        \egroup \expandafter\lsthk@EndGroup
+    \fi}
+\lst@AddToHook{EndGroup}{}% init
+\def\lst@InterruptModes{%
+    \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}%
+    \lst@LeaveAllModes}
+\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty}
+\def\lst@ReenterModes{%
+    \ifx\lst@modestack\@empty\else
+        \lst@LeaveAllModes
+        \global\let\@gtempa\lst@modestack
+        \global\let\lst@modestack\@empty
+        \expandafter\lst@ReenterModes@\@gtempa\relax
+    \fi}
+\def\lst@ReenterModes@#1#2{%
+    \ifx\relax#2\@empty
+        \gdef\@gtempa##1{#1}%
+        \expandafter\@gtempa
+    \else
+        \lst@AddTo\lst@modestack{{#1}}%
+        \expandafter\lst@ReenterModes@
+    \fi
+    {#2}}
+\def\lst@LeaveAllModes{%
+    \ifnum\lst@mode=\lst@nomode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveAllModes
+    \fi}
+\lst@AddToHook{ExitVars}{\lst@LeaveAllModes}
+\lst@NewMode\lst@Pmode
+\lst@NewMode\lst@GPmode
+\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue}
+\let\lst@ifmode\iffalse % init
+\lst@AddToHook{ModeTrue}{}% init
+\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue}
+\let\lst@ifLmode\iffalse % init
+\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode}
+\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}}
+\def\lst@NormedNameDef#1#2{%
+    \lowercase{\edef\lst@temp{\zap@space#1 \@empty}%
+    \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}}
+\def\lst@GetFreeMacro#1{%
+    \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}%
+    \lst@GFM@}
+\def\lst@GFM@{%
+    \expandafter\ifx \csname\lst@freemacro\endcsname \relax
+        \edef\lst@freemacro{\csname\lst@freemacro\endcsname}%
+    \else
+        \advance\@tempcnta\@ne
+        \expandafter\lst@GFM@
+    \fi}
+\newbox\lst@gtempboxa
+\newtoks\lst@token \newcount\lst@length
+\def\lst@ResetToken{\lst@token{}\lst@length\z@}
+\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty}
+\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty}
+\def\lst@lettertrue{\let\lst@ifletter\iftrue}
+\def\lst@letterfalse{\let\lst@ifletter\iffalse}
+\lst@AddToHook{InitVars}{\lst@letterfalse}
+\def\lst@Append#1{\advance\lst@length\@ne
+                  \lst@token=\expandafter{\the\lst@token#1}}
+\def\lst@AppendOther{%
+    \lst@ifletter \lst@Output\lst@letterfalse \fi
+    \futurelet\lst@lastother\lst@Append}
+\def\lst@AppendLetter{%
+    \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi
+    \lst@Append}
+\def\lst@SaveToken{%
+    \global\let\lst@gthestyle\lst@thestyle
+    \global\let\lst@glastother\lst@lastother
+    \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}%
+                           \noexpand\lst@length\the\lst@length\relax
+                           \noexpand\let\noexpand\lst@thestyle
+                                        \noexpand\lst@gthestyle
+                           \noexpand\let\noexpand\lst@lastother
+                                        \noexpand\lst@glastother}}
+\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax}
+\def\lst@IfLastOtherOneOf@#1{%
+    \ifx #1\relax
+        \expandafter\@secondoftwo
+    \else
+        \ifx\lst@lastother#1%
+            \lst@IfLastOtherOneOf@t
+        \else
+            \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@
+        \fi
+    \fi}
+\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo}
+\newdimen\lst@currlwidth % \global
+\newcount\lst@column \newcount\lst@pos % \global
+\lst@AddToHook{InitVarsBOL}
+    {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@}
+\def\lst@CalcColumn{%
+            \@tempcnta\lst@column
+    \advance\@tempcnta\lst@length
+    \advance\@tempcnta-\lst@pos}
+\newdimen\lst@lostspace % \global
+\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@}
+\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi}
+\def\lst@InsertLostSpace{%
+    \lst@Kern\lst@lostspace \global\lst@lostspace\z@}
+\def\lst@InsertHalfLostSpace{%
+    \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace}
+\newdimen\lst@width
+\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}%
+    {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}%
+     \ifx\lst@widthflexible\@empty
+         \let\lst@widthflexible\lst@widthfixed
+     \fi
+     \def\lst@temp{\PackageError{Listings}%
+                                {Negative value(s) treated as zero}%
+                                \@ehc}%
+     \let\lst@error\@empty
+     \ifdim \lst@widthfixed<\z@
+         \let\lst@error\lst@temp \let\lst@widthfixed\z@
+     \fi
+     \ifdim \lst@widthflexible<\z@
+         \let\lst@error\lst@temp \let\lst@widthflexible\z@
+     \fi
+     \lst@error}}
+\lst@AddToHook{FontAdjust}
+    {\lst@width=\lst@ifflexible\lst@widthflexible
+                          \else\lst@widthfixed\fi \relax}
+\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust}
+\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi}
+\lst@AddToHook{InitVars}{\lsthk@FontAdjust}
+\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}}
+\def\lst@alloverstyle#1{#1}% init
+\def\lst@Kern#1{%
+    \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}%
+    \global\advance\lst@currlwidth \wd\z@
+    \lst@OutputBox\z@}
+\def\lst@CalcLostSpaceAndOutput{%
+    \global\advance\lst@lostspace \lst@length\lst@width
+    \global\advance\lst@lostspace-\wd\@tempboxa
+    \global\advance\lst@currlwidth \wd\@tempboxa
+    \global\advance\lst@pos -\lst@length
+    \setbox\@tempboxa\hbox{\let\lst@OutputBox\box
+        \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi
+        \box\@tempboxa
+        \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}%
+    \lst@OutputBox\@tempboxa \lsthk@PostOutput}
+\lst@AddToHook{PostOutput}{}% init
+\def\lst@OutputToken{%
+    \lst@TrackNewLines \lst@OutputLostSpace
+    \lst@ifgobbledws
+        \lst@gobbledwhitespacefalse
+        \lst@@discretionary
+    \fi
+    \lst@CheckMerge
+    {\lst@thestyle{\lst@FontAdjust
+     \setbox\@tempboxa\lst@hbox
+        {\lsthk@OutputBox
+         \lst@lefthss
+         \expandafter\lst@FillOutputBox\the\lst@token\@empty
+         \lst@righthss}%
+     \lst@CalcLostSpaceAndOutput}}%
+    \lst@ResetToken}
+\lst@AddToHook{OutputBox}{}% init
+\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue}
+\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse}
+\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init
+\def\lst@Delay#1{%
+    \lst@CheckDelay
+    #1%
+    \lst@GetOutputMacro\lst@delayedoutput
+    \edef\lst@delayed{\the\lst@token}%
+    \edef\lst@delayedlength{\the\lst@length}%
+    \lst@ResetToken}
+\def\lst@Merge#1{%
+    \lst@CheckMerge
+    #1%
+    \edef\lst@merged{\the\lst@token}%
+    \edef\lst@mergedlength{\the\lst@length}%
+    \lst@ResetToken}
+\def\lst@MergeToken#1#2{%
+    \advance\lst@length#2%
+    \lst@lExtend#1{\the\lst@token}%
+    \expandafter\lst@token\expandafter{#1}%
+    \let#1\@empty}
+\def\lst@CheckDelay{%
+    \ifx\lst@delayed\@empty\else
+        \lst@GetOutputMacro\@gtempa
+        \ifx\lst@delayedoutput\@gtempa
+            \lst@MergeToken\lst@delayed\lst@delayedlength
+        \else
+            {\lst@ResetToken
+             \lst@MergeToken\lst@delayed\lst@delayedlength
+             \lst@delayedoutput}%
+            \let\lst@delayed\@empty
+        \fi
+    \fi}
+\def\lst@CheckMerge{%
+    \ifx\lst@merged\@empty\else
+        \lst@MergeToken\lst@merged\lst@mergedlength
+    \fi}
+\let\lst@delayed\@empty % init
+\let\lst@merged\@empty % init
+\def\lst@column@fixed{%
+    \lst@flexiblefalse
+    \lst@width\lst@widthfixed\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\lst@FillFixed
+    \let\lst@hss\hss
+    \def\lst@hbox{\hbox to\lst@length\lst@width}}
+\def\lst@FillFixed#1{#1\lst@FillFixed@}
+\def\lst@FillFixed@#1{%
+    \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi}
+\def\lst@column@flexible{%
+    \lst@flexibletrue
+    \lst@width\lst@widthflexible\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\@empty
+    \let\lst@hss\@empty
+    \let\lst@hbox\hbox}
+\def\lst@column@fullflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+\def\lst@column@spaceflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{%
+      \lst@ifwhitespace
+        \ifx\lst@outputspace\lst@visiblespace
+        \else
+          \lst@UseLostSpace
+        \fi
+      \else
+        \lst@ifnewline \lst@UseLostSpace\fi
+      \fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+\def\lst@outputpos#1#2\relax{%
+    \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss
+    \let\lst@rightinsert\lst@InsertLostSpace
+    \ifx #1c%
+        \let\lst@leftinsert\lst@InsertHalfLostSpace
+    \else\ifx #1r%
+        \let\lst@righthss\@empty
+        \let\lst@leftinsert\lst@InsertLostSpace
+        \let\lst@rightinsert\@empty
+    \else
+        \let\lst@lefthss\@empty
+        \let\lst@leftinsert\@empty
+        \ifx #1l\else \PackageWarning{Listings}%
+            {Unknown positioning for output boxes}%
+        \fi
+    \fi\fi}
+\def\lst@flexibletrue{\let\lst@ifflexible\iftrue}
+\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse}
+\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{%
+    \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi
+    \expandafter\let\expandafter\lst@arg
+                                \csname\@lst @column@##2\endcsname
+    \lst@arg
+    \ifx\lst@arg\relax
+        \PackageWarning{Listings}{Unknown column format `##2'}%
+    \else
+        \lst@ifflexible
+            \let\lst@columnsflexible\lst@arg
+        \else
+            \let\lst@columnsfixed\lst@arg
+        \fi
+    \fi}}
+\let\lst@columnsfixed\lst@column@fixed % init
+\let\lst@columnsflexible\lst@column@flexible % init
+\lst@Key{flexiblecolumns}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@ifflexible
+    \lst@ifflexible \lst@columnsflexible
+              \else \lst@columnsfixed \fi}
+\newcount\lst@newlines
+\lst@AddToHook{InitVars}{\global\lst@newlines\z@}
+\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne}
+\def\lst@NewLine{%
+    \ifx\lst@OutputBox\@gobble\else
+        \par\noindent \hbox{}%
+    \fi
+    \global\advance\lst@newlines\m@ne
+    \lst@newlinetrue}
+\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue}
+\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init
+\def\lst@TrackNewLines{%
+    \ifnum\lst@newlines>\z@
+        \lsthk@OnNewLine
+        \lst@DoNewLines
+    \fi}
+\lst@AddToHook{OnNewLine}{}% init
+\lst@Key{emptylines}\maxdimen{%
+    \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}%
+            {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil
+    \advance\@tempcnta\@ne
+    \edef\lst@maxempty{\the\@tempcnta\relax}%
+    \let\lst@ifpreservenumber\lst@if}
+\def\lst@DoNewLines{
+    \@whilenum\lst@newlines>\lst@maxempty \do
+        {\lst@ifpreservenumber
+            \lsthk@OnEmptyLine
+            \global\advance\c@lstnumber\lst@advancelstnum
+         \fi
+         \global\advance\lst@newlines\m@ne}%
+    \@whilenum \lst@newlines>\@ne \do
+        {\lsthk@OnEmptyLine \lst@NewLine}%
+    \ifnum\lst@newlines>\z@ \lst@NewLine \fi}
+\lst@AddToHook{OnEmptyLine}{}% init
+\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty}
+\def\lst@GotoTabStop{%
+    \ifnum\lst@newlines=\z@
+        \setbox\@tempboxa\hbox{\lst@outputspace}%
+        \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}%
+        \lst@CalcLostSpaceAndOutput
+    \else
+        \global\advance\lst@lostspace \lst@length\lst@width
+        \global\advance\lst@column\lst@length \lst@length\z@
+    \fi}
+\def\lst@OutputOther{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \let\lst@thestyle\lst@currstyle
+        \lsthk@OutputOther
+        \lst@OutputToken
+    \fi}
+\lst@AddToHook{OutputOther}{}% init
+\let\lst@currstyle\relax % init
+\def\lst@Output{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \ifx\lst@currstyle\relax
+            \let\lst@thestyle\lst@identifierstyle
+        \else
+            \let\lst@thestyle\lst@currstyle
+        \fi
+        \lsthk@Output
+        \lst@OutputToken
+    \fi
+    \let\lst@lastother\relax}
+\lst@AddToHook{Output}{}% init
+\def\lst@GetOutputMacro#1{%
+    \lst@ifletter \global\let#1\lst@Output
+            \else \global\let#1\lst@OutputOther\fi}
+\def\lst@PrintToken{%
+    \lst@ifletter \lst@Output \lst@letterfalse
+            \else \lst@OutputOther \let\lst@lastother\@empty \fi}
+\def\lst@XPrintToken{%
+    \lst@PrintToken \lst@CheckMerge
+    \ifnum\lst@length=\z@\else \lst@PrintToken \fi}
+\def\lst@BeginDropOutput#1{%
+    \xdef\lst@BDOnewlines{\the\lst@newlines}%
+    \global\let\lst@BDOifnewline\lst@ifnewline
+    \lst@EnterMode{#1}%
+        {\lst@modetrue
+         \let\lst@OutputBox\@gobble
+         \aftergroup\lst@BDORestore}}
+\def\lst@BDORestore{%
+    \global\lst@newlines\lst@BDOnewlines
+    \global\let\lst@ifnewline\lst@BDOifnewline}
+\let\lst@EndDropOutput\lst@LeaveMode
+\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter}
+\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther}
+\def\lst@ProcessDigit{%
+    \lst@whitespacefalse
+    \lst@ifletter \expandafter\lst@AppendLetter
+            \else \expandafter\lst@AppendOther\fi}
+\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue}
+\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse}
+\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue}
+\lst@Key{tabsize}{8}
+    {\ifnum#1>\z@ \def\lst@tabsize{#1}\else
+         \PackageError{Listings}{Strict positive integer expected}%
+         {You can't use `#1' as tabsize. \@ehc}%
+     \fi}
+\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}%
+              \hrulefill\hbox{\vrule\@height.3ex}}
+    {\def\lst@tab{#1}}
+\def\lst@ProcessTabulator{%
+    \lst@XPrintToken \lst@whitespacetrue
+    \global\advance\lst@column -\lst@pos
+    \@whilenum \lst@pos<\@ne \do
+        {\global\advance\lst@pos\lst@tabsize}%
+    \lst@length\lst@pos
+    \lst@PreGotoTabStop}
+\def\lst@PreGotoTabStop{%
+    \lst@ifshowtabs
+        \lst@TrackNewLines
+        \setbox\@tempboxa\hbox to\lst@length\lst@width
+            {{\lst@currstyle{\hss\lst@tab}}}%
+        \lst@CalcLostSpaceAndOutput
+    \else
+        \lst@ifkeepspaces
+            \@tempcnta\lst@length \lst@length\z@
+            \@whilenum \@tempcnta>\z@ \do
+                {\lst@AppendOther\lst@outputspace
+                 \advance\@tempcnta\m@ne}%
+            \lst@OutputOther
+        \else
+            \lst@GotoTabStop
+        \fi
+    \fi
+    \lst@length\z@ \global\lst@pos\z@}
+\def\lst@outputspace{\ }
+\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace}
+\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces}
+\lst@AddToHook{Init}
+    {\lst@ifshowspaces
+         \let\lst@outputspace\lst@visiblespace
+         \lst@keepspacestrue
+     \fi}
+\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue}
+\def\lst@ProcessSpace{%
+    \lst@ifkeepspaces
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \else \ifnum\lst@newlines=\z@
+        \lst@AppendSpecialSpace
+    \else \ifnum\lst@length=\z@
+            \global\advance\lst@lostspace\lst@width
+            \global\advance\lst@pos\m@ne
+            \lst@whitespacetrue
+        \else
+            \lst@AppendSpecialSpace
+        \fi
+    \fi \fi}
+\def\lst@AppendSpecialSpace{%
+    \lst@ifwhitespace
+        \lst@PrintToken
+        \global\advance\lst@lostspace\lst@width
+        \global\advance\lst@pos\m@ne
+        \lst@gobbledwhitespacetrue
+    \else
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \fi}
+\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}}
+\def\lst@ProcessFormFeed{%
+    \lst@XPrintToken
+    \ifnum\lst@newlines=\z@
+        \lst@EOLUpdate \lsthk@InitVarsBOL
+    \fi
+    \lst@formfeed
+    \lst@whitespacetrue}
+\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}}
+\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}}
+\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }}
+\def\lst@SelectStdCharTable{%
+    \lst@Def{9}{\lst@ProcessTabulator}%
+    \lst@Def{12}{\lst@ProcessFormFeed}%
+    \lst@Def{32}{\lst@ProcessSpace}}
+\def\lst@CCPut#1#2{%
+    \ifnum#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}%
+    \fi
+    \lst@CCPut#1}
+\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}}
+\lst@CCPut \lst@ProcessOther
+    {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F}
+    {"3A}{"3B}{"3D}{"3F}{"5B}{"5D}
+    \z@
+\lst@CCPut \lst@ProcessDigit
+    {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39}
+    \z@
+\lst@CCPut \lst@ProcessLetter
+    {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47}
+    {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F}
+    {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57}
+    {"58}{"59}{"5A}
+         {"61}{"62}{"63}{"64}{"65}{"66}{"67}
+    {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F}
+    {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77}
+    {"78}{"79}{"7A}
+    \z@
+\def\lst@CCPutMacro#1#2#3{%
+    \ifnum#2=\z@ \else
+        \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax
+        \lowercase{\endgroup\expandafter\lst@CCPutMacro@
+            \csname\@lst @um/\expandafter\endcsname
+            \csname\@lst @um/@\endcsname /~}#1{#3}%
+        \expandafter\lst@CCPutMacro
+    \fi}
+\def\lst@CCPutMacro@#1#2#3#4#5#6{%
+    \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}%
+    \def#1{\lst@UM#3}%
+    \def#2{#6}}
+\def\lst@UM#1{\csname\@lst @um#1@\endcsname}
+\lst@CCPutMacro
+    \lst@ProcessOther {"23}\#
+    \lst@ProcessLetter{"24}\textdollar
+    \lst@ProcessOther {"25}\%
+    \lst@ProcessOther {"26}\&
+    \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle
+                                     \else \char39\relax \fi}
+    \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered}
+    \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}}
+    \lst@ProcessOther {"3C}{\lst@ttfamily<\textless}
+    \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater}
+    \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash}
+    \lst@ProcessOther {"5E}\textasciicircum
+    \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore}
+    \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave
+                                     \else \char96\relax \fi}
+    \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft}
+    \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar}
+    \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright}
+    \lst@ProcessOther {"7E}\textasciitilde
+    \lst@ProcessOther {"7F}-
+    \@empty\z@\@empty
+\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi}
+\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}}
+\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote
+    \lst@ifupquote
+       \@ifundefined{textasciigrave}%
+          {\let\KV@lst@upquote\@gobble
+           \lstKV@SetIf f\lst@ifupquote \@gobble\fi
+           \PackageError{Listings}{Option `upquote' requires `textcomp'
+            package.\MessageBreak The option has been disabled}%
+          {Add \string\usepackage{textcomp} to your preamble.}}%
+          {}%
+    \fi}
+\AtBeginDocument{%
+  \@ifpackageloaded{upquote}{\RequirePackage{textcomp}%
+                             \lstset{upquote}}{}%
+  \@ifpackageloaded{upquote2}{\lstset{upquote}}{}}
+\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue}
+\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse}
+\lst@activecharstrue
+\def\lst@SelectCharTable{%
+    \lst@SelectStdCharTable
+    \lst@ifactivechars
+        \catcode9\active \catcode12\active \catcode13\active
+        \@tempcnta=32\relax
+        \@whilenum\@tempcnta<128\do
+            {\catcode\@tempcnta\active\advance\@tempcnta\@ne}%
+    \fi
+    \lst@ifec \lst@DefEC \fi
+    \let\do\lst@do@noligs \verbatim@nolig@list
+    \lsthk@SelectCharTable
+    \lst@DeveloperSCT
+\lst@DefRange
+    \ifx\lst@Backslash\relax\else
+        \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash
+    \fi}
+\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}}
+\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}}
+\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty}
+\def\lst@do@noligs#1{%
+    \begingroup \lccode`\~=`#1\lowercase{\endgroup
+    \lst@do@noligs@~}}
+\def\lst@do@noligs@#1{%
+    \expandafter\expandafter\expandafter\def
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}}
+\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig}
+\def\lst@nolig{\lst@UM\@empty}%
+\@namedef{\@lst @um@}{\leavevmode\kern\z@}
+\def\lst@SaveOutputDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup
+    \def\lst@temp##1\def~##2##3\relax}{%
+        \global\expandafter\let\expandafter#2\@gobble##2\relax}%
+    \expandafter\lst@temp\lst@SelectStdCharTable\relax}
+\lst@SaveOutputDef{"5C}\lstum@backslash
+\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec}
+\def\lst@DefEC{%
+    \lst@CCECUse \lst@ProcessLetter
+      ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
+      ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
+      ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
+      ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
+      ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
+      ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
+      ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
+      ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
+      ^^00}
+\def\lst@CCECUse#1#2{%
+    \ifnum`#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \ifnum\catcode`#2=\active
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}%
+        \else
+            \lst@ifactivechars \catcode`#2=\active \fi
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}%
+        \fi
+    \fi
+    \lst@CCECUse#1}
+\def\lst@CCECUse@#1#2#3{%
+    \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}%
+    \expandafter\let\csname\@lst @um#3@\endcsname #2%
+    \edef#2{\noexpand#1%
+            \expandafter\noexpand\csname\@lst @EC#3\endcsname}}
+\lst@AddToHook{Init}
+    {\let\lsts@nfss@catcodes\nfss@catcodes
+     \let\nfss@catcodes\lst@nfss@catcodes}
+\def\lst@nfss@catcodes{%
+    \lst@makeletter
+        ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax
+    \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&%
+    \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4%
+    \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9%
+    \@makeother =\lsts@nfss@catcodes}
+\def\lst@makeletter#1{%
+    \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi}
+\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase0#1 0\or 1\else 2\fi}}
+\lst@AddToHook{Init}
+{\edef\lst@OrgOutput{\the\output}%
+\ifcase\lst@useoutput\relax
+\or
+ \output{\global\setbox\lst@gtempboxa\box\@cclv
+         \expandafter\egroup
+         \lst@SaveToken
+     \lst@InterruptModes
+     \setbox\@cclv\box\lst@gtempboxa
+     \bgroup\lst@OrgOutput\egroup
+     \bgroup
+     \aftergroup\pagegoal\aftergroup\vsize
+     \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}%
+\else
+ \output{\lst@RestoreOrigCatcodes
+         \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi
+         \lst@OrgOutput}%
+\fi}
+\def\lst@GetChars#1#2#3{%
+    \let#1\@empty
+    \@tempcnta#2\relax \@tempcntb#3\relax
+    \loop \ifnum\@tempcnta<\@tempcntb\relax
+        \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}%
+        \lst@lExtend#1{\the\catcode\@tempcnta\relax}%
+        \ifnum\the\catcode\@tempcnta=\active
+            \begingroup\lccode`\~=\@tempcnta
+            \lowercase{\endgroup
+            \lst@lExtend#1{\expandafter\let\expandafter~\csname
+                                    lstecs@\the\@tempcnta\endcsname}%
+            \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}%
+        \fi
+        \advance\@tempcnta\@ne
+    \repeat}
+\begingroup \catcode12=\active\let^^L\@empty
+\gdef\lst@ScanChars{%
+  \let\lsts@ssL^^L%
+  \def^^L{\par}%
+    \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}%
+  \let^^L\lsts@ssL
+    \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}}
+\endgroup
+\lst@Key{rescanchars}\relax{\lst@ScanChars}
+\AtBeginDocument{\lst@ScanChars}
+\lst@Key{alsoletter}\relax{%
+    \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter}
+\lst@Key{alsodigit}\relax{%
+    \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit}
+\lst@Key{alsoother}\relax{%
+    \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther}
+\lst@AddToHook{SelectCharTable}
+    {\lst@alsoother \lst@alsodigit \lst@alsoletter}
+\lst@AddToHookExe{SetLanguage}% init
+    {\let\lst@alsoletter\@empty
+     \let\lst@alsodigit\@empty
+     \let\lst@alsoother\@empty}
+\def\lst@DoAlso#1#2#3{%
+    \lst@DefOther\lst@arg{#1}\let#2\@empty
+    \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax}
+\def\lst@DoAlso@#1#2#3{%
+    \ifx\relax#3\expandafter\@gobblethree \else
+        \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup
+        \def\lst@temp##1\def~##2##3\relax{%
+            \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter
+                                         \noexpand\@gobble##2}}}}%
+        \expandafter\lst@temp\lst@SelectStdCharTable\relax
+        \lst@lExtend#1{\lst@arg}%
+    \fi
+    \lst@DoAlso@#1#2}
+\def\lst@SaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}}
+\def\lst@DefSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}}
+\def\lst@LetSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}}
+\def\lst@CDef#1{\lst@CDef@#1}
+\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4}
+\def\lst@CDefX#1{\lst@CDefX@#1}
+\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}}
+\def\lst@CDefIt#1#2#3#4#5#6#7#8{%
+    \ifx\@empty#2\@empty
+        \def#1{#6\def\lst@next{#7#4#8}\lst@next}%
+    \else \ifx\@empty#3\@empty
+        \def#1##1{%
+            #6%
+            \ifx##1#2\def\lst@next{#7#4#8}\else
+                     \def\lst@next{#5##1}\fi
+            \lst@next}%
+    \else
+        \def#1{%
+            #6%
+            \lst@IfNextCharsArg{#2#3}{#7#4#8}%
+                                     {\expandafter#5\lst@eaten}}%
+    \fi \fi}
+\def\lst@CArgX#1#2\relax{%
+    \lst@DefActive\lst@arg{#1#2}%
+    \expandafter\lst@CArg\lst@arg\relax}
+\def\lst@CArg#1#2\relax{%
+    \lccode`\/=`#1\lowercase{\def\lst@temp{/}}%
+    \lst@GetFreeMacro{lst@c\lst@temp}%
+    \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax}
+\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{%
+    \let#1#2%
+    \ifx\@empty#3\@empty
+        \def\lst@next{#6{#2{}{}}}%
+    \else
+        \def\lst@next{#6{#2#3{#4}}}%
+    \fi
+    \lst@next #1}
+\def\lst@CArgEmpty#1\@empty{#1}
+\lst@Key{excludedelims}\relax
+    {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}%
+     \expandafter\lst@for\lst@temp\do
+     {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}}
+\def\lst@DelimPrint#1#2{%
+    #1%
+      \begingroup
+        \lst@mode\lst@nomode \lst@modetrue
+        #2\lst@XPrintToken
+      \endgroup
+      \lst@ResetToken
+    \fi}
+\def\lst@DelimOpen#1#2#3#4#5#6\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint#1{#6}%
+    \lst@EnterMode{#4}{\def\lst@currstyle#5}%
+    \lst@DelimPrint{#1#2}{#6}%
+    #3}
+\def\lst@DelimClose#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint{#1#2}{#3}%
+    \lst@LeaveMode
+    \lst@DelimPrint{#1}{#3}}
+\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}}
+\def\lst@EndDelim{\lst@DelimClose\iffalse\else}
+\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}}
+\def\lst@EndIDelim{\lst@DelimClose\iffalse{}}
+\lst@AddToHook{SelectCharTable}{\lst@DefDelims}
+\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty}
+\def\lst@Delim#1{%
+    \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty
+    \@ifstar{\@ifstar{\lst@Delim@{#1}}%
+                     {\let\lst@cumulative\relax
+                      \lst@Delim@{#1}}}%
+            {\lst@true\lst@Delim@{#1}}}
+\def\lst@Delim@#1[#2]{%
+    \gdef\lst@delimtype{#2}%
+    \@ifnextchar[\lst@Delim@sty
+                 {\lst@Delim@sty[#1]}}
+\def\lst@Delim@sty[#1]{%
+    \def\lst@delimstyle{#1}%
+    \ifx\@empty#1\@empty\else
+        \lst@Delim@sty@ #1\@nil
+    \fi
+    \@ifnextchar[\lst@Delim@option
+                 \lst@Delim@delim}
+\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim}
+\def\lst@Delim@sty@#1#2\@nil{%
+    \if\relax\noexpand#1\else
+        \edef\lst@delimstyle{\expandafter\noexpand
+                             \csname\@lst @\lst@delimstyle\endcsname}%
+    \fi}
+\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{%
+    \ifx #4\@empty \lst@Delim@delall{#2}\fi
+    \ifx\@empty#1\@empty
+        \ifx #4\@nil
+            \@ifundefined{\@lst @#2DM@\lst@delimtype}%
+                {\lst@Delim@delall{#2@\lst@delimtype}}%
+                {\lst@Delim@delall{#2DM@\lst@delimtype}}%
+        \fi
+    \else
+        \expandafter\lst@Delim@args\expandafter
+            {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4%
+        \let\lst@delim\@empty
+        \expandafter\lst@IfOneOf\lst@delimtype\relax#3%
+        {\@ifundefined{\@lst @#2DM@\lst@delimtype}%
+             {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+             {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode
+                                     \csname\@lst @#2DM@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+         \ifx #4\@nil
+             \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty
+             \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil
+         \else
+             \lst@lExtend\lst@DefDelims\lst@delim
+         \fi}%
+        {\PackageError{Listings}{Illegal type `\lst@delimtype'}%
+                                {#2 types are #3.}}%
+     \fi}
+\def\lst@Delim@args#1#2#3#4#5#6#7{%
+    \begingroup
+    \lst@false \let\lst@next\lst@XConvert
+    \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble
+                                        \lst@delimtype}%
+                    #5\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#6}%
+                    \lst@GobbleNil}%
+                   {\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#3}%
+                    \lst@GobbleNil}%
+                 #1\@nil
+    \global\let\@gtempa\lst@arg
+    \endgroup
+    \let\lst@arg\@gtempa
+    \ifx #7\@nil\else
+        \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}%
+    \fi}
+\def\lst@Delim@args@#1{%
+    \lst@if
+        \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}%
+    \else
+        \ifx\lst@cumulative\@empty
+            \lst@lAddTo\lst@arg{{{}#1}}%
+        \else
+            \lst@lAddTo\lst@arg{{{#1}}}%
+        \fi
+    \fi}
+\def\lst@Delim@del#1\@empty#2#3#4{%
+    \ifx #2\@nil\else
+        \def\lst@temp{#1\@empty#2#3}%
+        \ifx\lst@temp\lst@delim\else
+            \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}%
+        \fi
+        \expandafter\lst@Delim@del
+    \fi}
+\def\lst@Delim@delall#1{%
+    \begingroup
+    \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}%
+    \lst@false \global\let\@gtempa\@empty
+    \expandafter\lst@Delim@delall@\lst@DefDelims\@empty
+    \endgroup
+    \let\lst@DefDelims\@gtempa}
+\def\lst@Delim@delall@#1{%
+    \ifx #1\@empty\else
+        \ifx #1\lst@UseDynamicMode
+            \lst@true
+            \let\lst@next\lst@Delim@delall@do
+        \else
+            \def\lst@next{\lst@Delim@delall@do#1}%
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@Delim@delall@do#1#2\@empty#3#4#5{%
+    \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}%
+      {}%
+      {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi
+       \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}%
+    \lst@false \lst@Delim@delall@}
+\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \lst@ifmode #4\else
+             #5%
+             \def\lst@bnext{#6{#7}{#8}}%
+         \fi
+         \lst@bnext}%
+        \@empty}
+\gdef\lst@DefDelimE#1#2#3#4#5#6#7{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@enext\lst@CArgEmpty
+         \ifnum #7=\lst@mode%
+             #4%
+             \let\lst@enext#6%
+         \else
+             #5%
+         \fi
+         \lst@enext}%
+        \@empty}
+\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax}
+\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \ifnum #7=\lst@mode
+             #4%
+             \let\lst@bnext#9%
+         \else
+             \lst@ifmode\else
+                 #5%
+                 \def\lst@bnext{#6{#7}{#8}}%
+             \fi
+         \fi
+         \lst@bnext}%
+        \@empty}
+\gdef\lst@delimtypes{s,l}
+\gdef\lst@DelimKey#1#2{%
+    \lst@Delim{}#2\relax
+        {Delim}\lst@delimtypes #1%
+                {\lst@BeginDelim\lst@EndDelim}
+        i\@empty{\lst@BeginIDelim\lst@EndIDelim}}
+\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}}
+\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}}
+\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}
+\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}}
+\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if
+                             \def\lst@literate{#1}}
+\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey}
+                             {\lst@false\lst@Literatekey}#1\@nil@}
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@literate\@empty\else
+         \expandafter\lst@Literate\lst@literate{}\relax\z@
+     \fi}
+\def\lst@Literate#1#2#3{%
+    \ifx\relax#2\@empty\else
+        \lst@CArgX #1\relax\lst@CDef
+            {}
+            {\let\lst@next\@empty
+             \lst@ifxliterate
+                \lst@ifmode \let\lst@next\lst@CArgEmpty \fi
+             \fi
+             \ifx\lst@next\@empty
+                 \ifx\lst@OutputBox\@gobble\else
+                   \lst@XPrintToken \let\lst@scanmode\lst@scan@m
+                   \lst@token{#2}\lst@length#3\relax
+                   \lst@XPrintToken
+                 \fi
+                 \let\lst@next\lst@CArgEmptyGobble
+             \fi
+             \lst@next}%
+            \@empty
+        \expandafter\lst@Literate
+    \fi}
+\def\lst@CArgEmptyGobble#1\@empty{}
+\def\lst@BeginDropInput#1{%
+    \lst@EnterMode{#1}%
+    {\lst@modetrue
+     \let\lst@OutputBox\@gobble
+     \let\lst@ifdropinput\iftrue
+     \let\lst@ProcessLetter\@gobble
+     \let\lst@ProcessDigit\@gobble
+     \let\lst@ProcessOther\@gobble
+     \let\lst@ProcessSpace\@empty
+     \let\lst@ProcessTabulator\@empty
+     \let\lst@ProcessFormFeed\@empty}}
+\let\lst@ifdropinput\iffalse % init
+\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}}
+\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}}
+\lst@AddToHook{Init}
+    {\lst@basicstyle
+     \ifx\lst@inputenc\@empty\else
+         \@ifundefined{inputencoding}{}%
+            {\inputencoding\lst@inputenc}%
+     \fi}
+\lst@AddToHookExe{EmptyStyle}
+    {\let\lst@basicstyle\@empty
+     \let\lst@inputenc\@empty}
+\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}
+\def\lst@parshape{\parshape\@ne \z@ \linewidth}
+\lst@AddToHookAtTop{EveryLine}{\lst@parshape}
+\lst@AddToHookAtTop{EndGroup}{\lst@parshape}
+\newcount\lst@lineno % \global
+\lst@AddToHook{InitVars}{\global\lst@lineno\@ne}
+\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint}
+\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}}
+\lst@AddToHook{PreSet}
+    {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}}
+\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{%
+    \def\lst@interrange{##1}\def\lst@linerange{##2,}}}
+\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}%
+                            \def\lst@rangeendprefix{#1}}
+\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}%
+                            \def\lst@rangeendsuffix{#1}}
+\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}}
+\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}}
+\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}}
+\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}}
+\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker}
+\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}%
+                       \let\lst@linerange\@empty}
+\lst@AddToHook{Init}
+{\ifx\lst@linerange\@empty
+     \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}%
+ \fi
+ \lst@GetLineInterval}%
+\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil}
+\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil}
+\def\lst@GLI@#1-#2-#3\@nil{%
+    \lst@IfNumber{#1}%
+    {\ifx\@empty#1\@empty
+         \let\lst@firstline\@ne
+     \else
+         \def\lst@firstline{#1\relax}%
+     \fi
+     \ifx\@empty#3\@empty
+         \def\lst@lastline{9999999\relax}%
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@lastline\lst@firstline
+         \else
+             \def\lst@lastline{#2\relax}%
+         \fi
+     \fi}%
+    {\def\lst@firstline{9999999\relax}%
+     \let\lst@lastline\lst@firstline
+     \let\lst@rangebegin\lst@rangebeginprefix
+     \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix
+     \ifx\@empty#3\@empty
+         \let\lst@rangeend\lst@rangeendprefix
+         \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@rangeend\@empty
+         \else
+             \let\lst@rangeend\lst@rangeendprefix
+             \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+         \fi
+     \fi
+     \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}%
+     \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}}
+\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty}
+\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}
+\def\lst@DefRangeB@#1#2#3#4{%
+    \lst@CDef{#1{#2}{#3}}#4{}%
+    {\lst@ifincluderangemarker
+         \lst@LeaveMode
+         \let#1#4%
+         \lst@DefRangeEnd
+         \lst@InitLstNumber
+     \else
+         \@tempcnta\lst@lineno \advance\@tempcnta\@ne
+         \edef\lst@firstline{\the\@tempcnta\relax}%
+         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%
+         \lst@InitLstNumber
+     \fi
+ \global\let\lst@DefRange\lst@DefRangeEnd
+     \lst@CArgEmpty}%
+    \@empty}
+\def\lstpatch@labels{%
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \else
+            \lst@nololtrue
+            \advance\@tempcnta\lst@advancenumber
+            \edef\lst@firstnumber{\the\@tempcnta\relax}%
+        \fi
+    \fi}%
+}
+\def\lst@InitLstNumber{%
+     \global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum
+     \ifx \lst@firstnumber\c@lstnumber
+         \global\advance\c@lstnumber-\lst@advancelstnum
+     \fi%
+     \lst@ifincluderangemarker\else%
+         \global\advance\c@lstnumber by 1%
+     \fi%
+     }
+\def\lst@DefRangeEnd{%
+    \ifx\lst@rangeend\@empty\else
+        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE
+    \fi}
+\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}
+\def\lst@DefRangeE@#1#2#3#4{%
+    \lst@CDef{#1#2{#3}}#4{}%
+    {\let#1#4%
+     \edef\lst@lastline{\the\lst@lineno\relax}%
+     \lst@DefRangeE@@}%
+    \@empty}
+\def\lst@DefRangeE@@#1\@empty{%
+    \lst@ifincluderangemarker
+        #1\lst@XPrintToken
+    \fi
+    \lst@LeaveModeToPmode
+    \lst@BeginDropInput{\lst@Pmode}}
+\def\lst@LeaveModeToPmode{%
+    \ifnum\lst@mode=\lst@Pmode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveModeToPmode
+    \fi}
+\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}
+\gdef\lst@OnceAtEOL{}% Init
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@
+        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty
+        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.
+        \lsthk@InitVarsBOL
+        \lst@BOLGobble}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \def\lst@next{\lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst}%
+        \expandafter\lst@next
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lst@IfNumber#1{%
+    \ifx\@empty#1\@empty
+        \let\lst@next\@firstoftwo
+    \else
+        \lst@IfNumber@#1\@nil
+    \fi
+    \lst@next}
+\def\lst@IfNumber@#1#2\@nil{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1>47\relax \ifnum`#1>57\relax\else
+        \let\lst@next\@firstoftwo
+    \fi\fi}
+\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol}
+\def\lst@nololtrue{\let\lst@ifnolol\iftrue}
+\let\lst@ifnolol\iffalse % init
+\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}}
+\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}}
+\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}}
+\lst@Key{label}\relax{\def\lst@label{#1}}
+\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax}
+\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}%
+    {\def\lst@caption{##2}\def\lst@@caption{##1}}%
+     \let\lst@title\@empty}
+\lst@AddToHookExe{TextStyle}
+    {\let\lst@caption\@empty \let\lst@@caption\@empty
+     \let\lst@title\@empty \let\lst@label\@empty}
+\AtBeginDocument{
+  \@ifundefined{thechapter}{\let\lst@ifnumberbychapter\iffalse}{}
+  \lst@ifnumberbychapter
+      \newcounter{lstlisting}[chapter]
+      \gdef\thelstlisting%
+           {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}
+  \else
+      \newcounter{lstlisting}
+      \gdef\thelstlisting{\@arabic\c@lstlisting}
+  \fi}
+\lst@UserCommand\lstlistingname{Listing}
+\lst@Key{numberbychapter}{true}[t]{\lstKV@SetIf{#1}\lst@ifnumberbychapter}
+\@ifundefined{abovecaptionskip}
+{\newskip\abovecaptionskip
+ \newskip\belowcaptionskip}{}
+\@ifundefined{@makecaption}
+{\long\def\@makecaption#1#2{%
+   \vskip\abovecaptionskip
+   \sbox\@tempboxa{#1: #2}%
+   \ifdim \wd\@tempboxa >\hsize
+     #1: #2\par
+   \else
+     \global \@minipagefalse
+     \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+   \fi
+   \vskip\belowcaptionskip}%
+}{}
+\def\fnum@lstlisting{%
+  \lstlistingname
+  \ifx\lst@@caption\@empty\else~\thelstlisting\fi}%
+\def\lst@MakeCaption#1{%
+  \lst@ifdisplaystyle
+    \ifx #1t%
+        \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else
+                                \expandafter\refstepcounter
+        \fi {lstlisting}%
+        \ifx\lst@label\@empty\else \label{\lst@label}\fi
+        \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+        \global\let\lst@name\lst@arg \global\let\lstname\lst@name
+        \lst@ifnolol\else
+            \ifx\lst@@caption\@empty
+                \ifx\lst@caption\@empty
+                    \ifx\lst@intname\@empty \else \def\lst@temp{ }%
+                    \ifx\lst@intname\lst@temp \else
+                        \addcontentsline{lol}{lstlisting}\lst@name
+                    \fi\fi
+                \fi
+            \else
+                \addcontentsline{lol}{lstlisting}%
+                    {\protect\numberline{\thelstlisting}\lst@@caption}%
+            \fi
+         \fi
+     \fi
+    \ifx\lst@caption\@empty\else
+        \lst@IfSubstring #1\lst@captionpos
+            {\begingroup \let\@@vskip\vskip
+             \def\vskip{\afterassignment\lst@vskip \@tempskipa}%
+             \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}%
+             \par\@parboxrestore\normalsize\normalfont % \noindent (AS)
+             \ifx #1t\allowbreak \fi
+             \ifx\lst@title\@empty
+                 \lst@makecaption\fnum@lstlisting{\ignorespaces \lst@caption}
+             \else
+                 \lst@maketitle\lst@title % (AS)
+             \fi
+             \ifx #1b\allowbreak \fi
+             \endgroup}{}%
+    \fi
+  \fi}
+\def\lst@makecaption{\@makecaption}
+\def\lst@maketitle{\@makecaption\lst@title@dropdelim}
+\def\lst@title@dropdelim#1{\ignorespaces}
+\AtBeginDocument{%
+\@ifundefined{captionlabelfalse}{}{%
+  \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}%
+\@ifundefined{caption@startrue}{}{%
+  \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}%
+}
+\def\lst@HRefStepCounter#1{%
+    \begingroup
+    \c@lstlisting\lst@neglisting
+    \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}%
+    \ifx\hyper@refstepcounter\@undefined\else
+        \hyper@refstepcounter{#1}%
+    \fi
+    \endgroup}
+\gdef\lst@neglisting{\z@}% init
+\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}}
+\def\lst@boxtrue{\let\lst@ifbox\iftrue}
+\let\lst@ifbox\iffalse
+\lst@Key{float}\relax[\lst@floatplacement]{%
+    \lstKV@SwitchCases{#1}%
+    {true&\let\lst@floatdefault\lst@floatplacement
+          \let\lst@float\lst@floatdefault\\%
+     false&\let\lst@floatdefault\relax
+           \let\lst@float\lst@floatdefault
+    }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat
+                             \let\lst@endfloat\end@dblfloat
+                             \lst@KFloat}%
+                            {\let\lst@beginfloat\@float
+                             \let\lst@endfloat\end@float
+                             \lst@KFloat}}
+      \edef\lst@float{#1}%
+      \expandafter\lst@next\lst@float\relax}}
+\def\lst@KFloat#1\relax{%
+    \ifx\@empty#1\@empty
+        \let\lst@float\lst@floatplacement
+    \else
+        \def\lst@float{#1}%
+    \fi}
+\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}}
+\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault}
+\lst@AddToHook{TextStyle}{\let\lst@float\relax}
+\let\lst@floatdefault\relax % init
+\lst@AddToHook{DeInit}{%
+    \ifx\lst@float\relax
+        \global\let\lst@doendpe\@doendpe
+    \else
+        \global\let\lst@doendpe\@empty
+    \fi}
+\AtBeginDocument{%
+\@ifundefined{c@float@type}%
+    {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}}
+    {\edef\ftype@lstlisting{\the\c@float@type}%
+     \addtocounter{float@type}{\value{float@type}}}%
+}
+\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}}
+\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}}
+\lst@AddToHook{TextStyle}
+    {\let\lst@aboveskip\z@ \let\lst@belowskip\z@}
+\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}}
+\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse}
+\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue}
+\let\lst@ifdisplaystyle\iffalse
+\def\lst@Init#1{%
+    \begingroup
+    \ifx\lst@float\relax\else
+        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
+        \expandafter\@tempa
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
+        \expandafter\lst@next
+    \fi
+    \ifhmode\ifinner \lst@boxtrue \fi\fi
+    \lst@ifbox
+        \lsthk@BoxUnsafe
+        \hbox to\z@\bgroup
+             $\if t\lst@boxpos \vtop
+        \else \if b\lst@boxpos \vbox
+        \else \vcenter \fi\fi
+        \bgroup \par\noindent
+    \else
+        \lst@ifdisplaystyle
+            \lst@EveryDisplay
+            \par\penalty-50\relax
+            \vspace\lst@aboveskip
+        \fi
+    \fi
+    \normalbaselines
+    \abovecaptionskip\lst@abovecaption\relax
+    \belowcaptionskip\lst@belowcaption\relax
+    \lst@MakeCaption t%
+    \lsthk@PreInit \lsthk@Init
+    \lst@ifdisplaystyle
+        \global\let\lst@ltxlabel\@empty
+        \if@inlabel
+            \lst@ifresetmargins
+                \leavevmode
+            \else
+                \xdef\lst@ltxlabel{\the\everypar}%
+                \lst@AddTo\lst@ltxlabel{%
+                    \global\let\lst@ltxlabel\@empty
+                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%
+            \fi
+        \fi
+        \everypar\expandafter{\lst@ltxlabel
+                              \lsthk@EveryLine\lsthk@EveryPar}%
+    \else
+        \everypar{}\let\lst@NewLine\@empty
+    \fi
+    \lsthk@InitVars \lsthk@InitVarsBOL
+    \lst@Let{13}\lst@MProcessListing
+    \let\lst@Backslash#1%
+    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
+    \lst@InitFinalize}
+\let\lst@InitFinalize\@empty % init
+\lst@AddToHook{PreInit}
+    {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil
+     \let\par\@@par}
+\lst@AddToHook{EveryLine}{}% init
+\lst@AddToHook{EveryPar}{}% init
+\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines}
+\def\lst@DeInit{%
+    \lst@XPrintToken \lst@EOLUpdate
+    \global\advance\lst@newlines\m@ne
+    \lst@ifshowlines
+        \lst@DoNewLines
+    \else
+        \setbox\@tempboxa\vbox{\lst@DoNewLines}%
+    \fi
+    \lst@ifdisplaystyle \par\removelastskip \fi
+    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor
+    \lst@MakeCaption b%
+    \lst@ifbox
+        \egroup $\hss \egroup
+        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
+    \else
+        \lst@ifdisplaystyle
+            \par\penalty-50\vspace\lst@belowskip
+        \fi
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \def\lst@next{\global\let\@checkend\@gobble
+                      \endmulticols
+                      \global\let\@checkend\lst@@checkend}
+        \expandafter\lst@next
+    \fi
+    \ifx\lst@float\relax\else
+        \expandafter\lst@endfloat
+    \fi
+    \endgroup}
+\let\lst@@checkend\@checkend
+\newdimen\lst@maxwidth % \global
+\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@}
+\lst@AddToHook{InitVarsEOL}
+    {\ifdim\lst@currlwidth>\lst@maxwidth
+         \global\lst@maxwidth\lst@currlwidth
+     \fi}
+\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL}
+\def\lst@MProcessListing{%
+    \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno>\lst@lastline
+        \lst@ifdropinput \lst@LeaveMode \fi
+        \ifx\lst@linerange\@empty
+            \expandafter\expandafter\expandafter\lst@EndProcessListing
+        \else
+            \lst@interrange
+            \lst@GetLineInterval
+            \expandafter\expandafter\expandafter\lst@SkipToFirst
+        \fi
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\let\lst@EndProcessListing\endinput
+\lst@Key{gobble}{0}{\def\lst@gobble{#1}}
+\def\lst@BOLGobble{%
+    \ifnum\lst@gobble>\z@
+        \@tempcnta\lst@gobble\relax
+        \expandafter\lst@BOLGobble@
+\fi}
+\def\lst@BOLGobble@@{%
+    \ifnum\@tempcnta>\z@
+        \expandafter\lst@BOLGobble@
+    \fi}
+\def\lstenv@BOLGobble@@{%
+    \lst@IfNextChars\lstenv@endstring{\lstenv@End}%
+    {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}}
+\def\lst@BOLGobble@#1{%
+    \let\lst@next#1%
+    \ifx \lst@next\relax\else
+    \ifx \lst@next\lst@MProcessListing\else
+    \ifx \lst@next\lst@processformfeed\else
+    \ifx \lst@next\lstenv@backslash
+        \let\lst@next\lstenv@BOLGobble@@
+    \else
+        \let\lst@next\lst@BOLGobble@@
+        \ifx #1\lst@processtabulator
+            \advance\@tempcnta-\lst@tabsize\relax
+            \ifnum\@tempcnta<\z@
+                \lst@length-\@tempcnta \lst@PreGotoTabStop
+            \fi
+        \else
+            \advance\@tempcnta\m@ne
+        \fi
+    \fi \fi \fi \fi
+    \lst@next}
+\def\lst@processformfeed{\lst@ProcessFormFeed}
+\def\lst@processtabulator{\lst@ProcessTabulator}
+\lst@Key{name}\relax{\def\lst@intname{#1}}
+\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty}
+\lst@AddToHook{PreInit}{%
+    \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+    \global\let\lst@name\lst@arg \global\let\lstname\lst@name}
+\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash}
+\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}}
+\lst@UserCommand\lstlistlistingname{Listings}
+\lst@UserCommand\lstlistoflistings{\bgroup
+    \let\contentsname\lstlistlistingname
+    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
+    \tableofcontents \egroup}
+\@ifundefined{float@listhead}{}{%
+  \renewcommand*{\lstlistoflistings}{%
+    \begingroup
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@twocolumn
+          \@restonecoltrue\onecolumn
+        \else
+          \@restonecolfalse
+        \fi
+      }%
+      \float@listhead{\lstlistlistingname}%
+      \parskip\z@\parindent\z@\parfillskip \z@ \@plus 1fil%
+      \@starttoc{lol}%
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@restonecol\twocolumn\fi
+      }%
+    \endgroup
+  }%
+}
+\AtBeginDocument{%
+  \@ifundefined{float@addtolists}%
+    {\gdef\float@addtolists#1{\addtocontents{lol}{#1}}}%
+    {\let\orig@float@addtolists\float@addtolists
+     \gdef\float@addtolists#1{%
+       \addtocontents{lol}{#1}%
+       \orig@float@addtolists{#1}}}%
+}%
+\newcommand\lstinline[1][]{%
+    \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+      \def\lst@boxpos{b}%
+      \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+      \lsthk@TextStyle
+      \@ifnextchar\bgroup{%
+        \afterassignment\lst@InlineG \let\@let@token}%
+                         \lstinline@}
+\def\lstinline@#1{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
+\lst@AddToHook{TextStyle}{}% init
+\lst@AddToHook{SelectCharTable}{\lst@inlinechars}
+\global\let\lst@inlinechars\@empty
+\def\lst@InlineM#1{\gdef\lst@inlinechars{%
+    \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}%
+    \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty
+        \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
+    \lst@inlinechars}
+\def\lst@InlineJ#1{%
+    \def\lst@temp##1#1{%
+        \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
+        \lst@DeInit\egroup}%
+    \lst@temp}
+\def\lst@InlineG{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM\}}%
+                         {\let\lst@arg\@empty \lst@InlineGJ}}
+\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest}
+\def\lst@InlineGJTest{%
+    \ifx\@let@token\egroup
+        \afterassignment\lst@InlineGJEnd
+        \expandafter\let\expandafter\@let@token
+    \else
+        \ifx\@let@token\@sptoken
+            \let\lst@next\lst@InlineGJReadSp
+        \else
+            \let\lst@next\lst@InlineGJRead
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup}
+\def\lst@InlineGJRead#1{%
+    \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ}
+\def\lst@InlineGJReadSp#1{%
+    \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ#1}
+\newcommand\lstMakeShortInline[1][]{%
+  \def\lst@shortinlinedef{\lstinline[#1]}%
+  \lstMakeShortInline@}%
+\def\lstMakeShortInline@#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \lst@shortlstinlineinfo{Made }{#1}%
+    \lst@add@special{#1}%
+    \expandafter
+    \xdef\csname lst@ShortInlineOldCatcode\string#1\endcsname{\the\catcode`#1}%
+    \begingroup
+      \catcode`\~\active  \lccode`\~`#1%
+      \lowercase{%
+        \global\expandafter\let
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname~%
+          \expandafter\gdef\expandafter~\expandafter{\lst@shortinlinedef#1}}%
+    \endgroup
+    \global\catcode`#1\active
+  \else
+    \PackageError{Listings}%
+    {\string\lstMakeShorterInline\ definitions cannot be nested}%
+    {Use \string\lstDeleteShortInline first.}%
+    {}%
+  \fi}
+\def\lstDeleteShortInline#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \PackageError{Listings}%
+    {#1 is not a short reference for \string\lstinline}%
+    {Use \string\lstMakeShortInline first.}%
+    {}%
+  \else
+    \lst@shortlstinlineinfo{Deleted }{#1 as}%
+    \lst@rem@special{#1}%
+    \global\catcode`#1\csname lst@ShortInlineOldCatcode\string#1\endcsname
+    \global \expandafter\let%
+      \csname lst@ShortInlineOldCatcode\string#1\endcsname \relax
+    \ifnum\catcode`#1=\active
+      \begingroup
+        \catcode`\~\active  \lccode`\~`#1%
+        \lowercase{%
+          \global\expandafter\let\expandafter~%
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname}%
+      \endgroup
+    \fi
+  \fi}
+\def\lst@shortlstinlineinfo#1#2{%
+     \PackageInfo{Listings}{%
+       #1\string#2 a short reference for \string\lstinline}}
+\def\lst@add@special#1{%
+  \lst@rem@special{#1}%
+  \expandafter\gdef\expandafter\dospecials\expandafter
+    {\dospecials \do #1}%
+  \expandafter\gdef\expandafter\@sanitize\expandafter
+    {\@sanitize \@makeother #1}}
+\def\lst@rem@special#1{%
+  \def\do##1{%
+    \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+  \xdef\dospecials{\dospecials}%
+  \begingroup
+    \def\@makeother##1{%
+      \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+    \xdef\@sanitize{\@sanitize}%
+  \endgroup}
+\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi}
+\def\lst@MakePath@#1/{#1/\lst@MakePath@@}
+\def\lst@MakePath@@#1/{%
+    \ifx\@nil#1\expandafter\@gobble
+         \else \ifx\@empty#1\else #1/\fi \fi
+    \lst@MakePath@@}
+\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}}
+\def\lstinputlisting{%
+    \begingroup \lst@setcatcodes \lst@inputlisting}
+\newcommand\lst@inputlisting[2][]{%
+    \endgroup
+    \def\lst@set{#1}%
+    \IfFileExists{\lst@inputpath#2}%
+        {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}%
+        {\filename@parse{\lst@inputpath#2}%
+         \edef\reserved@a{\noexpand\lst@MissingFileError
+             {\filename@area\filename@base}%
+             {\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+         \reserved@a}%
+    \lst@doendpe \@newlistfalse \ignorespaces}
+\def\lst@MissingFileError#1#2{%
+    \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J%
+        ^^JType X to quit or <RETURN> to proceed,^^J%
+        or enter new name. (Default extension: #2)^^J}%
+    \message{Enter file name: }%
+    {\endlinechar\m@ne \global\read\m@ne to\@gtempa}%
+    \ifx\@gtempa\@empty \else
+        \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \filename@parse\@gtempa
+        \edef\filename@ext{%
+            \ifx\filename@ext\relax#2\else\filename@ext\fi}%
+        \edef\reserved@a{\noexpand\IfFileExists %
+                {\filename@area\filename@base.\filename@ext}%
+            {\noexpand\lst@InputListing %
+                {\filename@area\filename@base.\filename@ext}}%
+            {\noexpand\lst@MissingFileError
+                {\filename@area\filename@base}{\filename@ext}}}%
+        \expandafter\reserved@a %
+    \fi}
+\let\lst@ifdraft\iffalse
+\DeclareOption{draft}{\let\lst@ifdraft\iftrue}
+\DeclareOption{final}{\let\lst@ifdraft\iffalse}
+\lst@AddToHook{PreSet}
+    {\lst@ifdraft
+         \let\lst@ifprint\iffalse
+         \@gobbletwo\fi\fi
+     \fi}
+\def\lst@InputListing#1{%
+    \begingroup
+      \lsthk@PreSet \gdef\lst@intname{#1}%
+      \expandafter\lstset\expandafter{\lst@set}%
+      \lsthk@DisplayStyle
+      \catcode\active=\active
+      \lst@Init\relax \let\lst@gobble\z@
+      \lst@SkipToFirst
+      \lst@ifprint \def\lst@next{\input{#1}}%
+             \else \let\lst@next\@empty \fi
+      \lst@next
+      \lst@DeInit
+    \endgroup}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \lst@LeaveMode \global\lst@newlines\z@
+        \lsthk@InitVarsBOL
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lstenv@DroppedWarning{%
+    \ifx\lst@dropped\@undefined\else
+        \PackageWarning{Listings}{Text dropped after begin of listing}%
+    \fi}
+\let\lst@dropped\@undefined % init
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lstenv@Process#1{%
+    \ifx~#1%
+        \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst
+    \else\ifx^^J#1%
+        \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ
+    \else
+        \let\lst@dropped#1\let\lst@next\lstenv@Process
+    \fi \fi
+    \lst@next}
+}\endgroup
+\def\lstenv@ProcessJ{%
+    \let\lst@arg\@empty
+    \ifx\@currenvir\lstenv@name
+        \expandafter\lstenv@ProcessJEnv
+    \else
+        \expandafter\def\expandafter\lst@temp\expandafter##1%
+            \csname end\lstenv@name\endcsname
+                {\lst@InsideConvert{##1}\lstenv@ProcessJ@}%
+        \expandafter\lst@temp
+    \fi}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@ProcessJ@{%
+    \lst@lExtend\lst@arg
+        {\expandafter\ \expandafter~\lstenv@endstring}%
+    \catcode10=\active \lst@Let{10}\lst@MProcessListing
+    \lst@SkipToFirst \lst@arg}
+}\endgroup
+\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}%
+    \ifx\lstenv@name\lst@temp
+        \lst@InsideConvert{#1}%
+        \expandafter\lstenv@ProcessJ@
+    \else
+        \lst@InsideConvert{#1\\end\{#2\}}%
+        \expandafter\lstenv@ProcessJEnv
+    \fi}
+\def\lstenv@backslash{%
+    \lst@IfNextChars\lstenv@endstring
+        {\lstenv@End}%
+        {\expandafter\lsts@backslash \lst@eaten}}%
+\def\lstenv@End{%
+    \ifx\@currenvir\lstenv@name
+        \edef\lst@next{\noexpand\end{\lstenv@name}}%
+    \else
+        \def\lst@next{\csname end\lstenv@name\endcsname}%
+    \fi
+    \lst@next}
+\lst@UserCommand\lstnewenvironment#1#2#{%
+    \@ifundefined{#1}%
+        {\let\lst@arg\@empty
+         \lst@XConvert{#1}\@nil
+         \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}%
+        {\PackageError{Listings}{Environment `#1' already defined}\@eha
+         \@gobbletwo}}
+\def\@tempa#1#2#3{%
+\gdef\lstnewenvironment@##1##2##3##4##5{%
+    \begingroup
+    \global\@namedef{end##2}{\lstenv@Error{##2}}%
+    \global\@namedef{##2}{\def\lstenv@name{##2}%
+        \begingroup \lst@setcatcodes \catcode\active=\active
+        \csname##2@\endcsname}%
+    \let\l@ngrel@x\global
+    \let\@xargdef\lstenv@xargdef
+    \expandafter\new@command\csname##2@\endcsname##3%
+        {\lsthk@PreSet ##4%
+         \ifx\@currenvir\lstenv@name
+             \def\lstenv@endstring{#1#2##1#3}%
+         \else
+             \def\lstenv@endstring{#1##1}%
+         \fi
+         \@namedef{end##2}{\lst@DeInit ##5\endgroup
+                          \lst@doendpe \@ignoretrue}%
+         \lsthk@DisplayStyle
+         \let\lst@EndProcessListing\lstenv@SkipToEnd
+         \lst@Init\lstenv@backslash
+         \lst@ifprint
+             \expandafter\expandafter\expandafter\lstenv@Process
+         \else
+             \expandafter\lstenv@SkipToEnd
+         \fi
+         \lst@insertargs}%
+    \endgroup}%
+}
+\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil
+\expandafter\@tempa\lst@arg
+\let\lst@insertargs\@empty
+\def\lstenv@xargdef#1{
+    \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1}
+\def\lstenv@xargdef@#1#2[#3][#4]#5{%
+  \@ifdefinable#2{%
+       \gdef#2{%
+          \ifx\protect\@typeset@protect
+            \expandafter\lstenv@testopt
+          \else
+            \@x@protect#2%
+          \fi
+          #1%
+          {#4}}%
+       \@yargdef
+          #1%
+           \tw@
+           {#3}%
+           {#5}}}
+\long\def\lstenv@testopt#1#2{%
+  \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}%
+               {#1[{#2}]}}
+\def\lstenv@testopt@#1[#2]{%
+    \catcode\active\active
+    #1[#2]}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@SkipToEnd{%
+    \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter
+        1\expandafter~\lstenv@endstring{\lstenv@End}%
+    \lst@temp}
+}\endgroup
+\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}%
+    {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lst@TestEOLChar#1{%
+    \def\lst@insertargs{#1}%
+    \ifx ~#1\@empty \else
+    \ifx^^J#1\@empty \else
+        \global\let\lst@intname\lst@insertargs
+        \let\lst@insertargs\@empty
+    \fi \fi}
+}\endgroup
+\lstnewenvironment{lstlisting}[2][]
+    {\lst@TestEOLChar{#2}%
+     \lstset{#1}%
+     \csname\@lst @SetFirstNumber\endcsname}
+    {\csname\@lst @SaveFirstNumber\endcsname}
+\lst@Key{fancyvrb}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@iffancyvrb
+    \lstFV@fancyvrb}
+\ifx\lstFV@fancyvrb\@undefined
+    \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb}
+\fi
+\@ifundefined{ocp}{}
+    {\lst@AddToHook{OutputBox}%
+         {\let\lst@ProcessLetter\@firstofone
+          \let\lst@ProcessDigit\@firstofone
+          \let\lst@ProcessOther\@firstofone}}
+\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax}
+\def\lst@ProcessOption#1#2\relax{%
+    \ifx #1!%
+        \lst@DeleteKeysIn\lst@loadaspects{#2}%
+    \else
+        \lst@lAddTo\lst@loadaspects{,#1#2}%
+    \fi}
+\@ifundefined{lst@loadaspects}
+  {\def\lst@loadaspects{strings,comments,escape,style,language,%
+      keywords,labels,lineshape,frames,emph,index}%
+  }{}
+\InputIfFileExists{lstpatch.sty}{}{}
+\let\lst@ifsavemem\iffalse
+\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue}
+\DeclareOption{noaspects}{\let\lst@loadaspects\@empty}
+\ProcessOptions
+\lst@RequireAspects\lst@loadaspects
+\let\lst@loadaspects\@empty
+\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle}
+\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage}
+\InputIfFileExists{listings.cfg}{}{}
+\InputIfFileExists{lstlocal.cfg}{}{}
+\endinput
+%%
+%% End of file `listings.sty'.
Index: doc/LaTeXmacros/listings/listings.sty.new
===================================================================
--- doc/LaTeXmacros/listings/listings.sty.new	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/listings.sty.new	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,2260 @@
+%%
+%% This is file `listings.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% listings.dtx  (with options: `kernel')
+%% 
+%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\def\filedate{2015/06/04}
+\def\fileversion{1.6}
+\NeedsTeXFormat{LaTeX2e}
+\AtEndOfPackage{\ProvidesPackage{listings}
+             [\filedate\space\fileversion\space(Carsten Heinz)]}
+\def\lst@CheckVersion#1{\edef\reserved@a{#1}%
+    \ifx\lst@version\reserved@a \expandafter\@gobble
+                          \else \expandafter\@firstofone \fi}
+\let\lst@version\fileversion
+\def\lst@InputCatcodes{%
+    \makeatletter \catcode`\"12%
+    \catcode`\^^@\active
+    \catcode`\^^I9%
+    \catcode`\^^L9%
+    \catcode`\^^M9%
+    \catcode`\%14%
+    \catcode`\~\active}
+\def\lst@RestoreCatcodes#1{%
+    \ifx\relax#1\else
+        \noexpand\catcode`\noexpand#1\the\catcode`#1\relax
+        \expandafter\lst@RestoreCatcodes
+    \fi}
+\edef\lst@RestoreCatcodes{%
+    \noexpand\lccode`\noexpand\/`\noexpand\/%
+    \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax
+    \catcode12\active}
+\lst@InputCatcodes
+\AtEndOfPackage{\lst@RestoreCatcodes}
+\def\@lst{lst}
+\def\lst@IfSubstring#1#2{%
+    \def\lst@temp##1#1##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp#2#1\@empty\relax}
+\def\lst@IfOneOf#1\relax#2{%
+    \def\lst@temp##1,#1,##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}
+\def\lst@DeleteKeysIn#1#2{%
+    \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,}
+\def\lst@DeleteKeysIn@#1#2,{%
+    \ifx\relax#2\@empty
+        \expandafter\@firstoftwo\expandafter\lst@RemoveCommas
+    \else
+        \ifx\@empty#2\@empty\else
+            \def\lst@temp##1,#2,##2{%
+                ##1%
+                \ifx\@empty##2\@empty\else
+                    \expandafter\lst@temp\expandafter,%
+                \fi ##2}%
+            \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}%
+        \fi
+    \fi
+    \lst@DeleteKeysIn@#1}
+\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}}
+\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi}
+\def\lst@ReplaceIn#1#2{%
+    \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty}
+\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty}
+\def\lst@ReplaceIn@#1#2#3{%
+    \ifx\@empty#3\relax\else
+        \def\lst@temp##1#2##2{%
+            \ifx\@empty##2%
+                \lst@lAddTo#1{##1}%
+            \else
+                \lst@lAddTo#1{##1#3}\expandafter\lst@temp
+            \fi ##2}%
+        \let\@tempa#1\let#1\@empty
+        \expandafter\lst@temp\@tempa#2\@empty
+        \expandafter\lst@ReplaceIn@\expandafter#1%
+    \fi}
+\providecommand*\@gobblethree[3]{}
+\def\lst@GobbleNil#1\@nil{}
+\def\lst@Swap#1#2{#2#1}
+\def\lst@true{\let\lst@if\iftrue}
+\def\lst@false{\let\lst@if\iffalse}
+\lst@false
+\def\lst@IfNextCharsArg#1{%
+    \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind}
+\def\lst@IfNextChars#1#2#3{%
+    \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}%
+    \let\lst@eaten\@empty \lst@IfNextChars@}
+\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax}
+\def\lst@IfNextChars@@#1#2\relax#3{%
+    \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}%
+    \ifx#1#3%
+        \ifx\lst@tofind\@empty
+            \let\lst@next\@tempa
+        \else
+            \let\lst@next\lst@IfNextChars@
+        \fi
+        \expandafter\lst@next
+    \else
+        \expandafter\@tempb
+    \fi}
+\def\lst@IfNextCharActive#1#2#3{%
+    \begingroup \lccode`\~=`#3\lowercase{\endgroup
+    \ifx~}#3%
+        \def\lst@next{#1}%
+    \else
+        \def\lst@next{#2}%
+    \fi \lst@next #3}
+\def\lst@for#1\do#2{%
+  \def\lst@forbody##1{#2}%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@empty\else\expandafter\lst@f@r#1,\@nil,\fi
+}
+\def\lst@f@r#1,{%
+  \def\@tempa{#1}%
+  \ifx\@tempa\@nnil\else\lst@forbody{#1}\expandafter\lst@f@r\fi
+}
+\def\lst@MakeActive#1{%
+    \let\lst@temp\@empty \lst@MakeActive@#1%
+    \relax\relax\relax\relax\relax\relax\relax\relax\relax}
+\begingroup
+\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active
+\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active
+\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active
+\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax
+    \ifx#1\relax
+    \else \lccode`\^^@=`#1%
+    \ifx#2\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@}}%
+    \else \lccode`\^^A=`#2%
+    \ifx#3\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}%
+    \else \lccode`\^^B=`#3%
+    \ifx#4\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}%
+    \else \lccode`\^^C=`#4%
+    \ifx#5\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}%
+    \else \lccode`\^^D=`#5%
+    \ifx#6\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}%
+    \else \lccode`\^^E=`#6%
+    \ifx#7\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}%
+    \else \lccode`\^^F=`#7%
+    \ifx#8\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}%
+    \else \lccode`\^^G=`#8%
+    \ifx#9\relax
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}%
+    \else \lccode`\^^H=`#9%
+        \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}%
+        \let\lst@next\lst@MakeActive@
+    \fi \fi \fi \fi \fi \fi \fi \fi \fi
+    \lst@next}
+\endgroup
+\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp}
+\def\lst@DefOther#1#2{%
+    \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup
+    \expandafter\lst@DefOther@\meaning#1\relax#1}
+\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}}
+\def\lst@InsideConvert#1{%
+   \lst@ifmathescape
+      \lst@InsideConvert@e#1$\@nil
+      \lst@if
+         \lst@InsideConvert@ey#1\@nil
+      \else
+         \lst@InsideConvert@#1 \@empty
+         \expandafter\@gobbletwo
+      \fi
+      \expandafter\lst@next
+   \else
+      \lst@InsideConvert@#1 \@empty
+   \fi}
+\begingroup \lccode`\~=`\ \relax \lowercase{%
+\gdef\lst@InsideConvert@#1 #2{%
+    \lst@MakeActive{#1}%
+    \ifx\@empty#2%
+        \lst@lExtend\lst@arg{\lst@temp}%
+    \else
+        \lst@lExtend\lst@arg{\lst@temp~}%
+        \expandafter\lst@InsideConvert@
+    \fi #2}
+}\endgroup
+\def\lst@InsideConvert@e#1$#2\@nil{%
+   \ifx\@empty#2\@empty \lst@false \else \lst@true \fi}
+\def\lst@InsideConvert@ey#1$#2$#3\@nil{%
+   \lst@InsideConvert@#1 \@empty
+   \lst@lAddTo\lst@arg{%
+      \lst@ifdropinput\else
+         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
+         \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin
+         #2%
+         \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput
+         \lst@whitespacefalse
+      \fi}%
+   \def\lst@next{\lst@InsideConvert{#3}}%
+}
+\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@}
+\def\lst@XConvertArg#1{%
+    {\lst@false \let\lst@arg\@empty
+     \lst@XConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+    \lst@lExtend\lst@arg{\expandafter{\@gtempa}}%
+    \lst@XConvertNext}
+\def\lst@XConvert@#1{%
+    \ifx\@nil#1\else
+        \begingroup\lccode`\~=`#1\lowercase{\endgroup
+        \lst@lAddTo\lst@arg~}%
+        \expandafter\lst@XConvertNext
+    \fi}
+\def\lst@XConvertNext{%
+    \lst@if \expandafter\lst@XConvertX
+      \else \expandafter\lst@XConvert \fi}
+\def\lst@XConvertX#1{%
+    \ifx\@nil#1\else
+        \lst@XConvertX@#1\relax
+        \expandafter\lst@XConvert
+    \fi}
+\def\lst@XConvertX@#1#2\relax{%
+    \begingroup\lccode`\~=`#1\lowercase{\endgroup
+    \lst@XCConvertX@@~}{#2}}
+\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}}
+\def\lst@Require#1#2#3#4#5{%
+    \begingroup
+    \aftergroup\lst@true
+    \ifx\@empty#3\@empty\else
+        \def\lst@prefix{#2}\let\lst@require\@empty
+        \edef\lst@temp{\expandafter\zap@space#3 \@empty}%
+        \lst@for\lst@temp\do{%
+          \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{%
+            #4[####1]{####2}%
+            \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}%
+            {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}%
+            {}}%
+          \fi}%
+        \global\let\lst@loadaspects\@empty
+        \lst@InputCatcodes
+        \ifx\lst@require\@empty\else
+            \lst@for{#5}\do{%
+                \ifx\lst@require\@empty\else
+                    \InputIfFileExists{##1}{}{}%
+                \fi}%
+        \fi
+        \ifx\lst@require\@empty\else
+            \PackageError{Listings}{Couldn't load requested #1}%
+            {The following #1s weren't loadable:^^J\@spaces
+             \lst@require^^JThis may cause errors in the sequel.}%
+            \aftergroup\lst@false
+        \fi
+        \ifx\lst@loadaspects\@empty\else
+            \lst@RequireAspects\lst@loadaspects
+        \fi
+    \fi
+    \endgroup}
+\def\lst@IfRequired[#1]#2{%
+    \lst@NormedDef\lst@temp{[#1]#2}%
+    \expandafter\lst@IfRequired@\lst@temp\relax}
+\def\lst@IfRequired@[#1]#2\relax#3{%
+    \lst@IfOneOf #2$#1\relax\lst@require
+        {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,%
+         \global\expandafter\let
+             \csname\@lst\lst@prefix @#2$#1\endcsname\@empty
+         #3}}
+\let\lst@require\@empty
+\def\lst@NoAlias[#1]#2{%
+    \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}}
+\gdef\lst@LAS#1#2#3#4#5#6#7{%
+    \lst@Require{#1}{#2}{#3}#4#5%
+    #4#3%
+    \@ifundefined{lst#2@\lst@malias$\lst@oalias}%
+        {\PackageError{Listings}%
+         {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi
+          \lst@malias\space undefined}%
+         {The #1 is not loadable. \@ehc}}%
+        {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}}
+\def\lst@RequireAspects#1{%
+    \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles}
+\let\lstloadaspects\lst@RequireAspects
+\@ifundefined{lstaspectfiles}
+    {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{}
+\gdef\lst@DefDriver#1#2#3#4{%
+    \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}%
+                 {\lst@DefDriver@{#1}{#2}#3#4[]}}
+\gdef\lst@DefDriver@#1#2#3#4[#5]#6{%
+    \def\lst@name{#1}\let\lst@if#4%
+    \lst@NormedDef\lst@driver{\@lst#2@#6$#5}%
+    \lst@IfRequired[#5]{#6}{\begingroup \lst@true}%
+                           {\begingroup}%
+    \lst@setcatcodes
+    \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}}
+\gdef\lst@DefDriver@@#1#2{%
+    \lst@if
+        \global\@namedef{\lst@driver}{#1{#2}}%
+    \fi
+    \endgroup
+    \@ifnextchar[\lst@XXDefDriver\@empty}
+\gdef\lst@XXDefDriver[#1]{%
+    \ifx\@empty#1\@empty\else
+        \lst@if
+            \lstloadaspects{#1}%
+        \else
+            \@ifundefined{\lst@driver}{}%
+            {\xdef\lst@loadaspects{\lst@loadaspects,#1}}%
+        \fi
+    \fi}
+\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}}
+\let\lst@UserCommand\gdef
+\newcommand*\lst@BeginAspect[2][]{%
+    \def\lst@curraspect{#2}%
+    \ifx \lst@curraspect\@empty
+        \expandafter\lst@GobbleAspect
+    \else
+        \let\lst@next\@empty
+        \lst@IfRequired[]{#2}%
+            {\lst@RequireAspects{#1}%
+             \lst@if\else \let\lst@next\lst@GobbleAspect \fi}%
+            {\let\lst@next\lst@GobbleAspect}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@EndAspect{%
+    \csname\@lst patch@\lst@curraspect\endcsname
+    \let\lst@curraspect\@empty}
+\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty}
+\def\lst@Key#1#2{%
+    \@ifnextchar[{\lstKV@def{#1}{#2}}%
+                 {\def\lst@temp{\lst@Key@{#1}{#2}}
+                  \afterassignment\lst@temp
+                  \global\@namedef{KV@\@lst @#1}####1}}
+\def\lstKV@def#1#2[#3]{%
+    \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter
+        {\csname KV@\@lst @#1\endcsname{#3}}%
+    \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp
+    \global\@namedef{KV@\@lst @#1}##1}
+\def\lst@Key@#1#2{%
+    \ifx\relax#2\@empty\else
+        \begingroup \globaldefs\@ne
+        \csname KV@\@lst @#1\endcsname{#2}%
+        \endgroup
+    \fi}
+\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname}
+\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo}
+\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo}
+\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop}
+\long\def\lst@ATH@#1#2#3#4{%
+    \@ifundefined{\@lst hk@#3}{%
+        \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}%
+    \expandafter#2\csname\@lst hk@#3\endcsname{#4}%
+    \def\lst@temp{#4}%
+    #1% \iftrue|false
+        \begingroup \globaldefs\@ne \lst@temp \endgroup
+    \fi}
+\long\def\lst@AddTo#1#2{%
+    \expandafter\gdef\expandafter#1\expandafter{#1#2}}
+\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}%
+    \expandafter\expandafter\expandafter\gdef
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}}
+\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+\def\lst@Extend#1#2{%
+    \expandafter\lst@AddTo\expandafter#1\expandafter{#2}}
+\def\lst@lExtend#1#2{%
+    \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}}
+\RequirePackage{keyval}[1997/11/10]
+\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}}
+\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}}
+\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}}
+\def\lstKV@OptArg[#1]#2#3{%
+    \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@}
+\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}}
+\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}}
+\def\lstKV@XOptArg[#1]#2#3{%
+    \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@}
+\def\lstKV@CSTwoArg#1#2{%
+    \gdef\@gtempa##1,##2,##3\relax{#2}%
+    \@gtempa#1,,\relax}
+\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax}
+\def\lstKV@SetIf@#1#2\relax#3{\lowercase{%
+    \expandafter\let\expandafter#3%
+        \csname if\ifx #1t}true\else false\fi\endcsname}
+\def\lstKV@SwitchCases#1#2#3{%
+    \def\lst@temp##1\\#1&##2\\##3##4\@nil{%
+        \ifx\@empty##3%
+            #3%
+        \else
+            ##2%
+        \fi
+    }%
+    \lst@temp\\#2\\#1&\\\@empty\@nil}
+\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@}
+\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi}
+\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax}
+\def\lst@NewMode#1{%
+    \ifx\@undefined#1%
+        \lst@mode\lst@newmode\relax \advance\lst@mode\@ne
+        \xdef\lst@newmode{\the\lst@mode}%
+        \global\chardef#1=\lst@mode
+        \lst@mode\lst@nomode
+    \fi}
+\newcount\lst@mode
+\def\lst@newmode{\m@ne}% init
+\lst@NewMode\lst@nomode % init (of \lst@mode :-)
+\def\lst@UseDynamicMode{%
+    \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne
+    \edef\lst@dynamicmode{\the\@tempcnta}%
+    \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}}
+\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode}
+\def\lst@EnterMode#1#2{%
+    \bgroup \lst@mode=#1\relax #2%
+    \lst@FontAdjust
+    \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}}
+\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty}
+\let\lst@entermodes\@empty % init
+\def\lst@LeaveMode{%
+    \ifnum\lst@mode=\lst@nomode\else
+        \egroup \expandafter\lsthk@EndGroup
+    \fi}
+\lst@AddToHook{EndGroup}{}% init
+\def\lst@InterruptModes{%
+    \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}%
+    \lst@LeaveAllModes}
+\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty}
+\def\lst@ReenterModes{%
+    \ifx\lst@modestack\@empty\else
+        \lst@LeaveAllModes
+        \global\let\@gtempa\lst@modestack
+        \global\let\lst@modestack\@empty
+        \expandafter\lst@ReenterModes@\@gtempa\relax
+    \fi}
+\def\lst@ReenterModes@#1#2{%
+    \ifx\relax#2\@empty
+        \gdef\@gtempa##1{#1}%
+        \expandafter\@gtempa
+    \else
+        \lst@AddTo\lst@modestack{{#1}}%
+        \expandafter\lst@ReenterModes@
+    \fi
+    {#2}}
+\def\lst@LeaveAllModes{%
+    \ifnum\lst@mode=\lst@nomode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveAllModes
+    \fi}
+\lst@AddToHook{ExitVars}{\lst@LeaveAllModes}
+\lst@NewMode\lst@Pmode
+\lst@NewMode\lst@GPmode
+\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue}
+\let\lst@ifmode\iffalse % init
+\lst@AddToHook{ModeTrue}{}% init
+\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue}
+\let\lst@ifLmode\iffalse % init
+\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode}
+\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}}
+\def\lst@NormedNameDef#1#2{%
+    \lowercase{\edef\lst@temp{\zap@space#1 \@empty}%
+    \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}}
+\def\lst@GetFreeMacro#1{%
+    \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}%
+    \lst@GFM@}
+\def\lst@GFM@{%
+    \expandafter\ifx \csname\lst@freemacro\endcsname \relax
+        \edef\lst@freemacro{\csname\lst@freemacro\endcsname}%
+    \else
+        \advance\@tempcnta\@ne
+        \expandafter\lst@GFM@
+    \fi}
+\newbox\lst@gtempboxa
+\newtoks\lst@token \newcount\lst@length \newcount\lst@colposn
+\def\lst@ResetToken{\lst@token{}\lst@length\z@}
+\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty}
+\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty}
+\def\lst@lettertrue{\let\lst@ifletter\iftrue}
+\def\lst@letterfalse{\let\lst@ifletter\iffalse}
+\lst@AddToHook{InitVars}{\lst@letterfalse}
+\def\lst@Append#1{\advance\lst@length\@ne
+                  \lst@token=\expandafter{\the\lst@token#1}}
+\def\lst@AppendOther{%
+    \lst@ifletter \lst@Output\lst@letterfalse \fi
+    \futurelet\lst@lastother\lst@Append}
+\def\lst@AppendLetter{%
+    \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi
+    \lst@Append}
+\def\lst@SaveToken{%
+    \global\let\lst@gthestyle\lst@thestyle
+    \global\let\lst@glastother\lst@lastother
+    \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}%
+                           \noexpand\lst@length\the\lst@length\relax
+                           \noexpand\let\noexpand\lst@thestyle
+                                        \noexpand\lst@gthestyle
+                           \noexpand\let\noexpand\lst@lastother
+                                        \noexpand\lst@glastother}}
+\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax}
+\def\lst@IfLastOtherOneOf@#1{%
+    \ifx #1\relax
+        \expandafter\@secondoftwo
+    \else
+        \ifx\lst@lastother#1%
+            \lst@IfLastOtherOneOf@t
+        \else
+            \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@
+        \fi
+    \fi}
+\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo}
+\newdimen\lst@currlwidth % \global
+\newcount\lst@column \newcount\lst@pos % \global
+\lst@AddToHook{InitVarsBOL}
+    {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@}
+\def\lst@CalcColumn{%
+            \@tempcnta\lst@column
+    \advance\@tempcnta\lst@length
+    \advance\@tempcnta-\lst@pos}
+\newdimen\lst@lostspace % \global
+\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@}
+\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi}
+\def\lst@InsertLostSpace{%
+    \lst@Kern\lst@lostspace \global\lst@lostspace\z@}
+\def\lst@InsertHalfLostSpace{%
+    \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace}
+\newdimen\lst@width
+\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}%
+    {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}%
+     \ifx\lst@widthflexible\@empty
+         \let\lst@widthflexible\lst@widthfixed
+     \fi
+     \def\lst@temp{\PackageError{Listings}%
+                                {Negative value(s) treated as zero}%
+                                \@ehc}%
+     \let\lst@error\@empty
+     \ifdim \lst@widthfixed<\z@
+         \let\lst@error\lst@temp \let\lst@widthfixed\z@
+     \fi
+     \ifdim \lst@widthflexible<\z@
+         \let\lst@error\lst@temp \let\lst@widthflexible\z@
+     \fi
+     \lst@error}}
+\lst@AddToHook{FontAdjust}
+    {\lst@width=\lst@ifflexible\lst@widthflexible
+                          \else\lst@widthfixed\fi \relax}
+\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust}
+\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi}
+\lst@AddToHook{InitVars}{\lsthk@FontAdjust}
+\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}}
+\def\lst@alloverstyle#1{#1}% init
+\def\lst@Kern#1{%
+    \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}%
+    \global\advance\lst@currlwidth \wd\z@
+    \lst@OutputBox\z@}
+\def\lst@CalcLostSpaceAndOutput{%
+    \global\advance\lst@lostspace \lst@length\lst@width
+    \global\advance\lst@lostspace-\wd\@tempboxa
+    \global\advance\lst@currlwidth \wd\@tempboxa
+    \global\advance\lst@pos -\lst@length
+    \setbox\@tempboxa\hbox{\let\lst@OutputBox\box
+        \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi
+        \box\@tempboxa
+        \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}%
+    \lst@OutputBox\@tempboxa \lsthk@PostOutput}
+\lst@AddToHook{PostOutput}{}% init
+\def\lst@OutputToken{%
+    \lst@TrackNewLines \lst@OutputLostSpace
+    \lst@ifgobbledws
+        \lst@gobbledwhitespacefalse
+        \lst@@discretionary
+    \fi
+    \lst@CheckMerge
+    {\lst@thestyle{\lst@FontAdjust
+     \setbox\@tempboxa\lst@hbox
+        {\lsthk@OutputBox
+         \lst@lefthss
+         \expandafter\lst@FillOutputBox\the\lst@token\@empty
+         \lst@righthss}%
+     \lst@CalcLostSpaceAndOutput}}%
+    \lst@ResetToken}
+\lst@AddToHook{OutputBox}{}% init
+\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue}
+\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse}
+\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init
+\def\lst@Delay#1{%
+    \lst@CheckDelay
+    #1%
+    \lst@GetOutputMacro\lst@delayedoutput
+    \edef\lst@delayed{\the\lst@token}%
+    \edef\lst@delayedlength{\the\lst@length}%
+    \lst@ResetToken}
+\def\lst@Merge#1{%
+    \lst@CheckMerge
+    #1%
+    \edef\lst@merged{\the\lst@token}%
+    \edef\lst@mergedlength{\the\lst@length}%
+    \lst@ResetToken}
+\def\lst@MergeToken#1#2{%
+    \advance\lst@length#2%
+    \lst@lExtend#1{\the\lst@token}%
+    \expandafter\lst@token\expandafter{#1}%
+    \let#1\@empty}
+\def\lst@CheckDelay{%
+    \ifx\lst@delayed\@empty\else
+        \lst@GetOutputMacro\@gtempa
+        \ifx\lst@delayedoutput\@gtempa
+            \lst@MergeToken\lst@delayed\lst@delayedlength
+        \else
+            {\lst@ResetToken
+             \lst@MergeToken\lst@delayed\lst@delayedlength
+             \lst@delayedoutput}%
+            \let\lst@delayed\@empty
+        \fi
+    \fi}
+\def\lst@CheckMerge{%
+    \ifx\lst@merged\@empty\else
+        \lst@MergeToken\lst@merged\lst@mergedlength
+    \fi}
+\let\lst@delayed\@empty % init
+\let\lst@merged\@empty % init
+\def\lst@column@fixed{%
+    \lst@flexiblefalse
+    \lst@width\lst@widthfixed\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\lst@FillFixed
+    \let\lst@hss\hss
+    \def\lst@hbox{\hbox to\lst@length\lst@width}}
+\def\lst@FillFixed#1{#1\lst@FillFixed@}
+\def\lst@FillFixed@#1{%
+    \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi}
+\def\lst@column@flexible{%
+    \lst@flexibletrue
+    \lst@width\lst@widthflexible\relax
+    \let\lst@OutputLostSpace\lst@UseLostSpace
+    \let\lst@FillOutputBox\@empty
+    \let\lst@hss\@empty
+    \let\lst@hbox\hbox}
+\def\lst@column@fullflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+\def\lst@column@spaceflexible{%
+    \lst@column@flexible
+    \def\lst@OutputLostSpace{%
+      \lst@ifwhitespace
+        \ifx\lst@outputspace\lst@visiblespace
+        \else
+          \lst@UseLostSpace
+        \fi
+      \else
+        \lst@ifnewline \lst@UseLostSpace\fi
+      \fi}%
+    \let\lst@leftinsert\@empty
+    \let\lst@rightinsert\@empty}
+\def\lst@outputpos#1#2\relax{%
+    \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss
+    \let\lst@rightinsert\lst@InsertLostSpace
+    \ifx #1c%
+        \let\lst@leftinsert\lst@InsertHalfLostSpace
+    \else\ifx #1r%
+        \let\lst@righthss\@empty
+        \let\lst@leftinsert\lst@InsertLostSpace
+        \let\lst@rightinsert\@empty
+    \else
+        \let\lst@lefthss\@empty
+        \let\lst@leftinsert\@empty
+        \ifx #1l\else \PackageWarning{Listings}%
+            {Unknown positioning for output boxes}%
+        \fi
+    \fi\fi}
+\def\lst@flexibletrue{\let\lst@ifflexible\iftrue}
+\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse}
+\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{%
+    \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi
+    \expandafter\let\expandafter\lst@arg
+                                \csname\@lst @column@##2\endcsname
+    \lst@arg
+    \ifx\lst@arg\relax
+        \PackageWarning{Listings}{Unknown column format `##2'}%
+    \else
+        \lst@ifflexible
+            \let\lst@columnsflexible\lst@arg
+        \else
+            \let\lst@columnsfixed\lst@arg
+        \fi
+    \fi}}
+\let\lst@columnsfixed\lst@column@fixed % init
+\let\lst@columnsflexible\lst@column@flexible % init
+\lst@Key{flexiblecolumns}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@ifflexible
+    \lst@ifflexible \lst@columnsflexible
+              \else \lst@columnsfixed \fi}
+\newcount\lst@newlines
+\lst@AddToHook{InitVars}{\global\lst@newlines\z@}
+\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne}
+\def\lst@NewLine{%
+    \ifx\lst@OutputBox\@gobble\else
+        \par\noindent \hbox{}%
+    \fi
+    \lst@colposn\z@
+    \global\advance\lst@newlines\m@ne
+    \lst@newlinetrue}
+\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue}
+\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init
+\def\lst@TrackNewLines{%
+    \ifnum\lst@newlines>\z@
+        \lsthk@OnNewLine
+        \lst@DoNewLines
+    \fi}
+\lst@AddToHook{OnNewLine}{}% init
+\lst@Key{emptylines}\maxdimen{%
+    \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}%
+            {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil
+    \advance\@tempcnta\@ne
+    \edef\lst@maxempty{\the\@tempcnta\relax}%
+    \let\lst@ifpreservenumber\lst@if}
+\def\lst@DoNewLines{
+    \@whilenum\lst@newlines>\lst@maxempty \do
+        {\lst@ifpreservenumber
+            \lsthk@OnEmptyLine
+            \global\advance\c@lstnumber\lst@advancelstnum
+         \fi
+         \global\advance\lst@newlines\m@ne}%
+    \@whilenum \lst@newlines>\@ne \do
+        {\lsthk@OnEmptyLine \lst@NewLine}%
+    \ifnum\lst@newlines>\z@ \lst@NewLine \fi}
+\lst@AddToHook{OnEmptyLine}{}% init
+\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty}
+\def\lst@GotoTabStop{%
+    \ifnum\lst@newlines=\z@
+        \setbox\@tempboxa\hbox{\lst@outputspace}%
+        \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}%
+        \lst@CalcLostSpaceAndOutput
+    \else
+        \global\advance\lst@lostspace \lst@length\lst@width
+        \global\advance\lst@column\lst@length \lst@length\z@
+    \fi}
+\def\lst@OutputOther{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \let\lst@thestyle\lst@currstyle
+        \lsthk@OutputOther
+        \lst@OutputToken
+    \fi}
+\lst@AddToHook{OutputOther}{}% init
+\let\lst@currstyle\relax % init
+\def\lst@Output{%
+    \lst@CheckDelay
+    \ifnum\lst@length=\z@\else
+        \ifx\lst@currstyle\relax
+            \let\lst@thestyle\lst@identifierstyle
+        \else
+            \let\lst@thestyle\lst@currstyle
+        \fi
+        \lsthk@Output
+        \lst@OutputToken
+    \fi
+    \let\lst@lastother\relax}
+\lst@AddToHook{Output}{}% init
+\def\lst@GetOutputMacro#1{%
+    \lst@ifletter \global\let#1\lst@Output
+            \else \global\let#1\lst@OutputOther\fi}
+\def\lst@PrintToken{%
+    \lst@ifletter \lst@Output \lst@letterfalse
+            \else \lst@OutputOther \let\lst@lastother\@empty \fi}
+\def\lst@XPrintToken{%
+    \lst@PrintToken \lst@CheckMerge
+    \ifnum\lst@length=\z@\else \lst@PrintToken \fi}
+\def\lst@BeginDropOutput#1{%
+    \xdef\lst@BDOnewlines{\the\lst@newlines}%
+    \global\let\lst@BDOifnewline\lst@ifnewline
+    \lst@EnterMode{#1}%
+        {\lst@modetrue
+         \let\lst@OutputBox\@gobble
+         \aftergroup\lst@BDORestore}}
+\def\lst@BDORestore{%
+    \global\lst@newlines\lst@BDOnewlines
+    \global\let\lst@ifnewline\lst@BDOifnewline}
+\let\lst@EndDropOutput\lst@LeaveMode
+\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter}
+\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther}
+\def\lst@ProcessDigit{%
+    \lst@whitespacefalse
+    \lst@ifletter \expandafter\lst@AppendLetter
+            \else \expandafter\lst@AppendOther\fi}
+\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue}
+\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse}
+\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue}
+\lst@Key{tabsize}{8}
+    {\ifnum#1>\z@ \def\lst@tabsize{#1}\else
+         \PackageError{Listings}{Strict positive integer expected}%
+         {You can't use `#1' as tabsize. \@ehc}%
+     \fi}
+\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}%
+              \hrulefill\hbox{\vrule\@height.3ex}}
+    {\def\lst@tab{#1}}
+\def\lst@ProcessTabulator{%
+    \lst@XPrintToken \lst@whitespacetrue
+    \global\advance\lst@column -\lst@pos
+    \@whilenum \lst@pos<\@ne \do
+        {\global\advance\lst@pos\lst@tabsize}%
+    \lst@length\lst@pos
+    \lst@PreGotoTabStop}
+\def\lst@PreGotoTabStop{%
+    \lst@ifshowtabs
+        \lst@TrackNewLines
+        \setbox\@tempboxa\hbox to\lst@length\lst@width
+            {{\lst@currstyle{\hss\lst@tab}}}%
+        \lst@CalcLostSpaceAndOutput
+    \else
+        \lst@ifkeepspaces
+%            \@tempcnta\lst@length \lst@length\z@
+            \@tempcnta\lst@length
+%            \@whilenum \@tempcnta>\z@ \do
+%                {
+%                  \lst@AppendOther\lst@outputspace
+%\the\lst@column
+%\the\lst@colposn/\the\lst@length/\the\lst@column/\the\numexpr ( \lst@column + \lst@tabsize )
+\the\lst@currlwidth
+		\ifnum\lst@colposn=\z@
+                \ifnum\lst@length=\lst@tabsize
+                \makebox[\the\numexpr ( \lst@tabsize ) * 10pt]{}
+                \else
+                \makebox[\the\numexpr ( \lst@length ) * 5pt]{}
+                \fi
+                \else
+                \makebox[\the\numexpr ( \lst@length ) * 5pt]{}
+                \fi
+                   \advance\lst@column\lst@length
+%                  \advance\@tempcnta\m@ne
+%                }%
+            \lst@OutputOther
+        \else
+            \lst@GotoTabStop
+        \fi
+    \fi
+    \lst@length\z@ \global\lst@pos\z@}
+\def\lst@outputspace{\ }
+\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace}
+\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces}
+\lst@AddToHook{Init}
+    {\lst@ifshowspaces
+         \let\lst@outputspace\lst@visiblespace
+         \lst@keepspacestrue
+     \fi}
+\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue}
+\def\lst@ProcessSpace{%
+    \lst@ifkeepspaces
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \else \ifnum\lst@newlines=\z@
+        \lst@AppendSpecialSpace
+    \else \ifnum\lst@length=\z@
+            \global\advance\lst@lostspace\lst@width
+            \global\advance\lst@pos\m@ne
+            \lst@whitespacetrue
+        \else
+            \lst@AppendSpecialSpace
+        \fi
+    \fi \fi}
+\def\lst@AppendSpecialSpace{%
+    \lst@ifwhitespace
+        \lst@PrintToken
+        \global\advance\lst@lostspace\lst@width
+        \global\advance\lst@pos\m@ne
+        \lst@gobbledwhitespacetrue
+    \else
+        \lst@PrintToken
+        \lst@whitespacetrue
+        \lst@AppendOther\lst@outputspace
+        \lst@PrintToken
+    \fi}
+\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}}
+\def\lst@ProcessFormFeed{%
+    \lst@XPrintToken
+    \ifnum\lst@newlines=\z@
+        \lst@EOLUpdate \lsthk@InitVarsBOL
+    \fi
+    \lst@formfeed
+    \lst@whitespacetrue}
+\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}}
+\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}}
+\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }}
+\def\lst@SelectStdCharTable{%
+    \lst@Def{9}{\lst@ProcessTabulator}%
+    \lst@Def{12}{\lst@ProcessFormFeed}%
+    \lst@Def{32}{\lst@ProcessSpace}}
+\def\lst@CCPut#1#2{%
+    \ifnum#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}%
+    \fi
+    \lst@CCPut#1}
+\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}}
+\lst@CCPut \lst@ProcessOther
+    {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F}
+    {"3A}{"3B}{"3D}{"3F}{"5B}{"5D}
+    \z@
+\lst@CCPut \lst@ProcessDigit
+    {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39}
+    \z@
+\lst@CCPut \lst@ProcessLetter
+    {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47}
+    {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F}
+    {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57}
+    {"58}{"59}{"5A}
+         {"61}{"62}{"63}{"64}{"65}{"66}{"67}
+    {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F}
+    {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77}
+    {"78}{"79}{"7A}
+    \z@
+\def\lst@CCPutMacro#1#2#3{%
+    \ifnum#2=\z@ \else
+        \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax
+        \lowercase{\endgroup\expandafter\lst@CCPutMacro@
+            \csname\@lst @um/\expandafter\endcsname
+            \csname\@lst @um/@\endcsname /~}#1{#3}%
+        \expandafter\lst@CCPutMacro
+    \fi}
+\def\lst@CCPutMacro@#1#2#3#4#5#6{%
+    \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}%
+    \def#1{\lst@UM#3}%
+    \def#2{#6}}
+\def\lst@UM#1{\csname\@lst @um#1@\endcsname}
+\lst@CCPutMacro
+    \lst@ProcessOther {"23}\#
+    \lst@ProcessLetter{"24}\textdollar
+    \lst@ProcessOther {"25}\%
+    \lst@ProcessOther {"26}\&
+    \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle
+                                     \else \char39\relax \fi}
+    \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered}
+    \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}}
+    \lst@ProcessOther {"3C}{\lst@ttfamily<\textless}
+    \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater}
+    \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash}
+    \lst@ProcessOther {"5E}\textasciicircum
+    \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore}
+    \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave
+                                     \else \char96\relax \fi}
+    \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft}
+    \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar}
+    \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright}
+    \lst@ProcessOther {"7E}\textasciitilde
+    \lst@ProcessOther {"7F}-
+    \@empty\z@\@empty
+\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi}
+\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}}
+\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote
+    \lst@ifupquote
+       \@ifundefined{textasciigrave}%
+          {\let\KV@lst@upquote\@gobble
+           \lstKV@SetIf f\lst@ifupquote \@gobble\fi
+           \PackageError{Listings}{Option `upquote' requires `textcomp'
+            package.\MessageBreak The option has been disabled}%
+          {Add \string\usepackage{textcomp} to your preamble.}}%
+          {}%
+    \fi}
+\AtBeginDocument{%
+  \@ifpackageloaded{upquote}{\RequirePackage{textcomp}%
+                             \lstset{upquote}}{}%
+  \@ifpackageloaded{upquote2}{\lstset{upquote}}{}}
+\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue}
+\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse}
+\lst@activecharstrue
+\def\lst@SelectCharTable{%
+    \lst@SelectStdCharTable
+    \lst@ifactivechars
+        \catcode9\active \catcode12\active \catcode13\active
+        \@tempcnta=32\relax
+        \@whilenum\@tempcnta<128\do
+            {\catcode\@tempcnta\active\advance\@tempcnta\@ne}%
+    \fi
+    \lst@ifec \lst@DefEC \fi
+    \let\do\lst@do@noligs \verbatim@nolig@list
+    \lsthk@SelectCharTable
+    \lst@DeveloperSCT
+\lst@DefRange
+    \ifx\lst@Backslash\relax\else
+        \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash
+    \fi}
+\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}}
+\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}}
+\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty}
+\def\lst@do@noligs#1{%
+    \begingroup \lccode`\~=`#1\lowercase{\endgroup
+    \lst@do@noligs@~}}
+\def\lst@do@noligs@#1{%
+    \expandafter\expandafter\expandafter\def
+    \expandafter\expandafter\expandafter#1%
+    \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}}
+\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig}
+\def\lst@nolig{\lst@UM\@empty}%
+\@namedef{\@lst @um@}{\leavevmode\kern\z@}
+\def\lst@SaveOutputDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup
+    \def\lst@temp##1\def~##2##3\relax}{%
+        \global\expandafter\let\expandafter#2\@gobble##2\relax}%
+    \expandafter\lst@temp\lst@SelectStdCharTable\relax}
+\lst@SaveOutputDef{"5C}\lstum@backslash
+\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec}
+\def\lst@DefEC{%
+    \lst@CCECUse \lst@ProcessLetter
+      ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
+      ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
+      ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
+      ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
+      ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
+      ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
+      ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
+      ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
+      ^^00}
+\def\lst@CCECUse#1#2{%
+    \ifnum`#2=\z@
+        \expandafter\@gobbletwo
+    \else
+        \ifnum\catcode`#2=\active
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}%
+        \else
+            \lst@ifactivechars \catcode`#2=\active \fi
+            \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}%
+        \fi
+    \fi
+    \lst@CCECUse#1}
+\def\lst@CCECUse@#1#2#3{%
+    \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}%
+    \expandafter\let\csname\@lst @um#3@\endcsname #2%
+    \edef#2{\noexpand#1%
+            \expandafter\noexpand\csname\@lst @EC#3\endcsname}}
+\lst@AddToHook{Init}
+    {\let\lsts@nfss@catcodes\nfss@catcodes
+     \let\nfss@catcodes\lst@nfss@catcodes}
+\def\lst@nfss@catcodes{%
+    \lst@makeletter
+        ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax
+    \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&%
+    \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4%
+    \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9%
+    \@makeother =\lsts@nfss@catcodes}
+\def\lst@makeletter#1{%
+    \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi}
+\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase0#1 0\or 1\else 2\fi}}
+\lst@AddToHook{Init}
+{\edef\lst@OrgOutput{\the\output}%
+\ifcase\lst@useoutput\relax
+\or
+ \output{\global\setbox\lst@gtempboxa\box\@cclv
+         \expandafter\egroup
+         \lst@SaveToken
+     \lst@InterruptModes
+     \setbox\@cclv\box\lst@gtempboxa
+     \bgroup\lst@OrgOutput\egroup
+     \bgroup
+     \aftergroup\pagegoal\aftergroup\vsize
+     \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}%
+\else
+ \output{\lst@RestoreOrigCatcodes
+         \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi
+         \lst@OrgOutput}%
+\fi}
+\def\lst@GetChars#1#2#3{%
+    \let#1\@empty
+    \@tempcnta#2\relax \@tempcntb#3\relax
+    \loop \ifnum\@tempcnta<\@tempcntb\relax
+        \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}%
+        \lst@lExtend#1{\the\catcode\@tempcnta\relax}%
+        \ifnum\the\catcode\@tempcnta=\active
+            \begingroup\lccode`\~=\@tempcnta
+            \lowercase{\endgroup
+            \lst@lExtend#1{\expandafter\let\expandafter~\csname
+                                    lstecs@\the\@tempcnta\endcsname}%
+            \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}%
+        \fi
+        \advance\@tempcnta\@ne
+    \repeat}
+\begingroup \catcode12=\active\let^^L\@empty
+\gdef\lst@ScanChars{%
+  \let\lsts@ssL^^L%
+  \def^^L{\par}%
+    \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}%
+  \let^^L\lsts@ssL
+    \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}}
+\endgroup
+\lst@Key{rescanchars}\relax{\lst@ScanChars}
+\AtBeginDocument{\lst@ScanChars}
+\lst@Key{alsoletter}\relax{%
+    \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter}
+\lst@Key{alsodigit}\relax{%
+    \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit}
+\lst@Key{alsoother}\relax{%
+    \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther}
+\lst@AddToHook{SelectCharTable}
+    {\lst@alsoother \lst@alsodigit \lst@alsoletter}
+\lst@AddToHookExe{SetLanguage}% init
+    {\let\lst@alsoletter\@empty
+     \let\lst@alsodigit\@empty
+     \let\lst@alsoother\@empty}
+\def\lst@DoAlso#1#2#3{%
+    \lst@DefOther\lst@arg{#1}\let#2\@empty
+    \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax}
+\def\lst@DoAlso@#1#2#3{%
+    \ifx\relax#3\expandafter\@gobblethree \else
+        \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup
+        \def\lst@temp##1\def~##2##3\relax{%
+            \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter
+                                         \noexpand\@gobble##2}}}}%
+        \expandafter\lst@temp\lst@SelectStdCharTable\relax
+        \lst@lExtend#1{\lst@arg}%
+    \fi
+    \lst@DoAlso@#1#2}
+\def\lst@SaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}}
+\def\lst@DefSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}}
+\def\lst@LetSaveDef#1#2{%
+    \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}}
+\def\lst@CDef#1{\lst@CDef@#1}
+\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4}
+\def\lst@CDefX#1{\lst@CDefX@#1}
+\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}}
+\def\lst@CDefIt#1#2#3#4#5#6#7#8{%
+    \ifx\@empty#2\@empty
+        \def#1{#6\def\lst@next{#7#4#8}\lst@next}%
+    \else \ifx\@empty#3\@empty
+        \def#1##1{%
+            #6%
+            \ifx##1#2\def\lst@next{#7#4#8}\else
+                     \def\lst@next{#5##1}\fi
+            \lst@next}%
+    \else
+        \def#1{%
+            #6%
+            \lst@IfNextCharsArg{#2#3}{#7#4#8}%
+                                     {\expandafter#5\lst@eaten}}%
+    \fi \fi}
+\def\lst@CArgX#1#2\relax{%
+    \lst@DefActive\lst@arg{#1#2}%
+    \expandafter\lst@CArg\lst@arg\relax}
+\def\lst@CArg#1#2\relax{%
+    \lccode`\/=`#1\lowercase{\def\lst@temp{/}}%
+    \lst@GetFreeMacro{lst@c\lst@temp}%
+    \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax}
+\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{%
+    \let#1#2%
+    \ifx\@empty#3\@empty
+        \def\lst@next{#6{#2{}{}}}%
+    \else
+        \def\lst@next{#6{#2#3{#4}}}%
+    \fi
+    \lst@next #1}
+\def\lst@CArgEmpty#1\@empty{#1}
+\lst@Key{excludedelims}\relax
+    {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}%
+     \expandafter\lst@for\lst@temp\do
+     {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}}
+\def\lst@DelimPrint#1#2{%
+    #1%
+      \begingroup
+        \lst@mode\lst@nomode \lst@modetrue
+        #2\lst@XPrintToken
+      \endgroup
+      \lst@ResetToken
+    \fi}
+\def\lst@DelimOpen#1#2#3#4#5#6\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint#1{#6}%
+    \lst@EnterMode{#4}{\def\lst@currstyle#5}%
+    \lst@DelimPrint{#1#2}{#6}%
+    #3}
+\def\lst@DelimClose#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@DelimPrint{#1#2}{#3}%
+    \lst@LeaveMode
+    \lst@DelimPrint{#1}{#3}}
+\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}}
+\def\lst@EndDelim{\lst@DelimClose\iffalse\else}
+\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}}
+\def\lst@EndIDelim{\lst@DelimClose\iffalse{}}
+\lst@AddToHook{SelectCharTable}{\lst@DefDelims}
+\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty}
+\def\lst@Delim#1{%
+    \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty
+    \@ifstar{\@ifstar{\lst@Delim@{#1}}%
+                     {\let\lst@cumulative\relax
+                      \lst@Delim@{#1}}}%
+            {\lst@true\lst@Delim@{#1}}}
+\def\lst@Delim@#1[#2]{%
+    \gdef\lst@delimtype{#2}%
+    \@ifnextchar[\lst@Delim@sty
+                 {\lst@Delim@sty[#1]}}
+\def\lst@Delim@sty[#1]{%
+    \def\lst@delimstyle{#1}%
+    \ifx\@empty#1\@empty\else
+        \lst@Delim@sty@ #1\@nil
+    \fi
+    \@ifnextchar[\lst@Delim@option
+                 \lst@Delim@delim}
+\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim}
+\def\lst@Delim@sty@#1#2\@nil{%
+    \if\relax\noexpand#1\else
+        \edef\lst@delimstyle{\expandafter\noexpand
+                             \csname\@lst @\lst@delimstyle\endcsname}%
+    \fi}
+\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{%
+    \ifx #4\@empty \lst@Delim@delall{#2}\fi
+    \ifx\@empty#1\@empty
+        \ifx #4\@nil
+            \@ifundefined{\@lst @#2DM@\lst@delimtype}%
+                {\lst@Delim@delall{#2@\lst@delimtype}}%
+                {\lst@Delim@delall{#2DM@\lst@delimtype}}%
+        \fi
+    \else
+        \expandafter\lst@Delim@args\expandafter
+            {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4%
+        \let\lst@delim\@empty
+        \expandafter\lst@IfOneOf\lst@delimtype\relax#3%
+        {\@ifundefined{\@lst @#2DM@\lst@delimtype}%
+             {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+             {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode
+                                     \csname\@lst @#2DM@\lst@delimtype
+                                     \expandafter\endcsname\lst@arg}}%
+         \ifx #4\@nil
+             \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty
+             \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil
+         \else
+             \lst@lExtend\lst@DefDelims\lst@delim
+         \fi}%
+        {\PackageError{Listings}{Illegal type `\lst@delimtype'}%
+                                {#2 types are #3.}}%
+     \fi}
+\def\lst@Delim@args#1#2#3#4#5#6#7{%
+    \begingroup
+    \lst@false \let\lst@next\lst@XConvert
+    \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble
+                                        \lst@delimtype}%
+                    #5\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#6}%
+                    \lst@GobbleNil}%
+                   {\lst@next#2\@nil
+                    \lst@lAddTo\lst@arg{\@empty#3}%
+                    \lst@GobbleNil}%
+                 #1\@nil
+    \global\let\@gtempa\lst@arg
+    \endgroup
+    \let\lst@arg\@gtempa
+    \ifx #7\@nil\else
+        \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}%
+    \fi}
+\def\lst@Delim@args@#1{%
+    \lst@if
+        \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}%
+    \else
+        \ifx\lst@cumulative\@empty
+            \lst@lAddTo\lst@arg{{{}#1}}%
+        \else
+            \lst@lAddTo\lst@arg{{{#1}}}%
+        \fi
+    \fi}
+\def\lst@Delim@del#1\@empty#2#3#4{%
+    \ifx #2\@nil\else
+        \def\lst@temp{#1\@empty#2#3}%
+        \ifx\lst@temp\lst@delim\else
+            \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}%
+        \fi
+        \expandafter\lst@Delim@del
+    \fi}
+\def\lst@Delim@delall#1{%
+    \begingroup
+    \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}%
+    \lst@false \global\let\@gtempa\@empty
+    \expandafter\lst@Delim@delall@\lst@DefDelims\@empty
+    \endgroup
+    \let\lst@DefDelims\@gtempa}
+\def\lst@Delim@delall@#1{%
+    \ifx #1\@empty\else
+        \ifx #1\lst@UseDynamicMode
+            \lst@true
+            \let\lst@next\lst@Delim@delall@do
+        \else
+            \def\lst@next{\lst@Delim@delall@do#1}%
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@Delim@delall@do#1#2\@empty#3#4#5{%
+    \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}%
+      {}%
+      {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi
+       \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}%
+    \lst@false \lst@Delim@delall@}
+\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \lst@ifmode #4\else
+             #5%
+             \def\lst@bnext{#6{#7}{#8}}%
+         \fi
+         \lst@bnext}%
+        \@empty}
+\gdef\lst@DefDelimE#1#2#3#4#5#6#7{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@enext\lst@CArgEmpty
+         \ifnum #7=\lst@mode%
+             #4%
+             \let\lst@enext#6%
+         \else
+             #5%
+         \fi
+         \lst@enext}%
+        \@empty}
+\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax}
+\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{%
+    \lst@CDef{#1}#2%
+        {#3}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \ifnum #7=\lst@mode
+             #4%
+             \let\lst@bnext#9%
+         \else
+             \lst@ifmode\else
+                 #5%
+                 \def\lst@bnext{#6{#7}{#8}}%
+             \fi
+         \fi
+         \lst@bnext}%
+        \@empty}
+\gdef\lst@delimtypes{s,l}
+\gdef\lst@DelimKey#1#2{%
+    \lst@Delim{}#2\relax
+        {Delim}\lst@delimtypes #1%
+                {\lst@BeginDelim\lst@EndDelim}
+        i\@empty{\lst@BeginIDelim\lst@EndIDelim}}
+\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}}
+\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}}
+\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}
+\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}}
+\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if
+                             \def\lst@literate{#1}}
+\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey}
+                             {\lst@false\lst@Literatekey}#1\@nil@}
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@literate\@empty\else
+         \expandafter\lst@Literate\lst@literate{}\relax\z@
+     \fi}
+\def\lst@Literate#1#2#3{%
+    \ifx\relax#2\@empty\else
+        \lst@CArgX #1\relax\lst@CDef
+            {}
+            {\let\lst@next\@empty
+             \lst@ifxliterate
+                \lst@ifmode \let\lst@next\lst@CArgEmpty \fi
+             \fi
+             \ifx\lst@next\@empty
+                 \ifx\lst@OutputBox\@gobble\else
+                   \lst@XPrintToken \let\lst@scanmode\lst@scan@m
+                   \lst@token{#2}\lst@length#3\relax
+                   \lst@XPrintToken
+                 \fi
+                 \let\lst@next\lst@CArgEmptyGobble
+             \fi
+             \lst@next}%
+            \@empty
+        \expandafter\lst@Literate
+    \fi}
+\def\lst@CArgEmptyGobble#1\@empty{}
+\def\lst@BeginDropInput#1{%
+    \lst@EnterMode{#1}%
+    {\lst@modetrue
+     \let\lst@OutputBox\@gobble
+     \let\lst@ifdropinput\iftrue
+     \let\lst@ProcessLetter\@gobble
+     \let\lst@ProcessDigit\@gobble
+     \let\lst@ProcessOther\@gobble
+     \let\lst@ProcessSpace\@empty
+     \let\lst@ProcessTabulator\@empty
+     \let\lst@ProcessFormFeed\@empty}}
+\let\lst@ifdropinput\iffalse % init
+\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}}
+\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}}
+\lst@AddToHook{Init}
+    {\lst@basicstyle
+     \ifx\lst@inputenc\@empty\else
+         \@ifundefined{inputencoding}{}%
+            {\inputencoding\lst@inputenc}%
+     \fi}
+\lst@AddToHookExe{EmptyStyle}
+    {\let\lst@basicstyle\@empty
+     \let\lst@inputenc\@empty}
+\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}
+\def\lst@parshape{\parshape\@ne \z@ \linewidth}
+\lst@AddToHookAtTop{EveryLine}{\lst@parshape}
+\lst@AddToHookAtTop{EndGroup}{\lst@parshape}
+\newcount\lst@lineno % \global
+\lst@AddToHook{InitVars}{\global\lst@lineno\@ne}
+\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint}
+\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}}
+\lst@AddToHook{PreSet}
+    {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}}
+\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{%
+    \def\lst@interrange{##1}\def\lst@linerange{##2,}}}
+\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}%
+                            \def\lst@rangeendprefix{#1}}
+\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}%
+                            \def\lst@rangeendsuffix{#1}}
+\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}}
+\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}}
+\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}}
+\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}}
+\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker}
+\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}%
+                       \let\lst@linerange\@empty}
+\lst@AddToHook{Init}
+{\ifx\lst@linerange\@empty
+     \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}%
+ \fi
+ \lst@GetLineInterval}%
+\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil}
+\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil}
+\def\lst@GLI@#1-#2-#3\@nil{%
+    \lst@IfNumber{#1}%
+    {\ifx\@empty#1\@empty
+         \let\lst@firstline\@ne
+     \else
+         \def\lst@firstline{#1\relax}%
+     \fi
+     \ifx\@empty#3\@empty
+         \def\lst@lastline{9999999\relax}%
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@lastline\lst@firstline
+         \else
+             \def\lst@lastline{#2\relax}%
+         \fi
+     \fi}%
+    {\def\lst@firstline{9999999\relax}%
+     \let\lst@lastline\lst@firstline
+     \let\lst@rangebegin\lst@rangebeginprefix
+     \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix
+     \ifx\@empty#3\@empty
+         \let\lst@rangeend\lst@rangeendprefix
+         \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+     \else
+         \ifx\@empty#2\@empty
+             \let\lst@rangeend\@empty
+         \else
+             \let\lst@rangeend\lst@rangeendprefix
+             \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix
+         \fi
+     \fi
+     \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}%
+     \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}}
+\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty}
+\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}
+\def\lst@DefRangeB@#1#2#3#4{%
+    \lst@CDef{#1{#2}{#3}}#4{}%
+    {\lst@ifincluderangemarker
+         \lst@LeaveMode
+         \let#1#4%
+         \lst@DefRangeEnd
+         \lst@InitLstNumber
+     \else
+         \@tempcnta\lst@lineno \advance\@tempcnta\@ne
+         \edef\lst@firstline{\the\@tempcnta\relax}%
+         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%
+         \lst@InitLstNumber
+     \fi
+ \global\let\lst@DefRange\lst@DefRangeEnd
+     \lst@CArgEmpty}%
+    \@empty}
+\def\lstpatch@labels{%
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \else
+            \lst@nololtrue
+            \advance\@tempcnta\lst@advancenumber
+            \edef\lst@firstnumber{\the\@tempcnta\relax}%
+        \fi
+    \fi}%
+}
+\def\lst@InitLstNumber{%
+     \global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum
+     \ifx \lst@firstnumber\c@lstnumber
+         \global\advance\c@lstnumber-\lst@advancelstnum
+     \fi%
+     \lst@ifincluderangemarker\else%
+         \global\advance\c@lstnumber by 1%
+     \fi%
+     }
+\def\lst@DefRangeEnd{%
+    \ifx\lst@rangeend\@empty\else
+        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE
+    \fi}
+\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}
+\def\lst@DefRangeE@#1#2#3#4{%
+    \lst@CDef{#1#2{#3}}#4{}%
+    {\let#1#4%
+     \edef\lst@lastline{\the\lst@lineno\relax}%
+     \lst@DefRangeE@@}%
+    \@empty}
+\def\lst@DefRangeE@@#1\@empty{%
+    \lst@ifincluderangemarker
+        #1\lst@XPrintToken
+    \fi
+    \lst@LeaveModeToPmode
+    \lst@BeginDropInput{\lst@Pmode}}
+\def\lst@LeaveModeToPmode{%
+    \ifnum\lst@mode=\lst@Pmode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveModeToPmode
+    \fi}
+\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}
+\gdef\lst@OnceAtEOL{}% Init
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@
+        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty
+        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.
+        \lsthk@InitVarsBOL
+        \lst@BOLGobble}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \def\lst@next{\lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst}%
+        \expandafter\lst@next
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lst@IfNumber#1{%
+    \ifx\@empty#1\@empty
+        \let\lst@next\@firstoftwo
+    \else
+        \lst@IfNumber@#1\@nil
+    \fi
+    \lst@next}
+\def\lst@IfNumber@#1#2\@nil{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1>47\relax \ifnum`#1>57\relax\else
+        \let\lst@next\@firstoftwo
+    \fi\fi}
+\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol}
+\def\lst@nololtrue{\let\lst@ifnolol\iftrue}
+\let\lst@ifnolol\iffalse % init
+\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}}
+\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}}
+\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}}
+\lst@Key{label}\relax{\def\lst@label{#1}}
+\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax}
+\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}%
+    {\def\lst@caption{##2}\def\lst@@caption{##1}}%
+     \let\lst@title\@empty}
+\lst@AddToHookExe{TextStyle}
+    {\let\lst@caption\@empty \let\lst@@caption\@empty
+     \let\lst@title\@empty \let\lst@label\@empty}
+\AtBeginDocument{
+  \@ifundefined{thechapter}{\let\lst@ifnumberbychapter\iffalse}{}
+  \lst@ifnumberbychapter
+      \newcounter{lstlisting}[chapter]
+      \gdef\thelstlisting%
+           {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}
+  \else
+      \newcounter{lstlisting}
+      \gdef\thelstlisting{\@arabic\c@lstlisting}
+  \fi}
+\lst@UserCommand\lstlistingname{Listing}
+\lst@Key{numberbychapter}{true}[t]{\lstKV@SetIf{#1}\lst@ifnumberbychapter}
+\@ifundefined{abovecaptionskip}
+{\newskip\abovecaptionskip
+ \newskip\belowcaptionskip}{}
+\@ifundefined{@makecaption}
+{\long\def\@makecaption#1#2{%
+   \vskip\abovecaptionskip
+   \sbox\@tempboxa{#1: #2}%
+   \ifdim \wd\@tempboxa >\hsize
+     #1: #2\par
+   \else
+     \global \@minipagefalse
+     \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+   \fi
+   \vskip\belowcaptionskip}%
+}{}
+\def\fnum@lstlisting{%
+  \lstlistingname
+  \ifx\lst@@caption\@empty\else~\thelstlisting\fi}%
+\def\lst@MakeCaption#1{%
+  \lst@ifdisplaystyle
+    \ifx #1t%
+        \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else
+                                \expandafter\refstepcounter
+        \fi {lstlisting}%
+        \ifx\lst@label\@empty\else \label{\lst@label}\fi
+        \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+        \global\let\lst@name\lst@arg \global\let\lstname\lst@name
+        \lst@ifnolol\else
+            \ifx\lst@@caption\@empty
+                \ifx\lst@caption\@empty
+                    \ifx\lst@intname\@empty \else \def\lst@temp{ }%
+                    \ifx\lst@intname\lst@temp \else
+                        \addcontentsline{lol}{lstlisting}\lst@name
+                    \fi\fi
+                \fi
+            \else
+                \addcontentsline{lol}{lstlisting}%
+                    {\protect\numberline{\thelstlisting}\lst@@caption}%
+            \fi
+         \fi
+     \fi
+    \ifx\lst@caption\@empty\else
+        \lst@IfSubstring #1\lst@captionpos
+            {\begingroup \let\@@vskip\vskip
+             \def\vskip{\afterassignment\lst@vskip \@tempskipa}%
+             \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}%
+             \par\@parboxrestore\normalsize\normalfont % \noindent (AS)
+             \ifx #1t\allowbreak \fi
+             \ifx\lst@title\@empty
+                 \lst@makecaption\fnum@lstlisting{\ignorespaces \lst@caption}
+             \else
+                 \lst@maketitle\lst@title % (AS)
+             \fi
+             \ifx #1b\allowbreak \fi
+             \endgroup}{}%
+    \fi
+  \fi}
+\def\lst@makecaption{\@makecaption}
+\def\lst@maketitle{\@makecaption\lst@title@dropdelim}
+\def\lst@title@dropdelim#1{\ignorespaces}
+\AtBeginDocument{%
+\@ifundefined{captionlabelfalse}{}{%
+  \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}%
+\@ifundefined{caption@startrue}{}{%
+  \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}%
+}
+\def\lst@HRefStepCounter#1{%
+    \begingroup
+    \c@lstlisting\lst@neglisting
+    \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}%
+    \ifx\hyper@refstepcounter\@undefined\else
+        \hyper@refstepcounter{#1}%
+    \fi
+    \endgroup}
+\gdef\lst@neglisting{\z@}% init
+\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}}
+\def\lst@boxtrue{\let\lst@ifbox\iftrue}
+\let\lst@ifbox\iffalse
+\lst@Key{float}\relax[\lst@floatplacement]{%
+    \lstKV@SwitchCases{#1}%
+    {true&\let\lst@floatdefault\lst@floatplacement
+          \let\lst@float\lst@floatdefault\\%
+     false&\let\lst@floatdefault\relax
+           \let\lst@float\lst@floatdefault
+    }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat
+                             \let\lst@endfloat\end@dblfloat
+                             \lst@KFloat}%
+                            {\let\lst@beginfloat\@float
+                             \let\lst@endfloat\end@float
+                             \lst@KFloat}}
+      \edef\lst@float{#1}%
+      \expandafter\lst@next\lst@float\relax}}
+\def\lst@KFloat#1\relax{%
+    \ifx\@empty#1\@empty
+        \let\lst@float\lst@floatplacement
+    \else
+        \def\lst@float{#1}%
+    \fi}
+\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}}
+\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault}
+\lst@AddToHook{TextStyle}{\let\lst@float\relax}
+\let\lst@floatdefault\relax % init
+\lst@AddToHook{DeInit}{%
+    \ifx\lst@float\relax
+        \global\let\lst@doendpe\@doendpe
+    \else
+        \global\let\lst@doendpe\@empty
+    \fi}
+\AtBeginDocument{%
+\@ifundefined{c@float@type}%
+    {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}}
+    {\edef\ftype@lstlisting{\the\c@float@type}%
+     \addtocounter{float@type}{\value{float@type}}}%
+}
+\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}}
+\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}}
+\lst@AddToHook{TextStyle}
+    {\let\lst@aboveskip\z@ \let\lst@belowskip\z@}
+\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}}
+\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse}
+\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue}
+\let\lst@ifdisplaystyle\iffalse
+\def\lst@Init#1{%
+    \begingroup
+    \ifx\lst@float\relax\else
+        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
+        \expandafter\@tempa
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
+        \expandafter\lst@next
+    \fi
+    \ifhmode\ifinner \lst@boxtrue \fi\fi
+    \lst@ifbox
+        \lsthk@BoxUnsafe
+        \hbox to\z@\bgroup
+             $\if t\lst@boxpos \vtop
+        \else \if b\lst@boxpos \vbox
+        \else \vcenter \fi\fi
+        \bgroup \par\noindent
+    \else
+        \lst@ifdisplaystyle
+            \lst@EveryDisplay
+            \par\penalty-50\relax
+            \vspace\lst@aboveskip
+        \fi
+    \fi
+    \normalbaselines
+    \abovecaptionskip\lst@abovecaption\relax
+    \belowcaptionskip\lst@belowcaption\relax
+    \lst@MakeCaption t%
+    \lsthk@PreInit \lsthk@Init
+    \lst@ifdisplaystyle
+        \global\let\lst@ltxlabel\@empty
+        \if@inlabel
+            \lst@ifresetmargins
+                \leavevmode
+            \else
+                \xdef\lst@ltxlabel{\the\everypar}%
+                \lst@AddTo\lst@ltxlabel{%
+                    \global\let\lst@ltxlabel\@empty
+                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%
+            \fi
+        \fi
+        \everypar\expandafter{\lst@ltxlabel
+                              \lsthk@EveryLine\lsthk@EveryPar}%
+    \else
+        \everypar{}\let\lst@NewLine\@empty
+    \fi
+    \lsthk@InitVars \lsthk@InitVarsBOL
+    \lst@Let{13}\lst@MProcessListing
+    \let\lst@Backslash#1%
+    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
+    \lst@InitFinalize}
+\let\lst@InitFinalize\@empty % init
+\lst@AddToHook{PreInit}
+    {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil
+     \let\par\@@par}
+\lst@AddToHook{EveryLine}{}% init
+\lst@AddToHook{EveryPar}{}% init
+\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines}
+\def\lst@DeInit{%
+    \lst@XPrintToken \lst@EOLUpdate
+    \global\advance\lst@newlines\m@ne
+    \lst@ifshowlines
+        \lst@DoNewLines
+    \else
+        \setbox\@tempboxa\vbox{\lst@DoNewLines}%
+    \fi
+    \lst@ifdisplaystyle \par\removelastskip \fi
+    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor
+    \lst@MakeCaption b%
+    \lst@ifbox
+        \egroup $\hss \egroup
+        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
+    \else
+        \lst@ifdisplaystyle
+            \par\penalty-50\vspace\lst@belowskip
+        \fi
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \def\lst@next{\global\let\@checkend\@gobble
+                      \endmulticols
+                      \global\let\@checkend\lst@@checkend}
+        \expandafter\lst@next
+    \fi
+    \ifx\lst@float\relax\else
+        \expandafter\lst@endfloat
+    \fi
+    \endgroup}
+\let\lst@@checkend\@checkend
+\newdimen\lst@maxwidth % \global
+\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@}
+\lst@AddToHook{InitVarsEOL}
+    {\ifdim\lst@currlwidth>\lst@maxwidth
+         \global\lst@maxwidth\lst@currlwidth
+     \fi}
+\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL}
+\def\lst@MProcessListing{%
+    \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno>\lst@lastline
+        \lst@ifdropinput \lst@LeaveMode \fi
+        \ifx\lst@linerange\@empty
+            \expandafter\expandafter\expandafter\lst@EndProcessListing
+        \else
+            \lst@interrange
+            \lst@GetLineInterval
+            \expandafter\expandafter\expandafter\lst@SkipToFirst
+        \fi
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\let\lst@EndProcessListing\endinput
+\lst@Key{gobble}{0}{\def\lst@gobble{#1}}
+\def\lst@BOLGobble{%
+    \ifnum\lst@gobble>\z@
+        \@tempcnta\lst@gobble\relax
+        \expandafter\lst@BOLGobble@
+\fi}
+\def\lst@BOLGobble@@{%
+    \ifnum\@tempcnta>\z@
+        \expandafter\lst@BOLGobble@
+    \fi}
+\def\lstenv@BOLGobble@@{%
+    \lst@IfNextChars\lstenv@endstring{\lstenv@End}%
+    {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}}
+\def\lst@BOLGobble@#1{%
+    \let\lst@next#1%
+    \ifx \lst@next\relax\else
+    \ifx \lst@next\lst@MProcessListing\else
+    \ifx \lst@next\lst@processformfeed\else
+    \ifx \lst@next\lstenv@backslash
+        \let\lst@next\lstenv@BOLGobble@@
+    \else
+        \let\lst@next\lst@BOLGobble@@
+        \ifx #1\lst@processtabulator
+            \advance\@tempcnta-\lst@tabsize\relax
+            \ifnum\@tempcnta<\z@
+                \lst@length-\@tempcnta \lst@PreGotoTabStop
+            \fi
+        \else
+            \advance\@tempcnta\m@ne
+        \fi
+    \fi \fi \fi \fi
+    \lst@next}
+\def\lst@processformfeed{\lst@ProcessFormFeed}
+\def\lst@processtabulator{\lst@ProcessTabulator}
+\lst@Key{name}\relax{\def\lst@intname{#1}}
+\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty}
+\lst@AddToHook{PreInit}{%
+    \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+    \global\let\lst@name\lst@arg \global\let\lstname\lst@name}
+\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash}
+\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}}
+\lst@UserCommand\lstlistlistingname{Listings}
+\lst@UserCommand\lstlistoflistings{\bgroup
+    \let\contentsname\lstlistlistingname
+    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
+    \tableofcontents \egroup}
+\@ifundefined{float@listhead}{}{%
+  \renewcommand*{\lstlistoflistings}{%
+    \begingroup
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@twocolumn
+          \@restonecoltrue\onecolumn
+        \else
+          \@restonecolfalse
+        \fi
+      }%
+      \float@listhead{\lstlistlistingname}%
+      \parskip\z@\parindent\z@\parfillskip \z@ \@plus 1fil%
+      \@starttoc{lol}%
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@restonecol\twocolumn\fi
+      }%
+    \endgroup
+  }%
+}
+\AtBeginDocument{%
+  \@ifundefined{float@addtolists}%
+    {\gdef\float@addtolists#1{\addtocontents{lol}{#1}}}%
+    {\let\orig@float@addtolists\float@addtolists
+     \gdef\float@addtolists#1{%
+       \addtocontents{lol}{#1}%
+       \orig@float@addtolists{#1}}}%
+}%
+\newcommand\lstinline[1][]{%
+    \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+      \def\lst@boxpos{b}%
+      \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+      \lsthk@TextStyle
+      \@ifnextchar\bgroup{%
+        \afterassignment\lst@InlineG \let\@let@token}%
+                         \lstinline@}
+\def\lstinline@#1{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
+\lst@AddToHook{TextStyle}{}% init
+\lst@AddToHook{SelectCharTable}{\lst@inlinechars}
+\global\let\lst@inlinechars\@empty
+\def\lst@InlineM#1{\gdef\lst@inlinechars{%
+    \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}%
+    \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty
+        \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
+    \lst@inlinechars}
+\def\lst@InlineJ#1{%
+    \def\lst@temp##1#1{%
+        \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
+        \lst@DeInit\egroup}%
+    \lst@temp}
+\def\lst@InlineG{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM\}}%
+                         {\let\lst@arg\@empty \lst@InlineGJ}}
+\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest}
+\def\lst@InlineGJTest{%
+    \ifx\@let@token\egroup
+        \afterassignment\lst@InlineGJEnd
+        \expandafter\let\expandafter\@let@token
+    \else
+        \ifx\@let@token\@sptoken
+            \let\lst@next\lst@InlineGJReadSp
+        \else
+            \let\lst@next\lst@InlineGJRead
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup}
+\def\lst@InlineGJRead#1{%
+    \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ}
+\def\lst@InlineGJReadSp#1{%
+    \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ#1}
+\newcommand\lstMakeShortInline[1][]{%
+  \def\lst@shortinlinedef{\lstinline[#1]}%
+  \lstMakeShortInline@}%
+\def\lstMakeShortInline@#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \lst@shortlstinlineinfo{Made }{#1}%
+    \lst@add@special{#1}%
+    \expandafter
+    \xdef\csname lst@ShortInlineOldCatcode\string#1\endcsname{\the\catcode`#1}%
+    \begingroup
+      \catcode`\~\active  \lccode`\~`#1%
+      \lowercase{%
+        \global\expandafter\let
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname~%
+          \expandafter\gdef\expandafter~\expandafter{\lst@shortinlinedef#1}}%
+    \endgroup
+    \global\catcode`#1\active
+  \else
+    \PackageError{Listings}%
+    {\string\lstMakeShorterInline\ definitions cannot be nested}%
+    {Use \string\lstDeleteShortInline first.}%
+    {}%
+  \fi}
+\def\lstDeleteShortInline#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \PackageError{Listings}%
+    {#1 is not a short reference for \string\lstinline}%
+    {Use \string\lstMakeShortInline first.}%
+    {}%
+  \else
+    \lst@shortlstinlineinfo{Deleted }{#1 as}%
+    \lst@rem@special{#1}%
+    \global\catcode`#1\csname lst@ShortInlineOldCatcode\string#1\endcsname
+    \global \expandafter\let%
+      \csname lst@ShortInlineOldCatcode\string#1\endcsname \relax
+    \ifnum\catcode`#1=\active
+      \begingroup
+        \catcode`\~\active  \lccode`\~`#1%
+        \lowercase{%
+          \global\expandafter\let\expandafter~%
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname}%
+      \endgroup
+    \fi
+  \fi}
+\def\lst@shortlstinlineinfo#1#2{%
+     \PackageInfo{Listings}{%
+       #1\string#2 a short reference for \string\lstinline}}
+\def\lst@add@special#1{%
+  \lst@rem@special{#1}%
+  \expandafter\gdef\expandafter\dospecials\expandafter
+    {\dospecials \do #1}%
+  \expandafter\gdef\expandafter\@sanitize\expandafter
+    {\@sanitize \@makeother #1}}
+\def\lst@rem@special#1{%
+  \def\do##1{%
+    \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+  \xdef\dospecials{\dospecials}%
+  \begingroup
+    \def\@makeother##1{%
+      \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+    \xdef\@sanitize{\@sanitize}%
+  \endgroup}
+\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi}
+\def\lst@MakePath@#1/{#1/\lst@MakePath@@}
+\def\lst@MakePath@@#1/{%
+    \ifx\@nil#1\expandafter\@gobble
+         \else \ifx\@empty#1\else #1/\fi \fi
+    \lst@MakePath@@}
+\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}}
+\def\lstinputlisting{%
+    \begingroup \lst@setcatcodes \lst@inputlisting}
+\newcommand\lst@inputlisting[2][]{%
+    \endgroup
+    \def\lst@set{#1}%
+    \IfFileExists{\lst@inputpath#2}%
+        {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}%
+        {\filename@parse{\lst@inputpath#2}%
+         \edef\reserved@a{\noexpand\lst@MissingFileError
+             {\filename@area\filename@base}%
+             {\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+         \reserved@a}%
+    \lst@doendpe \@newlistfalse \ignorespaces}
+\def\lst@MissingFileError#1#2{%
+    \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J%
+        ^^JType X to quit or <RETURN> to proceed,^^J%
+        or enter new name. (Default extension: #2)^^J}%
+    \message{Enter file name: }%
+    {\endlinechar\m@ne \global\read\m@ne to\@gtempa}%
+    \ifx\@gtempa\@empty \else
+        \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \filename@parse\@gtempa
+        \edef\filename@ext{%
+            \ifx\filename@ext\relax#2\else\filename@ext\fi}%
+        \edef\reserved@a{\noexpand\IfFileExists %
+                {\filename@area\filename@base.\filename@ext}%
+            {\noexpand\lst@InputListing %
+                {\filename@area\filename@base.\filename@ext}}%
+            {\noexpand\lst@MissingFileError
+                {\filename@area\filename@base}{\filename@ext}}}%
+        \expandafter\reserved@a %
+    \fi}
+\let\lst@ifdraft\iffalse
+\DeclareOption{draft}{\let\lst@ifdraft\iftrue}
+\DeclareOption{final}{\let\lst@ifdraft\iffalse}
+\lst@AddToHook{PreSet}
+    {\lst@ifdraft
+         \let\lst@ifprint\iffalse
+         \@gobbletwo\fi\fi
+     \fi}
+\def\lst@InputListing#1{%
+    \begingroup
+      \lsthk@PreSet \gdef\lst@intname{#1}%
+      \expandafter\lstset\expandafter{\lst@set}%
+      \lsthk@DisplayStyle
+      \catcode\active=\active
+      \lst@Init\relax \let\lst@gobble\z@
+      \lst@SkipToFirst
+      \lst@ifprint \def\lst@next{\input{#1}}%
+             \else \let\lst@next\@empty \fi
+      \lst@next
+      \lst@DeInit
+    \endgroup}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \lst@LeaveMode \global\lst@newlines\z@
+        \lsthk@InitVarsBOL
+        \expandafter\lst@BOLGobble
+    \fi}
+\def\lstenv@DroppedWarning{%
+    \ifx\lst@dropped\@undefined\else
+        \PackageWarning{Listings}{Text dropped after begin of listing}%
+    \fi}
+\let\lst@dropped\@undefined % init
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lstenv@Process#1{%
+    \ifx~#1%
+        \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst
+    \else\ifx^^J#1%
+        \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ
+    \else
+        \let\lst@dropped#1\let\lst@next\lstenv@Process
+    \fi \fi
+    \lst@next}
+}\endgroup
+\def\lstenv@ProcessJ{%
+    \let\lst@arg\@empty
+    \ifx\@currenvir\lstenv@name
+        \expandafter\lstenv@ProcessJEnv
+    \else
+        \expandafter\def\expandafter\lst@temp\expandafter##1%
+            \csname end\lstenv@name\endcsname
+                {\lst@InsideConvert{##1}\lstenv@ProcessJ@}%
+        \expandafter\lst@temp
+    \fi}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@ProcessJ@{%
+    \lst@lExtend\lst@arg
+        {\expandafter\ \expandafter~\lstenv@endstring}%
+    \catcode10=\active \lst@Let{10}\lst@MProcessListing
+    \lst@SkipToFirst \lst@arg}
+}\endgroup
+\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}%
+    \ifx\lstenv@name\lst@temp
+        \lst@InsideConvert{#1}%
+        \expandafter\lstenv@ProcessJ@
+    \else
+        \lst@InsideConvert{#1\\end\{#2\}}%
+        \expandafter\lstenv@ProcessJEnv
+    \fi}
+\def\lstenv@backslash{%
+    \lst@IfNextChars\lstenv@endstring
+        {\lstenv@End}%
+        {\expandafter\lsts@backslash \lst@eaten}}%
+\def\lstenv@End{%
+    \ifx\@currenvir\lstenv@name
+        \edef\lst@next{\noexpand\end{\lstenv@name}}%
+    \else
+        \def\lst@next{\csname end\lstenv@name\endcsname}%
+    \fi
+    \lst@next}
+\lst@UserCommand\lstnewenvironment#1#2#{%
+    \@ifundefined{#1}%
+        {\let\lst@arg\@empty
+         \lst@XConvert{#1}\@nil
+         \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}%
+        {\PackageError{Listings}{Environment `#1' already defined}\@eha
+         \@gobbletwo}}
+\def\@tempa#1#2#3{%
+\gdef\lstnewenvironment@##1##2##3##4##5{%
+    \begingroup
+    \global\@namedef{end##2}{\lstenv@Error{##2}}%
+    \global\@namedef{##2}{\def\lstenv@name{##2}%
+        \begingroup \lst@setcatcodes \catcode\active=\active
+        \csname##2@\endcsname}%
+    \let\l@ngrel@x\global
+    \let\@xargdef\lstenv@xargdef
+    \expandafter\new@command\csname##2@\endcsname##3%
+        {\lsthk@PreSet ##4%
+         \ifx\@currenvir\lstenv@name
+             \def\lstenv@endstring{#1#2##1#3}%
+         \else
+             \def\lstenv@endstring{#1##1}%
+         \fi
+         \@namedef{end##2}{\lst@DeInit ##5\endgroup
+                          \lst@doendpe \@ignoretrue}%
+         \lsthk@DisplayStyle
+         \let\lst@EndProcessListing\lstenv@SkipToEnd
+         \lst@Init\lstenv@backslash
+         \lst@ifprint
+             \expandafter\expandafter\expandafter\lstenv@Process
+         \else
+             \expandafter\lstenv@SkipToEnd
+         \fi
+         \lst@insertargs}%
+    \endgroup}%
+}
+\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil
+\expandafter\@tempa\lst@arg
+\let\lst@insertargs\@empty
+\def\lstenv@xargdef#1{
+    \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1}
+\def\lstenv@xargdef@#1#2[#3][#4]#5{%
+  \@ifdefinable#2{%
+       \gdef#2{%
+          \ifx\protect\@typeset@protect
+            \expandafter\lstenv@testopt
+          \else
+            \@x@protect#2%
+          \fi
+          #1%
+          {#4}}%
+       \@yargdef
+          #1%
+           \tw@
+           {#3}%
+           {#5}}}
+\long\def\lstenv@testopt#1#2{%
+  \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}%
+               {#1[{#2}]}}
+\def\lstenv@testopt@#1[#2]{%
+    \catcode\active\active
+    #1[#2]}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@SkipToEnd{%
+    \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter
+        1\expandafter~\lstenv@endstring{\lstenv@End}%
+    \lst@temp}
+}\endgroup
+\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}%
+    {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lst@TestEOLChar#1{%
+    \def\lst@insertargs{#1}%
+    \ifx ~#1\@empty \else
+    \ifx^^J#1\@empty \else
+        \global\let\lst@intname\lst@insertargs
+        \let\lst@insertargs\@empty
+    \fi \fi}
+}\endgroup
+\lstnewenvironment{lstlisting}[2][]
+    {\lst@TestEOLChar{#2}%
+     \lstset{#1}%
+     \csname\@lst @SetFirstNumber\endcsname}
+    {\csname\@lst @SaveFirstNumber\endcsname}
+\lst@Key{fancyvrb}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@iffancyvrb
+    \lstFV@fancyvrb}
+\ifx\lstFV@fancyvrb\@undefined
+    \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb}
+\fi
+\@ifundefined{ocp}{}
+    {\lst@AddToHook{OutputBox}%
+         {\let\lst@ProcessLetter\@firstofone
+          \let\lst@ProcessDigit\@firstofone
+          \let\lst@ProcessOther\@firstofone}}
+\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax}
+\def\lst@ProcessOption#1#2\relax{%
+    \ifx #1!%
+        \lst@DeleteKeysIn\lst@loadaspects{#2}%
+    \else
+        \lst@lAddTo\lst@loadaspects{,#1#2}%
+    \fi}
+\@ifundefined{lst@loadaspects}
+  {\def\lst@loadaspects{strings,comments,escape,style,language,%
+      keywords,labels,lineshape,frames,emph,index}%
+  }{}
+\InputIfFileExists{lstpatch.sty}{}{}
+\let\lst@ifsavemem\iffalse
+\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue}
+\DeclareOption{noaspects}{\let\lst@loadaspects\@empty}
+\ProcessOptions
+\lst@RequireAspects\lst@loadaspects
+\let\lst@loadaspects\@empty
+\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle}
+\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage}
+\InputIfFileExists{listings.cfg}{}{}
+\InputIfFileExists{lstlocal.cfg}{}{}
+\endinput
+%%
+%% End of file `listings.sty'.
Index: doc/LaTeXmacros/listings/lstdoc.sty
===================================================================
--- doc/LaTeXmacros/listings/lstdoc.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstdoc.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,454 @@
+%%
+%% This is file `lstdoc.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% listings.dtx  (with options: `doc')
+%% 
+%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\def\filedate{2015/06/04}
+\def\fileversion{1.6}
+\ProvidesPackage{lstdoc}
+             [\filedate\space\fileversion\space(Carsten Heinz)]
+\let\lstdoc@currversion\fileversion
+\RequirePackage[writefile]{listings}[2004/09/07]
+\newif\iffancyvrb \IfFileExists{fancyvrb.sty}{\fancyvrbtrue}{}
+\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{}
+\lst@false
+\newif\ifhyper
+\@ifundefined{pdfoutput}
+    {}
+    {\ifnum\pdfoutput>\z@ \lst@true \fi}
+\@ifundefined{VTeXversion}
+    {}
+    {\ifnum\OpMode>\z@ \lst@true \fi}
+\lst@if \IfFileExists{hyperref.sty}{\hypertrue}{}\fi
+\newif\ifalgorithmicpkg \IfFileExists{algorithmic.sty}{\algorithmicpkgtrue}{}
+\newif\iflgrind \IfFileExists{lgrind.sty}{\lgrindtrue}{}
+\iffancyvrb \RequirePackage{fancyvrb}\fi
+\ifhyper \RequirePackage[colorlinks]{hyperref}\else
+    \def\href#1{\texttt}\fi
+\ifcolor \RequirePackage{color}\fi
+\ifalgorithmicpkg \RequirePackage{algorithmic}\fi
+\iflgrind \RequirePackage{lgrind}\fi
+\RequirePackage{nameref}
+\RequirePackage{url}
+\renewcommand\ref{\protect\T@ref}
+\renewcommand\pageref{\protect\T@pageref}
+\def\lst@BeginRemark#1{%
+    \begin{quote}\topsep0pt\let\small\footnotesize\small#1:}
+\def\lst@EndRemark{\end{quote}}
+\newenvironment{TODO}
+    {\lst@BeginRemark{To do}}{\lst@EndRemark}
+\newenvironment{ALTERNATIVE}
+    {\lst@BeginRemark{Alternative}}{\lst@EndRemark}
+\newenvironment{REMOVED}
+    {\lst@BeginRemark{Removed}}{\lst@EndRemark}
+\newenvironment{OLDDEF}
+    {\lst@BeginRemark{Old definition}}{\lst@EndRemark}
+\def\advise{\par\list\labeladvise
+    {\advance\linewidth\@totalleftmargin
+     \@totalleftmargin\z@
+     \@listi
+     \let\small\footnotesize \small\sffamily
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep6\p@ \@plus1\p@\@minus2\p@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\let\endadvise\endlist
+\def\advisespace{\hbox{}\qquad}
+\def\labeladvise{$\to$}
+\newenvironment{syntax}
+   {\list{}{\itemindent-\leftmargin
+    \def\makelabel##1{\hss\lst@syntaxlabel##1,,,,\relax}}}
+   {\endlist}
+\def\lst@syntaxlabel#1,#2,#3,#4\relax{%
+    \llap{\scriptsize\itshape#3}%
+    \def\lst@temp{#2}%
+    \expandafter\lst@syntaxlabel@\meaning\lst@temp\relax
+    \rlap{\hskip-\itemindent\hskip\itemsep\hskip\linewidth
+          \llap{\ttfamily\lst@temp}\hskip\labelwidth
+          \def\lst@temp{#1}%
+          \ifx\lst@temp\lstdoc@currversion#1\fi}}
+\def\lst@syntaxlabel@#1>#2\relax
+    {\edef\lst@temp{\zap@space#2 \@empty}}
+\newcommand*\syntaxnewline{\newline\hbox{}\kern\labelwidth}
+\newcommand*\syntaxor{\qquad or\qquad}
+\newcommand*\syntaxbreak
+    {\hfill\kern0pt\discretionary{}{\kern\labelwidth}{}}
+\let\syntaxfill\hfill
+\def\alternative#1{\lst@true \alternative@#1,\relax,}
+\def\alternative@#1,{%
+    \ifx\relax#1\@empty
+        \expandafter\@gobble
+    \else
+        \ifx\@empty#1\@empty\else
+            \lst@if \lst@false \else $\vert$\fi
+            \textup{\texttt{#1}}%
+        \fi
+    \fi
+    \alternative@}
+\long\def\m@cro@#1#2#3{\endgroup \topsep\MacroTopsep \trivlist
+  \edef\saved@macroname{\string#3}%
+  \def\makelabel##1{\llap{##1}}%
+  \if@inlabel
+    \let\@tempa\@empty \count@\macro@cnt
+    \loop \ifnum\count@>\z@
+      \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+    \edef\makelabel##1{\llap{\vtop to\baselineskip
+                               {\@tempa\hbox{##1}\vss}}}%
+    \advance \macro@cnt \@ne
+  \else  \macro@cnt\@ne  \fi
+  \edef\@tempa{\noexpand\item[%
+     #1%
+       \noexpand\PrintMacroName
+     \else
+       \expandafter\noexpand\csname Print#2Name\endcsname % MODIFIED
+     \fi
+     {\string#3}]}%
+  \@tempa
+  \global\advance\c@CodelineNo\@ne
+   #1%
+      \SpecialMainIndex{#3}\nobreak
+      \DoNotIndex{#3}%
+   \else
+      \csname SpecialMain#2Index\endcsname{#3}\nobreak % MODIFIED
+   \fi
+  \global\advance\c@CodelineNo\m@ne
+  \ignorespaces}
+\def\macro{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iftrue {Macro}}% MODIFIED
+\def\environment{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iffalse {Env}}% MODIFIED
+\def\newdocenvironment#1#2#3#4{%
+    \@namedef{#1}{#3\begingroup \catcode`\\12\relax
+                  \MakePrivateLetters \m@cro@ \iffalse {#2}}%
+    \@namedef{end#1}{#4\endmacro}%
+    \@ifundefined{Print#2Name}{\expandafter
+        \let\csname Print#2Name\endcsname\PrintMacroName}{}%
+    \@ifundefined{SpecialMain#2Index}{\expandafter
+        \let\csname SpecialMain#2Index\endcsname\SpecialMainIndex}{}}
+\newdocenvironment{aspect}{Aspect}{}{}
+\def\PrintAspectName#1{}
+\def\SpecialMainAspectIndex#1{%
+    \@bsphack
+    \index{aspects:\levelchar\protect\aspectname{#1}}%
+    \@esphack}
+\newdocenvironment{lstkey}{Key}{}{}
+\def\PrintKeyName#1{\strut\keyname{#1}\ }
+\def\SpecialMainKeyIndex#1{%
+    \@bsphack
+    \index{keys\levelchar\protect\keyname{#1}}%
+    \@esphack}
+\newcounter{argcount}
+\def\labelargcount{\texttt{\#\arabic{argcount}}\hskip\labelsep$=$}
+\def\macroargs{\list\labelargcount
+    {\usecounter{argcount}\leftmargin=2\leftmargin
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep4\p@ \@plus\p@ \@minus2\p@
+     \itemsep\z@ \@plus\z@ \@minus\z@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\def\endmacroargs{\endlist\@endparenv}
+\lst@RequireAspects{writefile}
+\newbox\lst@samplebox
+\lstnewenvironment{lstsample}[3][]
+    {\global\let\lst@intname\@empty
+     \gdef\lst@sample{#2}%
+     \setbox\lst@samplebox=\hbox\bgroup
+         \setkeys{lst}{language={},style={},tabsize=4,gobble=5,%
+             basicstyle=\small\ttfamily,basewidth=0.51em,point={#1}}
+         #3%
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\lst@EndWriteFile\egroup
+     \ifdim \wd\lst@samplebox>.5\linewidth
+         \begin{center}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{center}%
+         \lst@sampleInput
+     \else
+         \begin{center}%
+         \begin{minipage}{0.45\linewidth}\lst@sampleInput\end{minipage}%
+         \qquad
+         \begin{minipage}{0.45\linewidth}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{minipage}%
+         \end{center}%
+     \fi}
+\lst@InstallKeywords{p}{point}{pointstyle}\relax{keywordstyle}{}ld
+\lstnewenvironment{lstxsample}[1][]
+    {\begingroup
+         \setkeys{lst}{belowskip=-\medskipamount,language={},style={},%
+             tabsize=4,gobble=5,basicstyle=\small\ttfamily,%
+             basewidth=0.51em,point={#1}}
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\endgroup
+     \endgroup}
+\def\lst@sampleInput{%
+    \MakePercentComment\catcode`\^^M=10\relax
+    \small\lst@sample
+    {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}%
+                                  {\lst@ProcessTabulator}}%
+     \leavevmode \input{\jobname.tmp}}\MakePercentIgnore}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+                                      {1.25ex \@plus1ex \@minus.2ex}%
+                                      {-1em}%
+                                      {\normalfont\normalsize\bfseries}}
+\def\lstref#1{\emph{\ref{#1} \nameref{#1}}}
+\def\@part[#1]#2{\ifhyper\phantomsection\fi
+    \addcontentsline{toc}{part}{#1}%
+    {\parindent\z@ \raggedright \interlinepenalty\@M
+     \normalfont \huge \bfseries #2\markboth{}{}\par}%
+    \nobreak\vskip 3ex\@afterheading}
+\renewcommand*\l@section[2]{%
+    \addpenalty\@secpenalty
+    \addvspace{.25em \@plus\p@}%
+    \setlength\@tempdima{1.5em}%
+    \begingroup
+      \parindent \z@ \rightskip \@pnumwidth
+      \parfillskip -\@pnumwidth
+      \leavevmode
+      \advance\leftskip\@tempdima
+      \hskip -\leftskip
+      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+    \endgroup}
+\renewcommand*\l@subsection{\@dottedtocline{2}{0pt}{2.3em}}
+\renewcommand*\l@subsubsection{\@dottedtocline{3}{0pt}{3.2em}}
+\newcommand\ikeyname[1]{%
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \keyname{#1}}
+\newcommand\ekeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack}
+\newcommand\rkeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack{\rstyle\keyname{#1}}}
+\newcommand\icmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\string#1}}
+\newcommand\rcmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\rstyle\string#1}}
+\def\lstaspectindex#1#2{%
+    \global\@namedef{lstkandc@\string#1}{}%
+    \@ifundefined{lstisaspect@\string#1}
+        {\index{unknown\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+        {\index{\@nameuse{lstisaspect@\string#1}\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+}
+\def\lstkeyindex#1#2{%
+}
+\def\lstisaspect[#1]#2{%
+    \global\@namedef{lstaspect@#1}{#2}%
+    \lst@AddTo\lst@allkeysandcmds{,#2}%
+    \@for\lst@temp:=#2\do
+    {\ifx\@empty\lst@temp\else
+         \global\@namedef{lstisaspect@\lst@temp}{#1}%
+     \fi}}
+\gdef\lst@allkeysandcmds{}
+\def\lstprintaspectkeysandcmds#1{%
+    \lst@true
+    \expandafter\@for\expandafter\lst@temp
+    \expandafter:\expandafter=\csname lstaspect@#1\endcsname\do
+    {\lst@if\lst@false\else, \fi \texttt{\lst@temp}}}
+\def\lstcheckreference{%
+   \@for\lst@temp:=\lst@allkeysandcmds\do
+   {\ifx\lst@temp\@empty\else
+        \@ifundefined{lstkandc@\lst@temp}
+        {\typeout{\lst@temp\space not in reference guide?}}{}%
+    \fi}}
+\newcommand*\lst{\texttt{lst}}
+\newcommand*\Cpp{C\texttt{++}}
+\let\keyname\texttt
+\let\keyvalue\texttt
+\let\hookname\texttt
+\newcommand*\aspectname[1]{{\normalfont\sffamily#1}}
+\DeclareRobustCommand\packagename[1]{%
+    {\leavevmode\text@command{#1}%
+     \switchfontfamily\sfdefault\rmdefault
+     \check@icl #1\check@icr
+     \expandafter}}%
+\renewcommand\packagename[1]{{\normalfont\sffamily#1}}
+\def\switchfontfamily#1#2{%
+    \begingroup\xdef\@gtempa{#1}\endgroup
+    \ifx\f@family\@gtempa\fontfamily#2%
+                    \else\fontfamily#1\fi
+    \selectfont}
+\ifcolor
+    \definecolor{darkgreen}{rgb}{0,0.5,0}
+    \def\rstyle{\color{darkgreen}}
+\else
+    \let\rstyle\empty
+\fi
+\gdef\lst@emails{}
+\newcommand*\lstthanks[2]
+    {#1\lst@AddTo\lst@emails{,#1,<#2>}%
+     \ifx\@empty#2\@empty\typeout{Missing email for #1}\fi}
+\newcommand*\lsthelper[3]
+    {{\let~\ #1}%
+     \lst@IfOneOf#1\relax\lst@emails
+     {}{\typeout{^^JWarning: Unknown helper #1.^^J}}}
+\lstdefinelanguage[doc]{Pascal}{%
+  morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+     do,downto,else,end,false,file,for,function,get,goto,if,in,%
+     integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+     procedure,put,read,readln,real,record,repeat,reset,rewrite,set,%
+     text,then,to,true,type,unpack,until,var,while,with,write,writeln},%
+  sensitive=false,%
+  morecomment=[s]{(*}{*)},%
+  morecomment=[s]{\{}{\}},%
+  morestring=[d]{'}}
+\lstdefinestyle{}
+    {basicstyle={},%
+     keywordstyle=\bfseries,identifierstyle={},%
+     commentstyle=\itshape,stringstyle={},%
+     numberstyle={},stepnumber=1,%
+     pointstyle=\pointstyle}
+\def\pointstyle{%
+    {\let\lst@um\@empty \xdef\@gtempa{\the\lst@token}}%
+    \expandafter\lstkeyindex\expandafter{\@gtempa}{}%
+    \expandafter\lstaspectindex\expandafter{\@gtempa}{}%
+    \rstyle}
+\lstset{defaultdialect=[doc]Pascal,language=Pascal,style={}}
+\def\lstscanlanguages#1#2#3{%
+    \begingroup
+        \def\lst@DefDriver@##1##2##3##4[##5]##6{%
+           \lst@false
+           \lst@lAddTo\lst@scan{##6(##5),}%
+           \begingroup
+           \@ifnextchar[{\lst@XDefDriver{##1}##3}{\lst@DefDriver@@##3}}%
+        \def\lst@XXDefDriver[##1]{}%
+        \lst@InputCatcodes
+        \def\lst@dontinput{#3}%
+        \let\lst@scan\@empty
+        \lst@for{#2}\do{%
+            \lst@IfOneOf##1\relax\lst@dontinput
+                {}%
+                {\InputIfFileExists{##1}{}{}}}%
+        \global\let\@gtempa\lst@scan
+    \endgroup
+    \let#1\@gtempa}
+\def\lstprintlanguages#1{%
+    \def\do##1{\setbox\@tempboxa\hbox{##1\space\space}%
+        \ifdim\wd\@tempboxa<.5\linewidth \wd\@tempboxa.5\linewidth
+                                   \else \wd\@tempboxa\linewidth \fi
+        \box\@tempboxa\allowbreak}%
+    \begin{quote}
+      \par\noindent
+      \hyphenpenalty=\@M \rightskip=\z@\@plus\linewidth\relax
+      \lst@BubbleSort#1%
+      \expandafter\lst@NextLanguage#1\relax(\relax),%
+    \end{quote}}
+\def\lst@NextLanguage#1(#2),{%
+    \ifx\relax#1\else
+        \def\lst@language{#1}\def\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \fi}
+\def\lst@NextLanguage@#1(#2),{%
+    \def\lst@temp{#1}%
+    \ifx\lst@temp\lst@language
+        \lst@lAddTo\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \else
+        \do{\lst@language
+        \ifx\lst@dialects\lst@emptydialect\else
+            \expandafter\lst@NormedDef\expandafter\lst@language
+                \expandafter{\lst@language}%
+            \space(%
+            \lst@BubbleSort\lst@dialects
+            \expandafter\lst@PrintDialects\lst@dialects(\relax),%
+            )%
+        \fi}%
+        \def\lst@next{\lst@NextLanguage#1(#2),}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@emptydialect{(),}
+\def\lst@PrintDialects(#1),{%
+    \ifx\@empty#1\@empty empty\else
+        \lst@PrintDialect{#1}%
+    \fi
+    \lst@PrintDialects@}
+\def\lst@PrintDialects@(#1),{%
+    \ifx\relax#1\else
+        , \lst@PrintDialect{#1}%
+        \expandafter\lst@PrintDialects@
+    \fi}
+\def\lst@PrintDialect#1{%
+    \lst@NormedDef\lst@temp{#1}%
+    \expandafter\ifx\csname\@lst dd@\lst@language\endcsname\lst@temp
+        \texttt{\underbar{#1}}%
+    \else
+        \texttt{#1}%
+    \fi}
+\def\lst@IfLE#1#2\@empty#3#4\@empty{%
+    \ifx #1\relax
+        \let\lst@next\@firstoftwo
+    \else \ifx #3\relax
+        \let\lst@next\@secondoftwo
+    \else
+        \lowercase{\ifx#1#3}%
+            \def\lst@next{\lst@IfLE#2\@empty#4\@empty}%
+        \else
+            \lowercase{\ifnum`#1<`#3}\relax
+                \let\lst@next\@firstoftwo
+            \else
+                \let\lst@next\@secondoftwo
+            \fi
+        \fi
+    \fi \fi
+    \lst@next}
+\def\lst@BubbleSort#1{%
+    \ifx\@empty#1\else
+        \lst@false
+        \expandafter\lst@BubbleSort@#1\relax,\relax,%
+        \expandafter\lst@BubbleSort@\expandafter,\lst@sorted
+                                      \relax,\relax,%
+        \let#1\lst@sorted
+        \lst@if
+            \def\lst@next{\lst@BubbleSort#1}%
+            \expandafter\expandafter\expandafter\lst@next
+        \fi
+    \fi}
+\def\lst@BubbleSort@#1,#2,{%
+    \ifx\@empty#1\@empty
+        \def\lst@sorted{#2,}%
+        \def\lst@next{\lst@BubbleSort@@}%
+    \else
+        \let\lst@sorted\@empty
+        \def\lst@next{\lst@BubbleSort@@#1,#2,}%
+    \fi
+    \lst@next}
+\def\lst@BubbleSort@@#1,#2,{%
+    \ifx\relax#1\else
+        \ifx\relax#2%
+            \lst@lAddTo\lst@sorted{#1,}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@@
+        \else
+            \lst@IfLE #1\relax\@empty #2\relax\@empty
+                          {\lst@lAddTo\lst@sorted{#1,#2,}}%
+                {\lst@true \lst@lAddTo\lst@sorted{#2,#1,}}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@
+        \fi
+    \fi}
+\def\lst@BubbleSort@@@#1\relax,{}
+\endinput
+%%
+%% End of file `lstdoc.sty'.
Index: doc/LaTeXmacros/listings/lstdrvrs.dtx
===================================================================
--- doc/LaTeXmacros/listings/lstdrvrs.dtx	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstdrvrs.dtx	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,7494 @@
+% \iffalse
+%
+% $Id: lstdrvrs.dtx 200 2015-06-04 18:59:32Z j_hoffmann $
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{lstdoc, textcomp}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+    \DocInput{lstdrvrs.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \DoNotIndex{\[,\{,\},\],\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\`,\,,\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\askforoverwritefalse,\askforoverwritetrue,\batchfile}
+% \DoNotIndex{\begin,\def,\else,\@empty,\end,\endpreamble,\expandafter}
+% \DoNotIndex{\fi,\file,\from,\gdef,\generate,\ifnum,\ifx,\input}
+% \DoNotIndex{\keepsilent,\lccode,\let,\lowercase,\preamble,\relax}
+% \DoNotIndex{\undefined}
+%
+%
+% \newbox\abstractbox
+% \setbox\abstractbox=\vbox{
+%	\begin{abstract}
+%	This article describes the implementation of the language drivers for
+%	the \packagename{listings} package.
+%	\end{abstract}}
+%
+% \title{Language, Style and Format drivers\\ for \textsf{Listings}\\ {\large by Carsten Heinz and individual authors:}}
+% \author{\InputIfFileExists{lstdrvrs.tmp}{}{}}
+% \date{2015/06/04\enspace\enspace Version 1.6\ \box\abstractbox}
+%
+% \hypersetup{pdfsubject=Language definitions,pdfauthor=Jobst Hoffmann
+%    <j.hoffmann-(at)-fh-aachen.de>}
+%
+% \maketitle
+%
+% \newwrite\authors \immediate\openout\authors lstdrvrs.tmp\relax
+% \gdef\lstthanks#1#2#3{#1\global\let\lstthanks\lstthanksb\lstwrite{#1}}
+% \gdef\lstthanksb#1#2#3{#1\lstwrite{\string\and\space#1}}
+% \gdef\lstwrite#1{\begingroup\let~\space\def\"{\string\"}\def\'{\string\'}\immediate\write\authors{#1}\endgroup}
+%
+% \renewcommand*\lsthelper[4]{#1}
+%
+% \newif\ifmulticols
+% \IfFileExists{multicol.sty}{\multicolstrue}{}
+%
+% \ifmulticols
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+% \fi
+%
+% \tableofcontents
+%
+%
+% \section{Installation and configuration}
+% \label{sec:installation}
+%
+% \begingroup
+%    \begin{macrocode}
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*install>
+\input docstrip
+\preamble
+\endpreamble
+
+\ifToplevel{
+\usedir{tex/latex/listings}
+\keepsilent
+\askonceonly
+}
+
+
+\generate{
+    \file{lstlang1.sty}{\from{lstdrvrs.dtx}{lang1}}
+    \file{lstlang2.sty}{\from{lstdrvrs.dtx}{lang2}}
+    \file{lstlang3.sty}{\from{lstdrvrs.dtx}{lang3}}
+}
+
+\generate{
+    \file{listings-acm.prf}{\from{lstdrvrs.dtx}{acm-prf}}
+    \file{listings-bash.prf}{\from{lstdrvrs.dtx}{bash-prf}}
+    \file{listings-fortran.prf}{\from{lstdrvrs.dtx}{fortran-prf}}
+    \file{listings-lua.prf}{\from{lstdrvrs.dtx}{lua-prf}}
+    \file{listings-python.prf}{\from{lstdrvrs.dtx}{python-prf}}
+}
+
+
+\ifToplevel{
+\Msg{*}
+\Msg{* You probably need to move all created `.sty' and `.cfg'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{*}
+\Msg{* Run `lstdrvrs.dtx' through LaTeX2e to get the documentation.}
+\Msg{*}
+}
+
+\endbatchfile
+%</install>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*config>
+%    \end{macrocode}
+% \endgroup
+% We mainly define default dialects.
+%    \begin{macrocode}
+\ProvidesFile{listings.cfg}[2015/06/04 1.6 listings configuration]
+\def\lstlanguagefiles
+    {lstlang0.sty,lstlang1.sty,lstlang2.sty,lstlang3.sty}
+\lstset{defaultdialect=[R/3 6.10]ABAP,
+        defaultdialect=[2005]Ada,
+        defaultdialect=[68]Algol,
+        defaultdialect=[gnu]Awk,
+        defaultdialect=[ANSI]C,
+        defaultdialect=[light]Caml,
+        defaultdialect=[1985]Cobol,
+        defaultdialect=[WinXP]command.com,
+        defaultdialect=[ISO]C++,
+        defaultdialect=[95]Fortran,
+        defaultdialect=[5.2]Mathematica,
+        defaultdialect=[OMG]OCL,
+        defaultdialect=[Standard]Pascal,
+        defaultdialect=[67]Simula,
+        defaultdialect=[plain]TeX,
+        defaultdialect=[97]VRML}
+\lstalias[]{TclTk}[tk]{tcl}
+%    \end{macrocode}
+% And now some shortcuts for the ABAP versions (provided by Knut Lickert).
+% I (Knut) think the leading R/2, R/3 is not necessary (The support for R/2
+% is finished). The version number with letter is important for the
+% runtime-system, but the programming language should be the same
+% for each version.
+%    \begin{macrocode}
+\lstalias[6.1]{ABAP}[R/3 6.10]{ABAP}
+\lstalias[3.1]{ABAP}[R/3 3.1C]{ABAP}
+\lstalias[4.6]{ABAP}[R/3 4.6C]{ABAP}
+%    \end{macrocode}
+% \begingroup
+%    \begin{macrocode}
+%</config>
+%    \end{macrocode}
+% \endgroup
+%
+%    \begin{macrocode}
+%<+lang1>\ProvidesFile{lstlang1.sty}
+%<+lang2>\ProvidesFile{lstlang2.sty}
+%<+lang3>\ProvidesFile{lstlang3.sty}
+%<+acm-prf>\ProvidesFile{listings-acm.prf}
+%<+bash-prf>\ProvidesFile{listings-bash.prf}
+%<+fortran-prf>\ProvidesFile{listings-fortran.prf}
+%<+lua-prf>\ProvidesFile{listings-lua.prf}
+%<+python-prf>\ProvidesFile{listings-python.prf}
+%<-config>    [2015/06/04 1.6 listings language file]
+%    \end{macrocode}
+%
+%
+% \section{Language drivers}
+%
+%
+% \subsection{Abap}
+%
+% \lstthanks{Knut Lickert}{knut.lickert@gmx.de}{2000/08/01,2001/12/29,2002/04/11}
+% added support for Abap.\footnote{In this section `I' is Knut Lickert.}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Abap definition by Knut Lickert
+%%
+%    \end{macrocode}
+%
+% There are some other new commands in release 6.10.
+% They will follow later, but up to now I don't work
+% with 6.10.
+%
+%    \begin{macrocode}
+\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}%
+  {morekeywords={try,endtry},%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}%
+  {morekeywords={method,ref,class,create,object,%
+        methods,endmethod,private,protected,public,section,%
+        catch,system-exceptions,endcatch,%
+        },%
+   moreprocnamekeys={class},%
+   literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,%
+  }[keywords,comments,strings,procnames]
+%    \end{macrocode}
+% Yes there are also some more releases in R/3 (2.1\ldots), but I
+% know them not really. So let's start with R/3~3.1.
+%    \begin{macrocode}
+\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}%
+%    \end{macrocode}
+% As I remember all this commands exists in R/2. Many commands are
+% new in R/2~5.0 (compared with R/2 4.3). But as I am not using
+% R/2~4.3 any more, I start with R/2~5.0.
+%    \begin{macrocode}
+\lst@definelanguage[R/2 5.0]{ABAP}%
+  {sensitive=f,%
+   procnamekeys={report,program,form,function,module},%
+   morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,%
+        authority-check,before,binary,blank,break-point,calendar,call,%
+        case,change,changing,check,clear,cnt,co,collect,commit,common,%
+        component,compute,condense,corresponding,cos,cp,cs,currency-conversion,%
+        cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,%
+        describe,detail,dialog,directory,div,divide,do,documentation,%
+        during,dynpro,else,end-of-page,end-of-selection,endat,endcase,%
+        enddo,endfor,endform,endif,endloop,endmodule,endselect,%
+        endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,%
+        field,fields,field-groups,field-symbols,find,for,form,format,free,%
+        from,function,generating,get,giving,hide,id,if,import,%
+        importing,in,incl,include,initial,initialization,input,insert,%
+        interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count,
+        line-selection,list-processing,load,local,log,logfile,loop,%
+        margin,mark,mask,memory,menue,message,mod,modify,module,move,%
+        move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,%
+        number,obligatory,occurs,of,on,or,others,output,parameter,%
+        parameters,parts,perform,pf-status,places,position,process,%
+        raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,%
+        replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,%
+        segments,select,select-options,selection-screen,set,shift,sin,%
+        single,sqrt,start-of-selection,statement,structure,submit,%
+        subtract,summary,summing,suppress,system,table,tables,task,%
+        text,time,to,top-of-page,trace,transaction,transfer,%
+        transfer-dynpro,translate,type,unpack,update,user-command,%
+        using,value,when,where,while,window,with,workfile,write,},%
+   morecomment=[l]",%
+   morecomment=[f][commentstyle][0]*,%
+   morestring=[d]'%
+  }[keywords,comments,strings,procnames]
+%    \end{macrocode}
+% This section for R/2~4.3 is not really maintained. It is just what I remember
+% of the past.
+%    \begin{macrocode}
+\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}%
+  {deletekeywords={function,importing,exporting,changing,exceptions,%
+        raise,raising}%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ACM}
+%
+% ACM is the language of the Aspen Custom Modeler
+% (\url{http://www.aspentech.com/products/aspen-custom-modeler.aspx}), the
+% language definition was provided by \lstthanks{Stefan Pinnow}{Stefan
+% Pinnow <Mo-Gul@gmx.net>}{2013/09/08}. It is intended for writing models.
+% \lsthelper{Maximilian~Dammann}{maximilian.dammann@tu-clausthal.de}
+% {2014/09/16}{missing keyword} pointed out the missing keyword ``Description''.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ACM and ACMscript definition
+%% (c) 2013 Stefan Pinnow
+%%
+\lst@definelanguage{ACM}{
+  morekeywords={
+    abs,After,acos,And,As,asin,atan,At,Call,Compatibility,Connect,cos,cosh,%
+    Create,Delay,Description,Difference,Do,Else,ElseIf,End,EndFor,EndIf,%
+    EndParallel,EndState,EndSwitch,EndText,EndWith,exp,External,Fixed,For,%
+    ForEach,Free,Global,Hidden,If,Implementation,In,Initial,Input,InterSection,%
+    IntegerSet,Invoke,Is,Language,Library,Link,Log10,LogE,Max,Min,Model,Of,%
+    Once,Options,Output,Parallel,Parameter,Pause,Port,Print,Private,%
+    Procedure,Product,Ramp,Repeat,Restart,Return,Round,Runs,Sigma,sin,sinh,%
+    Size,SnapShot,sqr,sqrt,SRamp,State,Stream,StringSet,Structure,Switch,%
+    SubRoutine,SymDiff,tan,tanh,Task,Text,Time,Then,Truncate,Union,Until,%
+    Uses,Variable,Wait,When,With,WithIn,WorkSpace%
+  },%
+  sensitive=false,%
+  morecomment=[l]{//},%
+  morecomment=[s]{/*}{*/},%
+  string=[b]{"},%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+% In addition to writing models there is a language ACMscript, which is
+% similar to VBScript. According to Stefan Pinnow this language is used for
+% writing scripts for the models.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{ACMscript}[]{VBScript}{%
+  morekeywords={%
+    ElseIf,False,In,Resume,True%
+  },%
+  deletekeywords={%
+    Abs,Array,Clear,CreateObject,CStr,Err,ForReading,ForWriting,%
+    OpenTextFile,Replace,WriteLine%
+  }%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Stefan Pinnow also supplied a definition of a style for printing ACM code:
+%    \begin{macrocode}
+%<*acm-prf>
+%    \end{macrocode}
+%    \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+\definecolor{Comments}{rgb}{0.00,0.50,0.00}
+\definecolor{KeyWords}{rgb}{0.00,0.00,0.63}
+\definecolor{Strings}{rgb}{0.84,0.00,0.00}
+
+\lstdefinestyle{ACM}{%
+  basicstyle=\scriptsize\ttfamily,%
+  keywordstyle=\color{KeyWords},%
+  showstringspaces=false,%
+  identifierstyle=\color{black},%
+  commentstyle=\color{Comments},%
+  stringstyle=\color{Strings},%
+  frame=shadowbox,%             % for ACM-Code scrartcl commented out
+%   frame=l,%                   % line on the left side
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}%
+%    \end{macrocode}
+% This code is provided in the file |listings-acm.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+%    \begin{macrocode}
+%</acm-prf>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ACSL}
+%
+% This language was provided by \lstthanks{Andreas~Matthias}{amat@kabsi.at}
+% {2000/03/21}. I'm sorry for forgetting to add this language for a long time.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ACSL definition (c) 2000 by Andreas Matthias
+%%
+\lst@definelanguage{ACSL}[90]{Fortran}%
+   {morekeywords={algorithm,cinterval,constant,derivative,discrete,%
+         dynamic,errtag,initial,interval,maxterval,minterval,%
+         merror,xerror,nsteps,procedural,save,schedule,sort,%
+         table,terminal,termt,variable},%
+    sensitive=false,%
+    morecomment=[l]!%
+   }[keywords, comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Ada}
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Barnes, John Gilbert Presslie}:
+%		\textbf{Programming in Ada plus language reference manual};
+%		{\copyright} 1991 Addison-Wesley Publishing Company, Inc.;
+%		ISBN 0-201-56539-0.
+% \end{itemize}
+% \lstthanks{Torsten~Neuer}{tneuer@inwise.de}{1998/11/23} added support for
+% Ada 95. I changed the definition to reduce the required string memory.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Ada 95 definition (c) Torsten Neuer
+%%
+%% Ada 2005 definition (c) 2006 Santiago Urue\~{n}a Pascual
+%%                              <Santiago.Uruena@upm.es>
+%%
+\lst@definelanguage[2005]{Ada}[95]{Ada}%
+  {morekeywords={interface,overriding,synchronized}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[95]{Ada}[83]{Ada}%
+  {morekeywords={abstract,aliased,protected,requeue,tagged,until}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[83]{Ada}%
+  {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,%
+      case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,%
+      exception,exit,for,function,generic,goto,if,in,is,limited,loop,%
+      mod,new,not,null,of,or,others,out,package,pragma,private,%
+      procedure,raise,range,record,rem,renames,return,reverse,select,%
+      separate,subtype,task,terminate,then,type,use,when,while,with,%
+      xor},%
+   sensitive=f,%
+   morecomment=[l]--,%
+   morestring=[m]",% percent not defined as stringizer so far
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Algol}
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Uwe Pape}:
+%		\textbf{Programmieren in ALGOL 60};
+%		{\copyright} 1973 Carl Hanser Verlag M\"unchen;
+%		ISBN 3-446-11605-2
+% \item
+%		\textsc{Frank G.\ Pagan}:
+%		\textbf{A practical guide to ALGOL 68};
+%		{\copyright} 1976 by John Wiley $\&$ Sohn Ltd.;
+%		ISBN 0-471-65746-8 (Cloth); ISBN 0-471-65747-6 (Pbk).
+% \end{itemize}
+% The definition of Algol 68 doesn't support comments enclosed by \rlap{/}c.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[68]{Algol}%
+% ??? should 'i' be a keyword
+  {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,%
+      char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,%
+      end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,%
+      goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,%
+      minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,%
+      overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,%
+      round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,%
+      timesab,to,true,union,up,upb,void,while},%
+   sensitive=f,% ???
+   morecomment=[s]{\#}{\#},%
+   keywordcomment={co,comment}%
+  }[keywords,comments,keywordcomments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[60]{Algol}%
+  {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,%
+      false,for,goto,if,integer,label,own,power,procedure,real,step,%
+      string,switch,then,true,until,value,while},%
+   sensitive=f,% ???
+   keywordcommentsemicolon={end}{else,end}{comment}%
+  }[keywords,keywordcomments]%
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Assembler}
+%
+% Credits go to \lstthanks{Michael~Franke}{-}{2006/05/13}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% Motorola 68K definition (c) 2006 Michael Franke
+%%
+\lst@definelanguage[Motorola68k]{Assembler}%
+ {morekeywords={ABCD,ADD,%
+ADDA,ADDI,ADDQ,ADDX,AND,ANDI,ASL,ASR,BCC,BLS,BCS,BLT,BEQ,BMI,BF,BNE,BGE,BPL,%
+BGT,BT,BHI,BVC,BLE,BVS,BCHG,BCLR,BRA,BSET,BSR,BTST,CHK,CLR,CMP,CMPA,CMPI,CMPM,%
+DBCC,DBLS,DBCS,DBLT,DBEQ,DBMI,DBF,DBNE,DBGE,DBPL,DBGT,DBT,DBHI,DBVC,DBLE,DBVS,DIVS,%
+DIVU,EOR,EORI,EXG,EXT,ILLEGAL,JMP,JSR,LEA,LINK,LSL,LSR,MOVE,MOVEA,MOVEM,MOVEP,MOVEQ,%
+MULS,MULU,NBCD,NEG,NEGX,NOP,NOT,OR,ORI,PEA,RESET,ROL,ROR,ROXL,ROXR,RTE,RTR,RTS,SBCD,%
+SCC,SLS,SCS,SLT,SEQ,SMI,SF,SNE,SGE,SPL,SGT,ST,SHI,SVC,SLE,SVS,STOP,SUB,SUBA,SUBI,SUBQ,%
+SUBX,SWAP,TAS,TRAP,TRAPV,TST,UNLK},%
+   sensitive=false,%
+   morecomment=[l]*,%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+% Credits go to \lstthanks{Andrew~Zabolotny}{zap@cobra.ru}{2002/07/05}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% x86masm definition (c) 2002 Andrew Zabolotny
+%%
+\lst@definelanguage[x86masm]{Assembler}%
+  {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,%
+      si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,%
+      db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,%
+      st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,%
+      btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,%
+      cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,%
+      inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,%
+      je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,%
+      jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,%
+      lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,%
+      loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,%
+      movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,%
+      popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,%
+      repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,%
+      setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,%
+      setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,%
+      setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,%
+      shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,%
+      test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,%
+      fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,%
+      fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,%
+      fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,%
+      fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,%
+      fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,%
+      fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},%
+   morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,%
+      .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,%
+      endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,%
+      .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,%
+      .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,%
+      ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,%
+      .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,%
+      name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.%
+      radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,%
+      .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,%
+      word,.xall,.xcref,.xlist},%
+   alsoletter=.,alsodigit=?,%
+   sensitive=f,%
+   morestring=[b]",%
+   morestring=[b]',%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Awk}
+%
+% Thanks to \lstthanks{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15} for
+% providing these definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%%
+%% awk definitions (c) Christoph Giess
+%%
+\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}%
+  {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,%
+      lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[POSIX]{Awk}%
+  {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,%
+      system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,%
+      index,length,match,split,sprintf,strtonum,sub,substr,tolower,%
+      toupper,if,while,do,for,break,continue,delete,exit,function,%
+      return},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Basic}
+%
+% Credits go to \lstthanks{Robert Frank}{rf7@ukc.ac.uk}{2002/07/05}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%%
+%% Visual Basic definition (c) 2002 Robert Frank
+%%
+\lst@definelanguage[Visual]{Basic}
+  {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,%
+      CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,%
+      Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,%
+      DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,%
+      DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,%
+      Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,%
+      GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,%
+      IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,%
+      IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,%
+      IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,%
+      Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,%
+      NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,%
+      Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,%
+      Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,%
+      TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,%
+      VarType,Weekday,Year},% functions
+   morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,%
+      AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,%
+      AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,%
+      BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,%
+      CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,%
+      Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,%
+      ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,%
+      Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,%
+      CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,%
+      CreatePreparedStatement,CreatePropery,CreateQuery,%
+      CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,%
+      CreateWorkspace,Customize,Delete,DeleteColumnLabels,%
+      DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,%
+      EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,%
+      Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,%
+      FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,%
+      GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,%
+      GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,%
+      GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,%
+      HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,%
+      InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,%
+      KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,%
+      Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,%
+      LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,%
+      MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,%
+      NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,%
+      OnDisconnection,OnStartupComplete,Open,OpenConnection,%
+      OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,%
+      Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,%
+      PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,%
+      Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,%
+      rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,%
+      ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,%
+      Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,%
+      RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,%
+      ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,%
+      RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,%
+      SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,%
+      ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,%
+      SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,%
+      SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,%
+      ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,%
+      Span,SplitContaining,StartLabelEdit,StartLogging,Stop,%
+      Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,%
+      TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,%
+      Upto,WhatsThisMode,WriteProperty,ZOrder},% methods
+   morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,%
+      AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,%
+      AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,%
+      AfterWriteFile,AmbienChanged,ApplyChanges,Associate,%
+      AsyncReadComplete,AxisActivated,AxisLabelActivated,%
+      AxisLabelSelected,AxisLabelUpdated,AxisSelected,%
+      AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,%
+      AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,%
+      BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,%
+      BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,%
+      ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,%
+      ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,%
+      ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,%
+      ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,%
+      Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,%
+      DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,%
+      DevModeChange,Disconnect,DisplayChanged,Dissociate,%
+      DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,%
+      DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,%
+      Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,%
+      GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,%
+      ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,%
+      ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,%
+      LeaveCell,LegendActivated,LegendSelected,LegendUpdated,%
+      LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,%
+      MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,%
+      OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,%
+      OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,%
+      PanelDblClick,PathChange,PatternChange,PlotActivated,%
+      PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,%
+      PointLabelSelected,PointLabelUpdated,PointSelected,%
+      PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,%
+      PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,%
+      QueryTimeout,QueryUnload,ReadProperties,Reposition,%
+      RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,%
+      RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,%
+      SelChange,SelectionChanged,SendComplete,SendProgress,%
+      SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,%
+      SplitChange,StateChanged,StatusUpdate,SysColorsChanged,%
+      Terminate,TimeChanged,TitleActivated,TitleSelected,%
+      TitleActivated,UnboundAddData,UnboundDeleteRow,%
+      UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,%
+      Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,%
+      WillChangeData,WillDissociate,WillExecute,WillUpdateRows,%
+      WithEvents,WriteProperties},% VB-events
+   morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,%
+      Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,%
+      DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,%
+      Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,%
+      For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,%
+      Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,%
+      Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,%
+      Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,%
+      SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,%
+      With,Write},% statements
+   sensitive=false,%
+   keywordcomment=rem,%
+   MoreSelectCharTable=\def\lst@BeginKC@{% chmod
+      \lst@ResetToken
+      \lst@BeginComment\lst@GPmode{{\lst@commentstyle}%
+                       \lst@Lmodetrue\lst@modetrue}\@empty},%
+   morecomment=[l]{'},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   }[keywords,comments,strings,keywordcomments]
+%</lang1>
+%    \end{macrocode}
+% Thanks to \lsthelper{Jonathan~de~Halleux}{dehalleux@pelikhan.com}
+% {2002/12/27}{missing comma} for reporting a missing comma after
+% \texttt{MoreSelectCharTable}, which was the cause of a problem
+% reported by \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}{2002/10/27}
+% {indention with language={[Visual]Basic} in optional argument}.
+% \lsthelper{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de}{2003/05/29}
+% {missing comma} also found the bug and the fix.
+% \endgroup
+%
+%
+% \subsection{Clean}
+%
+% Thanks to \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@iceb.ufop.br}{2000/08/08}.
+% \lsthelper{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}{missing comma}
+% found a missing comma
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% Clean definition (c) 1999 Jos\'e Romildo Malaquias
+%%
+%% Clean 1.3 :  some standard functional language: pure, lazy,
+%%              polymorphic type system, modules, type classes,
+%%              garbage collection, functions as first class citizens
+%%
+\lst@definelanguage{Clean}%
+  {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,%
+      [,],!,.,\\\\,;,_},%
+   morekeywords={from,definition,implementation,import,module,system,%
+      case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},%
+   morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,%
+      File,ProcId},%
+   sensitive,%
+   morecomment=[l]//,% missing comma: Markus Pahlow
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Corba IDL}
+%
+% This language definition is due to \lstthanks{Jens~T.~Berger~Thielemann}
+% {jensthi@ifi.uio.no}{1999/11/28}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%%
+%% Corba IDL definition (c) 1999 Jens T. Berger Thielemann
+%%
+\lst@definelanguage[CORBA]{IDL}%
+  {morekeywords={any,attribute,boolean,case,char,const,context,default,%
+      double,enum,exception,fixed,float,in,inout,interface,long,module,%
+      native,Object,octet,oneway,out,raises,readonly,sequence,short,%
+      string,struct,switch,typedef,union,unsigned,void,wchar,wstring,%
+      FALSE,TRUE},%
+   sensitive,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning},%
+   moredelim=*[directive]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{C, C++, et al}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% \lstthanks{Michael Fiedler}{post@michael-fiedler.net}{2014/09/04}
+% provided the following list of new introduced keywords for C++11.
+%    \begin{macrocode}
+\lst@definelanguage[11]{C++}[ISO]{C++}%
+  {morekeywords={alignas,alignof,char16_t,char32_t,constexpr,%
+      decltype,noexcept,nullptr,static_assert,thread_local},%
+  }%
+%    \end{macrocode}
+% \lstthanks{Michael Piefel}{piefel@informatik.hu-berlin.de}{2001/11/21}
+% suggested some more changes and added GNU C++.
+% For compatibility the `ANSI' language is defined in terms of ISO.
+%    \begin{macrocode}
+\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}%
+%    \end{macrocode}
+% \lstthanks{Michael Piefel}{piefel@informatik.hu-berlin.de}{2001/11/21}
+% suggested some more changes and added GNU C++.
+%    \begin{macrocode}
+\lst@definelanguage[GNU]{C++}[ISO]{C++}%
+  {morekeywords={__attribute__,__extension__,__restrict,__restrict__,%
+      typeof,__typeof__},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Visual]{C++}[ISO]{C++}%
+  {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,%
+      dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,%
+      __int32,__int64,naked,__stdcall,thread,__try,__leave},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ISO]{C++}[ANSI]{C}%
+  {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,%
+      catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,%
+      false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,%
+      or_eq,private,protected,public,reinterpret_cast,static_cast,%
+      template,this,throw,true,try,typeid,type_info,typename,using,%
+      virtual,wchar_t,xor,xor_eq},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% Objective-C is due to \lstthanks{Detlev~Dr\"oge}
+%{droege@informatik.uni-koblenz.de}{1997/11/04}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Objective-C definition (c) 1997 Detlev Droege
+%%
+\lst@definelanguage[Objective]{C}[ANSI]{C}
+  {morekeywords={bycopy,id,in,inout,oneway,out,self,super,%
+      @class,@defs,@encode,@end,@implementation,@interface,@private,%
+      @protected,@protocol,@public,@selector},%
+   moredirectives={import}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \lstthanks{J\"org~Viermann}{}{2004/07/17} provided the keywords for Handel-C.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Handel-C definition, refer http://www.celoxica.com
+%%
+\lst@definelanguage[Handel]{C}[ANSI]{C}
+  {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,%
+      external_divide,family,ifselect,in,inline,interface,internal,%
+      internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,%
+      releasesema,reset,rom,select,sema,set,seq,shared,signal,try,%
+      reset,trysema,typeof,undefined,width,with,wom},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ANSI]{C}%
+  {morekeywords={auto,break,case,char,const,continue,default,do,double,%
+      else,enum,extern,float,for,goto,if,int,long,register,return,%
+      short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
+      void,volatile,while},%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]",%
+   morestring=[b]',%
+   moredelim=*[directive]\#,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning}%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% Thanks go to \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de}{2002/03/17}.
+%    \begin{macrocode}
+%%
+%% C-Sharp definition (c) 2002 Martin Brodbeck
+%%
+\lst@definelanguage[Sharp]{C}%
+  {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,%
+      class,const,continue,decimal,default,delegate,do,double,else,%
+      enum,event,explicit,extern,false,finally,fixed,float,for,foreach,%
+      goto,if,implicit,in,int,interface,internal,is,lock,long,%
+      namespace,new,null,object,operator,out,override,params,private,%
+      protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,%
+      static,string,struct,switch,this,throw,true,try,typeof,uint,%
+      ulong,unchecked,unsafe,ushort,using,virtual,void,while,%
+      as,volatile,stackalloc},% Kai K\"ohne
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,%
+   morestring=[b]"
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Caml and Objective Caml}
+%
+% \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr}{1999/01/09} mailed me
+% the definition. \lsthelper{Tom~Hirschowitz}{tom.hirschowitz@inria.fr}
+% {2003/05/27}{missing keywords: object, ref} added two keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% (Objective) Caml definition (c) 1999 Patrick Cousot
+%%
+%% Objective CAML and Caml light are freely available, together with a
+%% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix,
+%% Windows and Macintosh OS operating systems.
+%%
+\lst@definelanguage[Objective]{Caml}[light]{Caml}
+  {deletekeywords={not,prefix,value,where},%
+   morekeywords={assert,asr,class,closed,constraint,external,false,%
+      functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,%
+      module,new,open,parser,private,sig,struct,true,val,virtual,when,%
+      object,ref},% TH
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[light]{Caml}
+  {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,%
+      fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,%
+      to,try,type,value,where,while,with},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[b]",%
+   moredelim=*[directive]\#,%
+   moredirectives={open,close,include}%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Common Intermediate Language}
+%
+% This language definition for CIL (Common Intermediate Language, part of
+% Microsoft's .NET interface) was provided by
+% \lsthelper{Olaf~Conradi}{-}{2006/08/23}. \lsthelper{Akim
+% Demaille}{akim@lrde.epita.fr}{2014/07/09}{Algol broken} pointed out that
+% the support for Algol was broken, but that came from a long missing `@'
+% in the following |lst@definelanguage|.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{CIL}%
+  {morekeywords=[1]{assembly,beforefieldinit,class,default,cdecl,cil,corflags,%
+                    culture,custom,data,entrypoint,fastcall,field,file,%
+                    hidebysig,hash,il,imagebase,locals,managed,marshall,%
+                    maxstack,mresource,method,module,namespace,publickey,%
+                    stdcall,subsystem,thiscall,unmanaged,vararg,ver,vtfixup,%
+                   % types
+                    bool,char,float32,float64,int,int8,int16,int32,%
+                    int64,method,native,object,string,modopt,modreq,pinned,%
+                    typedref,valuetype,unsigned,void,%
+                   % defining types
+                    abstract,ansi,auto,autochar,beforefieldinit,boxed,class,%
+                    explicit,extends,implements,interface,famandassem,family,%
+                    famorassem,inherits,nested,override,pack,private,property,%
+                    public,rtspecialname,sealed,sequential,serializable,size,%
+                    specialname,static,unicode,%
+                   % postfix
+                    algorithm,alignment,extern,init,from,nometadata,with},%
+  morekeywords=[2]{add,and,arglist,beq,bge,bgt,ble,blt,bne,br,break,brfalse,%
+                    brtrue,call,calli,ceq,cgt,ckfinite,clt,conv,cpblk,div,%
+                    dup,endfilter,endfinally,initblk,jmp,ldarg,ldarga,ldc,%
+                    ldftn,ldind,ldloc,ldloca,ldnull,leave,localloc,mul,neg,%
+                    nop,not,or,pop,rem,ret,shl,shr,starg,stind,stloc,sub,%
+                    switch,xor,%
+                   % prefix
+                    tail,unaligned,volatile,%
+                   % postfix
+                    un,s,ovf,%
+                   % object
+                    box,callvirt,castclass,cpobj,cctor,ctor,initobj,isinst,%
+                    ldelem,ldelema,ldfld,ldflda,ldlen,ldobj,ldsfld,ldsflda,%
+                    ldstr,ldtoken,ldvirtftn,mkrefany,newarr,newobj,refanytype,%
+                    refanyval,rethrow,sizeof,stelem,stfld,stobj,stsfld,throw,%
+                    unbox},%
+  sensitive=true,%
+  morecomment=[l]{//},%
+  morestring=[b]"%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Cobol}
+%
+% Keywords are not marked if their names are broken by EOL, for example DEBUG-
+% CONTENTS. Sometimes portions of a string are not printed as a string.
+% This happens if the double quote is not doubled to insert a quote,
+% e.g.~|""bad" cobol"| won't be printed correctly.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}%
+  {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,%
+      COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,%
+      ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,%
+      RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,%
+      SUPPRESS,TITLE,WHEN-COMPILED},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1985]{Cobol}[1974]{Cobol}%
+  {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,%
+      ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,%
+      CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,%
+      END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,%
+      END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,%
+      END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,%
+      FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,%
+      PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,%
+      STANDARD-2,TEST,THEN,TRUE},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1974]{Cobol}%
+  {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,%
+      ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,%
+      BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,%
+      CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,%
+      COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,%
+      CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,%
+      COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,%
+      DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,%
+      DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,%
+      DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,%
+      DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,%
+      EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,%
+      ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,%
+      FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,%
+      GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,%
+      IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,%
+      INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,%
+      JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,%
+      LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,%
+      LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,%
+      MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,%
+      OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,%
+      ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,%
+      PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,%
+      PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,%
+      QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,%
+      REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,%
+      REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,%
+      REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,%
+      SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,%
+      SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,%
+      SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,%
+      STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,%
+      SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,%
+      TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,%
+      UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,%
+      WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},%
+   alsodigit=-,%
+   sensitive=f,% ???
+   morecomment=[f][commentstyle][6]*,%
+   morestring=[d]"% ??? doubled
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% \texttt{commentstyle} (not the surrounding brackets) have been added after
+% a bug report by \lsthelper{Stephen Reindl}{Stephen.Reindl@vodafone.de}
+% {2002/05/28}{no commentstyle in Cobol}.
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Comal 80}
+%
+% The data is from
+% \begin{itemize}
+% \item
+%		\textsc{Borge R. Christensen}:
+%		\textbf{Strukturierte Programmierung mit COMAL 80} [aus dem
+%		D\"anischen \"ubertragen und bearbeitet von Margarete Kragh];
+%		2., verb.\ Auflage -- M\"unchen; Wien: Oldenburg, 1985;
+%		ISBN 3-486-26902-X.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Comal 80}%
+  {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,%
+      ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,%
+      MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,%
+      SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},%
+   sensitive=f,% ???
+   morecomment=[l]//,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{COMMAND.COM Batch Files}
+%
+% This definition for DOS and Windows batch files is from
+% \lstthanks{Stephan Hennig}{-}{2006/10/11}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[WinXP]{command.com}%
+  {morekeywords={assoc,at,attrib,bootcfg,break,cacls,call,cd,chcp,chdir,%
+      chkdsk,chkntfs,cls,cmd,cmdextversion,color,comp,compact,convert,copy,%
+      date,defined,del,dir,diskcomp,diskcopy,do,doskey,echo,else,endlocal,%
+      erase,errorlevel,exist,exit,fc,find,findstr,for,format,ftype,goto,%
+      graftabl,help,if,in,label,md,mkdir,mode,more,move,not,off,path,%
+      pause,popd,print,prompt,pushd,rd,recover,ren,rename,replace,rmdir,%
+      set,setlocal,shift,sort,start,subst,time,title,tree,type,ver,%
+      verify,vol,xcopy},%
+   sensitive=false,%
+   alsoother={@},%
+   alsoletter={\%~:-/},%
+   morecomment=[l]{rem},%
+   morecomment=[l]{reM},%
+   morecomment=[l]{rEm},%
+   morecomment=[l]{rEM},%
+   morecomment=[l]{Rem},%
+   morecomment=[l]{ReM},%
+   morecomment=[l]{REm},%
+   morecomment=[l]{REM},%
+   morestring=[d]"%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Comsol Multiphysics}
+%
+% Comsol Multiphysics (Prior to version 3.2 known as Femlab) can be used
+% standalone or as an extension to MatLab.  This definition is due to
+% \lstthanks{Martin~Heller}{-}{2006/05/10}.
+%
+% Unfortunately, there is a conflict in that Comsol is case-insensitive,
+% whereas Matlab is case-sensitive; \textsf{listings} does not
+% currently support different case-sensitivities in the same listing.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Comsol}%
+  {morekeywords={%
+      adaption,arc1,arc2,arrayr,assemble,asseminit,beziercurve2,block2,%
+      block3,bsplinecurve2,bsplinecurve3,bsplinesurf3,bypassplot,cardg,%
+      ccoeffgroup,chamfer,checkgeom,circ1,circ2,coeff2cell,comsol,%
+      cone2,cone3,Contents,createhexes,createprisms,createquads,csgbl2,%
+      csgbl3,csgcmpbz,csgimplbz,csginitaux,csginitnr,csgproputil,%
+      csgrbconv,csgunique3,csguniquep,csgversion,csgvvovl,curve2,%
+      curve3,cylinder2,cylinder3,dat2str,defastget,display,drawgetobj,%
+      drawreobj,drawsetobj,dst,duplicate,dxflayers,dxfread,dxfwrite,%
+      econe2,econe3,eigloop,elcconstr,elcplbnd,elcplextr,elcplproj,%
+      elcplscalar,elempty,elemreobj,eleqc,eleqw,elevate,elgeom,ellip1,%
+      ellip2,ellipsoid2,ellipsoid3,ellipsoidgen_fl23,elmat,elovar,%
+      elpconstr,elshape,elvar,elvarm,embed,extrude,face3,faceprim3,%
+      fastsetop,fem2jxfem,femblocksu,femdiff,femeig,femexport,femgui,%
+      femimport,femiter,femlab,femlin,femmesh,femmeshexp,femnlin,%
+      femplot,femsfun,femsim,femsimlowlevel,femsimserver,femsol,%
+      femsolver,femstate,femstruct,femtime,femwave,festyle,fieldnames,%
+      fillet,fl1d,fl2d,fl3d,flaction,flafun,flappconvert,flappobj,%
+      flaxisequal,flbase,flbinary,flc1hs,flc2hs,flcanpnt,flcell2draw,%
+      flclear,flcolorbar,flcompact,flconeplot,flcontour2mesh,%
+      flcontour2meshaux,flconvreact,flconvreact1d,flconvreact2d,%
+      flconvreact3d,flcyl,fldc1hs,fldc2hs,fldegree,fldegreer3,%
+      fldegreet3,fldimvarsget,fldisp,fldraw2cell,fldrawnow,fldsmhs,%
+      fldsmsign,flevalmat,flexch,flexchprop,flfastgeom,flform,flgc,%
+      flgcbo,flgdconv,flgeom2cellstr,flgeomadj,flgeomarcize,flgeomec,%
+      flgeomed,flgeomepol,flgeomes,flgeomfc,flgeomfd,flgeomfdp,%
+      flgeomff1,flgeomff2,flgeomfn,flgeomfs,flgeomgetlocalsys,%
+      flgeominit,flgeominitprop,flgeomitransform,flgeomloft,flgeommesh,%
+      flgeomnbs,flgeomnes,flgeomnmr,flgeomnv,flgeompsinv,flgeomrmsing,%
+      flgeomrotp,flgeomsd,flgeomsdim,flgeomse,flgeomsf2,flgeomspm,%
+      flgeomtransform,flgeomud,flgeomvtx,flgetdraw,flheat,flheat1d,%
+      flheat2d,flheat3d,flhelmholtz,flhelmholtz1d,flhelmholtz2d,%
+      flhelmholtz3d,flim2curve,flinterp1,fliscont,flismember,%
+      flisnumeric,fljaction,fllaplace,fllaplace1d,fllaplace2d,%
+      fllaplace3d,flload,flloadfl,flloadmatfile,flloadmfile,%
+      fllobj2cellstr,flmakeevalstr,flmapsoljac,flmat2str,flmatch,%
+      flmesh2spline,flmesh2splineaux,flml65setup,flngdof,flnull,%
+      flnullorth,flpde,flpdeac,flpdec,flpdec1d,flpdec2d,flpdec3d,%
+      flpdedc,flpdedc2d,flpdedc3d,flpdedf,flpdedf1d,flpdedf2d,%
+      flpdedf3d,flpdees,flpdees2d,flpdees3d,flpdeg,flpdeg1d,flpdeg2d,%
+      flpdeg3d,flpdeht,flpdeht1d,flpdeht2d,flpdeht3d,flpdems,flpdems2d,%
+      flpdems3d,flpdens,flpdens2d,flpdens3d,flpdepn,flpdeps,flpdesm3d,%
+      flpdew,flpdew1d,flpdew2d,flpdew3d,flpdewb,flpdewb1d,flpdewb2d,%
+      flpdewb3d,flpdewc,flpdewc1d,flpdewc2d,flpdewc3d,flpdewe,%
+      flpdewe3d,flpdewp,flpdewp2d,flpdewp3d,flplot,flpoisson,%
+      flpoisson1d,flpoisson2d,flpoisson3d,flpric2,flpric3,flreobj,%
+      flreport,flresolvepath,flsave,flschrodinger,flschrodinger1d,%
+      flschrodinger2d,flschrodinger3d,flsde,flsdp,flsdt,flsetalpha,%
+      flsetdraw,flsmhs,flsmsign,flspnull,fltherm_cond1,fltrg,flversion,%
+      flversions,flverver,flwave,flwave1d,flwave2d,flwave3d,%
+      flwriteghist,formstr,gdsread,gencyl2,gencyl3,genextrude,%
+      genextrudeaux,geom,geom0,geom0get,geom1,geom1get,geom2,geom2get,%
+      geom3,geom3get,geom3j2m,geom3m2j,geomaddlblmargin,geomanalyze,%
+      geomarrayr,geomassign,geomcoerce,geomcomp,geomconnect,geomcopy,%
+      geomcsg,geomdel,geomedit,geomexport,geomfile,geomget,%
+      geomgetlabels,geomgetwrkpln,geomimport,geominfo,geominfoaux,%
+      geomlblplot,geomload,geomnumparse,geomobject,geomparse,geomplot,%
+      geomplot1,geomplot2,geomplot3,geomposition,geomproputil,%
+      geomreconstruct,geomreobj,geomserver,geomspline,geomsurf,%
+      geomupdate,get,getfemgeom,getisocurve,getjptr,getmesh,getsdim,%
+      getvmatrixexch,handlesolnumstr,helix1,helix2,helix3,hexahedron2,%
+      hexahedron3,histfrommat,idst,igesread,importplotdata,isempty,%
+      isfield,isfunc,isscript,javaclass,jproputil,jptr2geom,jptrgeom1,%
+      jptrgeom1_fl23,jptrgeom2,jptrgeom2_fl23,jptrgeom3,jptrgeom3_fl23,%
+      keiter,line1,line2,loadobj,loft,matlabinterpdata,mesh2geom,%
+      meshassign,meshcaseadd,meshcasedel,meshcaseutil,meshcheck,%
+      meshembed,meshenrich,meshenrich1,meshenrich2,meshenrich3,%
+      meshexport,meshextend,meshextrude,meshget,meshimport,meshinit,%
+      meshintegrate,meshmap,meshoptim,meshparse,meshplot,meshplot1,%
+      meshplot2,meshplot3,meshplotproputil,meshpoi,meshproputil,%
+      meshptplot,meshqual,meshrefine,meshrevolve,meshsmooth,%
+      meshsmooth2,meshsweep,meshvolume,minus,mirror,mkreflparams,%
+      mmsolve,modetype,move,moveglobalfields,mphproputil,mtimes,%
+      multiphysics,mypostinterp,notscript,onlyelsconstr,outassign,%
+      paramgeom,pde2draw,pde2equ,pde2fem,pde2geom,pdeblxpd,plus,point1,%
+      point2,point3,poisson,poly1,poly2,postanim,postapplysettings,%
+      postarrow,postarrowbnd,postcolorbar,postcont,postcontdomind,%
+      postcoord,postcopyprop,postcrossplot,postdistrprops,posteval,%
+      postflow,postfnd,postgeomplot,postgetfem,postgetstylecolor,%
+      postglobaleval,postglobalplot,postgp,postinit,postint,postinterp,%
+      postiso,postlin,postmakecontcol,postmax,postmaxmin,postmin,%
+      postmkcontbar,postmknormexpr,postmovie,postnewplot,%
+      postoldmaxminprops,postpd2pm,postplot,postplotconstants,%
+      postpm2pd,postprinc,postprincbnd,postprocgui,postproputil,%
+      postslice,postsurf,posttet,posttitle,print2file,pyramid2,%
+      pyramid3,rect1,rect2,restorefields,revolve,rmfield,rotate,%
+      rotmatrix,scale,serialize,set,setmesh,sh2str,sharg_2_5,shbub,%
+      shdisc,shdiv,shherm,shlag,shvec,simplecoerce,simreobj,slblocks,%
+      solassign,solid0,solid1,solid2,solid3,solidprim3,solproputil,%
+      solsize,solveraddcases,sphere2,sphere3,spiceimport,splineaux,%
+      split,splittoprim,square1,square2,stlread,submode,submodes,%
+      subsasgn,subsref,tangent,taucs,tetrahedron2,tetrahedron3,%
+      tobsplines,torus2,torus3,transform,update,updateassoc,%
+      updateassocinfo,updatefem,updateguistruct,updateobj,vrmlread,%
+      xmeshinfo,xmeshinit},%
+   sensitive=false,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{bash, csh, and sh}
+%
+% csh is from \lstthanks{Kai~Below}{below@tu-harburg.de}{1998/09/21},
+% but he pointed out that some keywords are probably missing.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% csh definition (c) 1998 Kai Below
+%%
+\lst@definelanguage{csh}
+  {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,%
+      foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,time,while,umask,unalias,%
+      unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% Thanks to \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it}{2003/09/24}
+% for the following two
+% definitions. \lstthanks{Scott~Pakin}{scott@pakin.org}{2014/08/08} pointed
+% out some missing keywords (|elif|, |in| for |sh|, |caller|, |compopt|,
+% |coproc|, |dirs|, |help|, |mapfile|, |readarray| for |bash|) to the
+% current maintainer. The |sh| list of keywords was checkead against the
+% ``Manual of the Bourne Shell on Version 7'', found at
+% \url{http://www.in-ulm.de/~mascheck/bourne/v7/}, last visited on
+% 2014/09/06.
+%    \begin{macrocode}
+%%
+%% bash,sh definition (c) 2003 Riccardo Murri <riccardo.murri@gmx.it>
+%%
+\lst@definelanguage{bash}[]{sh}%
+  {morekeywords={alias,bg,bind,builtin,caller,command,compgen,compopt,%
+      complete,coproc,declare,disown,dirs,enable,fc,fg,help,history,%
+      jobs,let,local,logout,mapfile,printf,pushd,popd,readarray,select,%
+      set,suspend,shopt,source,times,type,typeset,ulimit,unalias,wait},%
+  }%
+\lst@definelanguage{sh}%
+  {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,elif,else,%
+      env,esac,eval,exec,exit,export,expr,false,fi,for,function,getopts,%
+      hash,history,if,in,kill,login,newgrp,nice,nohup,ps,pwd,read,%
+      readonly,return,set,sed,shift,test,then,times,trap,true,type,%
+      ulimit,umask,unset,until,wait,while},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Jobst Hoffmann copied the definition of a style for printing Fortran code
+% to a style for printing shell programs:
+%    \begin{macrocode}
+%<*bash-prf>
+%    \end{macrocode}
+%    \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+% common settings
+\lstset{%
+  frame=tlb,%      the frame is open on the right side
+  resetmargins=false,%
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  numberstyle=\tiny,%
+  numbersep=5pt,%
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  keepspaces=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}
+% settings for colored printing
+\lstdefinestyle{bash}{%
+  backgroundcolor=\color{yellow!10},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle=\color{black},%
+  keywordstyle=\color{blue},%
+  keywordstyle={[2]\color{cyan}},%
+  keywordstyle={[3]\color{olive}},%
+  stringstyle=\color{teal},%
+  commentstyle=\itshape\color{orange},%
+}%
+% settings for back and white printing
+\lstdefinestyle{bashbw}{%
+  backgroundcolor={},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle={},%
+  keywordstyle=\bfseries,%
+  stringstyle=\itshape,%
+  commentstyle=\slshape,%
+  rulesepcolor=\color{black},%
+}%
+%    \end{macrocode}
+% This code is provided in the file |listings-bash.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+%    \begin{macrocode}
+%</bash-prf>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Delphi}
+%
+% I took the data from Delphi 1.0 (?) online help.
+% \lstthanks{Christian~Gudrian}{chrigu@kawo1.rwth-aachen.de}{2001/08/16}
+% provided the `double slash' comment.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Delphi}%
+  {morekeywords={and,as,asm,array,begin,case,class,const,constructor,%
+      destructor,div,do,downto,else,end,except,exports,file,finally,%
+      for,function,goto,if,implementation,in,inherited,inline,%
+      initialization,interface,is,label,library,mod,nil,not,object,of,%
+      or,packed,procedure,program,property,raise,record,repeat,set,%
+      shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,%
+      xor,%
+      absolute,abstract,assembler,at,cdecl,default,dynamic,export,%
+      external,far,forward,index,name,near,nodefault,on,override,%
+      private,protected,public,published,read,resident,storedDir,%
+      virtual,write},%
+   morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,%
+      AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,%
+      ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,%
+      ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,%
+      Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,%
+      DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,%
+      Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,%
+      DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,%
+      Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,%
+      ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,%
+      FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,%
+      FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,%
+      FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,%
+      FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,%
+      FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,%
+      GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,%
+      IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,%
+      LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,%
+      Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,%
+      Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,%
+      RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,%
+      SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,%
+      Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,%
+      StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,%
+      StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,%
+      StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,%
+      StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,%
+      TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,%
+      WhereY,Write,WriteBuf,WriteChar,Writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morecomment=[l]{//},% 2001 Christian Gudrian
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Eiffel}
+%
+% Data is from
+% \begin{itemize}
+% \item
+%       \textsc{Bertrand Meyer}: \textbf{Eiffel: the language};
+%       Prentice Hall International (UK) Ldt, 1992;
+%       ISBN 0-13-247925-7.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Eiffel}%
+  {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,%
+      creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,%
+      ensure,expanded,export,external,false,feature,from,frozen,if,%
+      implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,%
+      like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,%
+      REAL,redefine,rename,require,rescue,Result,retry,select,%
+      separate,STRING,strip,then,true,undefine,unique,until,variant,%
+      when,xor},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]",%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% The key=value \texttt{stringtest=false} has been removed after a bug
+% report from \lsthelper{Xavier~Cr\'egut}{cregut@enseeiht.fr}{2002/09/09}
+% {stringtest no more part of package}.
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Elan}
+%
+% The data come from
+% \begin{itemize}
+% \item
+%		\textsc{Leo~H.~Klingen, Jochen Liedtke}:
+%		\textbf{Programmieren mit ELAN};
+%		B.G.\ Teubner, Stuttgart 1983; ISBN 3-519-02507-8.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Elan}%
+  {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,%
+      COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,%
+      ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,%
+      INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,%
+      PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,%
+      TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,%
+      maxint,sign,abs,min,max,random,initializerandom,subtext,code,%
+      replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,%
+      pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,%
+      arctand,int,real,lastconversionok,put,putline,line,page,get,%
+      getline,input,output,sequentialfile,maxlinelaenge,reset,eof,%
+      close,complexzero,complexone,complexi,complex,realpart,imagpart,%
+      dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,%
+      replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},%
+   sensitive,%
+   morestring=[d]"%
+  }[keywords,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Erlang}
+%
+% Thanks to \lstthanks{Daniel~Gazard}{gazard_d@epita.fr}{2003/05/31}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Erlang definition (c) 2003 Daniel Gazard
+%%
+\lst@definelanguage{erlang}%
+  {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,%
+      binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,%
+      date,div,element,erase,end,exit,export,float,float_to_list,%
+      get,halt,hash,hd,if,info,import,integer,integer_to_list,%
+      length,link,list,list_to_atom,list_to_float,list_to_integer,%
+      list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,%
+      processes,put,receive,reference,register,registered,rem,%
+      round,self,setelement,size,spawn,throw,time,tl,trace,trunc,%
+      tuple,tuple_to_list,unlink,unregister,whereis,error,false,%
+      infinity,nil,ok,true,undefined,when},%
+   otherkeywords={->,!,[,],\{,\}},%
+   morecomment=[l]\%,%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Euphoria}
+%
+% \lstthanks{Detlef~Reimers}{dreimers@aol.com}{1998/08/30} sent me the language
+% definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Euphoria definition (c) 1998 Detlef Reimers
+%%
+\lst@definelanguage{Euphoria}%
+% for Euphoria 2.0, Rapid Deployment Software, Kanada
+  {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,%
+      call_proc,call_func,c_proc,c_func,clear_screen,close,%
+      command_line,compare,constant,cos,do,date,else,elsif,end,exit,%
+      find,floor,for,function,getc,getenv,get_key,gets,global,%
+      get_pixel,if,include,integer,length,log,match,machine_func,%
+      machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,%
+      or_bits,procedure,puts,position,prepend,print,printf,power,peek,%
+      poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,%
+      routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,%
+      trace,tan,while,with,without,xor,xor_bits},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Fortran}
+% \label{sec:fortran}
+%
+% Took things from
+% \begin{itemize}
+% \item
+%		\textsc{Karl Hans M\"uller}:
+%		\textbf{Fortran 77: Programmierungsanleitung};
+%		3., v\"ollig neu bearb.\ Aufl.\ -- Mannheim; Wien; Z\"urich:
+%		Bibliographisches Institut, 1984;
+%		ISBN 3-411-05804-8
+% \item
+%       \textsc{Thomas Michel}: \textbf{Fortran 90: Lehr-- und Handbuch};
+%       Mannheim; Leipzig; Wien; Z\"urich: BI-Wiss.-Verlag, 1994;
+%       ISBN 3-411-16861-7.
+% \end{itemize}
+% Another source for Fortran keywords is
+% \url{http://fortranwiki.org/fortran/show/Keywords} where the keywords for
+% Fortran 2003 and 2008 are taken from.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% The current version of Fortran (Fortran 2008) is defined by ISO/IEC
+% 1539-1:2010.  It contains nine new keywords, four of them consisting of
+% two words: ^^A
+% |ERROR STOP|, |SYNC ALL|, |SYNC IMAGES|, |SYNC MEMORY|, so
+% the list of keywords contains the single parts |ALL|, |ERROR|, |IMAGES|,
+% |MEMORY|, and |SYNC|.
+%    \begin{macrocode}
+\lst@definelanguage[08]{Fortran}[03]{Fortran}{%
+  morekeywords={ALL, BLOCK, CODIMENSION, CONCURRENT, CONTIGUOUS, CRITICAL,%
+    ERROR, LOCK, SUBMODULE, SYNC, UNLOCK},%
+%    \end{macrocode}
+% New procedures in Fortran 2008:
+%    \begin{macrocode}
+    morekeywords=[3]{ACOSH,ASINH,ATANH,ATOMIC_DEFINE,ATOMIC_REF,BESSEL_J0,%
+      BESSEL_J1,BESSEL_JN,BESSEL_Y0,BESSEL_Y1,BESSEL_YN,BGE,BGT,BLE,BLT,%
+      C_SIZEOF,COMPILER_OPTIONS,COMPILER_VERSION,DSHIFTL,DSHIFTR,ERF,ERFC,%
+      ERFC_SCALED,EXECUTE_COMMAND_LINE,GAMMA,HYPOT,IALL,IANY,IMAGE_INDEX,%
+      IPARITY,LCOBOUND,LEADZ,LOG_GAMMA,MASKL,MASKR,MERGE_BITS,NORM2,%
+      NUM_IMAGES,PARITY,POPCNT,POPPAR,SHIFTA,SHIFTL,SHIFTR,STORAGE_SIZE,%
+      THIS_IMAGE,TRAILZ,UCOBOUND}%
+}%
+%    \end{macrocode}
+% Fortran 2003 introduces the following keywords:
+%    \begin{macrocode}
+\lst@definelanguage[03]{Fortran}[95]{Fortran}{%
+  morekeywords={ABSTRACT, ASSOCIATE, ASYNCHRONOUS, BIND, CLASS, DEFERRED,%
+    ENUM, ENUMERATOR, EXTENDS, FINAL, FLUSH, GENERIC, IMPORT,%
+    NON_OVERRIDABLE, NOPASS, PASS, PROTECTED, VALUE, VOLATILE, WAIT},%
+%    \end{macrocode}
+% These are new options/specifiers:
+%    \begin{macrocode}
+    morekeywords=[2]{DECIMAL,ENCODING,IOMSG,ROUND},% corrected NML from NMT
+%    \end{macrocode}
+% And also some new procedures:
+%    \begin{macrocode}
+    morekeywords=[3]{C_ASSOCIATED,C_F_POINTER,C_F_PROCPOINTER,C_FUNLOC,%
+    C_LOC,COMMAND_ARGUMENT_COUNT,EXTENDS_TYPE_OF,GET_COMMAND,GET_COMMAND_ARGUMENT,%
+    GET_ENVIRONMENT_VARIABLE,IS_IOSTAT_END,MOVE_ALLOC,NEW_LINE,SAME_TYPE_AS,%
+    SELECTED_CHAR_KIND}%
+}%
+%    \end{macrocode}
+% \lsthelper{Denis Girou}{Denis.Girou@idris.fr}{1998/07/26}{Fortran 95=90}
+% proposed to have Fortran 95 and Fortran 90 to be equivalent.
+%    \begin{macrocode}
+\lst@definelanguage[90]{Fortran}[95]{Fortran}{}
+%    \end{macrocode}
+% There is no |morecomment=[f]| in Fortran 90 since otherwise CONTAINS could
+% start a comment. This problem was reported by \lsthelper{Magne Rudshaug}
+% {magne@ife.no}{1998/01/09}{no morecomment=[f] in Fortran 90}.
+% Moreover the keyword INCLUDE is due to him.
+%    \begin{macrocode}
+\lst@definelanguage[95]{Fortran}[77]{Fortran}%
+  {deletekeywords=SAVE,%
+   morekeywords={ALLOCATABLE,ALLOCATE,ASSIGNMENT,CASE,%
+      CONTAINS,CYCLE,DEALLOCATE,DEFAULT,EXIT,INCLUDE,IN,NONE,%
+      OUT,INTENT,INTERFACE,MODULE,NAMELIST,%
+      NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,POINTER,PRIVATE,%
+      PUBLIC,RECURSIVE,RESULT,SELECT,SEQUENCE,%
+      TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,%
+      ENDBLOCKDATA,ENDFILE,ENDFUNCTION,ENDINTERFACE,%
+      ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,%
+      INOUT,SELECTCASE,%
+%    \end{macrocode}
+% Theses keys were missing from the 1.4 version of listings:
+%    \begin{macrocode}
+      ELEMENTAL, ELSEWHERE, FORALL, PURE},%
+%    \end{macrocode}
+% The list of option keywords/specifiers new in Fortran 90 and 95:
+%    \begin{macrocode}
+    morekeywords=[2]{ACTION,ADVANCE,DELIM,IOLENGTH,LEN,NAME,%
+      NML,PAD,POSITION,READWRITE,SIZE,STAT},% corrected NML from NMT
+%    \end{macrocode}
+% and the list of intrinsic procedures new in Fortran 90 and 95:
+%    \begin{macrocode}
+    morekeywords=[3]{ADJUSTL,ADJUSTR,ALL,ALLOCATED,ANY,ASSOCIATED,BIT_SIZE,%
+    BTEST,CEILING,COUNT,CPU_TIME,CSHIFT,DATE_AND_TIME,DIGITS,DOT_PRODUCT,%
+    EOSHIFT,EPSILON,EXPONENT,FLOOR,FRACTION,HUGE,IACHAR,IAND,IBCLR,
+    IBITS,IBSET,ICHAR,IEOR,IOR,ISHFT,ISHFTC,KIND,LBOUND,LEN_TRIM,% left out LOGICAL
+    MATMUL,MAXEXPONENT,MAXLOC,MAXVAL,MERGE,MINEXPONENT,MINLOC,MINVAL,%
+    MODULO,MVBITS,NEAREST,NOT,NULL,PACK,PRECISION,PRESENT,PRODUCT,%
+    RADIX,RANDOM_NUMBER,RANDOM_SEED,RANGE,RANK,REPEAT,RESHAPE,RRSPACING,%
+    SCALE,SCAN,SELECTED_INT_KIND,SELECTED_REAL_KIND,SET_EXPONENT,SHAPE,%
+    SINH,SIZE,SPACING,SPREAD,SUM,SYSTEM_CLOCK,TINY,TRANSFER,TRANSPOSE,%
+    TRIM,UBOUND,UNPACK,VERIFY},%
+   deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug
+   morecomment=[l]!%
+  }%
+%    \end{macrocode}
+% As proposed by \lsthelper{J\"orn Wilms}{wilms@rocinante.colorado.edu}
+% {1997/07/07}{Fortran with \lstsensitivefalse} keywords are \emph{not} case
+% sensitive.  Also, note that Fortran 77 (and fixed-format source in later
+% versions) allows space in keywords; thus, this list contains some of the
+% more common variants (e.g., `GO TO' and `GOTO').
+%    \begin{macrocode}
+\lst@definelanguage[77]{Fortran}%
+%    \end{macrocode}
+% Jobst Hoffmann divided the list of keywords into two lists. The first
+% list contains the statement keywords, the second list contains the option
+% keywords/specifiers and values. This makes the different meanings of the
+% keywords distinguishable.
+%    \begin{macrocode}
+  {morekeywords={ASSIGN,BACKSPACE,CALL,CHARACTER,%
+      CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DO,DOUBLE,%
+      ELSE,ELSEIF,END,ENDIF,ENDDO,ENTRY,EQUIVALENCE,EXTERNAL,%
+      FILE,FORMAT,FUNCTION,GO,TO,GOTO,IF,IMPLICIT,%
+      INQUIRE,INTEGER,INTRINSIC,LOGICAL,%
+      OPEN,PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,%
+      RETURN,REWIND,STOP,SUBROUTINE,THEN,%
+      WRITE,SAVE},%
+    morekeywords=[2]{ACCESS,BLANK,BLOCK,DIRECT,EOF,ERR,EXIST,%
+      FMT,FORM,FORMATTED,IOSTAT,NAMED,NEXTREC,NUMBER,OPENED,%
+      REC,RECL,SEQUENTIAL,STATUS,TYPE,UNFORMATTED,UNIT},%
+%    \end{macrocode}
+% And here is another list: the list of intrinsic procedures (remember: all
+% functions belong to the Fortran language specification!)
+%    \begin{macrocode}
+    morekeywords=[3]{INT,DBLE,CMPLX,ICHAR,CHAR,AINT,ANINT,% left out real
+      NINT,ABS,MOD,SIGN,DIM,DPROD,MAX,MIN,AIMAG,CONJG,SQRT,EXP,LOG,%
+      LOG10,SIN,COS,TAN,ASIN,ACOS,ATAN,ATAN2,SINH,COSH,TANH,LGE,LLE,LLT,%
+      LEN,INDEX},%
+%    \end{macrocode}
+% And here is the last list: fortran operators:
+%    \begin{macrocode}
+    morekeywords=[4]{AND,EQ,EQV,FALSE,GE,GT,OR,LE,LT,NE,NEQV,NOT,TRUE},%
+   sensitive=f,%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morecomment=[f]*,%
+   morecomment=[f]C,%
+   morecomment=[f]c,%
+   morestring=[d]",%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Jobst Hoffmann supplied a definition of a style for printing Fortran code:
+%    \begin{macrocode}
+%<*fortran-prf>
+%    \end{macrocode}
+%    \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+% common settings
+\lstset{%
+  frame=tlb,%      the frame is open on the right side
+  resetmargins=false,%
+  rulesepcolor=\color{black},%
+  numbers=left,%                % left
+  numberstyle=\tiny,%
+  numbersep=5pt,%
+  firstnumber=1,%
+  stepnumber=5,%
+  columns=fixed,%               % to prevent inserting spaces
+  fontadjust=true,%
+  keepspaces=true,%
+  basewidth=0.5em,%
+  captionpos=t,%
+  abovecaptionskip=\smallskipamount,% same amount as default
+  belowcaptionskip=\smallskipamount,% in caption package
+}
+% settings for colored printing
+\lstdefinestyle{fortran}{%
+  backgroundcolor=\color{yellow!10},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle=\color{black},%
+  keywordstyle=\color{blue},%
+  keywordstyle={[2]\color{cyan}},%
+  keywordstyle={[3]\color{olive}},%
+  stringstyle=\color{teal},%
+  commentstyle=\itshape\color{orange},%
+}%
+% settings for back and white printing
+\lstdefinestyle{fortranbw}{%
+  backgroundcolor={},%
+  basicstyle=\small\ttfamily,%
+  identifierstyle={},%
+  keywordstyle=\bfseries,%
+  stringstyle=\itshape,%
+  commentstyle=\slshape,%
+  rulesepcolor=\color{black},%
+}%
+%    \end{macrocode}
+% This code is provided in the file |listings-fortran.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+%    \begin{macrocode}
+%</fortran-prf>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{GAP---Groups, Algorithms, Programming}
+%\label{sec:gap}
+%
+% GAP is a System for Computational Discrete Algebra, a description can be
+% found at \url{http://www.gap-system.org/}. \lstthanks{Heiko
+% Oberdiek}{heiko.oberdiek@googlemail.com}{2013/07/18} provided a
+% language definition without knowing this language, so any error should be
+% announced to the current maintainer of the \packagename{listings} package.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% GAP definition
+%% (c) 2013 Heiko Oberdiek
+%%
+\lst@definelanguage{GAP}{%
+  morekeywords={%
+    Assert,Info,IsBound,QUIT,%
+    TryNextMethod,Unbind,and,break,%
+    continue,do,elif,%
+    else,end,false,fi,for,%
+    function,if,in,local,%
+    mod,not,od,or,%
+    quit,rec,repeat,return,%
+    then,true,until,while%
+  },%
+  sensitive,%
+  morecomment=[l]\#,%
+  morestring=[b]",%
+  morestring=[b]',%
+}[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Guarded Command Language (GCL)}
+%
+% As you can read below, \lstthanks{Mark~van~Eijk}{mark@luon.net}{2002/10/30}
+% provided this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Guarded Command Language (GCL)  definition
+%% (c) 2002 Mark van Eijk
+%%
+\lst@definelanguage{GCL}%
+  {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},%
+   literate={|[}{\ensuremath{|\hskip -0.1em[}}2%
+            {]|}{\ensuremath{]\hskip -0.1em|}}2%
+	    {[]}{\ensuremath{[\hskip -0.1em]}}2%
+	    {->}{\ensuremath{\rightarrow}~}2%
+	    {==}{\ensuremath{\equiv}~}2%
+	    {>=}{\ensuremath{\geq}~}2%
+	    {<=}{\ensuremath{\leq}~}2%
+	    {/\\}{\ensuremath{\land}~}2%
+	    {\\/}{\ensuremath{\lor}~}2%
+	    {!}{\ensuremath{\lnot}}1%
+	    {!=}{\ensuremath{\neq}~}2%
+	    {max}{\ensuremath{\uparrow}}1%
+	    {min}{\ensuremath{\downarrow}}1,%
+   sensitive=f,%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Gnuplot}
+%
+% Thanks to \lsthelper{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15}{} for
+% providing this definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%%
+%% gnuplot definition (c) Christoph Giess
+%%
+\lst@definelanguage{Gnuplot}%
+  {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,%
+       besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,%
+       inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,%
+       sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,%
+       tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,%
+       help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,%
+       set,show,shell,splot,test,update,angles,arrow,autoscale,border,%
+       boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,%
+       format,function,functions,grid,hidden3d,isosamples,key,keytitle,%
+       label,logscale,mapping,offsets,output,parametric,pointsize,%
+       polar,rrange,samples,size,style,surface,terminal,tics,time,%
+       timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,%
+       xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,%
+       ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,%
+       zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,%
+       with,index,every,thru,smooth},%
+   sensitive,%
+   comment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Hansl/Gretl}
+%
+% Thanks to \lstthanks{Ignacio
+% D\'{i}az-Emparanza}{ignacio.diaz-emparanza@ehu.es}{2013/10/24} for providing
+% the definition of hansl.  Hansl is the gretl scripting language (see
+% \url{http://gretl.sourceforge.net}).
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% http://gretl.sourceforge.net/gretl-help/cmdref.html
+%% (c) 2013 Ignacio D\'iaz-Emparanza
+%%
+\lst@definelanguage{hansl}{%
+  % $-variables are internal functions in hansl
+  keywordsprefix ={\$},
+  morekeywords={ % hansl commands:
+    add,adf,anova,append,ar,ar1,%
+    arbond,arch,arima,biprobit,boxplot,break,%
+    catch,chow,clear,coeffsum,coint,coint2,%
+    corr,corrgm,cusum,data,dataset,debug,%
+    delete,diff,difftest,discrete,dpanel,dummify,%
+    duration,elif,else,end,endif,endloop,%
+    eqnprint,equation,estimate,fcast,foreign,fractint,%
+    freq,function,garch,genr,gmm,gnuplot,%
+    graphpg,hausman,heckit,help,hsk,hurst,%
+    if,include,info,intreg,join,kalman,%
+    kpss,labels,lad,lags,ldiff,leverage,%
+    levinlin,logistic,logit,logs,loop,mahal,%
+    makepkg,markers,meantest,mle,modeltab,modprint,%
+    modtest,mpols,negbin,nls,normtest,nulldata,%
+    ols,omit,open,orthdev,outfile,panel,%
+    pca,pergm,poisson,print,printf,probit,%
+    pvalue,qlrtest,qqplot,quantreg,quit,rename,%
+    reset,restrict,rmplot,run,runs,scatters,%
+    sdiff,set,setinfo,setobs,setmiss,shell,%
+    smpl,spearman,sprintf,square,sscanf,store,%
+    summary,system,tabprint,textplot,tobit,tsls,%
+    var,varlist,vartest,vecm,vif,wls,%
+    xcorrgm,xtab,scalar,series,matrix,string},%
+  morekeywords=[2]{ %  Functions
+    abs,acos,acosh,aggregate,argname,%
+    asin,asinh,atan,atanh,atof,%
+    bessel,BFGSmax,bkfilt,boxcox,bwfilt,%
+    cdemean,cdf,cdiv,ceil,cholesky,%
+    chowlin,cmult,cnorm,colname,colnames,%
+    cols,corr,corrgm,cos,cosh,%
+    cov,critical,cum,deseas,det,%
+    diag,diagcat,diff,digamma,dnorm,%
+    dsort,dummify,eigengen,eigensym,eigsolve,%
+    epochday,errmsg,exp,fcstats,fdjac,%
+    fft,ffti,filter,firstobs,fixname,%
+    floor,fracdiff,gammafun,getenv,getline,%
+    ghk,gini,ginv,halton,hdprod,%
+    hpfilt,I,imaxc,imaxr,imhof,%
+    iminc,iminr,inbundle,infnorm,inlist,%
+    int,inv,invcdf,invmills,invpd,%
+    irf,irr,isconst,isnan,isnull,%
+    isodate,iwishart,kdensity,kfilter,ksimul,%
+    ksmooth,kurtosis,lags,lastobs,ldet,%
+    ldiff,lincomb,ljungbox,lngamma,log,%
+    log10,log2,loess,logistic,lower,%
+    lrvar,max,maxc,maxr,mcorr,%
+    mcov,mcovg,mean,meanc,meanr,%
+    median,mexp,min,minc,minr,%
+    missing,misszero,mlag,mnormal,mols,%
+    monthlen,movavg,mpols,mrandgen,mread,%
+    mreverse,mrls,mshape,msortby,muniform,%
+    mwrite,mxtab,nadarwat,nelem,ngetenv,%
+    nobs,normal,npv,NRmax,nullspace,%
+    obs,obslabel,obsnum,ok,onenorm,%
+    ones,orthdev,pdf,pergm,pmax,%
+    pmean,pmin,pnobs,polroots,polyfit,%
+    princomp,prodc,prodr,psd,psdroot,%
+    pshrink,psum,pvalue,pxsum,qform,%
+    qnorm,qrdecomp,quadtable,quantile,randgen,%
+    randgen1,randint,rank,ranking,rcond,%
+    readfile,regsub,remove,replace,resample,%
+    round,rownames,rows,sd,sdc,%
+    sdiff,selifc,selifr,seq,setnote,%
+    simann,sin,sinh,skewness,sort,%
+    sortby,sqrt,sscanf,sst,strlen,%
+    strncmp,strsplit,strstr,strstrip,strsub,%
+    sum,sumall,sumc,sumr,svd,%
+    tan,tanh,toepsolv,tolower,toupper,%
+    tr,transp,trimr,typestr,uniform,%
+    uniq,unvech,upper,urcpval,values,%
+    var,varname,varnum,varsimul,vec,%
+    vech,weekday,wmean,wsd,wvar,%
+    xmax,xmin,xpx,zeromiss,zeros,%
+  },%
+  sensitive=t,%
+  morecomment=[l]{\#},%
+  morecomment=[s]{/*}{*/},%
+  morestring=[b]{"}}%
+\lstalias{gretl}{hansl}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Haskell}
+%
+% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/11/18} for
+% providing the new definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Haskell98 as implemented in Hugs98. See http://www.haskell.org
+%% All keywords from Prelude and Standard Libraries
+%% (c) 1999 Peter Bartke
+%%
+\lst@definelanguage{Haskell}%
+  {otherkeywords={=>},%
+   morekeywords={abstype,if,then,else,case,class,data,default,deriving,%
+      hiding,if,in,infix,infixl,infixr,import,instance,let,module,%
+      newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,%
+      Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,%
+      FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,%
+      Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,%
+      SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,%
+      Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,%
+      Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,%
+      MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,%
+      Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,%
+      Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,%
+      accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,%
+      approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,%
+      bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,%
+      compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,%
+      decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,%
+      digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,%
+      elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,%
+      enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,%
+      filter,filterM,find,findIndex,findIndices,flip,floatDigits,%
+      floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,%
+      foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,%
+      fromIntegral,fromJust,fromMaybe,fromRat,fromRational,%
+      fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,%
+      genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,%
+      getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,%
+      group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,%
+      hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,%
+      hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,%
+      hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,%
+      hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,%
+      hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,%
+      inRange,insert,insertBy,interact,intersect,intersectBy,%
+      intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,%
+      ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,%
+      isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,%
+      isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,%
+      isIllegalOperation,isInfinite,isJust,isLower,isNaN,%
+      isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,%
+      isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,%
+      join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,%
+      liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,%
+      lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,%
+      mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,%
+      maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,%
+      mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,%
+      null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,%
+      polar,pred,print,product,properFraction,putChar,putStr,putStrLn,%
+      quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,%
+      rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,%
+      readList,readLitChar,readLn,readParen,readOct,readSigned,reads,%
+      readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,%
+      reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,%
+      sequence_,setStdGen,show,showChar,showEFloat,showFFloat,%
+      showFloat,showGFloat,showInt,showList,showLitChar,showParen,%
+      showSigned,showString,shows,showsPrec,significand,signum,sin,%
+      sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,%
+      strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,%
+      tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,%
+      truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,%
+      unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,%
+      userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,%
+      zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,%
+      zipWith7},%
+   sensitive,%
+   morecomment=[l]--,%
+   morecomment=[n]{\{-}{-\}},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{HTML}
+%
+% I'm quite the opposite of a HTML wizard. In particular this is true for the
+% defined keywords. \lstthanks{Matthias~Bethke}{-}{2003/09/01} helped me out
+% and extended the list.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{HTML}%
+  {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,%
+      BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,%
+      COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,%
+      FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,%
+      INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,%
+      NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,%
+      OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,%
+      SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,%
+      VAR,XMP,%
+      accesskey,action,align,alink,alt,archive,axis,background,bgcolor,%
+      border,cellpadding,cellspacing,charset,checked,cite,class,classid,%
+      code,codebase,codetype,color,cols,colspan,content,coords,data,%
+      datetime,defer,disabled,dir,event,error,for,frameborder,headers,%
+      height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,%
+      longdesc,marginwidth,marginheight,maxlength,media,method,multiple,%
+      name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,%
+      ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,%
+      profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,%
+      onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,%
+      selected,shape,size,src,standby,style,tabindex,text,title,type,%
+      units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},%
+   tag=**[s]<>,%
+   sensitive=f,%
+   morestring=[d]",% ??? doubled
+%    \end{macrocode}
+% Now we take care of comments.
+% We don't enter comment mode if we aren't inside |<>|.
+%    \begin{macrocode}
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+  }[keywords,comments,strings,html]%
+%    \end{macrocode}
+% \lsthelper{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de}
+% {1999/07/01}{! Missing $\}$ inserted} reported a problem which was due to
+% missing |\@empty| in value of |SelectCharTable|. And after receiving a bug
+% report from \lsthelper{Jochen Schneider}{jschneider@ds3.etech.haw-hamburg.de}
+% {2002/04/05}{use of \lst@thestyle doesn't match its definition} I converted
+% the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{IDL}
+%
+% The definition is from \lstthanks{J\"urgen~Heim}
+% {heim@astro.uni-tuebingen.de}{1998/07/27}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% IDL definition (c) 1998 Juergen Heim
+%%
+\lst@definelanguage{IDL}%
+  {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,%
+      endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,%
+      mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,%
+      xor,on_error,openw,openr,openu,print,printf,printu,plot,read,%
+      readf,readu,writeu,stop},%
+   sensitive=f,%
+   morecomment=[l];,%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Inform}
+%
+% Thanks to \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de}{2003/11/10}
+% for this language definition. \lsthelper{Ulrike Fischer}{-}{2004/04/21}
+% {Bug in listings.sty} pointed out that |\lstdefinelanguage| should be
+% |\lst@definelanguage|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Inform definition (c) 2003 Jonathan Sauer
+%%
+\lst@definelanguage{inform}{%
+    % Language keywords
+    morekeywords={breakdo,else,false,for,has,hasnt,if,%
+                in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,%
+                private,property,provides,return,rfalse,rtrue,self,string,%
+                switch,to,true,until,while,with,%
+                creature,held,multiexcept,multiheld,multiinside,noun,number,%
+                scope,topic},%
+    %
+    % Inform functions
+    morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,%
+                new_line,parent,print,print_ret,read,remove,restore,sibling,%
+                save,spaces,quit,style,bold,underline,reverse,roman remaining,%
+                create,destroy,recreate,copy},%
+    %
+    % Inform definitions
+    morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,%
+                Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,%
+                Property,Verb,Release,Serial,Statusline},%
+    %
+    % Library attributes
+    morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,%
+                enterable,female,general,light,lockable locked,male,moved,%
+                neuter,on,open,openable,pluralname,proper,scenery,scored,%
+                static,supporter,switchable,talkable,transparent,visited,%
+                workflag,worn},%
+    %
+    % Library properties
+    morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,%
+                out_to,u_to,d_to,add_to_scope,after,article,articles,before,%
+                cant_go,capacity,daemon,describe,description,door_dir,door_to,%
+                each_turn,found_in,grammar,initial,inside_description,invent,%
+                life,list_together,name number,orders,parse_name,plural,%
+                react_after,react_before,short_name,short_name_indef,time_left,%
+                time_out,when_closed,when_open,when_on,when_off,%
+                with_key},%
+    %
+    % Library routines
+    morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,%
+                CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,%
+                IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,%
+                MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,%
+                ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,%
+                PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,%
+                StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,%
+                UnsignedCompare,WordAddress,WordInProperty,WordLength,%
+                WriteListFrom,YesOrNo},%
+    %
+    % Library,entry points
+    morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,%
+                DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,%
+                Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,%
+                ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,%
+                UnknownVerb},%
+    %
+    % Library constants
+    morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,%
+                ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,%
+                ISARE_BIT,CONCEAL_BIT},%
+    %
+    % Library,meta actions
+    morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,%
+                NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,%
+                LMode2,Lmode3},%
+    %
+    % Library,main actions
+    morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,%
+                Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,%
+                Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,%
+                Wear},%
+    %
+    % Library,stub actions
+    morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,%
+                Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,%
+                Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,%
+                Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,%
+                Wait,Wake,WakeOther,Wave,WaveHands,Yes},%
+    %
+    otherkeywords={->,-->},%
+    sensitive=false,%
+    morestring=[d]{"},%
+    morecomment=[l]{!}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Java and other JVM based languages}
+%
+% \lstthanks{Robert~Wenner}{robert.wenner@gmx.de}{2003/03/27} sent in the
+% first of the following two definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% AspectJ definition (c) Robert Wenner
+%%
+\lst@definelanguage[AspectJ]{Java}[]{Java}%
+  {morekeywords={%
+      adviceexecution,after,args,around,aspect,aspectOf,before,%
+      call,cflow,cflowbelow,%
+% declare error,declare parents,declare precedence,
+% declare soft,declare warning,
+      execution,get,handler,if,initialization,issingleton,pointcut,%
+      percflow,percflowbelow,perthis,pertarget,preinitialization,%
+      privileged,proceed,returning,set,staticinitialization,strictfp,%
+      target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,%
+      within,withincode},%
+   MoreSelectCharTable=%
+     \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}%
+     \ifx\lst@derefinstalled\@empty\else
+        \global\let\lst@derefinstalled\@empty
+\lst@AddToHook{Output}%
+{\lst@ifkeywords
+    \ifx\lst@derefop\@empty
+       \global\let\lst@derefop\relax
+       \ifx\lst@thestyle\lst@gkeywords@sty
+          \ifx\lst@currstyle\relax
+             \let\lst@thestyle\lst@identifierstyle
+          \else
+             \let\lst@thestyle\lst@currstyle
+          \fi
+       \fi
+    \fi
+ \fi}
+\lst@AddToHook{BOL}{\global\let\lst@derefop\relax}%
+\lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}%
+     \fi
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% Got data from \texttt{http://java.sun.com}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Java}%
+  {morekeywords={abstract,boolean,break,byte,case,catch,char,class,%
+      const,continue,default,do,double,else,extends,false,final,%
+      finally,float,for,goto,if,implements,import,instanceof,int,%
+      interface,label,long,native,new,null,package,private,protected,%
+      public,return,short,static,super,switch,synchronized,this,throw,%
+      throws,transient,true,try,void,volatile,while},%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/07/30}
+% {missing keyword label} added the keyword \texttt{label}.
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% \lstthanks{Martine~Gautier}{Martine.Gautier@loria.fr}{2004/03/30} made the
+% following contribution.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ByteCodeJava definition (c) 2004 Martine Gautier
+%%
+\lst@definelanguage{JVMIS}%
+  {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,%
+      aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,%
+      astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,%
+      castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,%
+      dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,%
+      dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,%
+      dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,%
+      f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,%
+      fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,%
+      fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,%
+      fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,%
+      iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,%
+      iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,%
+      if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,%
+      ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,%
+      iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,%
+      invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,%
+      istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,%
+      l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,%
+      ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,%
+      lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,%
+      lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,%
+      monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,%
+      pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,%
+      tableswitch,wide,limit,locals,stack},%
+  }[keywords]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsubsection{Scala}
+%
+% \lstthanks{Bastian Germann}{bastian.germann@nordakademie.de}{2013/10/19}
+% asked to include the Scala definition provided by Frank Teubler
+% (2009). Here it is:
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Scala}%
+  {morekeywords={abstract,case,catch,class,def,%
+    do,else,extends,false,final,finally,%
+    for,if,implicit,import,lazy,match,mixin,%
+    new,null,object,override,package,%
+    private,protected,requires,return,sealed,%
+    super,this,trait,true,try,%
+    type,val,var,while,with,yield},%+
+%	otherkeywords={_,:,=,=>,<<:,<\%,>:,\#,@},%
+	otherkeywords={=,=>,<-,<\%,<:,>:,\#,@},%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]',%
+   morestring=[b]""",%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ksh}
+%
+% Thanks to \lstthanks{Jeffrey Ratcliffe}{Jeffrey.Ratcliffe@m.eads.net}
+% {2002/02/21} for this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{ksh}
+  {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,%
+      for,in,do,done,select,case,esac,while,until,function,%
+      time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,%
+      glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,umask,unalias,%
+      unset,wait,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]',%
+   morestring=[d]`%
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/10/28}
+% {[Fwd: Re: Probleme mit Paket listings bei ksh]} suggested to add the
+% string delimiter |`|.
+% \endgroup
+%
+%
+% \subsection{Lingo}
+%
+% Thanks to \lstthanks{Mark Schade}{-}{2006/07/26} for this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Lingo}
+  {morekeywords={abort,after,and,before,do,down,halt,me,new,not,of,%
+      on,or,otherwise,pass,put,result,return,set,tell,the,then,to,with,%
+      repeat,while,case,if,else,true,false,global,property,\_global,\_key,%
+      \_mouse,\_movie,\_player,\_sound,\_system,abbr,abbrev,abbreviated,abs,%
+      actionsenabled,activateapplication,activatewindow,active3drenderer,%
+      activecastlib,activewindow,actorlist,add,addat,addbackdrop,addcamera,%
+      addchild,addmodifier,addoverlay,addprop,addtoworld,addvertex,alert,%
+      alerthook,alignment,allowcustomcaching,allowgraphicmenu,allowsavelocal,%
+      allowtransportcontrol,allowvolumecontrol,allowzooming,alphathreshold,%
+      ambient,ambientcolor,ancestor,angle,anglebetween,animationenabled,%
+      antialias,antialiasthreshold,append,applicationname,applicationpath,%
+      appminimize,atan,attenuation,attributevalue,auto,autoblend,automask,%
+      autotab,axisangle,back,backcolor,backdrop,backgroundcolor,backspace,%
+      beep,beepon,beginrecording,beginsprite,beveldepth,beveltype,bgcolor,%
+      bias,bitand,bitmap,bitmapsizes,bitnot,bitor,bitrate,bitspersample,%
+      bitxor,blend,blendconstant,blendconstantlist,blendfactor,blendfunction,%
+      blendfunctionlist,blendlevel,blendrange,blendsource,blendsourcelist,%
+      blendtime,bone,bonesplayer,border,both,bottom,bottomcap,bottomradius,%
+      bottomspacing,boundary,boundingsphere,box,boxdropshadow,boxtype,%
+      breakconnection,breakloop,brightness,broadcastprops,browsername,%
+      buffersize,build,buttonsenabled,buttonstyle,buttontype,bytesstreamed,%
+      boolean,cachedocverify,cachesize,call,callancestor,camera,cameracount,%
+      cameraposition,camerarotation,cancelidleload,castlib,castlibnum,%
+      castmemberlist,center,centerregpoint,centerstage,changearea,channelcount,%
+      char,characterset,charpostoloc,chars,charspacing,chartonum,%
+      checkboxaccess,checkboxtype,checkmark,checknetmessages,child,chunksize,%
+      clearatrender,clearcache,clearerror,clearframe,clearglobals,clearvalue,%
+      clickloc,clickmode,clickon,clone,clonedeep,clonemodelfromcastmember,%
+      clonemotionfromcastmember,close,closed,closewindow,closexlib,collision,%
+      collisiondata,collisionnormal,color,world,colorbuffer,colorbufferdepth,%
+      colordepth,colorlist,colorrange,colors,colorsteps,commanddown,comments,%
+      compressed,connecttonetserver,constrainh,constraint,constrainv,,%
+      continue,controldown,controller,copypixels,copyrightinfo,copyto,%
+      copytoclipboard,cos,count,cpuhogticks,creaseangle,creases,[contains],%
+      createfolder,createmask,creatematte,creationdate,creator,crop,cross,%
+      crossproduct,cuepassed,cuepointnames,cuepointtimes,currentloopstate,%
+      currentspritenum,currenttime,cursor,cursorsize,curve,cylinder,ate,day,%
+      deactivateapplication,deactivatewindow,debug,debugplaybackenabled,%
+      decaymode,defaultrect,defaultrectmode,delay,delete,deleteall,deleteat,%
+      deletecamera,deletefolder,deleteframe,deletegroup,deletelight,%
+      deletemodel,deletemodelresource,deletemotion,deleteone,deleteprop,%
+      deleteshader,deletetexture,deletevertex,density,depth,depthbufferdepth,%
+      desktoprectlist,diffuse,diffusecolor,diffuselightmap,%
+      digitalvideotimescale,digitalvideotype,direction,directionalcolor,%
+      directionalpreset,directtostage,disableimagingtransformation,displayface,%
+      displaymode,distanceto,distribution,dither,done,doneparsing,dot,%
+      dotproduct,doubleclick,downloadnetthing,drag,draw,drawrect,dropshadow,%
+      duplicate,duplicateframe,duration,editable,editshortcutsenabled,%
+      elapsedtime,emissive,emitter,empty,emulatemultibuttonmouse,enabled,%
+      enablehotspot,end,endangle,endcolor,endframe,endrecording,endsprite,%
+      endtime,enter,enterframe,environment,erase,error,eventpassmode,%
+      exchange,exists,exit,exitframe,exitlock,exp,externalevent,%
+      externalparamcount,externalparamname,externalparamvalue,extractalpha,%
+      extrude3d,face,fadein,fadeout,fadeto,far,field,fieldofview,filename,%
+      fill,fillcolor,fillcycles,filldirection,filled,fillmode,filloffset,%
+      fillscale,findempty,findlabel,findpos,findposnear,finishidleload,%
+      firstindent,fixedlinespace,fixedrate,fixstagesize,flashrect,flashtostage,%
+      flat,fliph,flipv,float,floatp,floatprecision,flush,flushinputevents,%
+      fog,folderchar,font,fontsize,fontstyle,forecolor,forget,frame,%
+      framecount,framelabel,framepalette,framerate,frameready,framescript,%
+      framesound1,framesound2,framestohms,frametempo,frametransition,freeblock,%
+      freebytes,fromcastmember,fromimageobject,front,frontwindow,%
+      generatenormals,getaprop,getat,getbehaviordescription,getbehaviortooltip,%
+      getboneid,geterror,geterrorstring,gethardwareinfo,gethotspotrect,getlast,%
+      getlatestnetid,getnetaddresscookie,getneterrorstring,getnetmessage,%
+      getnetoutgoingbytes,getnettext,getnormalized,getnthfilenameinfolder,%
+      getnumberwaitingnetmessages,getone,getpeerconnectionlist,getpixel,%
+      getplaylist,getpos,getpref,getprop,getpropat,getpropertydescriptionlist,%
+      getrendererservices,getstreamstatus,gettemppath,getworldtransform,globals,%
+      glossmap,go,gotoframe,gotonetmovie,gotonetpage,gradienttype,gravity,%
+      group,handler,handlers,height,heightvertices,high,highlightpercentage,%
+      highlightstrength,hilite,hither,hittest,hmstoframes,hold,hotspot,html,%
+      hyperlink,hyperlinkclicked,hyperlinkrange,hyperlinks,hyperlinkstate,%
+      id3tags,identity,idle,idlehandlerperiod,idleloaddone,idleloadmode,%
+      idleloadperiod,idleloadtag,idlereadchunksize,ilk,image,imagecompression,%
+      imageenabled,imagequality,immovable,importfileinto,inflate,ink,inker,%
+      inlineimeenabled,insertbackdrop,insertframe,insertoverlay,inside,%
+      installmenu,instance,integer,integerp,interface,interpolate,%
+      interpolateto,intersect,index,interval,inverse,invert,invertmask,%
+      isbusy,isinworld,isoktoattach,ispastcuepoint,item,itemdelimiter,kerning,%
+      kerningthreshold,key,keyboardfocussprite,keycode,keydown,keydownscript,%
+      keyframeplayer,keypressed,keyup,keyupscript,label,labellist,last,%
+      lastchannel,lastclick,lastevent,lastframe,lastkey,lastroll,left,%
+      leftindent,length,lengthvertices,level,lifetime,light,line,linearlist,%
+      linecolor,linecount,linedirection,lineheight,lineoffset,linepostolocv,%
+      linesize,linkas,linked,list,listp,loaded,loadfile,loc,loch,locked,%
+      locktranslation,loctocharpos,locv,locvtolinepos,locz,lod,log,long,%
+      loop,loopcount,loopendtime,loopsremaining,loopstarttime,machinetype,%
+      magnitude,map,mapImageToStage,mapmembertostage,mapstagetomember,margin,%
+      marker,markerlist,mask,max,maxinteger,maxspeed,mci,media,mediaready,%
+      member,membernum,members,memorysize,menu,mesh,meshdeform,milliseconds,%
+      min,minspeed,modal,mode,model,modela,modelb,modelresource,%
+      modelsunderloc,modelsunderray,modelunderloc,modified,modifiedby,%
+      modifieddate,modifier,modifiers,month,mostrecentcuepoint,motion,%
+      mousechar,mousedown,mousedownscript,mouseenter,mouseh,mouseitem,%
+      mouseleave,mouselevel,mouseline,mouseloc,mousemember,mouseoverbutton,%
+      mouseup,mouseupoutside,mouseupscript,mousev,mousewithin,mouseword,move,%
+      moveablesprite,movetoback,movetofront,movevertex,movevertexhandle,%
+      movewindow,movie,movieaboutinfo,moviecopyrightinfo,moviefilefreesize,%
+      moviefilesize,moviefileversion,movieimagecompression,movieimagequality,%
+      moviename,moviepath,movierate,movietime,moviextralist,mpeglayer,%
+      multiply,multisound,name,near,nearfiltering,neighbor,netabort,netdone,%
+      neterror,netlastmoddate,netmime,netpresent,netstatus,nettextresult,%
+      netthrottleticks,newcamera,newcurve,newgroup,newlight,newmesh,newmodel,%
+      newmodelresource,newmotion,newshader,newtexture,next,none,normalize,%
+      normallist,normals,nothing,notify,nudge,number,numchannels,%
+      numparticles,numsegments,numtochar,objectp,offset,open,openresfile,%
+      openwindow,openxlib,optiondown,organizationname,originalfont,originh,%
+      originmode,originpoint,originv,orthoheight,overlay,pageheight,palette,%
+      palettemapping,paletteref,paletteindex,pan,paragraph,param,paramcount,%
+      parent,parsestring,particle,pasteclipboardinto,path,pathname,%
+      pathstrength,pattern,pause,pausedatstart,pausestate,percentplayed,%
+      percentstreamed,period,perpendicularto,persistent,pi,picture,picturep,%
+      plane,platform,play,playbackmode,playfile,playing,playlist,playnext,%
+      playrate,point,pointat,pointatorientation,pointinhyperlink,%
+      pointofcontact,pointtochar,pointtoitem,pointtoline,pointtoparagraph,%
+      pointtoword,position,positionreset,posterframe,postnettext,power,%
+      preferred3drenderer,preload,preloadbuffer,preloadeventabort,preloadmember,%
+      preloadmode,preloadmovie,preloadnetthing,preloadram,preloadtime,%
+      premultiply,prepareframe,preparemovie,prerotate,prescale,pretranslate,%
+      previous,primitives,printfrom,productversion,projection,projectionangle,%
+      propList,proxyserver,pttohotspotid,puppet,puppetpalette,puppetsound,%
+      puppetsprite,puppettempo,puppettransition,purgepriority,%
+      qtregisteraccesskey,qtunregisteraccesskey,quad,quality,queue,quit,quote,%
+      radius,ramneeded,random,randomseed,randomvector,rateshift,rawnew,read,%
+      readvalue,recordfont,rect,ref,reflectionmap,reflectivity,region,%
+      registerforevent,registerscript,regpoint,regpointvertex,removebackdrop,%
+      removefromworld,removelast,removemodifier,removeoverlay,rename,renderer,%
+      rendererdevicelist,renderformat,renderstyle,resetworld,resizewindow,%
+      resolution,resolve,resolvea,resolveb,resource,restart,resume,%
+      reverttoworlddefaults,rewind,rgb,rgba4444,rgba5550,rgba5551,rgba5650,%
+      rgba8880,rgba8888,right,rightindent,rightmousedown,rightmouseup,%
+      rollover,romanlingo,rootlock,rootnode,rotate,rotation,rotationreset,%
+      rtf,runmode,runpropertydialog,safeplayer,samplecount,samplerate,%
+      samplesize,save,savedlocal,savemovie,scale,scalemode,score,scorecolor,%
+      scoreselection,script,scriptexecutionstyle,scriptinstancelist,scriptlist,%
+      scriptnum,scriptsenabled,scripttext,scripttype,scrollbyline,scrollbypage,%
+      scrolltop,sds,searchcurrentfolder,searchpath,searchpaths,seconds,%
+      selectedtext,selection,selend,selstart,sendallsprites,sendevent,%
+      sendnetmessage,sendsprite,serialnumber,setalpha,setaprop,setat,%
+      setcollisioncallback,setflashproperty,setnetbufferlimits,%
+      setnetmessagehandler,setpixel,setplaylist,setpref,setprop,setscriptlist,%
+      settrackenabled,setvariable,shader,shaderlist,shadowpercentage,%
+      shadowstrength,shapetype,shiftdown,shininess,shockwave3d,short,%
+      showglobals,showlocals,showprops,showresfile,showxlib,shutdown,%
+      silhouettes,sin,size,sizerange,skew,sleep,smoothness,sort,sound,%
+      soundbusy,soundchannel,sounddevice,sounddevicelist,soundenabled,%
+      soundkeepdevice,soundlevel,soundmixmedia,source,sourcerect,space,%
+      specular,specularcolor,specularlightmap,sphere,spotangle,spotdecay,%
+      sprite,spritenum,spritespacetoworldspace,sqrt,stage,stagebottom,%
+      stagecolor,stageleft,stageright,stagetoflash,stagetop,standard,%
+      startangle,startframe,startmovie,starttime,starttimer,state,static,%
+      status,stepframe,stilldown,stop,stopevent,stopmovie,stoptime,stream,%
+      streammode,streamname,streamsize,streamstatus,string,stringp,%
+      strokecolor,strokewidth,style,subdivision,sweep,swing,switchcolordepth,%
+      symbol,symbolp,systemdate,tab,tabcount,tabs,tan,target,%
+      tellstreamstatus,tension,text,texture,texturecoordinatelist,%
+      texturecoordinates,texturelayer,texturelist,texturemember,texturemode,%
+      texturemodelist,texturerenderformat,texturerepeat,texturerepeatlist,%
+      texturetransform,texturetransformlist,texturetype,thumbnail,ticks,tilt,%
+      time,timeout,timeouthandler,timeoutkeydown,timeoutlapsed,timeoutlength,%
+      timeoutlist,timeoutmouse,timeoutplay,timeoutscript,timer,timescale,%
+      title,titlevisible,toon,top,topcap,topradius,topspacing,trace,%
+      traceload,tracelogfile,trackcount,trackenabled,tracknextkeytime,%
+      tracknextsampletime,trackpreviouskeytime,trackprevioussampletime,%
+      trackstarttime,trackstoptime,tracktext,tracktype,trails,transform,%
+      transitiontype,translate,triggercallback,trimwhitespace,tunneldepth,%
+      tweened,tweenmode,type,[transparent],union,unload,unloadmember,%
+      unloadmovie,unregisterallevents,update,updateframe,updatelock,%
+      updatemovieenabled,updatestage,url,usealpha,usediffusewithtexture,%
+      usefastquads,usehypertextstyles,uselineoffset,userdata,username,value,%
+      vector,version,vertex,vertexlist,vertices,video,videoforwindowspresent,%
+      viewh,viewpoint,viewscale,viewv,visibility,visible,void,voidp,volume,%
+      volumeinfo,wait,waitfornetconnection,warpmode,width,widthvertices,wind,%
+      window,windowlist,windowpresent,windowtype,word,wordwrap,world,%
+      worldposition,worldspacetospritespace,worldtransform,wraptransform,%
+      wraptransformlist,write,writevalue,,xaxis,xtra,xtralist,xtras,,yaxis,%
+      year,yon,zaxis,zoombox,zoomwindow,repeat,Conditional,Boolean,TypeDef,%
+      Statement,Operator,String,Comment,Identifier,Special,x,y,z}
+   sensitive=false,
+   morecomment=[l]{--},
+   morestring=[b]",
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Lisp, AutoLisp}
+%
+% Most data are from
+% \begin{itemize}
+% \item
+%		\textsc{Guy Steele}:
+%		\textbf{Common Lisp};
+%		Copyright 1990 by Digital Equipment Corporation;
+%		ISBN 1-55558-042-4.
+% \end{itemize}
+% Thanks to \lsthelper{Aslak Raanes}{araanes@ifi.ntnu.no}{1997/11/24}{single
+% comment in Lisp} for the `single comment' delimiters. The keywords are the
+% `one-word' functions and macros of Common Lisp, i.e.~words not containing a
+% minus. But I left out the \texttt{caaaar}, \ldots{} functions.
+% If anyone types them in, I'd like to get them.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Lisp}%
+  {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,%
+      append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,%
+      atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,%
+      char,character,characterp,choose,chunk,cis,close,clrhash,coerce,%
+      collect,commonp,compile,complement,complex,complexp,concatenate,%
+      conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,%
+      count,delete,denominator,describe,directory,disassemble,%
+      documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,%
+      equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,%
+      expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,%
+      float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,%
+      funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,%
+      gethash,identity,imagpart,import,inspect,integerp,intern,%
+      intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,%
+      length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,%
+      logior,lognand,lognor,lognot,logtest,logxor,macroexpand,%
+      makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,%
+      mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,%
+      nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,%
+      nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,%
+      oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,%
+      position,positions,pprint,previous,princ,print,proclaim,provide,%
+      random,rassoc,rational,rationalize,rationalp,read,readtablep,%
+      realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,%
+      rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,%
+      search,second,series,set,seventh,shadow,signal,signum,sin,sinh,%
+      sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,%
+      subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,%
+      symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,%
+      typep,unexport,unintern,union,until,values,vector,vectorp,warn,%
+      write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,%
+      defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,%
+      defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,%
+      dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,%
+      incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,%
+      producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,%
+      setf,shiftf,step,time,trace,typecase,unless,untrace,when},%
+   sensitive,% ???
+   alsodigit=-,%
+   morecomment=[l];,%
+   morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+% \lstthanks{Stefan Lagotzki}{info@lagotzki.de}{2001/10/28} warned me to
+% define this as a lisp dialect \ldots
+%    \begin{macrocode}
+%%
+%% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de
+%%
+\lst@definelanguage[Auto]{Lisp}%
+  {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,%
+      action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,%
+      apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,%
+      atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,%
+      cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,%
+      defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,%
+      dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,%
+      distof,done_dialog,end_image,end_list,entdel,entget,entlast,%
+      entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,%
+      eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,%
+      function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,%
+      getcorner,getdist,getenv,getfiled,getint,getkword,getorient,%
+      getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,%
+      grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,%
+      last,layoutlist,length,list,listp,load,load_dialog,log,logand,%
+      logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,%
+      mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,%
+      null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,%
+      quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,%
+      reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,%
+      setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,%
+      ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,%
+      start_dialog,start_image,start_list,strcase,strcat,strlen,subst,%
+      substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,%
+      textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,%
+      vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,%
+      vl-bb-ref,vl-bb-set,vl-catch-all-apply,%
+      vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,%
+      vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,%
+      vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,%
+      vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,%
+      vl-file-size,vl-file-systime,vl-filename-base,%
+      vl-filename-directory,vl-filename-extension,vl-filename-mktemp,%
+      vl-get-resource,vl-list*,vl-list->string,%
+      vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,%
+      vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,%
+      vl-member-if-not,vl-position,vl-prin1-to-string,%
+      vl-princ-to-string,vl-propagate,vl-registry-delete,%
+      vl-registry-descendents,vl-registry-read,vl-registry-write,%
+      vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,%
+      vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,%
+      vl-string-mismatch,vl-string-position,vl-string-right-trim,%
+      vl-string-search,vl-string-subst,vl-string-translate,%
+      vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,%
+      vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,%
+      vlax-add-cmd,vlax-create-object,vlax-curve-getArea,%
+      vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,%
+      vlax-curve-getEndParam,vlax-curve-getEndPoint,%
+      vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,%
+      vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,%
+      vlax-curve-getStartParam,vlax-curve-getStartPoint,%
+      vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,%
+      vlax-curve-getClosestPointTo,%
+      vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,%
+      vlax-curve-getSecondDeriv,vlax-dump-object,%
+      vlax-ename->vla-object,vlax-erased-p,vlax-for,%
+      vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,%
+      vlax-get-property,vlax-import-type-library,vlax-invoke-method,%
+      vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,%
+      vlax-ldata-test,vlax-make-safearray,vlax-make-variant,%
+      vlax-map-collection,vlax-method-applicable-p,%
+      vlax-object-released-p,vlax-product-key,%
+      vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,%
+      vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,%
+      vlax-safearray-get-dim,vlax-safearray-get-element,%
+      vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,%
+      vlax-safearray-put-element,vlax-safearray-type,%
+      vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,%
+      vlax-variant-change-type,vlax-variant-type,vlax-variant-value,%
+      vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,%
+      vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,%
+      vlr-command-reactor,vlr-current-reaction-name,vlr-data,%
+      vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,%
+      vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,%
+      vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,%
+      vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,%
+      vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,%
+      vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,%
+      vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,%
+      vlr-remove,vlr-remove-all,vlr-set-notification,%
+      vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,%
+      vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,%
+      vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,%
+      write-char,write-line,xdroom,xdsize,zerop},%
+   alsodigit=->,%
+   otherkeywords={1+,1-},%
+   sensitive=false,%
+   morecomment=[l];,%
+   morecomment=[l];;,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{LLVM}
+%\label{sec:llvm}
+%
+% LLVM provides a collection of modular and reusable compiler and toolchain
+% technologies, all further information can be found at its home page
+% \url{http://llvm.org/}. \lstthanks{Scott Pakin}{scott@pakin.org}{2013/07/31} provided a
+% language definition for the LLVM intermediate presentation according to
+% \url{http://llvm.org/docs/}.\footnote{In this section `I' is Scott
+% Pakin.} The language provides
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{LLVM}{%
+  morekeywords={%
+%    \end{macrocode}
+% \begin{itemize}
+% \item Instructions
+%    \begin{macrocode}
+    ret,br,switch,indirectbr,invoke,resume,unreachable,%
+    add,fadd,sub,fsub,mul,fmul,udiv,sdiv,fdiv,urem,srem,frem,%
+    shl,lshr,ashr,and,or,xor,%
+    extractelement,insertelement,shufflevector,%
+    extractvalue,insertvalue,%
+    alloca,load,store,fence,cmpxchg,atomicrmw,getelementptr,%
+    trunc,zext,sext,fptrunc,fpext,fptoui,fptosi,uitofp,sitofp,ptrtoint,%
+    inttoptr,bitcast,to,%
+    icmp,fcmp,phi,select,call,va_arg,landingpad,%
+%    \end{macrocode}
+% \item Atomic operations -- some duplication with the above
+%    \begin{macrocode}
+    xchg,add,sub,and,nand,or,xor,max,min,umax,umin,%
+%    \end{macrocode}
+% \item Comparisons
+%    \begin{macrocode}
+    eq,ne,ugt,uge,ult,ule,sgt,sge,slt,sle,%
+    false,oeq,ogt,oge,olt,ole,one,ord,ueq,ugt,uge,ult,ule,une,uno,true,%
+%    \end{macrocode}
+% \item Linkage types
+%    \begin{macrocode}
+    private,linker_private,linker_private_weak,linker_private_weak_def_auto,%
+    internal,available_externally,linkonce,common,weak,appending,extern_weak,%
+    linkonce_odr,weak_odr,external,dllimport,dllexport,%
+%    \end{macrocode}
+% \item Function headers
+%    \begin{macrocode}
+    define,declare,%
+%    \end{macrocode}
+% \item Parameter attributes
+%    \begin{macrocode}
+    zeroext,signext,inreg,byval,sret,noalias,nocapture,next,%
+%    \end{macrocode}
+% \item Garbage collector names
+%    \begin{macrocode}
+    gc,%
+%    \end{macrocode}
+% \item Function attributes
+%    \begin{macrocode}
+    address_safety,alignstack,alwaysinline,nonlazybind,inlinehint,naked,%
+    noimplicitfloat,noinline,noredzone,noreturn,nounwind,optsize,readnone,%
+    readonly,returns_twice,ssp,sspreq,uwtable,%
+%    \end{macrocode}
+% \item Module-level inline assembly
+%    \begin{macrocode}
+    module,asm,%
+%    \end{macrocode}
+% \item Data layout
+%    \begin{macrocode}
+    target,datalayout,%
+%    \end{macrocode}
+% \item Inline assembler expressions
+%    \begin{macrocode}
+    sideeffect,alignstack,%
+%    \end{macrocode}
+% \item Other keywords -- I'm probably missing some here.
+%    \begin{macrocode}
+    nuw,nsw,exact,inbounds,unnamed_addr},%
+  morekeywords=[2]{%
+%    \end{macrocode}
+% \item Types
+%    \begin{macrocode}
+    i1,i2,i4,i8,i16,i32,i64,i128,i256,i512,i1024,% <-- Most common integers
+    half,float,double,x86_fp80,fp128,ppc_fp128,x86mmx,%
+    void,label,metadata},%
+  alsoletter=.,%
+  sensitive=false,%
+  morecomment=[l];,%
+  morestring=[b]"%
+}
+%    \end{macrocode}
+% \end{itemize}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Logo}
+%
+% I don't know where the keywords are from and what kind of Logo it is.
+% Help me!
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Logo}%
+% ??? {end,unix} also keywords
+  {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,%
+      cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,%
+      describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,%
+      errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,%
+      fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,%
+      fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,%
+      help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,%
+      local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,%
+      not,numberp,oflush,openr,openread,openw,openwrite,op,output,%
+      pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,%
+      rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,%
+      se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,%
+      sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,%
+      to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,%
+      mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,%
+      ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,%
+      lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,%
+      penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,%
+      scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,%
+      showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,%
+      display,dpy},%
+   sensitive=f% ???
+  }[keywords]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Lua}
+%
+% \lstthanks{Stephan Hennig}{sh2d@arcor.de}{2013/06/14} contributed the Lua
+% keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+% We begin with the keywords for Lua 5.0:
+%    \begin{macrocode}
+%%
+%% Lua definitions (c) 2013 Stephan Hennig
+%%
+\lst@definelanguage[5.0]{Lua}{%
+%    \end{macrocode}
+% To enable highlighting of library keywords, the dot needs to be a
+% letter.
+%    \begin{macrocode}
+  alsoletter={.},%
+%    \end{macrocode}
+% The language definition knows
+% \begin{itemize}
+%   \item language keywords
+%    \begin{macrocode}
+  morekeywords=[1]{%
+    and, break, do, else, elseif, end, false, for, function, if, in,%
+    local, nil, not, or, repeat, return, then, true, until, while,%
+  },%
+%    \end{macrocode}
+%   \item the standard library identifiers
+%    \begin{macrocode}
+  morekeywords=[2]{%
+%    \end{macrocode}
+%   \begin{itemize}
+%     \item coming from the base library
+%    \begin{macrocode}
+    _G, _LOADED, _REQUIREDNAME, _VERSION, LUA_PATH,%
+    assert, collectgarbage, dofile, error, gcinfo, getfenv,%
+    getmetatable, ipairs, loadfile, loadlib, loadstring, newproxy,%
+    next, pairs, pcall, print, rawequal, rawget, rawset, require,%
+    setfenv, setmetatable, tonumber, tostring, type, unpack, xpcall,%
+%    \end{macrocode}
+%     \item coming from the coroutine library
+%    \begin{macrocode}
+    coroutine, coroutine.create, coroutine.resume,%
+    coroutine.status, coroutine.wrap, coroutine.yield,%
+%    \end{macrocode}
+%     \item the debug library
+%    \begin{macrocode}
+    _TRACEBACK, debug, debug.debug, debug.gethook, debug.getinfo,%
+    debug.getlocal, debug.getupvalue, debug.sethook, debug.setlocal,%
+    debug.setupvalue,debug.traceback,%
+%    \end{macrocode}
+%     \item the io library
+%    \begin{macrocode}
+    io, io.close, io.flush, io.input, io.lines, io.open, io.output,%
+    io.popen, io.read, io.stderr, io.stdin, io.stdout, io.tmpfile,%
+    io.type, io.write,%
+%    \end{macrocode}
+%     \item the mathematical library
+%    \begin{macrocode}
+    __pow, math, math.abs, math.acos, math.asin, math.atan, math.atan2,%
+    math.ceil, math.cos, math.deg, math.exp, math.floor, math.frexp,%
+    math.ldexp, math.log, math.log10, math.max, math.min, math.mod,%
+    math.pi, math.pow, math.rad, math.random, math.randomseed, math.sin,%
+    math.sqrt, math.tan,%
+%    \end{macrocode}
+%     \item the os library
+%    \begin{macrocode}
+    os, os.clock, os.date, os.difftime, os.execute, os.exit, os.getenv,%
+    os.remove, os.rename, os.setlocale, os.time, os.tmpname,%
+%    \end{macrocode}
+%     \item the string library
+%    \begin{macrocode}
+    string, string.byte, string.char, string.dump, string.find,%
+    string.format, string.gfind, string.gsub, string.len, string.lower,%
+    string.rep, string.sub, string.upper,%
+%    \end{macrocode}
+%     \item the table library
+%    \begin{macrocode}
+    table, table.concat, table.foreach, table.foreachi, table.getn,%
+    table.insert, table.remove, table.setn, table.sort,%
+  },%
+%    \end{macrocode}
+%   \end{itemize}
+% \end{itemize}
+% and some additional identifiers
+%    \begin{macrocode}
+  morekeywords=[2]{%
+    _PROMPT, _PROMPT2, arg,%
+  },%
+%    \end{macrocode}
+% These are the common language settings
+%    \begin{macrocode}
+  sensitive=true,%
+  % single line comments
+  morecomment=[l]{--},%
+  % multi line comments
+  morecomment=[s]{--[[}{]]},%
+  % backslash escaped strings
+  morestring=[b]",%
+  morestring=[b]',%
+  % multi line strings
+  morestring=[s]{[[}{]]},%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+% \endgroup
+% And here are the new definitions for Lua 5.1:
+% \begingroup
+%    \begin{macrocode}
+\lst@definelanguage[5.1]{Lua}[5.0]{Lua}{%
+%    \end{macrocode}
+%  There are some deletions
+%    \begin{macrocode}
+  deletekeywords=[2]{%
+%    \end{macrocode}
+% concerning
+% \begin{itemize}
+% \item the base library
+%    \begin{macrocode}
+    _LOADED, _REQUIREDNAME, LUA_PATH, gcinfo, loadlib,%
+%    \end{macrocode}
+% \item the debug library
+%    \begin{macrocode}
+    _TRACEBACK,%
+%    \end{macrocode}
+% \item the mathematical library
+%    \begin{macrocode}
+    __pow, math.mod,%
+%    \end{macrocode}
+% \item the string library
+%    \begin{macrocode}
+    string.gfind,%
+%    \end{macrocode}
+% \item the table library
+%    \begin{macrocode}
+    table.foreach, table.foreachi, table.getn, table.setn,%
+  },%
+%    \end{macrocode}
+% \end{itemize}
+%  and some new identifiers in standard libraries like
+%    \begin{macrocode}
+  morekeywords=[2]{%
+%    \end{macrocode}
+% \begin{itemize}
+% \item the base library
+%    \begin{macrocode}
+    load, select,%
+%    \end{macrocode}
+%   \item coroutine library
+%    \begin{macrocode}
+    coroutine.running,%
+%    \end{macrocode}
+%   \item debug library
+%    \begin{macrocode}
+    debug.getfenv, debug.getmetatable, debug.getregistry, debug.setfenv,%
+    debug.setmetatable,%
+%    \end{macrocode}
+%   \item the mathematical library
+%    \begin{macrocode}
+    math.cosh, math.fmod, math.huge, math.modf, math.sinh, math.tanh,%
+%    \end{macrocode}
+%   \item the package library which itself is new in Lua 5.1
+%    \begin{macrocode}
+    module, package, package.config, package.cpath, package.loaded,%
+    package.loaders, package.loadlib, package.path, package.preload,%
+    package.seeall,%
+%    \end{macrocode}
+%   \item the string library and
+%    \begin{macrocode}
+    string.gmatch, string.match, string.reverse,%
+%    \end{macrocode}
+%   \item the table library
+%    \begin{macrocode}
+    table.maxn,%
+  },%
+%    \end{macrocode}
+% \end{itemize}
+% In Lua 5.1 long bracket comments were introduced also
+%    \begin{macrocode}
+  morecomment=[s]{--[=[}{]=]},%
+  morecomment=[s]{--[==[}{]==]},%
+  morecomment=[s]{--[===[}{]===]},%
+  morecomment=[s]{--[====[}{]====]},%
+  morecomment=[s]{--[=====[}{]=====]},%
+  morecomment=[s]{--[======[}{]======]},%
+  morecomment=[s]{--[=======[}{]=======]},%
+  morecomment=[s]{--[========[}{]========]},%
+  morecomment=[s]{--[=========[}{]=========]},%
+  morecomment=[s]{--[==========[}{]==========]},%
+%    \end{macrocode}
+% as well as long bracket strings
+%    \begin{macrocode}
+  morestring=[s]{[=[}{]=]},%
+  morestring=[s]{[==[}{]==]},%
+  morestring=[s]{[===[}{]===]},%
+  morestring=[s]{[====[}{]====]},%
+  morestring=[s]{[=====[}{]=====]},%
+  morestring=[s]{[======[}{]======]},%
+  morestring=[s]{[=======[}{]=======]},%
+  morestring=[s]{[========[}{]========]},%
+  morestring=[s]{[=========[}{]=========]},%
+  morestring=[s]{[==========[}{]==========]},%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+% \endgroup
+%
+% Lua 5.2 again has some changed features. These are
+% \begingroup
+%    \begin{macrocode}
+\lst@definelanguage[5.2]{Lua}[5.1]{Lua}{%
+%    \end{macrocode}
+% \begin{itemize}
+%   \item new language keywords
+%    \begin{macrocode}
+  morekeywords=[1]{%
+    goto,%
+  },%
+%    \end{macrocode}
+%   \item deleted identifiers from the standard libraries like
+%    \begin{macrocode}
+  deletekeywords=[2]{%
+%    \end{macrocode}
+%   \begin{itemize}
+%     \item the base library
+%    \begin{macrocode}
+    getfenv, loadstring, module, newproxy, setfenv, unpack,%
+%    \end{macrocode}
+%     \item the debug library
+%    \begin{macrocode}
+    debug.getfenv, debug.setfenv,%
+%    \end{macrocode}
+%     \item the mathematical library
+%    \begin{macrocode}
+    math.log10,%
+%    \end{macrocode}
+%     \item the package library and
+%    \begin{macrocode}
+    package.loaders, package.seeall,%
+%    \end{macrocode}
+%     \item the table library
+%    \begin{macrocode}
+    table.maxn,%
+  },%
+%    \end{macrocode}
+%   \end{itemize}
+% \end{itemize}
+% Again there are some new identifiers in the standard libraries
+%    \begin{macrocode}
+  morekeywords=[2]{%
+%    \end{macrocode}
+% like
+% \begin{itemize}
+% \item the base library
+%    \begin{macrocode}
+    rawlen,%
+%    \end{macrocode}
+% \item the bit library
+%    \begin{macrocode}
+    bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+    bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+    bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+%    \end{macrocode}
+%   \item the debug library
+%    \begin{macrocode}
+    debug.getuservalue, debug.setuservalue, debug.upvalueid,%
+    debug.upvaluejoin,%
+%    \end{macrocode}
+%   \item the package library
+%    \begin{macrocode}
+    package.searchers, package.searchpath,%
+%    \end{macrocode}
+%   \item the table library
+%    \begin{macrocode}
+    table.pack, table.unpack,%
+  },%
+%    \end{macrocode}
+%   \end{itemize}
+% There is a new additional identifier
+%    \begin{macrocode}
+  morekeywords=[2]{%
+    _ENV,%
+  },%
+%    \end{macrocode}
+% and labels are also new in Lua 5.2
+%    \begin{macrocode}
+  moredelim=[s][keywordstyle3]{::}{::},%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+% \endgroup
+%
+% In January 2015 Lua 5.3 was released, \lstthanks{Stephan
+% Hennig}{sh2d@posteo.net}{2015/03/28} again contributed the Lua
+% keywords.
+% \begingroup
+%    \begin{macrocode}
+\lst@definelanguage[5.3]{Lua}[5.2]{Lua}{%
+%    \end{macrocode}
+% \begin{itemize}
+%   \item some libraries are deprecated, so the following identifiers
+%   are deleted
+%    \begin{macrocode}
+  deletekeywords=[2]{%
+%    \end{macrocode}
+%   \begin{itemize}
+%     \item the |bit32| library
+%    \begin{macrocode}
+    bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+    bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+    bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+%    \end{macrocode}
+%     \item the mathematical library
+%    \begin{macrocode}
+    math.atan2, math.cosh, math.frexp, math.ldexp, math.pow,%
+    math.sinh, math.tanh,%
+  },%
+%    \end{macrocode}
+%   \end{itemize}
+% \end{itemize}
+% Again there are some new identifiers in the standard libraries
+%    \begin{macrocode}
+  morekeywords=[2]{%
+%    \end{macrocode}
+% like
+% \begin{itemize}
+% \item the coroutine library
+%    \begin{macrocode}
+    coroutine.isyieldable,%
+%    \end{macrocode}
+%   \item the mathematical library
+%    \begin{macrocode}
+    math.maxinteger, math.mininteger, math.tointeger, math.type,%
+    math.ult,%
+%    \end{macrocode}
+%   \item the string library
+%    \begin{macrocode}
+    string.pack, string.packsize, string.unpack,%
+%    \end{macrocode}
+%   \item the table library
+%    \begin{macrocode}
+    table.move,%
+%    \end{macrocode}
+%   \item the utf-8 library
+%    \begin{macrocode}
+    utf8, utf8.char, utf8.charpattern, utf8.codepoint, utf8.codes,%
+    utf8.len, utf8.offset,%
+  },%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Stephan Hennig also supplied a definition of a style for printing Lua code:
+%    \begin{macrocode}
+%<*lua-prf>
+%    \end{macrocode}
+%    \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+\lstdefinestyle{Lua}{%
+  language=[5.2]Lua,
+  basicstyle=\ttfamily,
+  columns=spaceflexible,
+  keywordstyle=\bfseries\color{Blue4},% language keywords
+  keywordstyle=[2]\bfseries\color{RoyalBlue3},% std. library identifiers
+  keywordstyle=[3]\bfseries\color{Purple3},% labels
+  stringstyle=\bfseries\color{Coral4},% strings
+  commentstyle=\itshape\color{Green4},% comments
+}
+%    \end{macrocode}
+% This code is provided in the file |listings-lua.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+%    \begin{macrocode}
+%</lua-prf>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Make}
+%
+% \lstthanks{Rolf~Niepraschk}{niepraschk@ptb.de}{2000/01/10} sent me the new
+% definitions. \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}
+% found a missing comma and added some keywords, which improve the highlighting
+% with |makemacrouse=true| (but I haven't tested this).
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Make definitions (c) 2000 Rolf Niepraschk
+%%
+\lst@definelanguage[gnu]{make}%
+  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,%
+      @,^,<,\%,+,?,*,% Markus Pahlow
+      export,unexport,include,override,define,ifdef,ifneq,ifeq,else,%
+      endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,%
+      sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,%
+      words,firstword,wildcard,shell,origin,foreach,%
+      @D,@F,*D,*F,\%D,\%F,<D,<F,^D,^F,+D,+F,?D,?F,%
+      AR,AS,CC,CXX,CO,CPP,FC,GET,LEX,PC,YACC,YACCR,MAKEINFO,TEXI2DVI,%
+      WEAVE,CWEAVE,TANGLE,CTANGLE,RM,M2C,LINT,COMPILE,LINK,PREPROCESS,%
+      CHECKOUT,%
+      ARFLAGS,ASFLAGS,CFLAGS,CXXFLAGS,COFLAGS,CPPFLAGS,FFLAGS,GFLAGS,%
+      LDFLAGS,LOADLIBES,LFLAGS,PFLAGS,RFLAGS,YFLAGS,M2FLAGS,MODFLAGS,%
+      LINTFLAGS,MAKEINFO_FLAGS,TEXI2DVI_FLAGS,COFLAGS,GFLAGS,%
+      OUTPUT_OPTION,SCCS_OUTPUT_OPTION,% missing comma: Markus Pahlow
+      .PHONY,.SUFFIXES,.DEFAULT,.PRECIOUS,.INTERMEDIATE,.SECONDARY,%
+      .IGNORE,.SILENT,.EXPORT_ALL_VARIABLES,MAKEFILES,VPATH,MAKESHELL,%
+      MAKELEVEL,MAKECMDGOALS,SUFFIXES},%
+   sensitive=true,
+   morecomment=[l]\#,%
+   morestring=[b]"%
+  }[keywords,comments,strings,make]%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{make}
+  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morestring=[b]"%
+  }[keywords,comments,strings,make]%
+%    \end{macrocode}
+% The two \texttt{[b]}-arguments have been added after a bug report by
+% \lsthelper{Dr.~Jobst~Hoffmann}{2002/06/24,2002/09/05}{language=make leads
+% to: Use of \lst@FindAlias doesn't match its definition}.
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Matlab}
+%
+% I took the keywords from \texttt{http://www.utexas.edu/math/Matlab/Manual},
+% but I removed the keywords |i|, |j| and |tmp|---the change was proposed by
+% \lsthelper{Kai Below}{below@tu-harburg.de}{1998/09/21}{Matlab: keywords
+% i,j,tmp removed}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Matlab}%
+  {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},%
+   sensitive,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Mathematica}
+%
+% \lstthanks{Michael Wiese}{wiese@itwm.uni-kl.de}{1999/02/25} typed in all the
+% keywords for the 1.0 and 3.0 versions.
+% \lstthanks{Oliver~Ruebenkoenig}{-}{2006/07/17} wrote a script to generate
+% the lists for the 5.2 version.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[5.2]{Mathematica}[3.0]{Mathematica}%%
+  {morekeywords={Above,AbsoluteOptions,AbsoluteTiming,AccountingForm,%
+      AccuracyGoal,Active,ActiveItem,AddOnHelpPath,%
+      AdjustmentBox,AdjustmentBoxOptions,After,AiryAiPrime,%
+      AlgebraicRulesData,Algebraics,Alias,AlignmentMarker,%
+      AllowInlineCells,AllowScriptLevelChange,Analytic,AnimationCycleOffset,%
+      AnimationCycleRepetitions,AnimationDirection,AnimationDisplayTime,ApartSquareFree,%
+      AppellF1,ArgumentCountQ,ArrayDepth,ArrayPlot,%
+      ArrayQ,ArrayRules,AspectRatioFixed,Assuming,%
+      Assumptions,AutoDelete,AutoEvaluateEvents,AutoGeneratedPackage,%
+      AutoIndent,AutoIndentSpacings,AutoItalicWords,AutoloadPath,%
+      AutoOpenNotebooks,AutoOpenPalettes,AutoScroll,AutoSpacing,%
+      AutoStyleOptions,Axis,BackgroundTasksSettings,Backsubstitution,%
+      Backward,Baseline,Before,BeginDialogPacket,%
+      BeginFrontEndInteractionPacket,Below,BezoutMatrix,BinaryFormat,%
+      BinaryGet,BinaryRead,BinaryReadList,BinaryWrite,%
+      BitAnd,BitNot,BitOr,BitXor,%
+      Black,BlankForm,Blue,Boole,%
+      Booleans,Bottom,Bounds,Box,%
+      BoxBaselineShift,BoxData,BoxDimensions,BoxFormFormatTypes,%
+      BoxFrame,BoxMargins,BoxRegion,Brown,%
+      Buchberger,Button,ButtonBox,ButtonBoxOptions,%
+      ButtonCell,ButtonContents,ButtonData,ButtonEvaluator,%
+      ButtonExpandable,ButtonFrame,ButtonFunction,ButtonMargins,%
+      ButtonMinHeight,ButtonNote,ButtonNotebook,ButtonSource,%
+      ButtonStyle,ButtonStyleMenuListing,ByteOrdering,CallPacket,%
+      CarmichaelLambda,Cell,CellAutoOverwrite,CellBaseline,%
+      CellBoundingBox,CellBracketOptions,CellContents,CellDingbat,%
+      CellEditDuplicate,CellElementsBoundingBox,CellElementSpacings,CellEvaluationDuplicate,%
+      CellFrame,CellFrameColor,CellFrameLabelMargins,CellFrameLabels,%
+      CellFrameMargins,CellGroup,CellGroupData,CellGrouping,%
+      CellGroupingRules,CellHorizontalScrolling,CellLabel,CellLabelAutoDelete,%
+      CellLabelMargins,CellLabelPositioning,CellMargins,CellObject,%
+      CellOpen,CellPasswords,CellPrint,CellSize,%
+      CellStyle,CellTags,CellularAutomaton,Center,%
+      CharacterEncoding,CharacterEncodingsPath,CharacteristicPolynomial,CharacterRange,%
+      CheckAll,CholeskyDecomposition,Clip,ClipboardNotebook,%
+      Closed,ClosingAutoSave,CoefficientArrays,CoefficientDomain,%
+      CofactorExpansion,ColonForm,ColorFunctionScaling,ColorRules,%
+      ColorSelectorSettings,Column,ColumnAlignments,ColumnLines,%
+      ColumnsEqual,ColumnSpacings,ColumnWidths,CommonDefaultFormatTypes,%
+      CompileOptimizations,CompletionsListPacket,Complexes,ComplexityFunction,%
+      Compose,ComposeSeries,ConfigurationPath,ConjugateTranspose,%
+      Connect,ConsoleMessage,ConsoleMessagePacket,ConsolePrint,%
+      ContentsBoundingBox,ContextToFileName,ContinuedFraction,ConversionOptions,%
+      ConversionRules,ConvertToBitmapPacket,ConvertToPostScript,ConvertToPostScriptPacket,%
+      Copyable,CoshIntegral,CounterAssignments,CounterBox,%
+      CounterBoxOptions,CounterEvaluator,CounterFunction,CounterIncrements,%
+      CounterStyle,CounterStyleMenuListing,CreatePalettePacket,Cross,%
+      CurrentlySpeakingPacket,Cyan,CylindricalDecomposition,DampingFactor,%
+      DataRange,Debug,DebugTag,Decimal,%
+      DedekindEta,DefaultDuplicateCellStyle,DefaultFontProperties,DefaultFormatType,%
+      DefaultFormatTypeForStyle,DefaultInlineFormatType,DefaultInputFormatType,
+      DefaultNaturalLanguage,%
+      DefaultNewCellStyle,DefaultNewInlineCellStyle,DefaultNotebook,DefaultOutputFormatType,%
+      DefaultStyleDefinitions,DefaultTextFormatType,DefaultTextInlineFormatType,DefaultValues,%
+      DefineExternal,DegreeLexicographic,DegreeReverseLexicographic,Deletable,%
+      DeleteContents,DeletionWarning,DelimiterFlashTime,DelimiterMatching,%
+      Delimiters,DependentVariables,DiacriticalPositioning,DialogLevel,%
+      DifferenceOrder,DigitCharacter,DigitCount,DiracDelta,%
+      Direction,DirectoryName,DisableConsolePrintPacket,DiscreteDelta,%
+      DisplayAnimation,DisplayEndPacket,DisplayFlushImagePacket,DisplayForm,%
+      DisplayPacket,DisplayRules,DisplaySetSizePacket,DisplayString,%
+      DivisionFreeRowReduction,DOSTextFormat,DoubleExponential,DoublyInfinite,%
+      Down,DragAndDrop,DrawHighlighted,DualLinearProgramming,%
+      DumpGet,DumpSave,Edit,Editable,%
+      EditButtonSettings,EditCellTagsSettings,EditDefinition,EditIn,%
+      Element,EliminationOrder,EllipticExpPrime,EllipticNomeQ,%
+      EllipticReducedHalfPeriods,EllipticThetaPrime,Empty,EnableConsolePrintPacket,%
+      Encoding,EndAdd,EndDialogPacket,EndFrontEndInteractionPacket,%
+      EndOfLine,EndOfString,Enter,EnterExpressionPacket,%
+      EnterTextPacket,EqualColumns,EqualRows,EquatedTo,%
+      Erfi,ErrorBox,ErrorBoxOptions,ErrorNorm,%
+      ErrorPacket,ErrorsDialogSettings,Evaluatable,EvaluatePacket,%
+      EvaluationCell,EvaluationCompletionAction,EvaluationMonitor,EvaluationNotebook,%
+      Evaluator,EvaluatorNames,EventEvaluator,ExactNumberQ,%
+      ExactRootIsolation,Except,ExcludedForms,Exists,%
+      ExitDialog,ExponentPosition,ExponentStep,Export,%
+      ExportAutoReplacements,ExportPacket,ExportString,ExpressionPacket,%
+      ExpToTrig,Extension,ExternalCall,ExternalDataCharacterEncoding,%
+      Extract,Fail,FEDisableConsolePrintPacket,FEEnableConsolePrintPacket,%
+      Fibonacci,File,FileFormat,FileInformation,%
+      FileName,FileNameDialogSettings,FindFit,FindInstance,%
+      FindMaximum,FindSettings,FitAll,FlushPrintOutputPacket,%
+      Font,FontColor,FontFamily,FontName,%
+      FontPostScriptName,FontProperties,FontReencoding,FontSize,%
+      FontSlant,FontSubstitutions,FontTracking,FontVariations,%
+      FontWeight,ForAll,FormatRules,FormatTypeAutoConvert,%
+      FormatValues,FormBox,FormBoxOptions,Forward,%
+      ForwardBackward,FourierCosTransform,FourierParameters,FourierSinTransform,%
+      FourierTransform,FractionalPart,FractionBox,FractionBoxOptions,%
+      FractionLine,FrameBox,FrameBoxOptions,FresnelC,%
+      FresnelS,FromContinuedFraction,FromDigits,FrontEndExecute,%
+      FrontEndObject,FrontEndStackSize,FrontEndToken,FrontEndTokenExecute,%
+      FrontEndVersion,Full,FullAxes,FullSimplify,%
+      FunctionExpand,FunctionInterpolation,GaussKronrod,GaussPoints,%
+      GenerateBitmapCaches,GenerateConditions,GeneratedCell,GeneratedParameters,%
+      Generic,GetBoundingBoxSizePacket,GetContext,GetFileName,%
+      GetFrontEndOptionsDataPacket,GetLinebreakInformationPacket,%
+      GetMenusPacket,GetPageBreakInformationPacket,%
+      Glaisher,GlobalPreferences,GlobalSession,Gradient,%
+      GraphicsData,GraphicsGrouping,Gray,Green,%
+      Grid,GridBaseline,GridBox,GridBoxOptions,%
+      GridCreationSettings,GridDefaultElement,GridFrame,GridFrameMargins,%
+      GroupPageBreakWithin,HarmonicNumber,Hash,HashTable,%
+      HeadCompose,HelpBrowserLookup,HelpBrowserNotebook,HelpBrowserSettings,%
+      HessenbergDecomposition,Hessian,HoldAllComplete,HoldComplete,%
+      HoldPattern,Horizontal,HorizontalForm,HorizontalScrollPosition,%
+      HTMLSave,Hypergeometric0F1Regularized,Hypergeometric1F1Regularized,%
+      Hypergeometric2F1Regularized,%
+      HypergeometricPFQ,HypergeometricPFQRegularized,HyperlinkCreationSettings,Hyphenation,%
+      HyphenationOptions,IgnoreCase,ImageCache,ImageCacheValid,%
+      ImageMargins,ImageOffset,ImageRangeCache,ImageRegion,%
+      ImageResolution,ImageRotated,ImageSize,Import,%
+      ImportAutoReplacements,ImportString,IncludeFileExtension,IncludeSingularTerm,%
+      IndentingNewlineSpacings,IndentMaxFraction,IndexCreationOptions,Inequality,%
+      InexactNumberQ,InexactNumbers,Inherited,InitializationCell,%
+      InitializationCellEvaluation,InitializationCellWarning,%
+      InlineCounterAssignments,InlineCounterIncrements,%
+      InlineRules,InputAliases,InputAutoFormat,InputAutoReplacements,%
+      InputGrouping,InputNamePacket,InputNotebook,InputPacket,%
+      InputSettings,InputStringPacket,InputToBoxFormPacket,InputToInputForm,%
+      InputToStandardForm,InsertionPointObject,IntegerExponent,IntegerPart,%
+      Integers,Interactive,Interlaced,InterpolationOrder,%
+      InterpolationPoints,InterpolationPrecision,InterpretationBox,%
+      InterpretationBoxOptions,%
+      InterpretTemplate,InterruptSettings,Interval,IntervalIntersection,%
+      IntervalMemberQ,IntervalUnion,InverseBetaRegularized,InverseEllipticNomeQ,%
+      InverseErf,InverseErfc,InverseFourierCosTransform,
+      InverseFourierSinTransform,%
+      InverseFourierTransform,InverseGammaRegularized,InverseJacobiCD,%
+      InverseJacobiCN,%
+      InverseJacobiCS,InverseJacobiDC,InverseJacobiDN,InverseJacobiDS,%
+      InverseJacobiNC,InverseJacobiND,InverseJacobiNS,InverseJacobiSC,%
+      InverseJacobiSD,InverseLaplaceTransform,InverseWeierstrassP,InverseZTransform,%
+      Jacobian,JacobiCD,JacobiCN,JacobiCS,%
+      JacobiDC,JacobiDN,JacobiDS,JacobiNC,%
+      JacobiND,JacobiNS,JacobiSC,JacobiSD,%
+      JordanDecomposition,K,Khinchin,KleinInvariantJ,%
+      KroneckerDelta,Language,LanguageCategory,LaplaceTransform,%
+      Larger,Launch,LayoutInformation,Left,%
+      LetterCharacter,Lexicographic,LicenseID,LimitsPositioning,%
+      LimitsPositioningTokens,LinearSolveFunction,LinebreakAdjustments,LineBreakWithin,%
+      LineForm,LineIndent,LineSpacing,LineWrapParts,%
+      LinkActivate,LinkClose,LinkConnect,LinkConnectedQ,%
+      LinkCreate,LinkError,LinkFlush,LinkHost,%
+      LinkInterrupt,LinkLaunch,LinkMode,LinkObject,%
+      LinkOpen,LinkOptions,LinkPatterns,LinkProtocol,%
+      LinkRead,LinkReadHeld,LinkReadyQ,Links,%
+      LinkWrite,LinkWriteHeld,ListConvolve,ListCorrelate,%
+      Listen,ListInterpolation,ListQ,LiteralSearch,%
+      LongestMatch,LongForm,Loopback,LUBackSubstitution,%
+      LUDecomposition,MachineID,MachineName,MachinePrecision,%
+      MacintoshSystemPageSetup,Magenta,Magnification,MakeBoxes,%
+      MakeExpression,MakeRules,Manual,MatchLocalNameQ,%
+      MathematicaNotation,MathieuC,MathieuCharacteristicA,MathieuCharacteristicB,%
+      MathieuCharacteristicExponent,MathieuCPrime,MathieuS,MathieuSPrime,%
+      MathMLForm,MathMLText,MatrixRank,Maximize,%
+      MaxIterations,MaxPlotPoints,MaxPoints,MaxRecursion,%
+      MaxStepFraction,MaxSteps,MaxStepSize,Mean,%
+      Median,MeijerG,MenuPacket,MessageOptions,%
+      MessagePacket,MessagesNotebook,MetaCharacters,Method,%
+      MethodOptions,Minimize,MinRecursion,MinSize,%
+      Mode,ModularLambda,MonomialOrder,MonteCarlo,%
+      Most,MousePointerNote,MultiDimensional,MultilaunchWarning,%
+      MultilineFunction,MultiplicativeOrder,Multiplicity,Nand,%
+      NeedCurrentFrontEndPackagePacket,NeedCurrentFrontEndSymbolsPacket,%
+      NestedScriptRules,NestWhile,%
+      NestWhileList,NevilleThetaC,NevilleThetaD,NevilleThetaN,%
+      NevilleThetaS,Newton,Next,NHoldAll,%
+      NHoldFirst,NHoldRest,NMaximize,NMinimize,%
+      NonAssociative,NonPositive,Nor,Norm,%
+      NormalGrouping,NormalSelection,NormFunction,Notebook,%
+      NotebookApply,NotebookAutoSave,NotebookClose,NotebookConvert,%
+      NotebookConvertSettings,NotebookCreate,NotebookCreateReturnObject,NotebookDefault,%
+      NotebookDelete,NotebookDirectory,NotebookFind,NotebookFindReturnObject,%
+      NotebookGet,NotebookGetLayoutInformationPacket,NotebookGetMisspellingsPacket,%
+      NotebookInformation,%
+      NotebookLocate,NotebookObject,NotebookOpen,NotebookOpenReturnObject,%
+      NotebookPath,NotebookPrint,NotebookPut,NotebookPutReturnObject,%
+      NotebookRead,NotebookResetGeneratedCells,Notebooks,NotebookSave,%
+      NotebookSaveAs,NotebookSelection,NotebookSetupLayoutInformationPacket,%
+      NotebooksMenu,%
+      NotebookWrite,NotElement,NProductExtraFactors,NProductFactors,%
+      NRoots,NSumExtraTerms,NSumTerms,NumberMarks,%
+      NumberMultiplier,NumberString,NumericFunction,NumericQ,%
+      NValues,Offset,OLEData,OneStepRowReduction,%
+      Open,OpenFunctionInspectorPacket,OpenSpecialOptions,OptimizationLevel,%
+      OptionInspectorSettings,OptionQ,OptionsPacket,OptionValueBox,%
+      OptionValueBoxOptions,Orange,Ordering,Oscillatory,%
+      OutputAutoOverwrite,OutputFormData,OutputGrouping,OutputMathEditExpression,%
+      OutputNamePacket,OutputToOutputForm,OutputToStandardForm,Over,%
+      Overflow,Overlaps,Overscript,OverscriptBox,%
+      OverscriptBoxOptions,OwnValues,PadLeft,PadRight,%
+      PageBreakAbove,PageBreakBelow,PageBreakWithin,PageFooterLines,%
+      PageFooters,PageHeaderLines,PageHeaders,PalettePath,%
+      PaperWidth,ParagraphIndent,ParagraphSpacing,ParameterVariables,%
+      ParentConnect,ParentForm,Parenthesize,PasteBoxFormInlineCells,%
+      Path,PatternTest,PeriodicInterpolation,Pick,%
+      Piecewise,PiecewiseExpand,Pink,Pivoting,%
+      PixelConstrained,Placeholder,Plain,Plot3Matrix,%
+      PointForm,PolynomialForm,PolynomialReduce,Polynomials,%
+      PowerModList,Precedence,PreferencesPath,PreserveStyleSheet,%
+      Previous,PrimaryPlaceholder,Primes,PrincipalValue,%
+      PrintAction,PrintingCopies,PrintingOptions,PrintingPageRange,%
+      PrintingStartingPageNumber,PrintingStyleEnvironment,PrintPrecision,%
+      PrivateCellOptions,%
+      PrivateEvaluationOptions,PrivateFontOptions,PrivateNotebookOptions,PrivatePaths,%
+      ProductLog,PromptForm,Purple,Quantile,%
+      QuasiMonteCarlo,QuasiNewton,RadicalBox,RadicalBoxOptions,%
+      RandomSeed,RationalFunctions,Rationals,RawData,%
+      RawMedium,RealBlockForm,Reals,Reap,%
+      Red,Refine,Refresh,RegularExpression,%
+      Reinstall,Release,Removed,RenderingOptions,%
+      RepeatedString,ReplaceList,Rescale,ResetMenusPacket,%
+      Resolve,ResumePacket,ReturnExpressionPacket,ReturnInputFormPacket,%
+      ReturnPacket,ReturnTextPacket,Right,Root,%
+      RootReduce,RootSum,Row,RowAlignments,%
+      RowBox,RowLines,RowMinHeight,RowsEqual,%
+      RowSpacings,RSolve,RuleCondition,RuleForm,%
+      RulerUnits,Saveable,SaveAutoDelete,ScreenRectangle,%
+      ScreenStyleEnvironment,ScriptBaselineShifts,ScriptLevel,ScriptMinSize,%
+      ScriptRules,ScriptSizeMultipliers,ScrollingOptions,ScrollPosition,%
+      Second,SectionGrouping,Selectable,SelectedNotebook,%
+      Selection,SelectionAnimate,SelectionCell,SelectionCellCreateCell,%
+      SelectionCellDefaultStyle,SelectionCellParentStyle,SelectionCreateCell,%
+      SelectionDuplicateCell,%
+      SelectionEvaluate,SelectionEvaluateCreateCell,SelectionMove,SelectionSetStyle,%
+      SelectionStrategy,SendFontInformationToKernel,SequenceHold,SequenceLimit,%
+      SeriesCoefficient,SetBoxFormNamesPacket,SetEvaluationNotebook,%
+      SetFileLoadingContext,%
+      SetNotebookStatusLine,SetOptionsPacket,SetSelectedNotebook,%
+      SetSpeechParametersPacket,%
+      SetValue,ShortestMatch,ShowAutoStyles,ShowCellBracket,%
+      ShowCellLabel,ShowCellTags,ShowClosedCellArea,ShowContents,%
+      ShowCursorTracker,ShowGroupOpenCloseIcon,ShowPageBreaks,ShowSelection,%
+      ShowShortBoxForm,ShowSpecialCharacters,ShowStringCharacters,%
+      ShrinkWrapBoundingBox,%
+      SingleLetterItalics,SingularityDepth,SingularValueDecomposition,%
+      SingularValueList,%
+      SinhIntegral,Smaller,Socket,SolveDelayed,%
+      SoundAndGraphics,Sow,Space,SpaceForm,%
+      SpanAdjustments,SpanCharacterRounding,SpanLineThickness,SpanMaxSize,%
+      SpanMinSize,SpanningCharacters,SpanSymmetric,Sparse,%
+      SparseArray,SpeakTextPacket,SpellingDictionaries,SpellingDictionariesPath,%
+      SpellingOptions,SpellingSuggestionsPacket,Spherical,Split,%
+      SqrtBox,SqrtBoxOptions,StandardDeviation,StandardForm,%
+      StartingStepSize,StartOfLine,StartOfString,StartupSound,%
+      StepMonitor,StieltjesGamma,StoppingTest,StringCases,%
+      StringCount,StringExpression,StringFreeQ,StringQ,%
+      StringReplaceList,StringReplacePart,StringSplit,StripBoxes,%
+      StripWrapperBoxes,StructuredSelection,StruveH,StruveL,%
+      StyleBox,StyleBoxAutoDelete,StyleBoxOptions,StyleData,%
+      StyleDefinitions,StyleForm,StyleMenuListing,StyleNameDialogSettings,%
+      StylePrint,StyleSheetPath,Subresultants,SubscriptBox,%
+      SubscriptBoxOptions,Subsets,Subsuperscript,SubsuperscriptBox,%
+      SubsuperscriptBoxOptions,SubtractFrom,SubValues,SugarCube,%
+      SuperscriptBox,SuperscriptBoxOptions,SuspendPacket,SylvesterMatrix,%
+      SymbolName,Syntax,SyntaxForm,SyntaxPacket,%
+      SystemException,SystemHelpPath,SystemStub,Tab,%
+      TabFilling,TabSpacings,TagBox,TagBoxOptions,%
+      TaggingRules,TagStyle,TargetFunctions,TemporaryVariable,%
+      TensorQ,TeXSave,TextAlignment,TextBoundingBox,%
+      TextData,TextJustification,TextLine,TextPacket,%
+      TextParagraph,TextRendering,TextStyle,ThisLink,%
+      TimeConstraint,TimeVariable,TitleGrouping,ToBoxes,%
+      ToColor,ToFileName,Toggle,ToggleFalse,%
+      Tolerance,TooBig,Top,ToRadicals,%
+      Total,Tr,TraceAction,TraceInternal,%
+      TraceLevel,TraditionalForm,TraditionalFunctionNotation,TraditionalNotation,%
+      TraditionalOrder,TransformationFunctions,TransparentColor,Trapezoidal,%
+      TrigExpand,TrigFactor,TrigFactorList,TrigReduce,%
+      TrigToExp,Tuples,UnAlias,Underflow,%
+      Underoverscript,UnderoverscriptBox,UnderoverscriptBoxOptions,Underscript,%
+      UnderscriptBox,UnderscriptBoxOptions,UndocumentedTestFEParserPacket,%
+      UndocumentedTestGetSelectionPacket,%
+      UnitStep,Up,URL,Using,%
+      V2Get,Value,ValueBox,ValueBoxOptions,%
+      ValueForm,Variance,Verbatim,Verbose,%
+      VerboseConvertToPostScriptPacket,VerifyConvergence,VerifySolutions,Version,%
+      VersionNumber,Vertical,VerticalForm,ViewPointSelectorSettings,%
+      Visible,VisibleCell,WeierstrassHalfPeriods,WeierstrassInvariants,%
+      WeierstrassSigma,WeierstrassZeta,White,Whitespace,%
+      WhitespaceCharacter,WindowClickSelect,WindowElements,WindowFloating,%
+      WindowFrame,WindowFrameElements,WindowMargins,WindowMovable,%
+      WindowSize,WindowTitle,WindowToolbars,WindowWidth,%
+      WordBoundary,WordCharacter,WynnDegree,XMLElement},%
+   morendkeywords={$,$AddOnsDirectory,$AnimationDisplayFunction,%
+      $AnimationFunction,%
+      $Assumptions,$BaseDirectory,$BoxForms,$ByteOrdering,%
+      $CharacterEncoding,$ConditionHold,$CurrentLink,$DefaultPath,%
+      $ExportEncodings,$ExportFormats,$FormatType,$FrontEnd,%
+      $HistoryLength,$HomeDirectory,$ImportEncodings,$ImportFormats,%
+      $InitialDirectory,$InstallationDate,$InstallationDirectory,%
+      $InterfaceEnvironment,%
+      $LaunchDirectory,$LicenseExpirationDate,$LicenseID,$LicenseProcesses,%
+      $LicenseServer,$MachineDomain,$MaxExtraPrecision,$MaxLicenseProcesses,%
+      $MaxNumber,$MaxPiecewiseCases,$MaxPrecision,$MaxRootDegree,%
+      $MinNumber,$MinPrecision,$NetworkLicense,$NumberMarks,%
+      $Off,$OutputForms,$ParentLink,$ParentProcessID,%
+      $PasswordFile,$PathnameSeparator,$PreferencesDirectory,$PrintForms,%
+      $PrintLiteral,$ProcessID,$ProcessorType,$ProductInformation,%
+      $ProgramName,$PSDirectDisplay,$RandomState,$RasterFunction,%
+      $RootDirectory,$SetParentLink,$SoundDisplay,$SuppressInputFormHeads,%
+      $SystemCharacterEncoding,$SystemID,$TemporaryPrefix,$TextStyle,%
+      $TopDirectory,$TraceOff,$TraceOn,$TracePattern,%
+      $TracePostAction,$TracePreAction,$UserAddOnsDirectory,$UserBaseDirectory,%
+      $UserName,Constant,Flat,HoldAll,%
+      HoldAllComplete,HoldFirst,HoldRest,Listable,%
+      Locked,NHoldAll,NHoldFirst,NHoldRest,%
+      NumericFunction,OneIdentity,Orderless,Protected,%
+      ReadProtected,SequenceHold},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mathematica definitions (c) 1999 Michael Wiese
+%%
+\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}%
+  {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,%
+      AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,%
+      AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,%
+      AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,%
+      Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,%
+      Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,%
+      ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,%
+      ContourLines,Contours,ContourShading,ContourSmoothing,%
+      ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,%
+      Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,%
+      DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,%
+      DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,%
+      Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,%
+      ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,%
+      FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,%
+      Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,%
+      FromDate,FullGraphics,FullOptions,GammaRegularized,%
+      GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,%
+      GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,%
+      InputStream,Install,InString,IntegerDigits,InterpolatingFunction,%
+      InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,%
+      InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,%
+      LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,%
+      MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,%
+      MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,%
+      NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,%
+      PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,%
+      PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,%
+      PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,%
+      QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,%
+      RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,%
+      ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,%
+      RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,%
+      SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,%
+      SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,%
+      SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,%
+      SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,%
+      SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,%
+      StreamPosition,Streams,StringByteCount,StringConversion,%
+      StringDrop,StringInsert,StringPosition,StringReplace,%
+      StringReverse,StringTake,StringToStream,SurfaceColor,%
+      SyntaxLength,SyntaxQ,TableAlignments,TableDepth,%
+      TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,%
+      TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,%
+      ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,%
+      TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,%
+      TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,%
+      UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,%
+      WordSearch,WordSeparators},%
+   morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,%
+      $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,%
+      $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,%
+      $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,%
+      $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,%
+      $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,%
+      $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,%
+      $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,%
+      $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,%
+      $VersionNumber}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1.0]{Mathematica}%
+  {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,%
+      AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,%
+      ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,%
+      ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,%
+      AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,%
+      BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,%
+      BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,%
+      ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,%
+      ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,%
+      ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,%
+      Complement,Complex,CompoundExpression,Condition,Conjugate,%
+      Constants,Context,Continuation,Continue,ContourGraphics,%
+      ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,%
+      D,Dashing,Decompose,Decrement,Default,Definition,Denominator,%
+      DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,%
+      DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,%
+      Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,%
+      Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,%
+      EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,%
+      EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,%
+      Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,%
+      ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,%
+      Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,%
+      Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,%
+      FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,%
+      FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,%
+      FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,%
+      Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,%
+      Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,%
+      HiddenSurface,Hold,HoldForm,Hypergeometric0F1,Hypergeometric1F1,%
+      Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,%
+      Implies,In,Increment,Indent,Infix,Information,Inner,Input,%
+      InputForm,InputString,Insert,Integer,IntegerQ,Integrate,%
+      Intersection,Inverse,InverseFourier,InverseJacobiSN,%
+      InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,%
+      Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,%
+      LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,%
+      Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,%
+      ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,%
+      LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,%
+      MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,%
+      MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,%
+      Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,%
+      NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,%
+      NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,%
+      NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,%
+      NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,%
+      OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,%
+      OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,%
+      ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,%
+      PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,%
+      PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,%
+      Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,%
+      PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,%
+      Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,%
+      PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,%
+      Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,%
+      Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,%
+      Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,%
+      Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,%
+      RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,%
+      RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,%
+      Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,%
+      SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,%
+      Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,%
+      Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,%
+      SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,%
+      StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,%
+      StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,%
+      Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,%
+      TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,%
+      Text,TextForm,Thickness,Thread,Through,Throw,Ticks,%
+      TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,%
+      ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,%
+      Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,%
+      ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,%
+      WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,%
+      Xor,ZeroTest,Zeta},%
+   morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,%
+      Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,%
+      HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,%
+      Modular,None,Null,OneIdentity,Orderless,Pi,Protected,%
+      ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,%
+      $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,%
+      $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,%
+      $Urgent,$Version},%
+   sensitive,%
+   morecomment=[s]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Mercury}
+%
+% \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24} mailed me the
+% data and \lstthanks{Ralph~Becket}{rbeck@microsoft.com}{2001/05/01} extended
+% the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mercury definition (c) 1997 Dominique de Waleffe
+%% Extended (c) 2001 Ralph Becket
+%%
+\lst@definelanguage{Mercury}%
+  {otherkeywords={::,->,-->,--->,:-,==,=>,<=,<=>},%
+   morekeywords={module,include_module,import_module,interface,%
+      end_module,implementation,mode,is,failure,semidet,nondet,det,%
+      multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,%
+      where,with_type,pred,func,lambda,impure,semipure,if,then,else,%
+      some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,%
+      minimal_model,fact_table,type_spec,terminates,does_not_terminate,%
+      check_termination,promise_only_solution,unsafe_promise_unique,%
+      source_file,obsolete,import,export,c_header_code,c_code,%
+      foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,%
+      thread_safe,not_thread_safe},%
+   sensitive=t,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{MetaPost}
+%
+% \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de}{2003/03/28} provided the
+% keywords for a previous version. The current language definition comes
+% from \lstthanks{Brooks~Moses}{}{2004/08/07}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% MetaPost definition (c) 2004 Brooks Moses
+%%   This definition is based on the language specifications
+%%   contained in the _User's Manual for Metapost_, with the core
+%%   language enhancements that are described in the _Drawing
+%%   Graphs with MetaPost_ documentation.
+%%
+\lst@definelanguage{MetaPost}%
+  {% keywords[1] = MetaPost primitives (not found in following tables)
+   morekeywords={end,begingroup,endgroup,beginfig,endfig,def,vardef,%
+      primary,secondary,tertiary,primarydef,secondarydef,tertiarydef,%
+      expr,suffix,text,enddef,if,fi,else,elseif,for,forsuffixes,%
+      forever,endfor,upto,downto,stop,until,tension,controls,on,off,%
+      btex,etex,within,input},
+   % keywords[2] = Operators (Tables 6-9 in MetaPost User's manual)
+   morekeywords=[2]{abs,and,angle,arclength,arctime,ASCII,bbox,bluepart,%
+      boolean,bot,ceiling,center,char,color,cosd,cutafter,cutbefore,%
+      cycle,decimal,dir,direction,directionpoint,directiontime,div,%
+      dotprod,floor,fontsize,greenpart,hex,infont,intersectionpoint,%
+      intersectiontimes,inverse,known,length,lft,llcorner,lrcorner,%
+      makepath,makepen,mexp,mlog,mod,normaldeviate,not,numeric,oct,%
+      odd,or,pair,path,pen,penoffset,picture,point,postcontrol,%
+      precontrol,redpart,reverse,rotated,round,rt,scaled,shifted,%
+      sind,slanted,sqrt,str,string,subpath,substring,top,transform,%
+      transformed,ulcorner,uniformdeviate,unitvector,unknown,%
+      urcorner,whatever,xpart,xscaled,xxpart,xypart,ypart,yscaled,%
+      yxpart,yypart,zscaled,of,reflectedabout,rotatedaround,ulft,urt,%
+      llft,lrt,readfrom,write,stroked,filled,textual,clipped,bounded,%
+      pathpart,penpart,dashpart,textpart,fontpart},%
+   % keywords[3] = Commands (Table 10)
+   morekeywords=[3]{addto,clip,cutdraw,draw,drawarrow,drawdblarrow,%
+      fill,filldraw,interim,let,loggingall,newinternal,pickup,%
+      save,setbounds,shipout,show,showdependencies,showtoken,%
+      showvariable,special,tracingall,tracingnone,undraw,unfill,%
+      unfilldraw,to,also,contour,doublepath,withcolor,withpen,%
+      dashed,randomseed},%
+   % keywords[4] = Function-Like Macros (Table 11)
+   morekeywords=[4]{boxit,boxjoin,bpath,buildcycle,circleit,dashpattern,%
+      decr,dotlabel,dotlabels,drawboxed,drawboxes,drawoptions,%
+      drawunboxed,fixpos,fixsize,incr,interpath,label,labels,max,min,pic,%
+      thelabel,z,image},%
+   % keywords[5] = Internal and Predefined Variables (Tables 3, 4)
+   morekeywords=[5]{ahangle,ahlength,bboxmargin,charcode,circmargin,%
+      day,defaultdx,defaultdy,defaultpen,defaultscale,labeloffset,%
+      linecap,linejoin,miterlimit,month,pausing,prologues,showstopping,%
+      time,tracingcapsules,tracingchoices,tracingcommands,%
+      tracingequations,tracinglostchars,tracingmacros,tracingonline,%
+      tracingoutput,tracingrestores,tracingspecs,tracingstats,%
+      tracingtitles,truecorners,warningcheck,year},
+   morekeywords=[5]{background,currentpen,currentpicture,cuttings,%
+      defaultfont},%
+   % keywords[6] = Predefined Constants (Table 5)
+   morekeywords=[6]{beveled,black,blue,bp,butt,cc,cm,dd,ditto,down,%
+      epsilon,evenly,false,fullcircle,green,halfcircle,identity,%
+      in,infinity,left,mitered,mm,nullpicture,origin,pc,pencircle,%
+      pt,quartercircle,red,right,rounded,squared,true,unitsquare,%
+      up,white,withdots},
+   sensitive=false,%
+   alsoother={0123456789$},%
+   morecomment=[l]\%,%
+   morestring=[mf]{input\ },%
+   morestring=[b]"%
+  }[keywords,comments,strings,mf]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Miranda}
+%
+% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/01/30}
+% for providing the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Miranda definition (c) 1998 Peter Bartke
+%%
+%% Miranda: pure lazy functional language with polymorphic type system,
+%%          garbage collection and functions as first class citizens
+%%
+\lst@definelanguage{Miranda}%
+  {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,%
+     with,bool,char,num,sys_message,False,True,Appendfile,Closefile,%
+     Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,%
+     \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,%
+     decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,%
+     foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,%
+     init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,%
+     log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,%
+     numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,%
+     scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,%
+     subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,%
+     until,zip2,zip3,zip4,zip5,zip6,zip},%
+   sensitive,%
+   morecomment=[l]||,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+%
+% \subsection{Mizar}
+%
+% As you can read below, \lstthanks{Adam~Grabowski}{adam@mizar.org}
+% {2003/03/29} provided this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mizar definition (c) 2003 Adam Grabowski
+%%
+%% Mizar is freely available at URL www.mizar.org for the Linux x86,
+%% Solaris x86, and Windows operating systems.
+%%
+\lst@definelanguage{Mizar}%
+  {otherkeywords={->,(\#,\#),.=),\&},%
+   morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,%
+      @proof,according,aggregate,and,antonym,as,associativity,assume,%
+      asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,%
+      clusters,coherence,commutativity,compatibility,connectedness,%
+      consider,consistency,constructors,contradiction,correctness,def,%
+      deffunc,define,definition,definitions,defpred,end,environ,equals,%
+      ex,exactly,existence,for,from,func,given,hence,hereby,holds,%
+      idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,%
+      let,means,mode,non,not,notation,now,of,or,otherwise,over,per,%
+      pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,%
+      reflexivity,requirements,reserve,scheme,schemes,section,selector,%
+      set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,%
+      theorem,theorems,thesis,thus,to,transitivity,uniqueness,%
+      vocabulary,where},%
+   sensitive=t,%
+   morecomment=[l]::%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ML}
+%
+% Thanks to \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk}{1999/02/18} for
+% providing the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ML definition (c) 1999 Torben Hoffmann
+%%
+\lst@definelanguage{ML}%
+  {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,%
+       eqtype,exception,fn,fun,functor,handle,if,in,include,infix,%
+       infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,%
+       signature,struct,structure,then,type,val,with,withtype,while},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Modula-2}
+%
+% Took data from
+% \begin{itemize}
+% \item
+%       \textsc{Niklaus Wirth}: \textbf{Programmieren in Modula-2},
+%       \"Ubers.\ Guido Pfeiffer;
+%       2.\ Auflage -- Berlin; Heidelberg; New York; London; Paris; Tokyo;
+%               Hong Kong: Springer, 1991;
+%       ISBN 3-540-51689-1.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Modula-2}%
+  {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,%
+      EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,%
+      OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,%
+      TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,%
+      CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,%
+      LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,%
+      VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{MuPAD}
+%
+% This definition was provided by \lstthanks{Christopher~Creutzig}
+% {ccr@mupad.de}{2002/10/15}. Again thanks to \lsthelper{Ulrike Fischer}
+% {-}{2004/04/23}{Re: Bug in listings.sty} for pointing to a missing |@|
+% in |\lstdefinelanguage|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{MuPAD}{%
+   morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,%
+      otherwise,for,from,to,step,downto,in,end_for,while,end_while,%
+      repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,%
+      intersect,subset,proc,begin,end_proc,domain,end_domain,category,%
+      end_category,axiom,end_axiom,quit,delete,frame},%
+   morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,%
+      RD_NAN,name,local,option,save,inherits,of,do},%
+   otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,%
+      @,@@,\$},%
+   sensitive=true,%
+   morecomment=[l]{//},%
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]{`}%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{NASTRAN}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+% The definition is from \lsthelper{Jeffrey Ratcliffe}
+% {Jeffrey.Ratcliffe@m.eads.net}{2002/02/21}{}---except the
+% \texttt{MoreSelectCharTable} part which simulates the keyword
+% \texttt{BEGIN BULK}.
+%    \begin{macrocode}
+\lst@definelanguage{NASTRAN}
+  {morekeywords={ENDDATA},%
+   morecomment=[l]$,%
+   MoreSelectCharTable=%
+        \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}%
+        {\lst@ifmode\else \ifnum\lst@length=\z@
+             \lst@EnterMode{\lst@GPmode}{\lst@modetrue
+                  \let\lst@currstyle\lst@gkeywords@sty}%
+         \fi \fi}%
+        {\ifnum\lst@mode=\lst@GPmode
+             \lst@XPrintToken \lst@LeaveMode
+         \fi}%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Oberon-2}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Oberon-2}%
+  {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,%
+      ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,%
+      LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,%
+      REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,%
+      WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,%
+      MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{OCL}
+%
+% This definition is based on chapter 7 of the OMG UML standard version 1.3:
+% \begin{itemize}
+% \item
+%               \textsc{OMG}:
+%               \textbf{OMG Unified Modeling Language Specification};
+%               {\copyright} 1999 OMG;
+%               Available at \texttt{ftp://ftp.omg.org/pub/docs/ad/99-06-08.pdf}.
+% \end{itemize}%
+% This language is due to \lstthanks{Achim~D.~Brucker}
+% {brucker@informatik.uni-freiburg.de}{2000/08/14}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% OCL definition (c) 2000 Achim D. Brucker
+%%
+%% You are allowed to use, modify and distribute this code either under
+%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0
+%% or later).
+%%
+%    \end{macrocode}
+% First we define are very decorative style. In the OMG standard only the
+% boolean (infix (?)) operations are highlighted, but I think all OCL-defined
+% operations should be highlighted, because they are \emph{guaranteed} to be
+% side-effect-free (in OCL only side effect free evaluations or path
+% expressions are allowed).
+%    \begin{macrocode}
+\lst@definelanguage[decorative]{OCL}[OMG]{OCL}
+  {otherkeywords={@pre},%
+   morendkeywords={name,attributes,associatoinEnds,operations,%
+      supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,%
+      oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,%
+      min,div,mod,size,concat,toUpper,toLower,substring,includes,%
+      excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,%
+      exists,forAll,isUnique,sortedBy,iterate,union,intersection,%
+      including,excluding,symmetricDifference,select,reject,collect,%
+      asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,%
+      first,last,true,false,isQuery}%
+  }%
+%    \end{macrocode}
+% Remark: "isQuery" is not real OCL, but a important attribute of the
+% underlying UML model.
+%
+% The dialect called \texttt{OMG} is a very spare version. If you use
+% this variant with bold style for first and second order keywords you
+% get the look and feel of the OMG standard. First order keywords are the
+% OCL context declarations (see section 7.3 of the OMG standard):
+%    \begin{macrocode}
+\lst@definelanguage[OMG]{OCL}%
+    {morekeywords={context,pre,inv,post},%
+%    \end{macrocode}
+% Second order keywords are the operation which are defined for type
+% Boolean (see pages 7-34/35 of the OMG standard) and the let-operation
+% (in principle these are the infix operations):
+%    \begin{macrocode}
+    ndkeywords={or,xor,and,not,implies,if,then,else,endif},%
+%    \end{macrocode}
+% Third order keywords are the basic data types as declared in section 7.4 of
+% the OMG standard:
+%    \begin{macrocode}
+    morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,%
+       OclType,OclAny,OclExpression,Enumeration,Collection,},%
+    sensitive=t,%
+    morecomment=[l]--,%
+    morestring=[d]'%
+   }[keywords,comments,strings]%
+%    \end{macrocode}
+% After a bug report by \lsthelper{Martin~S\"u\ss kraut}{Edon.Myder@web.de}
+% {2003/01/30}{morerdkeywords doesn't exist any more} \texttt{morerdkeywords}
+% has been changed to the correct optional argument \texttt{[3]}.
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Octave}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% As you can read below the definition is due to \lstthanks{Ulrich~G.~Wortmann}
+% {uliw@erdw.ethz.ch}{2002/02/18}{}.  Additions due to \lstthanks{Sebastian~%
+% Schubert}{-}{2006/05/11}.
+%    \begin{macrocode}
+%%
+%% Octave definition (c) 2001,2002 Ulrich G. Wortmann
+%%
+\lst@definelanguage{Octave}%
+  {morekeywords={gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,%
+      zlabel,zoom,endwhile,endfunction,printf,case,switch,otherwise,%
+      system,lsode,endfor,error,ones,oneplot,__gnuplot_set__,do,until},%
+   sensitive=t,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[l]\%,%
+   morestring=[m]',%
+   morestring=[m]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Oz}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+% Thanks to \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co}
+% {2003/10/02} for providing this language definition.
+%    \begin{macrocode}
+%%
+%% Oz definition (c) Andres Becerra Sandoval
+%%
+\lst@definelanguage{Oz}%
+  {morekeywords={andthen,at,attr,case,catch,choice,class,%
+      cond,declare,define,dis,div,else,elsecase,%
+      elseif,end,export,fail,false,feat,finally,%
+      from,fun,functor,if,import,in,local,%
+      lock,meth,mod,not,of,or,orelse,%
+      prepare,proc,prop,raise,require,self,skip,%
+      then,thread,true,try,unit},%
+   sensitive=true,%
+   morecomment=[l]{\%},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Pascal}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% Thanks to \lsthelper{Andreas Stephan}{Andreas.Stephan@victoria.de}{1998/04/07}
+% {alpha, byte, pack, unpack} for reporting non-keywords alpha, byte, pack and
+% unpack.
+%    \begin{macrocode}
+\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal}
+  {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan
+   morekeywords={dynamic,external,forward,global,module,nil,operator,%
+      priority,sum,type,use,dispose,mark,page,release,cimatrix,%
+      cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,%
+      interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,%
+      eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,%
+      ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal}
+  {morekeywords={asm,constructor,destructor,implementation,inline,%
+      interface,nil,object,shl,shr,string,unit,uses,xor},%
+   morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,%
+      DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,%
+      Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,%
+      GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,%
+      GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,%
+      GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,%
+      InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,%
+      MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,%
+      ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,%
+      Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,%
+      Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,%
+      Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,%
+      Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,%
+      Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,%
+      Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,%
+      FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,%
+      GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,%
+      GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,%
+      GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,%
+      GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,%
+      InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,%
+      MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,%
+      OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,%
+      PutImage,PutPixel,Randomize,Rectangle,Release,Rename,%
+      RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,%
+      SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,%
+      SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,%
+      SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,%
+      SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,%
+      SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,%
+      SwapVectors,TextBackground,TextColor,TextMode,Truncate,%
+      UnpackTime,Val,Window}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Standard]{Pascal}%
+  {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+      do,downto,else,end,false,file,for,function,get,goto,if,in,%
+      integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+      put,procedure,read,readln,real,record,repeat,reset,rewrite,set,%
+      text,then,to,true,type,unpack,until,var,while,with,write,%
+      writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Perl}
+%
+% I got the data from \texttt{http://www.perl.com}. But I wish to thank
+% \lsthelper{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at}{}{} for the
+% book `Learning Perl'.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Perl}%
+  {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,%
+      chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,%
+      continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,%
+      each,else,elsif,endgrent,endhostent,endnetent,endprotoent,%
+      endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,%
+      flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,%
+      getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,%
+      getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,%
+      getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,%
+      getpwent,getpwnam,getpwuid,getservbyname,getservbyport,%
+      getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,%
+      import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,%
+      link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,%
+      msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,%
+      pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,%
+      read,readdir,readlink,recv,redo,ref,rename,require,reset,return,%
+      reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,%
+      semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,%
+      setpriority,setprotoent,setpwent,setservent,setsockopt,shift,%
+      shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,%
+      socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,%
+      substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,%
+      telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,%
+      unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,%
+      wait,waitpid,wantarray,warn,while,write,y},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+   MoreSelectCharTable=%
+      \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PHP}
+%
+% \lstthanks{Luca Balzerani}{lou@latoserver.it}{2002/04/06,2002/04/16} sent me
+% this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PHP definition by Luca Balzerani
+%%
+\lst@definelanguage{PHP}%
+  {morekeywords={%
+  %--- core language
+    <?,?>,::,break,case,continue,default,do,else,%
+    elseif,for,foreach,if,include,require,phpinfo,%
+    switch,while,false,FALSE,true,TRUE,%
+  %--- apache functions
+    apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,%
+    virtual,apache_child_terminate,apache_setenv,%
+  %--- array functions
+    array,array_change_key_case,array_chunk,array_count_values,%
+    array_filter,array_flip,array_fill,array_intersect,%
+    array_keys,array_map,array_merge,array_merge_recursive,%
+    array_pad,array_pop,array_push,array_rand,array_reverse,%
+    array_shift,array_slice,array_splice,array_sum,array_unique,%
+    array_values,array_walk,arsort,asort,compact,count,current,each,%
+    extract,in_array,array_search,key,krsort,ksort,list,natsort,%
+    next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,%
+    usort,%
+  %--- aspell functions
+    aspell_new,aspell_check,aspell_check_raw,aspell_suggest,%
+  %--- bc functions
+    bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,%
+  %--- bzip2 functions
+    bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,%
+    bzopen,bzread,bzwrite,%
+  %--- calendar functions
+    JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,%
+    JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,%
+    unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,%
+  %--- ccvs functions
+    ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,%
+    ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,%
+    ccvs_report,ccvs_command,ccvs_textvalue,%
+  %--- classobj functions
+    call_user_method,call_user_method_array,class_exists,get_class,%
+    get_class_vars,get_declared_classes,get_object_vars,%
+    is_a,is_subclass_of,method_exists,%
+  %--- com functions
+    COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,%
+    com_set,com_addref,com_release,com_isenum,com_load_typelib,%
+  %--- cpdf functions
+    cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,%
+    cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,%
+    cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,%
+    cpdf_finalize,cpdf_finalize_page,%
+    cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,%
+    cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,%
+    cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,%
+    cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,%
+    cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,%
+    cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,%
+    cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,%
+    cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,%
+    cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,%
+    cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,%
+    cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,%
+    cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,%
+    cpdf_set_action_url,%
+  %--- crack functions
+    crack_opendict,crack_closedict,crack_check,crack_getlastmessage,%
+  %--- ctype functions
+    ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,%
+    ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,%
+  %--- curl functions
+    curl_init,curl_setopt,curl_exec,curl_close,curl_version,%
+    curl_error,curl_getinfo,%
+  %--- cybercash functions
+    cybercash_encr,cybercash_decr,cybercash_base64_encode,%
+  %--- cybermut functions
+    cybermut_creerformulairecm,cybermut_testmac,%
+  %--- cyrus functions
+    cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,%
+    cyrus_close,%
+  %--- datetime functions
+    checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,%
+    microtime,mktime,strftime,time,strtotime,%
+  %--- dbase functions
+    dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,%
+    dbase_delete_record,dbase_get_record,%
+    dbase_numfields,dbase_numrecords,%
+  %--- dba functions
+    dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,%
+    dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,%
+  %--- dbm functions
+    dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,%
+    dbmfirstkey,dbmnextkey,dblist,%
+  %--- dbx functions
+    dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,%
+  %--- dio functions
+    dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,%
+    dio_close,%
+  %--- dir functions
+    chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,%
+  %--- dotnet functions
+    dotnet_load,%
+  %--- errorfunc functions
+    error_log,error_reporting,restore_error_handler,%
+    trigger_error,user_error,%
+  %--- exec functions
+    escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,%
+  %--- fbsql functions
+    fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,%
+    fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,%
+    fbsql_database_password,fbsql_data_seek,fbsql_db_query,%
+    fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,%
+    fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,%
+    fbsql_field_flags,fbsql_field_name,fbsql_field_len,%
+    fbsql_field_table,fbsql_field_type,fbsql_free_result,%
+    fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,%
+    fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,%
+    fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,%
+    fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,%
+    fbsql_get_autostart_info,fbsql_hostname,fbsql_password,%
+    fbsql_username,%
+  %--- fdf functions
+    fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,%
+    fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,%
+    fdf_get_file,fdf_set_flags,fdf_set_opt,%
+    fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,%
+  %--- filepro functions
+    filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,%
+    filepro_fieldcount,filepro_rowcount,%
+  %--- filesystem functions
+    basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,%
+    diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,%
+    fgetss,file_get_contents,file,file_exists,fileatime,filectime,%
+    fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,%
+    fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,%
+    set_file_buffer,is_dir,is_executable,is_file,is_link,%
+    is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,%
+    parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,%
+    rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,%
+  %--- fribidi functions
+    fribidi_log2vis,%
+  %--- ftp functions
+    ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,%
+    ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,%
+    ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,%
+    ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,%
+  %--- funchand functions
+    call_user_func_array,call_user_func,create_function,%
+    func_get_args,func_num_args,function_exists,%
+    register_shutdown_function,register_tick_function,%
+  %--- gettext functions
+    bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,%
+    dngettext,gettext,ngettext,textdomain,%
+  %--- gmp functions
+    gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,%
+    gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,%
+    gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,%
+    gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,%
+    gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,%
+    gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,%
+  %--- http functions
+    header,headers_sent,setcookie,%
+  %--- hw functions
+    hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,%
+    hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,%
+    hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,%
+    hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,%
+    hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,%
+    hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,%
+    hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,%
+    hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,%
+    hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,%
+    hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,%
+    hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,%
+    hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,%
+    hw_insertanchors,hw_getrellink,hw_changeobject,%
+  %--- ibase functions
+    ibase_connect,ibase_pconnect,ibase_close,ibase_query,%
+    ibase_fetch_row,ibase_fetch_object,ibase_field_info,%
+    ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,%
+    ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,%
+    ibase_blob_close,ibase_blob_create,ibase_blob_echo,%
+    ibase_blob_import,ibase_blob_info,ibase_blob_open,%
+  %--- icap functions
+    icap_open,icap_close,icap_fetch_event,icap_list_events,%
+    icap_delete_event,icap_snooze,icap_list_alarms,%
+    icap_rename_calendar,icap_delete_calendar,icap_reopen,%
+  %--- iconv functions
+    iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,%
+  %--- ifx functions
+    ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,%
+    ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,%
+    ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,%
+    ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,%
+    ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,%
+    ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,%
+    ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,%
+    ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,%
+  %--- iisfunc functions
+    iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,%
+    iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,%
+    iis_set_script_map,iis_get_script_map,iis_set_app_settings,%
+    iis_stop_server,iis_stop_service,iis_start_service,%
+  %--- image functions
+    exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,%
+    imagealphablending,imagearc,imagefilledarc,imageellipse,%
+    imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,%
+    imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,%
+    imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,%
+    imagecolorset,imagecolorsforindex,imagecolorstotal,%
+    imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,%
+    imagecreate,imagecreatetruecolor,imagetruecolortopalette,%
+    imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,%
+    imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,%
+    imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,%
+    imagefilledrectangle,imagefilltoborder,imagefontheight,%
+    imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,%
+    imageline,imageloadfont,imagepalettecopy,imagepolygon,%
+    imagepsencodefont,imagepsfreefont,imagepsloadfont,%
+    imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,%
+    imagesetstyle,imagesettile,imagesetthickness,imagestring,%
+    imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,%
+    imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,%
+  %--- imap functions
+    imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,%
+    imap_bodystruct,imap_check,imap_clearflag_full,imap_close,%
+    imap_delete,imap_deletemailbox,imap_errors,imap_expunge,%
+    imap_fetchbody,imap_fetchheader,imap_fetchstructure,%
+    imap_getmailboxes,imap_getsubscribed,imap_header,%
+    imap_headers,imap_last_error,imap_listmailbox,%
+    imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,%
+    imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,%
+    imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,%
+    imap_rfc822_parse_headers,imap_rfc822_write_address,%
+    imap_search,imap_setacl,imap_set_quota,imap_setflag_full,%
+    imap_status,imap_subscribe,imap_uid,imap_undelete,%
+    imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,%
+  %--- info functions
+    assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,%
+    get_defined_constants,get_extension_funcs,getmygid,%
+    get_loaded_extensions,get_magic_quotes_gpc,%
+    getlastmod,getmyinode,getmypid,getmyuid,get_required_files,%
+    ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,%
+    phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,%
+    set_time_limit,version_compare,zend_logo_guid,zend_version,%
+  %--- ircg functions
+    ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,%
+    ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,%
+    ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,%
+    ircg_is_conn_alive,ircg_lookup_format_messages,%
+    ircg_set_on_die,ircg_set_file,ircg_get_username,%
+    ircg_nickname_unescape,%
+  %--- java functions
+    java_last_exception_clear,java_last_exception_get,%
+  %--- ldap functions
+    ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,%
+    ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,%
+    ldap_first_attribute,ldap_first_entry,ldap_free_result,%
+    ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,%
+    ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,%
+    ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,%
+    ldap_set_option,ldap_unbind,ldap_8859_to_t61,%
+    ldap_next_reference,ldap_parse_reference,ldap_parse_result,%
+    ldap_sort,ldap_start_tls,ldap_t61_to_8859,%
+  %--- mail functions
+    mail,ezmlm_hash,%
+  %--- math functions
+    abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,%
+    cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,%
+    hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,%
+    max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,%
+    rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,%
+  %--- mbstring functions
+    mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,%
+    mb_detect_order,mb_substitute_character,mb_output_handler,%
+    mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,%
+    mb_convert_encoding,mb_detect_encoding,mb_convert_kana,%
+    mb_decode_mimeheader,mb_convert_variables,%
+    mb_decode_numericentity,mb_send_mail,mb_get_info,%
+    mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,%
+    mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,%
+    mb_ereg_search_getregs,mb_ereg_search_getpos,%
+  %--- mcal functions
+    mcal_open,mcal_popen,mcal_reopen,mcal_close,%
+    mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,%
+    mcal_append_event,mcal_store_event,mcal_delete_event,%
+    mcal_list_alarms,mcal_event_init,mcal_event_set_category,%
+    mcal_event_set_description,mcal_event_set_start,%
+    mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,%
+    mcal_date_valid,mcal_time_valid,mcal_day_of_week,%
+    mcal_date_compare,mcal_next_recurrence,%
+    mcal_event_set_recur_daily,mcal_event_set_recur_weekly,%
+    mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,%
+    mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,%
+  %--- mcrypt functions
+    mcrypt_get_cipher_name,mcrypt_get_block_size,%
+    mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,%
+    mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,%
+    mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,%
+    mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,%
+    mcrypt_enc_is_block_algorithm_mode,%
+    mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,%
+    mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,%
+    mcrypt_enc_get_modes_name,mcrypt_module_self_test,%
+    mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,%
+    mcrypt_module_get_algo_key_size,%
+  %--- mhash functions
+    mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,%
+  %--- misc functions
+    connection_aborted,connection_status,connection_timeout,%
+    define,defined,die,eval,exit,get_browser,highlight_file,%
+    ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,%
+    usleep,%
+  %--- mnogosearch functions
+    udm_add_search_limit,udm_alloc_agent,udm_api_version,%
+    udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,%
+    udm_free_agent,udm_free_ispell_data,udm_free_res,%
+    udm_get_res_field,udm_get_res_param,udm_load_ispell_data,%
+    udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,%
+  %--- msession functions
+    msession_connect,msession_disconnect,msession_count,%
+    msession_destroy,msession_lock,msession_unlock,msession_set,%
+    msession_uniq,msession_randstr,msession_find,msession_list,%
+    msession_set_array,msession_listvar,msession_timeout,%
+    msession_getdata,msession_setdata,msession_plugin,%
+  %--- msql functions
+    msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,%
+    msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,%
+    msql_fetch_field,msql_fetch_object,msql_fetch_row,%
+    msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,%
+    msql_free_result,msql_freeresult,msql_list_fields,%
+    msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,%
+    msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,%
+    msql_regcase,msql_result,msql_select_db,msql_selectdb,%
+  %--- mssql functions
+    mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,%
+    mssql_fetch_object,mssql_fetch_row,mssql_field_length,%
+    mssql_field_seek,mssql_field_type,mssql_free_result,%
+    mssql_min_error_severity,mssql_min_message_severity,%
+    mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,%
+    mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,%
+    mssql_guid_string,mssql_init,mssql_rows_affected,%
+  %--- muscat functions
+    muscat_setup,muscat_setup_net,muscat_give,muscat_get,%
+  %--- mysql functions
+    mysql_affected_rows,mysql_change_user,mysql_character_set_name,%
+    mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,%
+    mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,%
+    mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,%
+    mysql_fetch_row,mysql_field_flags,mysql_field_name,%
+    mysql_field_seek,mysql_field_table,mysql_field_type,%
+    mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,%
+    mysql_list_tables,mysql_num_fields,mysql_num_rows,%
+    mysql_ping,mysql_query,mysql_unbuffered_query,%
+    mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,%
+    mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,%
+  %--- network functions
+    checkdnsrr,closelog,debugger_off,debugger_on,%
+    fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,%
+    getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,%
+    pfsockopen,socket_get_status,socket_set_blocking,%
+    syslog,%
+  %--- nis functions
+    yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,%
+    yp_errno,yp_err_string,yp_all,yp_cat,%
+  %--- oci8 functions
+    OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,%
+    OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,%
+    OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,%
+    OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,%
+    OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,%
+    OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,%
+    OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,%
+    OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,%
+    OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,%
+    OCICollTrim,%
+  %--- oracle functions
+    Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,%
+    Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,%
+    Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,%
+    Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,%
+  %--- outcontrol functions
+    flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,%
+    ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,%
+  %--- ovrimos functions
+    ovrimos_connect,ovrimos_close,ovrimos_longreadlen,%
+    ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,%
+    ovrimos_result,ovrimos_result_all,ovrimos_num_rows,%
+    ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,%
+    ovrimos_free_result,ovrimos_commit,ovrimos_rollback,%
+  %--- pcntl functions
+    pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,%
+    pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,%
+    pcntl_exec,%
+  %--- pcre functions
+    preg_match,preg_match_all,preg_replace,preg_replace_callback,%
+    preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,%
+  %--- pdf functions
+    pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,%
+    pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,%
+    pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,%
+    pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,%
+    pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,%
+    pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,%
+    pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,%
+    pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,%
+    pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,%
+    pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,%
+    pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,%
+    pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,%
+    pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,%
+    pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,%
+    pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,%
+    pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,%
+    pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,%
+    pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,%
+    pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,%
+    pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,%
+    pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,%
+    pdf_set_info_title,pdf_set_leading,pdf_set_parameter,%
+    pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,%
+    pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,%
+    pdf_stringwidth,pdf_stroke,pdf_translate,%
+  %--- pfpro functions
+    pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,%
+  %--- pgsql functions
+    pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,%
+    pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,%
+    pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,%
+    pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,%
+    pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,%
+    pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,%
+    pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,%
+    pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,%
+    pg_send_query,pg_cancel_query,pg_connection_busy,%
+    pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,%
+    pg_result_error,%
+  %--- posix functions
+    posix_kill,posix_getpid,posix_getppid,posix_getuid,%
+    posix_getgid,posix_getegid,posix_setuid,posix_seteuid,%
+    posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,%
+    posix_setpgid,posix_getpgid,posix_getsid,posix_uname,%
+    posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,%
+    posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,%
+  %--- printer functions
+    printer_open,printer_abort,printer_close,printer_write,%
+    printer_set_option,printer_get_option,printer_create_dc,%
+    printer_start_doc,printer_end_doc,printer_start_page,%
+    printer_create_pen,printer_delete_pen,printer_select_pen,%
+    printer_delete_brush,printer_select_brush,printer_create_font,%
+    printer_select_font,printer_logical_fontheight,%
+    printer_draw_rectangle,printer_draw_elipse,printer_draw_text,%
+    printer_draw_chord,printer_draw_pie,printer_draw_bmp,%
+  %--- pspell functions
+    pspell_add_to_personal,pspell_add_to_session,pspell_check,%
+    pspell_config_create,pspell_config_ignore,pspell_config_mode,%
+    pspell_config_repl,pspell_config_runtogether,%
+    pspell_new,pspell_new_config,pspell_new_personal,%
+    pspell_store_replacement,pspell_suggest,%
+  %--- qtdom functions
+    qdom_tree,qdom_error,%
+  %--- readline functions
+    readline,readline_add_history,readline_clear_history,%
+    readline_info,readline_list_history,readline_read_history,%
+  %--- recode functions
+    recode_string,recode,recode_file,%
+  %--- regex functions
+    ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,%
+  %--- sem functions
+    sem_get,sem_acquire,sem_release,sem_remove,shm_attach,%
+    shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,%
+  %--- sesam functions
+    sesam_connect,sesam_disconnect,sesam_settransaction,%
+    sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,%
+    sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,%
+    sesam_field_array,sesam_fetch_row,sesam_fetch_array,%
+    sesam_free_result,%
+  %--- session functions
+    session_start,session_destroy,session_name,session_module_name,%
+    session_id,session_register,session_unregister,session_unset,%
+    session_get_cookie_params,session_set_cookie_params,%
+    session_encode,session_set_save_handler,session_cache_limiter,%
+    session_write_close,%
+  %--- shmop functions
+    shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,%
+  %--- snmp functions
+    snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,%
+    snmprealwalk,%
+  %--- strings functions
+    addcslashes,addslashes,bin2hex,chop,chr,chunk_split,%
+    count_chars,crc32,crypt,echo,explode,get_html_translation_table,%
+    hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,%
+    localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,%
+    print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,%
+    setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,%
+    strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,%
+    strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,%
+    strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,%
+    strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,%
+    vsprintf,wordwrap,%
+  %--- swf functions
+    swf_openfile,swf_closefile,swf_labelframe,swf_showframe,%
+    swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,%
+    swf_removeobject,swf_nextid,swf_startdoaction,%
+    swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,%
+    swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,%
+    swf_actiongotolabel,swf_enddoaction,swf_defineline,%
+    swf_definepoly,swf_startshape,swf_shapelinesolid,%
+    swf_shapefillsolid,swf_shapefillbitmapclip,%
+    swf_shapemoveto,swf_shapelineto,swf_shapecurveto,%
+    swf_shapearc,swf_endshape,swf_definefont,swf_setfont,%
+    swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,%
+    swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,%
+    swf_startbutton,swf_addbuttonrecord,swf_oncondition,%
+    swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,%
+    swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,%
+  %--- sybase functions
+    sybase_affected_rows,sybase_close,sybase_connect,%
+    sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,%
+    sybase_field_seek,sybase_free_result,sybase_get_last_message,%
+    sybase_min_error_severity,sybase_min_message_severity,%
+    sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,%
+    sybase_select_db,%
+  %--- uodbc functions
+    odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,%
+    odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,%
+    odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,%
+    odbc_fetch_object,odbc_field_name,odbc_field_num,%
+    odbc_field_len,odbc_field_precision,odbc_field_scale,%
+    odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,%
+    odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,%
+    odbc_tableprivileges,odbc_columns,odbc_columnprivileges,%
+    odbc_primarykeys,odbc_foreignkeys,odbc_procedures,%
+    odbc_specialcolumns,odbc_statistics,%
+  %--- url functions
+    base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,%
+    urlencode,%
+  %--- var functions
+    doubleval,empty,floatval,gettype,get_defined_vars,%
+    import_request_variables,intval,is_array,is_bool,is_double,%
+    is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,%
+    is_scalar,is_string,isset,print_r,serialize,settype,strval,%
+    unset,var_dump,var_export,is_callable,%
+  %--- vpopmail functions
+    vpopmail_add_domain,vpopmail_del_domain,%
+    vpopmail_add_domain_ex,vpopmail_del_domain_ex,%
+    vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,%
+    vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,%
+    vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,%
+  %--- w32api functions
+    w32api_set_call_method,w32api_register_function,%
+    w32api_deftype,w32api_init_dtype,%
+  %--- wddx functions
+    wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,%
+    wddx_add_vars,wddx_deserialize,%
+  %--- xml functions
+    xml_parser_create,xml_set_object,xml_set_element_handler,%
+    xml_set_processing_instruction_handler,xml_set_default_handler,%
+    xml_set_notation_decl_handler,%
+    xml_parse,xml_get_error_code,xml_error_string,%
+    xml_get_current_column_number,xml_get_current_byte_index,%
+    xml_parser_free,xml_parser_set_option,xml_parser_get_option,%
+    utf8_encode,xml_parser_create_ns,%
+    xml_set_start_namespace_decl_handler,%
+  %--- xslt functions
+    xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,%
+    xslt_set_sax_handler,xslt_set_scheme_handler,%
+    xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,%
+  %--- yaz functions
+    yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,%
+    yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,%
+    yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,%
+    yaz_wait,yaz_sort,%
+  %--- zip functions
+    zip_close,zip_entry_close,zip_entry_compressedsize,%
+    zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,%
+    zip_read,%
+  %--- zlib functions
+    gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,%
+    gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,%
+    gzdeflate,gzinflate,gzencode,},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Plasm}
+%
+% \lstthanks{Alessio~Pace}{}{2004/09/01} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Plasm}%
+  {sensitive=false,%
+   morekeywords={aa,abs,ac,acolor,acos,actor,al,alias,align,and,%
+      animation,animation,appearance,apply,ar,arc,as,asin,assoc,atan,%
+      axialcamera,axialcameras,basehermite,bbox,bbox,bernstein,%
+      bernsteinbasis,bezier,beziercurve,beziermanifold,bezierstripe,%
+      beziersurface,bigger,biggest,bilinearsurface,binormal,%
+      biquadraticsurface,black,blend,blue,bottom,box,brown,bspize,%
+      bspline,bsplinebasis,c,cabinet,camera,cart,case,cat,catch,ceil,%
+      centeredcameras,centralcavalier,char,charseq,choose,circle,%
+      circumference,class,cmap,color,comp,computecoords,cone,%
+      conicalsurface,cons,control,convexcoords,convexhull,coonspatch,%
+      copy,cos,cosh,crease,crosspolytope,cube,cubiccardinal,%
+      cubiccardinalbasis,cubichermite,cubicubspline,cubicubsplinebasis,%
+      cuboid,curl,curvature,curve2cspath,curve2mapvect,cyan,cylinder,%
+      cylindricalsurface,d,deboor,def,depol,depth_sort,depth_test,%
+      derbernstein,derbernsteinbase,derbezier,determinant,difference,%
+      differencepr,dim,dimetric,dirproject,displaygraph,displaynubspline,%
+      displaynurbspline,distl,distr,div,divergence,dodecahedron,dot,down,%
+      dp,drawedges,drawforks,drawtree,ds,dsphere,dump,dumprep,ellipse,%
+      embed,end,eq,ex,exp,explode,export,extract_bodies,extract_polygons,%
+      extract_wires,extrude,extrusion,fact,false,feature,ff,fillcolor,%
+      filter,finitecone,first,flash,flashani,floor,fontcolor,fontheight,%
+      fontspacing,fontwidth,fractalsimplex,frame,frame,frameflash,fromto,%
+      gausscurvature,ge,grad,gradient,gradmap,gray,green,gt,help,hermite,%
+      hermitebasis,hermitesurface,hexahedron,icosahedron,id,idnt,if,in,%
+      inarcs,innerprod,inset,insl,insr,intersection,intersectionpr,%
+      intervals,intmax,intmin,intsto,inv,isa,isanimpol,isbool,ischar,%
+      isclosedshape,iscloseto,isempty,iseven,isfun,isfunvect,isge,isgt,%
+      isint,isintneg,isinto,isintpos,isle,islt,ismat,ismatof,isnat,%
+      isnull,isnum,isnumneg,isnumpos,isodd,isometric,isorthoshape,ispair,%
+      ispoint,ispointseq,ispol,ispoldim,ispolytope,ispurepol,isreal,%
+      isrealneg,isrealpos,isrealvect,isseq,isseqof,isshape,issimplex,%
+      issqrmat,isstring,isvect,iszero,jacobian,join,joints,k,last,le,%
+      left,leftcavalier,len,less,lesseq,lex,lift,light,linecolor,%
+      linesize,list,ln,load,loadlib,loop,lt,lxmy,magenta,map,mapshapes,%
+      markersize,mat,matdotprod,material,mathom,max,mean,meanpoint,med,%
+      merge,mesh,min,minkowski,mirror,mixedprod,mk,mkframe,mkpol,%
+      mkvector,mkversork,mod,model,move,mul,multextrude,mxby,mxmy,mxty,%
+      myfont,n,nat2string,neq,ngon,norm2,normalmap,not,nu_grid,nubspline,%
+      nubsplineknots,nurbspline,nurbsplineknots,octahedron,offset,%
+      onepoint,open,optimize,or,orange,ord,ortho,orthoproject,orthox,%
+      orthoy,orthoz,outarcs,outerloop,outerwarp,pairdiff,parallel,%
+      pascaltriangle,pdiff,pdifference,permutahedron,permutations,%
+      perspective,perspective,pi,pivotop,plane,planemapping,pmap,%
+      points2shape,polar,polyline,polymarker,polypoint,power,powerset,%
+      presort,principalnormal,print,prism,profileprodsurface,%
+      progressivesum,project,projection,purple,pyramid,q,quadarray,%
+      quadmesh,quote,r,raise,range,rationalbezier,rationalblend,%
+      rationalbspline,rationalize,red,rev,reverse,rgbacolor,right,%
+      rightcavalier,ring,rn,rotatedtext,rotationalsurface,rotn,rtail,%
+      ruledsurface,rxmy,s,save,scalarmatprod,scalarvectprod,schlegel2d,%
+      schlegel3d,sdifference,sdifferencepr,segment,sel,setand,setdiff,%
+      setfontcolor,setor,setxor,sex,shape_0,shape_1,shape2points,%
+      shape2pol,shapeclosed,shapecomb,shapediff,shapedist,%
+      shapeinbetweening,shapeinf,shapejoin,shapelen,shapenorm,%
+      shapenormal,shapeprod,shaperot,shapesum,shapesup,shapezero,shift,%
+      showprop,sign,signal,simplex,simplexpile,sin,sinh,size,skeleton,%
+      skew,smaller,smallest,solidifier,solidify,sort,sphere,spline,%
+      splinesampling,splitcells,splitpols,sqr,sqrt,star,string,%
+      stringtokens,struct,sub,svg,sweep,t,tail,tan,tangent,tanh,%
+      tensorprodsurface,tetrahedron,text,texture,textwithattributes,%
+      thinsolid,threepoints,time,tmax,tmin,top,torus,torusmap,trace,%
+      trans,tree,trianglefan,trianglestripe,trimetric,true,truncone,tt,%
+      tube,twopoints,uk,ukpol,ukpolf,union,unionpr,unitvect,unprune,up,%
+      vect2dtoangle,vect2mat,vectdiff,vectnorm,vectprod,vectsum,view,%
+      viewmodel,viewmodel,vrml,warp,warp,where,white,with,xcavalier,xor,%
+      xquadarray,xx,ycavalier,yellow},%
+   moredirectives={loadlib},%
+   otherkeywords={-,+,*,**,/,~,|,..,^,\&,\&\&,\#,\#\#},%
+   morecomment=[s]{\%}{\%},%
+   morestring=[b]',%
+   literate={~}{{$\sim$}}{1} {^}{$\wedge$}{1},%
+  }[keywords,directives,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PL/I}
+%
+% Found the data in
+% \begin{itemize}
+% \item
+%		\textsc{Bernhard Fischer, Herman Fischer}:
+%		\textbf{Structured Programming in PL/I and PL/C};
+%		Copyright {\copyright} 1976 by Marcel Dekker, Inc.;
+%		ISBN 0-8247-6394-7
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{PL/I}%
+  {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,%
+      BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,%
+      COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,%
+      ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,%
+      FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,%
+      INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,%
+      LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,%
+      NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,%
+      OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,%
+      RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,%
+      SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,%
+      VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},%
+   sensitive=f,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PostScript}
+%
+% Herbert Voss provided the following definition, written by
+% \lstthanks{Christophe~Jorssen}{}{2004/09/17} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PostScript language definition (c) 2005 Christophe Jorssen.
+%%
+\lst@definelanguage{PostScript}{%
+  morekeywords={abs,add,aload,anchorsearch,and,arc,arcn,arct,arcto,array,ashow,
+    astore,atan,awidthshow,begin,bind,bitshift,bytesavailable,cachestatus,
+    ceiling,charpath,clear,cleartomark,cleardictstack,clip,clippath,closefile,
+    closepath,colorimage,concat,concatmatrix,condition,copy,copypage,cos,count,
+    countdictstack,countexecstack,counttomark,cshow,currentblackgeneration,
+    currentcacheparams,currentcmykcolor,currentcolor,currentcolorrendering,
+    currentcolorscreen,currentcolorspace,currentcolortransfer,currentcontext,
+    currentdash,currentdevparams,currentdict,currentfile,currentflat,currentfont,
+    currentglobal,currentgray,currentgstate,currenthalftone,currenthalftonephase,
+    currenthsbcolor,currentlinecap,currentlinejoin,currentlinewidth,currentmatrix,
+    currentmiterlimit,currentobjectformat,currentpacking,currentpagedevice,
+    currentpoint,currentrgbcolor,currentscreen,currentshared,currentstrokeadjust,
+    currentsystemparams,currenttransfer,currentundercolorremoval,currentuserparams,
+    curveto,cvi,cvlit,cvn,cvr,cvrs,cvs,cvx,def,defaultmatrix,definefont,
+    defineresource,defineusername,defineuserobject,deletefile,detach,deviceinfo,
+    dict,dictstack,div,dtransform,dup,
+    echo,eexec,end,eoclip,eofill,eoviewclip,eq,erasepage,errordict,exch,exec,
+    execform,execstack,execuserobject,executeonly,executive,exit,
+    exp,false,file,filenameforall,fileposition,fill,filter,findencoding,findfont,
+    findresource,flattenpath,floor,flush,flushfile,FontDirectory,for,forall,fork,ge,
+    get,getinterval,globaldict,GlobalFontDirectory,glyphshow,grestore,grestoreall,
+    gsave,gstate,gt,identmatrix,idiv,idtransform,if,ifelse,image,
+    imagemask,index,ineofill,infill,initclip,initgraphics,initmatrix,initviewclip,
+    instroke,internaldict,inueofill,inufill,inustroke,
+    invertmatrix,ISOLatin1Encoding,itransform,join,kshow,
+    known,languagelevel,le,length,lineto,ln,load,lock,log,loop,lt,
+    makefont,makepattern,mark,matrix,maxlength,mod,monitor,moveto,mul,ne,neg,
+    newpath,noaccess,not,notify,null,nulldevice,or,packedarray,
+    pathbbox,pathforall,pop,print,printobject,product,prompt,pstack,put,putinterval,
+    quit,rand,rcurveto,read,readhexstring,readline,readonly,readstring,
+    realtime,rectclip,rectfill,rectstroke,rectviewclip,renamefile,repeat,resetfile,
+    resourceforall,resourcestatus,restore,reversepath,revision,rlineto,rmoveto,roll,
+    rootfont,rotate,round,rrand,run,save,scale,scalefont,scheck,search,selectfont,
+    serialnumber,setbbox,setblackgeneration,setcachedevice,setcachedevice2,
+    setcachelimit,setcacheparams,setcharwidth,setcmykcolor,setcolor,
+    setcolorrendering,setcolorscreen,setcolorspace,setcolortransfer,setdash,
+    setdevparams,setfileposition,setflat,setfont,setglobal,setgray,setgstate,
+    sethalftone,sethalftonephase,sethsbcolor,setlinecap,setlinejoin,setlinewidth,
+    setmatrix,setmiterlimit,setobjectformat,setoverprint,setpacking,setpagedevice,
+    setpattern,setrgbcolor,setscreen,setshared,setstrokeadjust,setsystemparams,
+    settransfer,setucacheparams,setundercolorremoval,setuserparams,setvmthreshold,
+    shareddict,show,showpage,sin,sqrt,srand,stack,
+    StandardEncoding,start,startjob,status,statusdict,stop,stopped,store,string,
+    stringwidth,stroke,strokepath,sub,systemdict,transform,
+    translate,true,truncate,type,token,uappend,ucache,ucachestatus,
+    ueofill,ufill,undef,
+    upath,userdict,UserObjects,
+    usertime,ustroke,ustrokepath,version,viewclip,viewclippath,vmreclaim,
+    vmstatus,wait,wcheck,where,widthshow,write,writehexstring,writeobject,
+    writestring,wtranslation,xcheck,xor,xshow,xyshow,yield,yshow},
+  sensitive,
+  morecomment=[l]\%}[keywords,comments]
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{POV-Ray}
+%
+% \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net}{1999/04/15} sent
+% me the definition. But I removed |blankstring=false| and
+% |flexiblecolumns=true| from the driver since they have nothing to do with a
+% language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% POV definition (c) 1999 Berthold H\"ollmann
+%%
+\lst@definelanguage{POV}%
+  {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,%
+      agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,%
+      arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,%
+      atan2,atanh,average,background,bezier_spline,bicubic_patch,%
+      black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,%
+      break,brick,brick_size,brightness,brilliance,bumps,bump_map,%
+      bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,%
+      clock_delta,color,color_map,colour,colour_map,component,%
+      composite,concat,cone,confidence,conic_sweep,control0,control1,%
+      cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,%
+      cylinder,cylindrical,debug,declare,default,defined,degrees,%
+      density,density_file,density_map,dents,difference,diffuse,%
+      dimensions,dimension_size,direction,disc,distance,%
+      distance_maximum,div,eccentricity,else,emission,end,error,%
+      error_bound,exp,extinction,fade_distance,fade_power,falloff,%
+      falloff_angle,false,fclose,file_exists,filter,finish,fisheye,%
+      flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,%
+      fopen,frequency,gif,global_settings,gradient,granite,%
+      gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,%
+      hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,%
+      interior,interpolate,intersection,intervals,inverse,ior,irid,%
+      irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,%
+      light_source,linear_spline,linear_sweep,local,location,log,%
+      looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,%
+      material,material_map,matrix,max,max_intersections,max_iteration,%
+      max_trace_level,media,media_attenuation,media_interaction,merge,%
+      mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,%
+      normal,normal_map,no_shadow,number_of_waves,object,octaves,off,%
+      offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,%
+      perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,%
+      planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,%
+      precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,%
+      quick_color,quick_colour,quilted,radial,radians,radiosity,radius,%
+      rainbow,ramp_wave,rand,range,ratio,read,reciprocal,%
+      recursion_limit,red,reflection,reflection_exponent,refraction,%
+      render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,%
+      samples,scale,scallop_wave,scattering,seed,shadowless,sin,%
+      sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,%
+      smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,%
+      spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,%
+      strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,%
+      text,texture,texture_map,tga,thickness,threshold,tightness,tile2,%
+      tiles,torus,track,transform,translate,transmit,triangle,%
+      triangle_wave,true,ttf,turbulence,turb_depth,type,u,%
+      ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,%
+      u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,%
+      vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,%
+      width,wood,wrinkles,write,x,y,yes,z},%
+   moredirectives={break,case,debug,declare,default,else,end,fclose,%
+      fopen,local,macro,read,render,statistics,switch,undef,version,%
+      warning,write},%
+   moredelim=*[directive]\#,%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]",%
+  }[keywords,directives,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Prolog}
+%
+% \lsthelper{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24}{Prolog} mailed
+% me the data for Prolog. He took the keywords from the \textsf{LGrind}
+% language definition file.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Prolog definition (c) 1997 Dominique de Waleffe
+%%
+\lst@definelanguage{Prolog}%
+  {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,%
+      assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,%
+      eof,fail,file,findall,write,functor,getc,integer,is,length,%
+      listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,%
+      private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,%
+      retract,retractall,save,see,seeing,seen,sh,skip,statistics,%
+      subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,%
+      untrace,var,write},%
+   sensitive=f,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Promela}
+%
+% Thanks to \lstthanks{William~Thimbleby}{-}{1997/11/24}{Promela} for this
+% language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Promela definition (c) 2004 William Thimbleby
+%%
+\lst@definelanguage{Promela}
+  {morekeywords={active,assert,atomic,bit,bool,break,byte,chan,d_step,%
+      Dproctype,do,else,empty,enabled,fi,full,goto,hidden,if,init,int,%
+      len,mtype,nempty,never,nfull,od,of,pcvalue,printf,priority,%
+      proctype,provided,run,short,skip,timeout,typedef,unless,unsigned,%
+      xr,xs,true,false,inline,eval},%
+   moredirectives={define,ifdef,ifndef,if,if,else,endif,undef,include},%
+   moredelim=*[directive]\#,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PSTricks}
+%
+% PSTricks is a \TeX\ macro package bundle.
+% \lstthanks{Herbert~Voss}{}{2004/09/17} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PSTricks definition (c) 2006 Herbert Voss
+%%
+\lst@definelanguage{PSTricks}%
+  {morekeywords={%
+    begin,end,definecolor,multido,%
+    KillGlue,DontKillGlue,pslbrace,bsrbrace,psscalebox,psset,pstVerb,pstverb,%
+    pst@def,,psframebox,psclip,endclip,endpspicture,psframe,
+%%    pspicture,%
+    multirput,multips,Rput,rput,uput,cput,lput,%
+    newrgbcolor,newgray,newcmykcolor,
+%%
+%% pstricks-add
+    psStep,psgraph,psbrace,psPrintValue,
+%%
+%% pst-plot
+    psvlabel,pshlabel,psplot,psline,pscustom,pscurve,psccurve,%
+    readdata,savedata,fileplot,dataplot,listplot,%
+    psecurce,psgraph,parametricplot,%
+    psellipse,psaxes,ncline,nccurve,psbezier,parabola,%
+    qdisk,qline,clipbox,endpsclip,%
+    psgrid,pscircle,pscirclebox,psdiabox,pstribox,%
+    newpsfontdot,psdot,psdots,%
+    pspolygon,psdiamond,psoval,pstriangle,%
+    psarc,psarcn,psellipticarc,psellipticarcn,pswedge,psellipticwedge,
+    pcline,pcdiag,pcdiagg,pccurve,pccurve,pcecurve,%
+    scalebox,scaleboxto,psmathboxtrue,everypsbox,psverbboxtrue,overlaybox,%
+    psoverlay,putoverlaybox,%
+    newpsstyle,newpsobject,%
+    moveto,newpath,closepath,stroke,fill,gsave,grestore,msave,mrestore,translate,scale,%
+    swapaxes,rotate,openshadow,closedshadow,movepath,lineto,rlineto,curveto,rcurveto,%
+    code,dim,coor,rcoor,file,arrows,setcolor,%
+    rotateleft,rotateright,rotatedown,%
+%%
+%% pst-node
+    nput,naput,nbput,ncput,%
+    ncarc,ncbox,ncangle,ncangles,ncloop,ncdiag,ncdiagg,ncarcbox,ncbar,%
+    cnodeput,nccircle,%
+    pnode,rnode,Rnode,Cnode,cnode,fnode,%
+    circlenode,ovalnode,trinode,dianode,%
+    psmatrix,endpsmatrix,psspan,%
+%%
+%% pst-tree
+    pstree,Tcircle,TCircle,Ttri,Tn,TC,Tc,Tfan,TR,Tr,Tdia,Toval,Tdot,Tp,Tf,%
+    skiplevel,skiplevels,endskiplevels,tspace,tlput,%
+%%
+%% pst-text
+    pscharpath,pstextpath,
+%%
+%% pst-barcode
+    psbarcode,
+%%
+%% pst-coil
+    psboxfill,pscoil,psCoil,pszigzag,nccoil,
+    psshadow,pstilt,psTilt,ThreeDput,
+%%
+%% pst-gr3d
+    PstGridThreeDNodeProcessor,%
+%%
+%% pst-vue3d
+    PstGridThreeD,
+    AxesThreeD,LineThreeD,DieThreeD,FrameThreeD,SphereCircleThreeD,SphereMeridienThreeD,
+    QuadrillageThreeD,TetraedreThreeD,PyramideThreeD,ConeThreeD,CylindreThreeD,
+    DodecahedronThreeD,ConeThreeD,SphereThreeD,SphereInverseThreeD,DemiSphereThreeD,
+    SphereCreuseThreeD,SphereCircledThreeD,PortionSphereThreeD,pNodeThreeD,CubeThreeD,%
+%%
+%% pst-3dplot
+    pstThreeDCoor,pstThreeDDot,pstThreeDTriangle,pstThreeDCircle,pstPlanePut,%
+    pstThreeDBox,pstThreeDEllipse,pstThreeDLine,pstThreeDPut,%
+    pstThreeDNode,pstThreeDSquare,psplotThreeD,parametricplotThreeD,fileplotThreeD,%
+    dataplotThreeD,pstScalePoints,%
+%%
+%% pst-circ
+    resistor,battery,Ucc,Icc,capacitor,coil,diode,Zener,LED,lamp,switch,wire,tension,
+    circledipole,multidipole,OA,transistor,Tswitch,potentiometer,transformer,
+    optoCoupler,logic,
+%%
+%% pst-eucl
+    pstTriangle,pstMediatorAB,pstInterLL,pstMiddleAB,pstProjection,pstCircleOA,pstLineAB,%
+%%
+%% pst-func
+    psBessel,psPolynomial,psFourier,psGaussI,psGauss,psSi,pssi,psCi,psci,%
+%%
+%% pst-infixplot
+    psPlot,
+%%
+%% pst-ob3d
+    PstDie,PstCube,
+%%
+%% pst-poly
+    PstPolygon,pspolygonbox,
+%%
+%% pst-bar
+    psbarchart,readpsbardata,psbarscale,newpsbarstyle,%
+%%
+%% pst-lens
+    PstLens,%
+%%
+%% pst-geo
+    WorldMap,WorldMapII,WorldMapThreeD,WorldMapThreeDII,pnodeMap,MapPut,%
+%%
+%% pst-autoseg
+    asr,firstnode,merge,massoc,labelmerge,%
+%%
+%% gastex
+    node,imark,fmark,rmark,drawqbpedge,drawedge,drawloop,%
+%%
+%% pst-labo
+    Distillation,Ballon,
+%%
+%% pst-optic
+    lens,Transform,%
+%%
+%% pst-light3d
+    PstLightThreeDText,%
+%%
+%% calendrier
+    Calendrier,%
+%%
+%% pst-osci
+    Oscillo%
+  },%
+   sensitive,%
+   alsoother={0123456789$_},%
+   morecomment=[l]\% %
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Python}
+%
+% \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de}{1998/12/21} sent me
+% the definition. He got data from \textsc{Mark Lutz}: \textbf{Programming
+% Python}; O'Reilly 1996; ISBN 1-56592-197-6.
+% \lstthanks{Stephen Kelly}{-}{2007/01/14} reported some problems that indicated
+% that the comment definitions needed to be moved after the string definitions
+% to work correctly.
+%
+% In August 2013
+% \lstthanks{Alexis~Dimitriadis}{A.Dimitriadis@uu.nl}{2013/08/15} reworked
+% the definition by supplying the builtins.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Python definition (c) 1998 Michael Weber
+%% Additional definitions (2013) Alexis Dimitriadis
+%%
+\lst@definelanguage{Python}%
+  {morekeywords={access,and,break,class,continue,def,del,elif,else,%
+      except,exec,finally,for,from,global,if,import,in,is,lambda,not,%
+      or,pass,print,raise,return,try,while},%
+%    \end{macrocode}
+% Python has a long list of builtin-in functions
+% (\url{http://docs.python.org/2/library/functions.html}) and it is a good
+% idea to make them visible in printed code
+%    \begin{macrocode}
+  % Built-ins
+   morekeywords=[2]{abs,all,any,basestring,bin,bool,bytearray,callable,chr,
+     classmethod,cmp,compile,complex,delattr,dict,dir,divmod,enumerate,eval,
+     execfile,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,
+     help,hex,id,input,int,isinstance,issubclass,iter,len,list,locals,long,map,
+     max,memoryview,min,next,object,oct,open,ord,pow,property,range,raw_input,
+     reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,
+     sum,super,tuple,type,unichr,unicode,vars,xrange,zip,apply,buffer,coerce,
+     intern},
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morestring=[b]',%
+   morestring=[b]",%
+%    \end{macrocode}
+% According to PEP (Python Enhancement Proposals) comment should be
+% distinguished from documentation strings, so we define
+%    \begin{macrocode}
+   morecomment=[s]{'''}{'''},% used for documentation text (mulitiline strings)
+   morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn
+%    \end{macrocode}
+% \lsthelper{J\"urgen Dietel}{j.dietel@rz.rwth-aachen}{2015/05/05}{} provided
+% an example with a wrong representation of documentation strings, so the
+% two lines above got changed from |morestring| $\rightarrow$ |morecomment|.
+%
+% Python now supports so called \emph{raw strings} and also Unicode
+% strings. Here is the definition of these strings:
+%    \begin{macrocode}
+   morestring=[s]{r'}{'},% `raw' strings
+   morestring=[s]{r"}{"},%
+   morestring=[s]{r'''}{'''},%
+   morestring=[s]{r"""}{"""},%
+   morestring=[s]{u'}{'},% unicode strings
+   morestring=[s]{u"}{"},%
+   morestring=[s]{u'''}{'''},%
+   morestring=[s]{u"""}{"""}%
+  }%
+%    \end{macrocode}
+% \lsthelper{Philipp Matthias Hahn}{pmhahn@titan.lahn.de}{2002/04/18}{}
+% added the third comment. \lsthelper{eRreuR}{rogspr@newdeal.ch}{2002/05/28}
+% {probl\`eme avec "listings" et le langage Python} found a bug using Python
+% and \lsthelper{Nicolas Markey}{markey@lsv.ens-cachan.fr}{2002/05/29}
+% {listings and Python} informed me about the corresponding thread on
+% \texttt{fr.comp.text.tex} and provided the fix---adding \texttt{[b]} to
+% both \texttt{morestring} declarations.
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+% Alexis Dimitriadis also proposes the following configuration for printing
+% Python code which simulates colorizing the code as it's done by the IDLE
+% GUI:
+%    \begin{macrocode}
+%<*python-prf>
+%    \end{macrocode}
+%    \begin{macrocode}
+\usepackage{xcolor}
+\usepackage{textcomp}
+
+%% Actual colors from idlelib/config-highlight.def --> corrected to ``web-safe''
+%% strings  = #00aa00 / 0,170,0      (a darker green)
+%% builtins = #900090 / 144,0,144    (purple-ish)
+%% keywords = #FF7700 / 255,119,0    (quite close to plain `orange')
+%\definecolor{IDLEorange}{RGB}{255,119,0} % pretty close to real orange
+%\definecolor{IDLEpurple}{RGB}{144,0,144}
+%\definecolor{IDLEgreen}{RGB}{0,170,0}
+%\definecolor{IDLEred}{RGB}{221,0,0}
+%% Corrected to ``web-safe''
+%\definecolor{orange2}{RGB}{255,102,0}
+\definecolor{purple2}{RGB}{153,0,153} % there's actually no standard purple
+\definecolor{green2}{RGB}{0,153,0} % a darker green
+%\definecolor{red2}{RGB}{221,0,0}
+
+% Except for green and purple, the other colors are pretty good in standard
+% hue
+\lstdefinestyle{python-idle-code}{%
+  language=Python,                   % the language
+  basicstyle=\normalsize\ttfamily,   % size of the fonts for the code
+  % Color settings to match IDLE style
+  keywordstyle=\color{orange},       % core keywords
+  keywordstyle={[2]\color{purple2}}, % built-ins
+  stringstyle=\color{green2},
+  commentstyle=\color{red},
+  upquote=true,                      % requires textcomp
+}
+% Unimplemented IDLE syntax: function/class names being defined should be
+% blue
+%    \end{macrocode}
+% This code is provided in the file |listings-python.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+%    \begin{macrocode}
+%</python-prf>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Rexx}
+%
+% \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com}{2003/10/24} provided this
+% definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% classic rexx listings definition
+%% by Patrick TJ McPhee <ptjm@interlog.com>
+%%
+\lst@definelanguage{Rexx}
+  {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,%
+                 interpret,leave,nop,numeric,options,otherwise,parse,%
+                 procedure,pull,push,queue,return,say,signal,then,to,%
+                 trace,when},%
+   sensitive=false,%
+   morecomment=[n]{/*}{*/},%
+   morestring=[d]{'},%
+   morestring=[d]{"},%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Reduce}
+%
+% was provided by \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net}
+% {2002/10/31}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Reduce definition (c) 2002 Geraint Paul Bevan
+%%
+\lst@definelanguage{Reduce}%
+  {morekeywords={%
+%% reserved identifiers
+	abs,acos,acosh,acot,acoth,acsc,acsch,%
+	adjprec,algebraic,algint,allbranch,allfac,and,%
+	antisymmetric,append,arglength,array,asec,asech,%
+	asin,asinh,atan,atan2,atanh,begin,bfspace,bye,%
+	card_no,ceiling,clear,clearrules,coeff,coeffn,%
+	cofactor,combineexpt,combinelogs,comment,comp,%
+	complex,conj,cons,cont,cos,cosh,cot,coth,cramer,%
+	cref,csc,csch,decompose,define,defn,deg,demo,den,%
+	depend,det,df,difference,dilog,display,div,do,e,%
+	echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,%
+	evallhseqp,eval_mode,even,evenp,exp,expandlogs,%
+	expr,expt,ezgcd,factor,factorial,factorize,fexpr,%
+	first,fix,fixp,floor,for,forall,foreach,fort,%
+	fort_width,freeof,fullroots,g,gcd,geq,go,goto,%
+	greaterp,high_pow,hypot,i,if,ifactor,impart,in,%
+	index,infinity,infix,input,int,integer,interpol,%
+	intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,%
+	let,lhs,linear,linelength,lisp,list,listargp,%
+	listargs,ln,load,load_package,log,log10,logb,%
+	low_pow,lterm,macro,mainvar,mass,mat,match,%
+	mateigen,matrix,max,mcd,member,memq,min,minus,mkid,%
+	modular,msg,mshell,multiplicities,nat,neq,nero,%
+	nextprime,nil,nodepend,noncom,nonzero,nosplit,%
+	nospur,nullspace,num,numberp,odd,off,on,operator,%
+	or,order,ordp,out,output,part,pause,period,pf,pi,%
+	plus,precedence,precise,precision,pret,pri,primep,%
+	print_precision,procedure,product,quit,quotient,%
+	random,random_new_seed,rank,rat,ratarg,rational,%
+	rationalize,ratpri,real,rederr,reduct,remainder,%
+	remfac,remind,repart,repeat,rest,resultant,retry,%
+	return,reverse,revpri,rhs,rlisp88,%
+	root_multiplicity,round,roundall,roundbf,rounded,%
+	saveas,savestructr,scalar,sec,sech,second,set,%
+	setmod,setq,share,showrules,showtime,shut,sign,sin,%
+	sinh,smacro,solve,solvesingular,spur,sqrt,structr,%
+	sub,sum,symbolic,symmetric,t,tan,tanh,third,time,%
+	times,tp,tra,trace,trfac,trigform,trint,until,%
+	varname,vecdim,vector,weight,when,where,while,%
+	write,ws,wtlevel,%
+%% identifiers with spaces
+%%	for all,for each,go to,such that,%
+	},%
+  sensitive=false,%
+  morecomment=[l]\%,%
+  morecomment=[s]{COMMENT}{;},%
+  morecomment=[s]{COMMENT}{$},%
+  morestring="%
+ }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{RSL}
+%
+% Thanks go to \lstthanks{Brian~Christensen}{}{2004/02/15}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% RSL definition (c) 2004 Brian Christensen
+%%
+\lst@definelanguage{RSL}%
+  {morekeywords={Bool,Char,devt_relation,Int,Nat,Real,Text,Unit,abs,any,%
+      as,axiom,card,case,channel,chaos,class,do,dom,elems,else,elsif,end,%
+      extend,false,for,hd,hide,if,in,inds,initialise,int,len,let,local,%
+      object,of,out,post,pre,read,real,rng,scheme,skip,stop,swap,%
+      test_case,theory,then,tl,true,type,until,use,value,variable,while,%
+      with,write},%
+literate=%
+{<}{$<$}{1}%
+{>}{$>$}{1}%
+{[}{$[$}{1}%%
+{]}{$]$}{1}%%
+{^}{{\mbox{$\widehat{\;}$}}}{1}%%
+{'}{{\raisebox{1ex}[1ex][0ex]{\protect\scriptsize$\prime$}}}{1}%%
+{||}{{\mbox{$\parallel$}}}{2}%%
+{|-}{$\vdash$}{1}%%
+{|=|}{{\mbox{$\lceil\!\rceil\!\!\!\!\!\!\;\lfloor\!\rfloor$}}}{1}%%
+{**}{$\uparrow$}{1}%
+{/\\}{$\wedge$}{1}%%
+{inter}{$\cap$}{1}%%
+{-\\}{$\lambda$}{1}%%
+{->}{$\rightarrow$}{1}%%
+{-m->}{{\mbox{$\rightarrow \hspace{-2.5\lst@width} _{m}\;$}}}{1}%
+{-~m->}{{\mbox{$\stackrel{\sim}{\mbox{$\rightarrow\hspace{-2.5\lst@width} _{m}\;$}}$}}}{1}%
+{-~->}{{\mbox{$\stackrel{\sim}{\rightarrow}$}}}{1}%%
+{-set}{\bf{-set}}{4}%%
+{-list}{{$^{\ast}$}}{1}%%
+{-inflist}{$^\omega$}{1}%
+{-infset}{{\mbox{{\bf -infset}}}}{7}%
+{\#}{$\circ$}{1}%
+{:-}{{\raisebox{.4ex}{\tiny $\bullet$}}}{1}%%
+{=}{$=$}{1}%%
+{==}{$==$}{2}%%
+{=>}{$\Rightarrow$}{1}%%
+{\ is\protect\^^M}{{$\;\equiv$}}{2}%
+{\ is\ }{{$\equiv$}}{3}%%
+{\ isin\protect\^^M}{$\;\in$}{2}%%
+{~}{$\sim$}{1}%%
+{~=}{$\neq$}{1}%%
+{~isin}{$\notin$}{1}%%
+{+>}{$\mapsto$}{1}%%
+{++}{}{1}%
+{|^|}{{\mbox{$\lceil\!\rceil$}}}{1}%%
+{\\/}{$\vee$}{1}%%
+{exists}{$\exists$}{1}%%
+{union}{$\cup$}{1}%%
+{>=}{$\geq$}{1}%%
+{><}{$\times$}{1}%%
+{>>}{$\supset$}{1}%
+{>>=}{$\supseteq$}{1}%%
+{<=}{$\leq$}{1}%%
+{<<}{$\subset$}{1}%
+{<.}{$\langle$}{1}%%
+{<<=}{$\subseteq$}{1}%%
+{<->}{$\leftrightarrow$}{1}%%
+{[=}{$\sqsubseteq$}{1}%%
+{\{=}{$\preceq$}{1}%%
+{\ all\protect\^^M}{$\forall$}{2}%%
+{\ all\ }{$\forall$}{3}%%
+{!!}{$\dagger$}{1}%%
+{always}{$\Box$}{1}%%
+{.>}{$\rangle$}{1}%%
+{`alpha}{$\alpha$}{1}%
+{`beta}{$\beta$}{1}%
+{`gamma}{$\gamma$}{1}%
+{`delta}{$\delta$}{1}%
+{`epsilon}{$\epsilon$}{1}%
+{`zeta}{$\zeta$}{1}%
+{`eta}{$\eta$}{1}%
+{`theta}{$\theta$}{1}%
+{`iota}{$\iota$}{1}%
+{`kappa}{$\kappa$}{1}%
+{`mu}{$\mu$}{1}%
+{`nu}{$\nu$}{1}%
+{`xi}{$\xi$}{1}%
+{`pi}{$\pi$}{1}%
+{`rho}{$\rho$}{1}%
+{`sigma}{$\sigma$}{1}%
+{`tau}{$\tau$}{1}%
+{`upsilon}{$\upsilon$}{1}%
+{`phi}{$\phi$}{1}%
+{`chi}{$\chi$}{1}%
+{`psi}{$\psi$}{1}%
+{`omega}{$\omega$}{1}%
+{`Gamma}{$\Gamma$}{1}%
+{`Delta}{$\Delta$}{1}%
+{`Theta}{$\Theta$}{1}%
+{`Lambda}{$\Lambda$}{1}%
+{`Xi}{$\Xi$}{1}%
+{`Pi}{$\Pi$}{1}%
+{`Sigma}{$\Sigma$}{1}%
+{`Upsilon}{$\Upsilon$}{1}%
+{`Phi}{$\Phi$}{1}%
+{`Psi}{$\Psi$}{1}%
+{`Omega}{$\Omega$}{1},%
+   sensitive=true,%
+   morecomment=[l]{--},%
+   morecomment=[s]{/*}{*/}%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Ruby}
+%
+% \lstthanks{Christian~Kaiser}{chk@combit.net}{2003/02/05} provided the initial
+% definition. \lstthanks{Xavier~Noria}{fxn@hashref.com}{2004/01/11} replaced
+% the keywords with the keywords from the at the time of writing current
+% stable Ruby version.  An erroneous string delimiter was removed following
+% a bug reported on comp.text.tex on 2006/09/01.
+%
+% Ruby supports string delimiters of the form \verb|%q!...!|, where \verb|!|
+% can be any character, or can be matched braces or parentheses or brackets.
+% The included string definitions include most of the common variants, but are
+% of course not comprehensive.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Ruby}%
+  {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,%
+      case,class,def,defined?,do,else,elsif,end,ensure,false,for,%
+      if,in,module,next,nil,not,or,redo,rescue,retry,return,self,%
+      super,then,true,undef,unless,until,when,while,yield},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[s]{=BEGIN}{=END},%
+   morestring=[b]',%
+   morestring=[b]",%
+   morestring=[s]{\%q/}{/},%
+   morestring=[s]{\%q!}{!},%
+   morestring=[s]{\%q\{}{\}},%
+   morestring=[s]{\%q(}{)},%
+   morestring=[s]{\%q[}{]},%
+   morestring=[s]{\%q-}{-},%
+   morestring=[s]{\%Q/}{/},%
+   morestring=[s]{\%Q!}{!},%
+   morestring=[s]{\%Q\{}{\}},%
+   morestring=[s]{\%Q(}{)},%
+   morestring=[s]{\%Q[}{]},%
+   morestring=[s]{\%Q-}{-}%
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Scilab}
+%
+% Thanks go to \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr}
+% {2003/06/02}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Scilab definition (c) 2002,2003 Jean-Philippe Grivet
+%%
+\lst@definelanguage{Scilab}%
+  {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,%
+      addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,%
+      amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,%
+      arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,%
+      asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,%
+      auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,%
+      besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,%
+      bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,%
+      bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,%
+      cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,%
+      cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,%
+      chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,%
+      chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,%
+      clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,%
+      coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,%
+      cond,conj,connex,contour2di,contour2d,contourf,contour,%
+      contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,%
+      convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,%
+      cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,%
+      curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,%
+      dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,%
+      delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,%
+      derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,%
+      dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,%
+      dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,%
+      dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,%
+      edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,%
+      elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,%
+      ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,%
+      eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,%
+      exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,%
+      fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,%
+      file,filter,findm,findobj,findx0BD,find_freq,find_path,find,%
+      findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,%
+      formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,%
+      fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,%
+      fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,%
+      fullrfk,fullrf,full,fun2string,funcprot,functions,function,%
+      funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,%
+      genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,%
+      getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,%
+      getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,%
+      getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,%
+      givens,glever,glist,global,glue,gpeche,graduate,grand,%
+      graphics_entities,graph_2_mat,graph_center,graph_complement,%
+      graph_diameter,graph_power,graph_simp,graph_sum,graph_union,%
+      graph-list,graycolormap,grayplot,graypolarplot,grep,group,%
+      gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,%
+      hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,%
+      hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,%
+      householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,%
+      iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,%
+      ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,%
+      ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,%
+      int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,%
+      interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,%
+      inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,%
+      iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,%
+      justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,%
+      kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,%
+      leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,%
+      lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,%
+      linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,%
+      lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,%
+      log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,%
+      lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,%
+      lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,%
+      make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,%
+      mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,%
+      mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,%
+      mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,%
+      min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,%
+      min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,%
+      mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,%
+      mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,%
+      names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,%
+      nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,%
+      netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,%
+      nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,%
+      null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,%
+      obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,%
+      ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,%
+      paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,%
+      pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,%
+      phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,%
+      plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,%
+      plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,%
+      polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,%
+      predecessors,predef,printf,printing,print,prod,profile,projsl,%
+      projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,%
+      pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,%
+      pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,%
+      pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,%
+      pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,%
+      pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,%
+      pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,%
+      quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,%
+      readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,%
+      repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,%
+      rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,%
+      rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,%
+      save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,%
+      sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,%
+      semidef,sensi,setbpt,seteventhandler,setfield,setmenu,%
+      setscicosvars,set,sfact,sgrid,shortest_path,showprofile,%
+      show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,%
+      sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,%
+      solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,%
+      spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,%
+      spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,%
+      square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,%
+      stabil,stacksize,standard_define,standard_draw,standard_input,%
+      standard_origin,standard_output,startup,stdevf,stdev,steadycos,%
+      str2code,strange,strcat,strindex,strings,string,stripblanks,%
+      strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,%
+      subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,%
+      sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,%
+      systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,%
+      texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,%
+      tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,%
+      translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,%
+      trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,%
+      uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,%
+      unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,%
+      varargout,variancef,variance,varn,warning,wavread,wavwrite,%
+      wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,%
+      wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,%
+      with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,%
+      xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,%
+      xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,%
+      xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,%
+      xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,%
+      xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,%
+      xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,%
+      x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,%
+      zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,%
+      msscanf,mucomp,%
+      ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,%
+      CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,%
+      CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,%
+      DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,%
+      EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,%
+      GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,%
+      INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,%
+      MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,%
+      PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,%
+      ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,%
+      SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,%
+      TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,%
+      TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,%
+      \%asn,\%helps,\%k,\%sn},%
+   alsoletter=\%,% chmod
+   sensitive,%
+   morecomment=[l]//,%
+   morestring=[b]",%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SHELXL}
+%
+% Thanks to \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au}
+% {1999/07/09} for mailing this definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SHELXL definition (c) 1999 Aidan Philip Heerdegen
+%%
+\lst@definelanguage{SHELXL}%
+  {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,%
+      REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,%
+      MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,%
+      EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,%
+      FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,%
+      WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,%
+      FMAP,GRID,PLAN,MOLE},%
+   sensitive=false,%
+   alsoother=_,% Makes the syntax highlighting ignore the underscores
+   morecomment=[l]{! },%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Simula}
+%
+% Took data from
+% \begin{itemize}
+% \item
+%		\textsc{G\"unther Lamprecht}:
+%		\textbf{Introduction to SIMULA 67};
+%		Braunschweig; Wiesbaden: Vieweg, 1981
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[DEC]{Simula}[67]{Simula}%
+  {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,%
+      options,or,protected,short}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[CII]{Simula}[67]{Simula}%
+  {morekeywords={and,equiv,exit,impl,not,or,stop}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[67]{Simula}%
+  {morekeywords={activate,after,array,at,before,begin,boolean,%
+      character,class,comment,delay,detach,do,else,end,external,false,%
+      for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,%
+      notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,%
+      simset,simulation,step,switch,text,then,this,to,true,until,value,%
+      virtual,when,while},%
+   sensitive=f,%
+   keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},%
+   morestring=[d]",%
+   morestring=[d]'%
+  }[keywords,keywordcomments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SPARQL}
+%
+% This definition for the SPARQL query language (SPARQL Protocol and RDF
+% Query Language, \url{http://www.w3.org/TR/rdf-sparql-query/}) was provided
+% by \lstthanks{Christoph~Kiefer}{-}{2006/10/24}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SPARQL definition (c) 2006 Christoph Kiefer
+%%
+\lst@definelanguage{SPARQL}%
+  {morekeywords={BASE,PREFIX,SELECT,DISTINCT,CONSTRUCT,DESCRIBE,ASK,%
+        FROM,NAMED,WHERE,ORDER,BY,ASC,DESC,LIMIT,OFFSET,OPTIONAL,%
+        GRAPH,UNION,FILTER,a,STR,LANG,LANGMATCHES,DATATYPE,BOUND,%
+        isIRI,isURI,isBLANK,isLITERAL,REGEX,true,false},%
+   sensitive=false,%
+   morecomment=[l]\#,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SQL}
+%
+% Data come from \lstthanks{Christian~Haul}
+% {haul@dvs1.informatik.tu-darmstadt.de}{1998/01/09}.
+% \lstthanks{Neil~Conway}{nconway@klamath.dyndns.org}{2002/07/06} added some
+% keywords, ditto \lsthelper{Torsten~Flatter}{Thorsten.Flatter@T-Systems.de}
+% {2002/10/15}{missing keywords}, \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}
+% {2002/11/19}{missing keywords} and \lsthelper{Dirk~Jesko}
+% {jesko@iti.cs.uni-magdeburg.de}{2003/06/03}{extended SQL definition}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SQL definition (c) 1998 Christian Haul
+%%                (c) 2002 Neil Conway
+%%                (c) 2002 Robert Frank
+%%                (c) 2003 Dirk Jesko
+%%
+\lst@definelanguage{SQL}%
+  {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,%
+      AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,%
+      CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,%
+      COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,%
+      CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,%
+      CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,%
+      DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,%
+      DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,%
+      EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,%
+      GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,%
+      INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,%
+      ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,%
+      MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,%
+      NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,%
+      PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,%
+      RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,%
+      SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,%
+      TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,%
+      TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,%
+      TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,%
+      VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,%
+      AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF
+      LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF
+      MIN,MAX,UNION,UPDATE,% RF
+      ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ
+      ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ
+   morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ
+      INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here
+   sensitive=false,% DJ
+   morecomment=[l]--,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Tcl/Tk}
+%
+% Tcl/Tk is a very dynamic language. A statical analysis might not be
+% adequate. Nevertheless the following definitions produce the desired
+% result for my programs with a minimum of ``misses''.
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Welch, Brent B.}:
+%		\textbf{Practical Programming in Tcl and Tk};
+%		{\copyright} 1997 Prentice Hall, Inc.;
+%		ISBN 0-13-616830-2.
+% \item
+%		\textsc{Ousterhout, John K.}:
+%		\textbf{Tcl and the Tk Toolkit};
+%		{\copyright} 1997 Addison-Wesley Publishing Company;
+%		ISBN 0-201-6337-X.
+% \end{itemize}
+% \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de}{2000/09/16} added support
+% for Tcl/Tk.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Tcl/Tk definition (c) Gerd Neugebauer
+%%
+\lst@definelanguage[tk]{tcl}[]{tcl}%
+  {morekeywords={activate,add,separator,radiobutton,checkbutton,%
+      command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,%
+      canvasy,cascade,cget,checkbutton,config,configu,configur,%
+      configure,clipboard,create,arc,bitmap,image,line,oval,polygon,%
+      rectangle,text,textwindow,curselection,delete,destroy,end,entry,%
+      entrycget,event,focus,font,actual,families,measure,metrics,names,%
+      frame,get,grab,current,release,status,grid,columnconfigure,%
+      rowconfigure,image,image,create,bitmap,photo,delete,height,types,%
+      widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,%
+      menu,menubutton,message,move,option,add,clear,get,readfile,pack,%
+      photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,%
+      selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,%
+      tkwait,window,variable,visibility,toplevel,unknown,update,winfo,%
+      class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,%
+      width,height,wm,aspect,client,command,deiconify,focusmodel,frame,%
+      geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,%
+      iconwindow,maxsize,minsize,overrideredirect,positionfrom,%
+      protocol,sizefrom,state,title,transient,withdraw,xview,yview,%
+      yposition,%
+      -accelerator,-activebackground,-activeborderwidth,%
+      -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,%
+      -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,%
+      -borderwidth,-button,-capstyle,-channel,-class,-closeenough,%
+      -colormap,-column,-columnspan,-command,-confine,-container,%
+      -count,-cursor,-data,-default,-detail,-digits,-direction,%
+      -displayof,-disableforeground,-elementborderwidth,-expand,%
+      -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,%
+      -fontmap,-foreground,-format,-from,-gamma,-global,-height,%
+      -highlightbackground,-highlightcolor,-highlightthickness,-icon,%
+      -image,-in,-insertbackground,-insertborderwidth,-insertofftime,%
+      -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,%
+      -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,%
+      -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,%
+      -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,%
+      -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,%
+      -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,%
+      -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,%
+      -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,%
+      -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,%
+      -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,%
+      -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,%
+      -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,%
+      -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,%
+      -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,%
+      -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,%
+      -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,%
+      activate,add,addtag,bbox,cget,clone,configure,coords,%
+      curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,%
+      entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,%
+      icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,%
+      moveto,own,post,postcascade,postscript,put,redither,ranges,%
+      scale,select,show,tag,type,unpost,xscrollcommand,xview,%
+      yscrollcommand,yview,yposition}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[]{tcl}%
+  {alsoletter={.:,*=&-},%
+   morekeywords={after,append,array,names,exists,anymore,donesearch,%
+      get,nextelement,set,size,startsearch,auto_mkindex,binary,break,%
+      case,catch,cd,clock,close,concat,console,continue,default,else,%
+      elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,%
+      fconfigure,fcopy,file,atime,dirname,executable,exists,extension,%
+      isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,%
+      rootname,size,stat,tail,type,writable,-permissions,-group,-owner,%
+      -archive,-hidden,-readonly,-system,-creator,-type,-force,%
+      fileevent,flush,for,foreach,format,gets,glob,global,history,if,%
+      incr,info,argsbody,cmdcount,commands,complete,default,exists,%
+      globals,level,library,locals,patchlevel,procs,script,tclversion,%
+      vars,interp,join,lappend,lindex,linsert,list,llength,lrange,%
+      lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,%
+      -real,-dictionary,-increasing,-decreasing,-index,-command,load,%
+      namespace,open,package,forget,ifneeded,provide,require,unknown,%
+      vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,%
+      regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,%
+      socket,source,split,string,compare,first,index,last,length,match,%
+      range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,%
+      time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,%
+      vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,%
+      hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round%
+      },%
+   morestring=[d]",%
+   morecomment=[f]\#,%
+   morecomment=[l]{;\#},%
+   morecomment=[l]{[\#},%
+   morecomment=[l]{\{\#}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% And after receiving a bug report from \lsthelper{Vitaly A. Repin}
+% {vitaly@radio.hop.stu.neva.ru}{2002/04/08}{undefined control sequence
+% \lst@CommentB} I converted the version 0.21 contents of |MoreSelectCharTable|
+% to version 1.0.
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Statistical languages}
+%
+% These languages have been added by \lstthanks{Winfried~Theis}
+% {theis@statistik.uni-dortmund.de}{2000/09/05}. \lstthanks{Robert~Denham}
+% {Robert.Denham@dnr.qld.gov.au}{2001/05/03} contributed the additional
+% string delimiter |'|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{S}[]{R}{}
+\lst@definelanguage[PLUS]{S}[]{R}{}
+\lst@definelanguage{R}%
+  {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,%
+      aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,%
+      approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,%
+      atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,%
+      axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,%
+      beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,%
+      c,C,call,Call,case,cat,category,cbind,ceiling,character,char,%
+      charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,%
+      coef,coefficients,co,col,colnames,colors,colours,commandArgs,%
+      comment,complete,complex,conflicts,Conj,contents,contour,%
+      contrasts,contr,control,helmert,contrib,convolve,cooks,coords,%
+      distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,%
+      create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,%
+      data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,%
+      debugger,Defunct,default,delay,delete,deltat,demo,de,density,%
+      deparse,dependencies,Deprecated,deriv,description,detach,%
+      dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,%
+      dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,%
+      dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,%
+      download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,%
+      duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,%
+      emacs,end,environment,env,erase,eval,equal,evalq,example,exists,%
+      exit,exp,expand,expression,External,extract,extractAIC,factor,%
+      fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,%
+      For,formals,format,formatC,formula,Fortran,forwardsolve,frame,%
+      frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,%
+      gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,%
+      getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,%
+      gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,%
+      ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,%
+      installed,integer,interaction,interactive,Internal,intersect,%
+      inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,%
+      layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,%
+      licence,license,lines,list,lm,load,local,locator,log,log10,log1p,%
+      log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,%
+      mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,%
+      matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,%
+      missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,%
+      names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,%
+      nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,%
+      numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,%
+      options,or,order,ordered,outer,package,packages,page,pairlist,%
+      pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,%
+      pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,%
+      pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,%
+      pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,%
+      postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,%
+      print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,%
+      psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,%
+      qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,%
+      qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,%
+      qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,%
+      rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,%
+      csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,%
+      relevel,remove,rep,repeat,replace,replications,report,require,%
+      resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,%
+      rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,%
+      rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,%
+      rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,%
+      search,searchpaths,segments,seq,sequence,setdiff,setequal,set,%
+      setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,%
+      spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,%
+      storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,%
+      subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,%
+      sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,%
+      tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,%
+      time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,%
+      ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,%
+      unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,%
+      variable,vector,Version,vi,warning,warnings,weighted,weights,%
+      which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,%
+      xpdrows,xy,xyinch,yinch,zapsmall,zip},%
+   otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},%
+   alsoother={._$},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]'% 2001 Robert Denham
+  }%
+%    \end{macrocode}
+% \lsthelper{Benjamin Janson}{benjamin.janson@gmx.de}{2002/07/09}
+% {prockeywords undefined} got a \texttt{prockeywords undefined} error,
+% which was removed by \lsthelper{Heiko Oberdiek}{oberdiek@uni-freiburg.de}
+% {2002/07/10}{prockeywords -> procnamekeys}.
+%    \begin{macrocode}
+\lst@definelanguage{SAS}%
+  {procnamekeys={proc},%
+   morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,%
+      TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,%
+      DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,%
+      CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,%
+      LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,%
+      POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,%
+      PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,%
+      CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,%
+      RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,%
+      UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,%
+      MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,%
+      LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,%
+      RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,%
+      SHOW},%
+   otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},%
+   morestring=[d]'%
+   }[keywords,comments,strings,procnames]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{\TeX}
+%
+% I extracted the data from |plain.tex|, |latex.ltx|, and |size10.clo|.
+% \lsthelper{Dr.~Peter~Leibner}{leibner@sta.siemens.de}{1999/11/08}{missing
+% keywords in definition of \LaTeX} reported that some keywords are missing
+% and also added a couple.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}%
+  {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,%
+      AtEndOfPackage,ClassError,ClassInfo,ClassWarning,%
+      ClassWarningNoLine,CurrentOption,DeclareErrorFont,%
+      DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,%
+      DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,%
+      DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,%
+      DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,%
+      DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,%
+      DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,%
+      DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,%
+      DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,%
+      DeclareTextCommandDefault,DeclareTextComposite,%
+      DeclareTextCompositeCommand,DeclareTextFontCommand,%
+      DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,%
+      GenericError,GenericInfo,GenericWarning,IfFileExists,%
+      InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,%
+      OptionNotUsed,PackageError,PackageInfo,PackageWarning,%
+      PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,%
+      ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,%
+      ProvidesPackage,ProvideTextCommand,RequirePackage,%
+      RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,%
+      TextSymbolUnavailable,UseTextAccent,UseTextSymbol},%
+   morekeywords={array,center,displaymath,document,enumerate,eqnarray,%
+      equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
+      picture,sloppypar,tabbing,tabular,trivlist,verbatim}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[LaTeX]{TeX}[common]{TeX}%
+  {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,%
+      addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,%
+      arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,%
+      baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,%
+      bibliography,bibliographystyle,bibstyle,bigskip,boldmath,%
+      botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,%
+      citation,cite,cleardoublepage,clearpage,cline,columnsep,%
+      columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,%
+      dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,%
+      defaultscriptratio,defaultscriptscriptratio,depth,Diamond,%
+      displaymath,document,documentclass,documentstyle,doublerulesep,%
+      em,emph,endarray,endcenter,enddisplaymath,enddocument,%
+      endenumerate,endeqnarray,endequation,endflushleft,endflushright,%
+      enditemize,endlist,endlrbox,endmath,endminipage,endpicture,%
+      endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,%
+      enlargethispage,ensuremath,enumerate,eqnarray,equation,%
+      evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,%
+      fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,%
+      fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,%
+      fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,%
+      frame,framebox,fussy,glossary,headheight,headsep,height,hline,%
+      hspace,I,include,includeonly,index,inputlineno,intextsep,%
+      itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,%
+      labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,%
+      leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,%
+      leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,%
+      linewidth,list,listfiles,listfiles,listparindent,lrbox,%
+      makeatletter,makeatother,makebox,makeglossary,makeindex,%
+      makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,%
+      marginparsep,marginparwidth,markboth,markright,math,mathbf,%
+      mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,%
+      mathunderscore,mathversion,mbox,mdseries,mho,minipage,%
+      multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,%
+      newenvironment,newfont,newhelp,newlabel,newlength,newline,%
+      newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,%
+      nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,%
+      nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,%
+      numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,%
+      pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,%
+      paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,%
+      protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,%
+      ref,refstepcounter,renewcommand,renewenvironment,restorecr,%
+      reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,%
+      rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,%
+      selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,%
+      shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,%
+      smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,%
+      subparagraphmark,subsectionmark,subsubsectionmark,sum,%
+      suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,%
+      tabularnewline,textasciicircum,textasciitilde,textbackslash,%
+      textbar,textbf,textbraceleft,textbraceright,textbullet,%
+      textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,%
+      textellipsis,textemdash,textendash,textexclamdown,textfloatsep,%
+      textfraction,textgreater,textheight,textit,textless,textmd,%
+      textnormal,textparagraph,textperiodcentered,textquestiondown,%
+      textquotedblleft,textquotedblright,textquoteleft,textquoteright,%
+      textregistered,textrm,textsc,textsection,textsf,textsl,%
+      textsterling,textsuperscript,texttrademark,texttt,textunderscore,%
+      textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,%
+      thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,%
+      thispagestyle,title,today,topfigrule,topfraction,topmargin,%
+      topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,%
+      typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,%
+      usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,%
+      vspace,width,%
+      normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,%
+      huge,Huge}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[plain]{TeX}[common]{TeX}%
+  {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,%
+      columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,%
+      fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,%
+      leqalignno,magnification,makefootline,makeheadline,midinsert,mit,%
+      mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,%
+      pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,%
+      settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,%
+      tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,%
+      tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,%
+      ttraggedright,vfootnote}%
+  }%
+%    \end{macrocode}
+% The following language is only a helper.
+%    \begin{macrocode}
+\lst@definelanguage[common]{TeX}[primitive]{TeX}
+  {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,%
+      alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,%
+      Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,%
+      bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,%
+      Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,%
+      bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,%
+      biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,%
+      braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,%
+      buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,%
+      centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,%
+      copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,%
+      ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,%
+      displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,%
+      Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,%
+      endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,%
+      flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,%
+      frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,%
+      grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,%
+      hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,%
+      imath,in,inf,infty,int,interdisplaylinepenalty,%
+      interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,%
+      kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,%
+      ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,%
+      leftharpoondown,leftharpoonup,leftline,leftrightarrow,%
+      Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,%
+      ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,%
+      longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,%
+      Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,%
+      mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,%
+      medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,%
+      nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,%
+      newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,%
+      newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,%
+      nonfrenchspacing,normalbaselines,normalbaselineskip,%
+      normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,%
+      oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,%
+      ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,%
+      overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,%
+      perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,%
+      prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,%
+      rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,%
+      rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,%
+      rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,%
+      rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,%
+      sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,%
+      smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,%
+      sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,%
+      subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,%
+      tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,%
+      triangle,triangleleft,triangleright,u,underbar,underbrace,%
+      uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,%
+      upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,%
+      vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,%
+      widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}%
+  }%
+%    \end{macrocode}
+% \lsthelper{Herbert Voss}{Herbert.Voss@FU-Berlin.DE}{2013-12-12}{typo} pointed
+% to a typo: the \TeX{} primitive is |lineskiplimit| instead of
+% |lineskiplimits|.
+%    \begin{macrocode}
+\lst@definelanguage[primitive]{TeX}%
+  {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,%
+      abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,%
+      atopwithdelims,badness,baselineskip,batchmode,begingroup,%
+      belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,%
+      boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,%
+      closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,%
+      deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,%
+      delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,%
+      discretionary,displayindent,displaylimits,displaystyle,%
+      displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,%
+      edef,else,emergencystretch,end,endcsname,endgroup,endinput,%
+      endlinechar,eqno,errhelp,errmessage,errorcontextlines,%
+      errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,%
+      everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,%
+      finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,%
+      fontname,futurelet,gdef,global,globaldefs,halign,hangafter,%
+      hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,%
+      holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,%
+      hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,%
+      ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,%
+      ignorespaces,immediate,indent,input,insert,insertpenalties,%
+      interlinepenalty,jobname,kern,language,lastbox,lastkern,%
+      lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,%
+      leqno,let,limits,linepenalty,lineskip,lineskiplimit,long,%
+      looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,%
+      mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,%
+      mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,%
+      maxdepth,meaning,medmuskip,message,mkern,month,moveleft,%
+      moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,%
+      noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,%
+      nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,%
+      output,outputpenalty,over,overfullrule,overline,overwithdelims,%
+      pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,%
+      pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,%
+      parindent,parshape,parskip,patterns,pausing,penalty,%
+      postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,%
+      prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,%
+      righthyphenmin,rightskip,romannumeral,scriptfont,%
+      scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,%
+      scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,%
+      showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,%
+      skipdef,spacefactor,spaceskip,span,special,splitbotmark,%
+      splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,%
+      textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,%
+      tolerance,topmark,topskip,tracingcommands,tracinglostchars,%
+      tracingmacros,tracingonline,tracingoutput,tracingpages,%
+      tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,%
+      underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,%
+      uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,%
+      vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,%
+      widowpenalty,write,xdef,xleaders,xspaceskip,year},%
+   sensitive,%
+   alsoother={0123456789$_},%$ to make Emacs fontlocking happy
+   morecomment=[l]\%%
+  }[keywords,tex,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VBScript}
+%
+% \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@sap.com}{2000/01/10}{VBScript}
+% sent me this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VBScript definition (c) 2000 Sonja Weidmann
+%%
+\lst@definelanguage{VBScript}%
+  {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,%
+      Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,%
+      Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,%
+      Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,%
+      CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,%
+      Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,%
+      FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,%
+      IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,%
+      LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,%
+      MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,%
+      ScriptEngineBuildVersion,ScriptEngineMajorVersion,%
+      ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,%
+      StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,%
+      UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,%
+      Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,%
+      CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,%
+      DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,%
+      FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,%
+      GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,%
+      GetExtensionName,GetFile,GetFileName,GetFolder,%
+      GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,%
+      MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,%
+      ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,%
+      WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,%
+      Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,%
+      RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,%
+      TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,%
+      Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,%
+      vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,%
+      vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,%
+      vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,%
+      vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,%
+      vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,%
+      vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,%
+      vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,%
+      vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,%
+      vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,%
+      vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,%
+      vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,%
+      vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,%
+      vbYellow,vbYesNo,vbYesNoCancel},%
+   sensitive=f,%
+   morecomment=[l]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Verilog}
+%
+% Thanks to \lstthanks{Cameron H. G. Wright}{c.h.g.wright@ieee.org}{2003/04/30}
+% for providing the definition. After a bug report by \lsthelper{George
+% M.~Georgiou}{georgiou@csci.csusb.edu}{2004/02/05}{directives not detected} I
+% changed the declaration of directives to use normal keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Verilog definition (c) 2003 Cameron H. G. Wright <c.h.g.wright@ieee.org>
+%%   Based on the IEEE 1364-2001 Verilog HDL standard
+%%   Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis,"
+%%        Prentice Hall, 2003. ISBN: 0-13-044911-3
+%%
+\lst@definelanguage{Verilog}%
+  {morekeywords={% reserved keywords
+      always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,%
+      casez,cell,cmos,config,deassign,default,defparam,design,disable,%
+      edge,else,end,endcase,endconfig,endfunction,endgenerate,%
+      endmodule,endprimitive,endspecify,endtable,endtask,event,for,%
+      force,forever,fork,function,generate,genvar,highz0,highz1,if,%
+      ifnone,incdir,include,initial,inout,input,instance,integer,join,%
+      large,liblist,library,localparam,macromodule,medium,module,nand,%
+      negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,%
+      parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,%
+      pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,%
+      release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,%
+      showcancelled,signed,small,specify,specparam,strong0,strong1,%
+      supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,%
+      tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,%
+      weak1,while,wire,wor,xnor,xor},%
+   morekeywords=[2]{% system tasks and functions
+      $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,%
+      $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,%
+      $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,%
+      $nokey},%
+   morekeywords=[3]{% compiler directives
+      `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,%
+      `define,`else,`elsif,`endcelldefine,`endif,`endprotect,%
+      `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,%
+      `no_accelerate,`noexpand_vectornets,`noremove_gatenames,%
+      `nounconnected_drive,`protect,`protected,`remove_gatenames,%
+      `remove_netnames,`resetall,`timescale,`unconnected_drive},%
+   alsoletter=\`,%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang3>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VHDL}
+%
+% This language is due to \lstthanks{Kai~Wollenweber}{kai@ece.wpi.edu}
+% {1997/11/04}{VHDL}. I've done conversion to version 0.19 only.
+% \lsthelper{Gaurav Aggarwal}{gaurav@ics.uci.edu}{1998/04/02}{sensitive=f}
+% reported that VHDL is case insensitive and \lsthelper{Arnaud~Tisserand}
+% {2003/02/17}{missing keywords: disconnect, elif, with} added three
+% keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VHDL definition (c) 1997 Kai Wollenweber
+%%
+\lst@definelanguage{VHDL}%
+  {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,%
+      ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,%
+      COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,%
+      FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,%
+      INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,%
+      NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,%
+      PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,%
+      RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,%
+      SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,%
+      WHILE,XOR,XNOR,%
+      DISCONNECT,ELIF,WITH},% Arnaud Tisserand
+   sensitive=f,% 1998 Gaurav Aggarwal
+   morecomment=[l]--,%
+   morestring=[d]{"}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% The VHDL-AMS dialect has been added by \lstthanks{Steffen~Klupsch}
+% {steffen@vlsi.informatik.tu-darmstadt.de}{2001/10/05}.
+%    \begin{macrocode}
+%%
+%% VHDL-AMS definition (c) Steffen Klupsch
+%%
+\lst@definelanguage[AMS]{VHDL}[]{VHDL}%
+  {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,%
+      PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,%
+      TOLERANCE,UNAFFACTED,UNITS}}
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VRML}
+%
+% This language is due to \lstthanks{Oliver~Baum}{oli.baum@web.de}{2001/07/10}
+% {VRML}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VRML definition (c) 2001 Oliver Baum
+%%
+\lst@definelanguage[97]{VRML}
+  {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,%
+      eventIn,eventOut,exposedField,field,Introduction,Anchor,%
+      Appearance,AudioClip,Background,Billboard,Box,Collision,Color,%
+      ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,%
+      Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,%
+      Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,%
+      Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,%
+      NormalInterpolator,OrientationInterpolator,PixelTexture,%
+      PlaneSensor,PointLight,PointSet,PositionInterpolator,%
+      ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,%
+      SphereSensor,SpotLight,Switch,Text,TextureCoordinate,%
+      TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,%
+      VisibilitySensor,WorldInfo},%
+   morecomment=[l]\#,% bug: starts comment in the first column
+   morestring=[b]"%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang2>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{XML et al}
+%
+% \lstthanks{Bernhard~Walle}{bernhard@bwalle.de}{2003/11/22} provided the
+% following two definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{XSLT}[]{XML}%
+  {morekeywords={%
+     % main elements
+     xsl:stylesheet,xsl:transform,%
+     % childs of the main element
+     xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,%
+     xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,%
+     xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,%
+     % 21 directives
+     xsl:apply-imports,xsl:apply-templates,xsl:attribute,%
+     xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,%
+     xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,%
+     xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,%
+     xsl:value-of,xsl:variable,xsl:when,xsl:with-param},%
+   alsodigit={-},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Ant}[]{XML}%
+  {morekeywords={%
+     project,target,patternset,include,exclude,excludesfile,includesfile,filterset,%
+     filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,%
+     filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,%
+     filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,%
+     regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,%
+     expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,%
+     classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,%
+     extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,%
+     dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,%
+     dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,%
+     patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,%
+     format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,%
+     p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,%
+     doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,%
+     translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,%
+     jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,%
+     support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,%
+     classes,webinf,rename,sequential,serverdeploy,generic,property,move,%
+     copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,%
+     p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,%
+     coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,%
+     iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,%
+     rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,%
+     stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,%
+     antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,%
+     rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,%
+     equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,%
+     untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,%
+     ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,%
+     tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,%
+     javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,%
+     soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,%
+     addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,%
+     success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,%
+     src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator},
+   deletekeywords={default},%
+  }
+%    \end{macrocode}
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+% This is my first attempt to support XML. It is from 2000/07/18.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{XML}%
+  {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,%
+      IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,%
+      INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,%
+      PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by #
+      xml,xml:space,xml:lang,version,standalone,default,preserve},%
+   alsoother=$,%
+   alsoletter=:,%
+   tag=**[s]<>,%
+   morestring=[d]",% ??? doubled
+   morestring=[d]',% ??? doubled
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+      \lst@CArgX[CDATA[\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@tagmode
+               \expandafter\lst@BeginCDATA
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+      \lst@CArgX]]\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@GPmode
+               \expandafter\lst@EndComment
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+  }[keywords,comments,strings,html]%
+%    \end{macrocode}
+% And after receiving a bug report from \lsthelper{Michael~Niedermair}
+% {m.g.n@gmx.de}{2002/04/07}{undefined control sequence \lst@commentmode} I
+% converted the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
+%    \begin{macrocode}
+%</lang1>
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \ifmulticols
+% \addtocontents{toc}{\protect\end{multicols}}
+% \fi
+%
+%^^A \setcounter{IndexColumns}{2}
+%^^A \PrintIndex
+%
+%
+% \Finale
+%
+\endinput
Index: doc/LaTeXmacros/listings/lstdrvrs.ins
===================================================================
--- doc/LaTeXmacros/listings/lstdrvrs.ins	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstdrvrs.ins	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,61 @@
+%%
+%% This is file `lstdrvrs.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `install')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\input docstrip
+\preamble
+\endpreamble
+
+\ifToplevel{
+\usedir{tex/latex/listings}
+\keepsilent
+\askonceonly
+}
+
+\generate{
+    \file{lstlang1.sty}{\from{lstdrvrs.dtx}{lang1}}
+    \file{lstlang2.sty}{\from{lstdrvrs.dtx}{lang2}}
+    \file{lstlang3.sty}{\from{lstdrvrs.dtx}{lang3}}
+}
+
+\generate{
+    \file{listings-acm.prf}{\from{lstdrvrs.dtx}{acm-prf}}
+    \file{listings-bash.prf}{\from{lstdrvrs.dtx}{bash-prf}}
+    \file{listings-fortran.prf}{\from{lstdrvrs.dtx}{fortran-prf}}
+    \file{listings-lua.prf}{\from{lstdrvrs.dtx}{lua-prf}}
+    \file{listings-python.prf}{\from{lstdrvrs.dtx}{python-prf}}
+}
+
+\ifToplevel{
+\Msg{*}
+\Msg{* You probably need to move all created `.sty' and `.cfg'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{*}
+\Msg{* Run `lstdrvrs.dtx' through LaTeX2e to get the documentation.}
+\Msg{*}
+}
+
+\endbatchfile
+    [2015/06/04 1.6 listings language file]
+\endinput
+%%
+%% End of file `lstdrvrs.ins'.
Index: doc/LaTeXmacros/listings/lstlang1.sty
===================================================================
--- doc/LaTeXmacros/listings/lstlang1.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstlang1.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,1615 @@
+%%
+%% This is file `lstlang1.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `lang1')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{lstlang1.sty}
+    [2015/06/04 1.6 listings language file]
+%%
+%% ACSL definition (c) 2000 by Andreas Matthias
+%%
+\lst@definelanguage{ACSL}[90]{Fortran}%
+   {morekeywords={algorithm,cinterval,constant,derivative,discrete,%
+         dynamic,errtag,initial,interval,maxterval,minterval,%
+         merror,xerror,nsteps,procedural,save,schedule,sort,%
+         table,terminal,termt,variable},%
+    sensitive=false,%
+    morecomment=[l]!%
+   }[keywords, comments]%
+%%
+%% Ada 95 definition (c) Torsten Neuer
+%%
+%% Ada 2005 definition (c) 2006 Santiago Urue\~{n}a Pascual
+%%                              <Santiago.Uruena@upm.es>
+%%
+\lst@definelanguage[2005]{Ada}[95]{Ada}%
+  {morekeywords={interface,overriding,synchronized}}%
+\lst@definelanguage[95]{Ada}[83]{Ada}%
+  {morekeywords={abstract,aliased,protected,requeue,tagged,until}}%
+\lst@definelanguage[83]{Ada}%
+  {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,%
+      case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,%
+      exception,exit,for,function,generic,goto,if,in,is,limited,loop,%
+      mod,new,not,null,of,or,others,out,package,pragma,private,%
+      procedure,raise,range,record,rem,renames,return,reverse,select,%
+      separate,subtype,task,terminate,then,type,use,when,while,with,%
+      xor},%
+   sensitive=f,%
+   morecomment=[l]--,%
+   morestring=[m]",% percent not defined as stringizer so far
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%%
+%% awk definitions (c) Christoph Giess
+%%
+\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}%
+  {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,%
+      lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}%
+  }%
+\lst@definelanguage[POSIX]{Awk}%
+  {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,%
+      system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,%
+      index,length,match,split,sprintf,strtonum,sub,substr,tolower,%
+      toupper,if,while,do,for,break,continue,delete,exit,function,%
+      return},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%%
+%% Visual Basic definition (c) 2002 Robert Frank
+%%
+\lst@definelanguage[Visual]{Basic}
+  {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,%
+      CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,%
+      Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,%
+      DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,%
+      DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,%
+      Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,%
+      GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,%
+      IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,%
+      IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,%
+      IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,%
+      Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,%
+      NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,%
+      Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,%
+      Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,%
+      TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,%
+      VarType,Weekday,Year},% functions
+   morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,%
+      AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,%
+      AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,%
+      BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,%
+      CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,%
+      Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,%
+      ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,%
+      Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,%
+      CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,%
+      CreatePreparedStatement,CreatePropery,CreateQuery,%
+      CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,%
+      CreateWorkspace,Customize,Delete,DeleteColumnLabels,%
+      DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,%
+      EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,%
+      Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,%
+      FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,%
+      GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,%
+      GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,%
+      GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,%
+      HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,%
+      InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,%
+      KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,%
+      Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,%
+      LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,%
+      MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,%
+      NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,%
+      OnDisconnection,OnStartupComplete,Open,OpenConnection,%
+      OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,%
+      Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,%
+      PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,%
+      Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,%
+      rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,%
+      ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,%
+      Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,%
+      RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,%
+      ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,%
+      RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,%
+      SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,%
+      ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,%
+      SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,%
+      SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,%
+      ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,%
+      Span,SplitContaining,StartLabelEdit,StartLogging,Stop,%
+      Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,%
+      TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,%
+      Upto,WhatsThisMode,WriteProperty,ZOrder},% methods
+   morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,%
+      AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,%
+      AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,%
+      AfterWriteFile,AmbienChanged,ApplyChanges,Associate,%
+      AsyncReadComplete,AxisActivated,AxisLabelActivated,%
+      AxisLabelSelected,AxisLabelUpdated,AxisSelected,%
+      AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,%
+      AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,%
+      BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,%
+      BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,%
+      ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,%
+      ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,%
+      ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,%
+      ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,%
+      Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,%
+      DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,%
+      DevModeChange,Disconnect,DisplayChanged,Dissociate,%
+      DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,%
+      DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,%
+      Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,%
+      GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,%
+      ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,%
+      ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,%
+      LeaveCell,LegendActivated,LegendSelected,LegendUpdated,%
+      LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,%
+      MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,%
+      OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,%
+      OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,%
+      PanelDblClick,PathChange,PatternChange,PlotActivated,%
+      PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,%
+      PointLabelSelected,PointLabelUpdated,PointSelected,%
+      PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,%
+      PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,%
+      QueryTimeout,QueryUnload,ReadProperties,Reposition,%
+      RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,%
+      RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,%
+      SelChange,SelectionChanged,SendComplete,SendProgress,%
+      SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,%
+      SplitChange,StateChanged,StatusUpdate,SysColorsChanged,%
+      Terminate,TimeChanged,TitleActivated,TitleSelected,%
+      TitleActivated,UnboundAddData,UnboundDeleteRow,%
+      UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,%
+      Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,%
+      WillChangeData,WillDissociate,WillExecute,WillUpdateRows,%
+      WithEvents,WriteProperties},% VB-events
+   morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,%
+      Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,%
+      DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,%
+      Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,%
+      For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,%
+      Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,%
+      Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,%
+      Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,%
+      SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,%
+      With,Write},% statements
+   sensitive=false,%
+   keywordcomment=rem,%
+   MoreSelectCharTable=\def\lst@BeginKC@{% chmod
+      \lst@ResetToken
+      \lst@BeginComment\lst@GPmode{{\lst@commentstyle}%
+                       \lst@Lmodetrue\lst@modetrue}\@empty},%
+   morecomment=[l]{'},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   }[keywords,comments,strings,keywordcomments]
+\lst@definelanguage[11]{C++}[ISO]{C++}%
+  {morekeywords={alignas,alignof,char16_t,char32_t,constexpr,%
+      decltype,noexcept,nullptr,static_assert,thread_local},%
+  }%
+\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}%
+\lst@definelanguage[GNU]{C++}[ISO]{C++}%
+  {morekeywords={__attribute__,__extension__,__restrict,__restrict__,%
+      typeof,__typeof__},%
+  }%
+\lst@definelanguage[Visual]{C++}[ISO]{C++}%
+  {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,%
+      dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,%
+      __int32,__int64,naked,__stdcall,thread,__try,__leave},%
+  }%
+\lst@definelanguage[ISO]{C++}[ANSI]{C}%
+  {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,%
+      catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,%
+      false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,%
+      or_eq,private,protected,public,reinterpret_cast,static_cast,%
+      template,this,throw,true,try,typeid,type_info,typename,using,%
+      virtual,wchar_t,xor,xor_eq},%
+  }%
+%%
+%% Objective-C definition (c) 1997 Detlev Droege
+%%
+\lst@definelanguage[Objective]{C}[ANSI]{C}
+  {morekeywords={bycopy,id,in,inout,oneway,out,self,super,%
+      @class,@defs,@encode,@end,@implementation,@interface,@private,%
+      @protected,@protocol,@public,@selector},%
+   moredirectives={import}%
+  }%
+%%
+%% Handel-C definition, refer http://www.celoxica.com
+%%
+\lst@definelanguage[Handel]{C}[ANSI]{C}
+  {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,%
+      external_divide,family,ifselect,in,inline,interface,internal,%
+      internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,%
+      releasesema,reset,rom,select,sema,set,seq,shared,signal,try,%
+      reset,trysema,typeof,undefined,width,with,wom},%
+  }%
+\lst@definelanguage[ANSI]{C}%
+  {morekeywords={auto,break,case,char,const,continue,default,do,double,%
+      else,enum,extern,float,for,goto,if,int,long,register,return,%
+      short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
+      void,volatile,while},%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]",%
+   morestring=[b]',%
+   moredelim=*[directive]\#,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning}%
+  }[keywords,comments,strings,directives]%
+%%
+%% C-Sharp definition (c) 2002 Martin Brodbeck
+%%
+\lst@definelanguage[Sharp]{C}%
+  {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,%
+      class,const,continue,decimal,default,delegate,do,double,else,%
+      enum,event,explicit,extern,false,finally,fixed,float,for,foreach,%
+      goto,if,implicit,in,int,interface,internal,is,lock,long,%
+      namespace,new,null,object,operator,out,override,params,private,%
+      protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,%
+      static,string,struct,switch,this,throw,true,try,typeof,uint,%
+      ulong,unchecked,unsafe,ushort,using,virtual,void,while,%
+      as,volatile,stackalloc},% Kai K\"ohne
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,%
+   morestring=[b]"
+  }[keywords,comments,strings]%
+%%
+%% csh definition (c) 1998 Kai Below
+%%
+\lst@definelanguage{csh}
+  {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,%
+      foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,time,while,umask,unalias,%
+      unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% bash,sh definition (c) 2003 Riccardo Murri <riccardo.murri@gmx.it>
+%%
+\lst@definelanguage{bash}[]{sh}%
+  {morekeywords={alias,bg,bind,builtin,caller,command,compgen,compopt,%
+      complete,coproc,declare,disown,dirs,enable,fc,fg,help,history,%
+      jobs,let,local,logout,mapfile,printf,pushd,popd,readarray,select,%
+      set,suspend,shopt,source,times,type,typeset,ulimit,unalias,wait},%
+  }%
+\lst@definelanguage{sh}%
+  {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,elif,else,%
+      env,esac,eval,exec,exit,export,expr,false,fi,for,function,getopts,%
+      hash,history,if,in,kill,login,newgrp,nice,nohup,ps,pwd,read,%
+      readonly,return,set,sed,shift,test,then,times,trap,true,type,%
+      ulimit,umask,unset,until,wait,while},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage[08]{Fortran}[03]{Fortran}{%
+  morekeywords={ALL, BLOCK, CODIMENSION, CONCURRENT, CONTIGUOUS, CRITICAL,%
+    ERROR, LOCK, SUBMODULE, SYNC, UNLOCK},%
+    morekeywords=[3]{ACOSH,ASINH,ATANH,ATOMIC_DEFINE,ATOMIC_REF,BESSEL_J0,%
+      BESSEL_J1,BESSEL_JN,BESSEL_Y0,BESSEL_Y1,BESSEL_YN,BGE,BGT,BLE,BLT,%
+      C_SIZEOF,COMPILER_OPTIONS,COMPILER_VERSION,DSHIFTL,DSHIFTR,ERF,ERFC,%
+      ERFC_SCALED,EXECUTE_COMMAND_LINE,GAMMA,HYPOT,IALL,IANY,IMAGE_INDEX,%
+      IPARITY,LCOBOUND,LEADZ,LOG_GAMMA,MASKL,MASKR,MERGE_BITS,NORM2,%
+      NUM_IMAGES,PARITY,POPCNT,POPPAR,SHIFTA,SHIFTL,SHIFTR,STORAGE_SIZE,%
+      THIS_IMAGE,TRAILZ,UCOBOUND}%
+}%
+\lst@definelanguage[03]{Fortran}[95]{Fortran}{%
+  morekeywords={ABSTRACT, ASSOCIATE, ASYNCHRONOUS, BIND, CLASS, DEFERRED,%
+    ENUM, ENUMERATOR, EXTENDS, FINAL, FLUSH, GENERIC, IMPORT,%
+    NON_OVERRIDABLE, NOPASS, PASS, PROTECTED, VALUE, VOLATILE, WAIT},%
+    morekeywords=[2]{DECIMAL,ENCODING,IOMSG,ROUND},% corrected NML from NMT
+    morekeywords=[3]{C_ASSOCIATED,C_F_POINTER,C_F_PROCPOINTER,C_FUNLOC,%
+    C_LOC,COMMAND_ARGUMENT_COUNT,EXTENDS_TYPE_OF,GET_COMMAND,GET_COMMAND_ARGUMENT,%
+    GET_ENVIRONMENT_VARIABLE,IS_IOSTAT_END,MOVE_ALLOC,NEW_LINE,SAME_TYPE_AS,%
+    SELECTED_CHAR_KIND}%
+}%
+\lst@definelanguage[90]{Fortran}[95]{Fortran}{}
+\lst@definelanguage[95]{Fortran}[77]{Fortran}%
+  {deletekeywords=SAVE,%
+   morekeywords={ALLOCATABLE,ALLOCATE,ASSIGNMENT,CASE,%
+      CONTAINS,CYCLE,DEALLOCATE,DEFAULT,EXIT,INCLUDE,IN,NONE,%
+      OUT,INTENT,INTERFACE,MODULE,NAMELIST,%
+      NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,POINTER,PRIVATE,%
+      PUBLIC,RECURSIVE,RESULT,SELECT,SEQUENCE,%
+      TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,%
+      ENDBLOCKDATA,ENDFILE,ENDFUNCTION,ENDINTERFACE,%
+      ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,%
+      INOUT,SELECTCASE,%
+      ELEMENTAL, ELSEWHERE, FORALL, PURE},%
+    morekeywords=[2]{ACTION,ADVANCE,DELIM,IOLENGTH,LEN,NAME,%
+      NML,PAD,POSITION,READWRITE,SIZE,STAT},% corrected NML from NMT
+    morekeywords=[3]{ADJUSTL,ADJUSTR,ALL,ALLOCATED,ANY,ASSOCIATED,BIT_SIZE,%
+    BTEST,CEILING,COUNT,CPU_TIME,CSHIFT,DATE_AND_TIME,DIGITS,DOT_PRODUCT,%
+    EOSHIFT,EPSILON,EXPONENT,FLOOR,FRACTION,HUGE,IACHAR,IAND,IBCLR,
+    IBITS,IBSET,ICHAR,IEOR,IOR,ISHFT,ISHFTC,KIND,LBOUND,LEN_TRIM,% left out LOGICAL
+    MATMUL,MAXEXPONENT,MAXLOC,MAXVAL,MERGE,MINEXPONENT,MINLOC,MINVAL,%
+    MODULO,MVBITS,NEAREST,NOT,NULL,PACK,PRECISION,PRESENT,PRODUCT,%
+    RADIX,RANDOM_NUMBER,RANDOM_SEED,RANGE,RANK,REPEAT,RESHAPE,RRSPACING,%
+    SCALE,SCAN,SELECTED_INT_KIND,SELECTED_REAL_KIND,SET_EXPONENT,SHAPE,%
+    SINH,SIZE,SPACING,SPREAD,SUM,SYSTEM_CLOCK,TINY,TRANSFER,TRANSPOSE,%
+    TRIM,UBOUND,UNPACK,VERIFY},%
+   deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug
+   morecomment=[l]!%
+  }%
+\lst@definelanguage[77]{Fortran}%
+  {morekeywords={ASSIGN,BACKSPACE,CALL,CHARACTER,%
+      CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DO,DOUBLE,%
+      ELSE,ELSEIF,END,ENDIF,ENDDO,ENTRY,EQUIVALENCE,EXTERNAL,%
+      FILE,FORMAT,FUNCTION,GO,TO,GOTO,IF,IMPLICIT,%
+      INQUIRE,INTEGER,INTRINSIC,LOGICAL,%
+      OPEN,PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,%
+      RETURN,REWIND,STOP,SUBROUTINE,THEN,%
+      WRITE,SAVE},%
+    morekeywords=[2]{ACCESS,BLANK,BLOCK,DIRECT,EOF,ERR,EXIST,%
+      FMT,FORM,FORMATTED,IOSTAT,NAMED,NEXTREC,NUMBER,OPENED,%
+      REC,RECL,SEQUENTIAL,STATUS,TYPE,UNFORMATTED,UNIT},%
+    morekeywords=[3]{INT,DBLE,CMPLX,ICHAR,CHAR,AINT,ANINT,% left out real
+      NINT,ABS,MOD,SIGN,DIM,DPROD,MAX,MIN,AIMAG,CONJG,SQRT,EXP,LOG,%
+      LOG10,SIN,COS,TAN,ASIN,ACOS,ATAN,ATAN2,SINH,COSH,TANH,LGE,LLE,LLT,%
+      LEN,INDEX},%
+    morekeywords=[4]{AND,EQ,EQV,FALSE,GE,GT,OR,LE,LT,NE,NEQV,NOT,TRUE},%
+   sensitive=f,%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morecomment=[f]*,%
+   morecomment=[f]C,%
+   morecomment=[f]c,%
+   morestring=[d]",%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage{HTML}%
+  {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,%
+      BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,%
+      COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,%
+      FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,%
+      INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,%
+      NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,%
+      OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,%
+      SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,%
+      VAR,XMP,%
+      accesskey,action,align,alink,alt,archive,axis,background,bgcolor,%
+      border,cellpadding,cellspacing,charset,checked,cite,class,classid,%
+      code,codebase,codetype,color,cols,colspan,content,coords,data,%
+      datetime,defer,disabled,dir,event,error,for,frameborder,headers,%
+      height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,%
+      longdesc,marginwidth,marginheight,maxlength,media,method,multiple,%
+      name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,%
+      ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,%
+      profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,%
+      onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,%
+      selected,shape,size,src,standby,style,tabindex,text,title,type,%
+      units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},%
+   tag=**[s]<>,%
+   sensitive=f,%
+   morestring=[d]",% ??? doubled
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+  }[keywords,comments,strings,html]%
+%%
+%% AspectJ definition (c) Robert Wenner
+%%
+\lst@definelanguage[AspectJ]{Java}[]{Java}%
+  {morekeywords={%
+      adviceexecution,after,args,around,aspect,aspectOf,before,%
+      call,cflow,cflowbelow,%
+      execution,get,handler,if,initialization,issingleton,pointcut,%
+      percflow,percflowbelow,perthis,pertarget,preinitialization,%
+      privileged,proceed,returning,set,staticinitialization,strictfp,%
+      target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,%
+      within,withincode},%
+   MoreSelectCharTable=%
+     \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}%
+     \ifx\lst@derefinstalled\@empty\else
+        \global\let\lst@derefinstalled\@empty
+\lst@AddToHook{Output}%
+{\lst@ifkeywords
+    \ifx\lst@derefop\@empty
+       \global\let\lst@derefop\relax
+       \ifx\lst@thestyle\lst@gkeywords@sty
+          \ifx\lst@currstyle\relax
+             \let\lst@thestyle\lst@identifierstyle
+          \else
+             \let\lst@thestyle\lst@currstyle
+          \fi
+       \fi
+    \fi
+ \fi}
+\lst@AddToHook{BOL}{\global\let\lst@derefop\relax}%
+\lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}%
+     \fi
+  }%
+\lst@definelanguage{Java}%
+  {morekeywords={abstract,boolean,break,byte,case,catch,char,class,%
+      const,continue,default,do,double,else,extends,false,final,%
+      finally,float,for,goto,if,implements,import,instanceof,int,%
+      interface,label,long,native,new,null,package,private,protected,%
+      public,return,short,static,super,switch,synchronized,this,throw,%
+      throws,transient,true,try,void,volatile,while},%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%%
+%% ByteCodeJava definition (c) 2004 Martine Gautier
+%%
+\lst@definelanguage{JVMIS}%
+  {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,%
+      aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,%
+      astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,%
+      castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,%
+      dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,%
+      dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,%
+      dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,%
+      f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,%
+      fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,%
+      fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,%
+      fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,%
+      iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,%
+      iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,%
+      if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,%
+      ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,%
+      iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,%
+      invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,%
+      istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,%
+      l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,%
+      ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,%
+      lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,%
+      lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,%
+      monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,%
+      pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,%
+      tableswitch,wide,limit,locals,stack},%
+  }[keywords]%
+\lst@definelanguage{Matlab}%
+  {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},%
+   sensitive,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage[5.2]{Mathematica}[3.0]{Mathematica}%%
+  {morekeywords={Above,AbsoluteOptions,AbsoluteTiming,AccountingForm,%
+      AccuracyGoal,Active,ActiveItem,AddOnHelpPath,%
+      AdjustmentBox,AdjustmentBoxOptions,After,AiryAiPrime,%
+      AlgebraicRulesData,Algebraics,Alias,AlignmentMarker,%
+      AllowInlineCells,AllowScriptLevelChange,Analytic,AnimationCycleOffset,%
+      AnimationCycleRepetitions,AnimationDirection,AnimationDisplayTime,ApartSquareFree,%
+      AppellF1,ArgumentCountQ,ArrayDepth,ArrayPlot,%
+      ArrayQ,ArrayRules,AspectRatioFixed,Assuming,%
+      Assumptions,AutoDelete,AutoEvaluateEvents,AutoGeneratedPackage,%
+      AutoIndent,AutoIndentSpacings,AutoItalicWords,AutoloadPath,%
+      AutoOpenNotebooks,AutoOpenPalettes,AutoScroll,AutoSpacing,%
+      AutoStyleOptions,Axis,BackgroundTasksSettings,Backsubstitution,%
+      Backward,Baseline,Before,BeginDialogPacket,%
+      BeginFrontEndInteractionPacket,Below,BezoutMatrix,BinaryFormat,%
+      BinaryGet,BinaryRead,BinaryReadList,BinaryWrite,%
+      BitAnd,BitNot,BitOr,BitXor,%
+      Black,BlankForm,Blue,Boole,%
+      Booleans,Bottom,Bounds,Box,%
+      BoxBaselineShift,BoxData,BoxDimensions,BoxFormFormatTypes,%
+      BoxFrame,BoxMargins,BoxRegion,Brown,%
+      Buchberger,Button,ButtonBox,ButtonBoxOptions,%
+      ButtonCell,ButtonContents,ButtonData,ButtonEvaluator,%
+      ButtonExpandable,ButtonFrame,ButtonFunction,ButtonMargins,%
+      ButtonMinHeight,ButtonNote,ButtonNotebook,ButtonSource,%
+      ButtonStyle,ButtonStyleMenuListing,ByteOrdering,CallPacket,%
+      CarmichaelLambda,Cell,CellAutoOverwrite,CellBaseline,%
+      CellBoundingBox,CellBracketOptions,CellContents,CellDingbat,%
+      CellEditDuplicate,CellElementsBoundingBox,CellElementSpacings,CellEvaluationDuplicate,%
+      CellFrame,CellFrameColor,CellFrameLabelMargins,CellFrameLabels,%
+      CellFrameMargins,CellGroup,CellGroupData,CellGrouping,%
+      CellGroupingRules,CellHorizontalScrolling,CellLabel,CellLabelAutoDelete,%
+      CellLabelMargins,CellLabelPositioning,CellMargins,CellObject,%
+      CellOpen,CellPasswords,CellPrint,CellSize,%
+      CellStyle,CellTags,CellularAutomaton,Center,%
+      CharacterEncoding,CharacterEncodingsPath,CharacteristicPolynomial,CharacterRange,%
+      CheckAll,CholeskyDecomposition,Clip,ClipboardNotebook,%
+      Closed,ClosingAutoSave,CoefficientArrays,CoefficientDomain,%
+      CofactorExpansion,ColonForm,ColorFunctionScaling,ColorRules,%
+      ColorSelectorSettings,Column,ColumnAlignments,ColumnLines,%
+      ColumnsEqual,ColumnSpacings,ColumnWidths,CommonDefaultFormatTypes,%
+      CompileOptimizations,CompletionsListPacket,Complexes,ComplexityFunction,%
+      Compose,ComposeSeries,ConfigurationPath,ConjugateTranspose,%
+      Connect,ConsoleMessage,ConsoleMessagePacket,ConsolePrint,%
+      ContentsBoundingBox,ContextToFileName,ContinuedFraction,ConversionOptions,%
+      ConversionRules,ConvertToBitmapPacket,ConvertToPostScript,ConvertToPostScriptPacket,%
+      Copyable,CoshIntegral,CounterAssignments,CounterBox,%
+      CounterBoxOptions,CounterEvaluator,CounterFunction,CounterIncrements,%
+      CounterStyle,CounterStyleMenuListing,CreatePalettePacket,Cross,%
+      CurrentlySpeakingPacket,Cyan,CylindricalDecomposition,DampingFactor,%
+      DataRange,Debug,DebugTag,Decimal,%
+      DedekindEta,DefaultDuplicateCellStyle,DefaultFontProperties,DefaultFormatType,%
+      DefaultFormatTypeForStyle,DefaultInlineFormatType,DefaultInputFormatType,
+      DefaultNaturalLanguage,%
+      DefaultNewCellStyle,DefaultNewInlineCellStyle,DefaultNotebook,DefaultOutputFormatType,%
+      DefaultStyleDefinitions,DefaultTextFormatType,DefaultTextInlineFormatType,DefaultValues,%
+      DefineExternal,DegreeLexicographic,DegreeReverseLexicographic,Deletable,%
+      DeleteContents,DeletionWarning,DelimiterFlashTime,DelimiterMatching,%
+      Delimiters,DependentVariables,DiacriticalPositioning,DialogLevel,%
+      DifferenceOrder,DigitCharacter,DigitCount,DiracDelta,%
+      Direction,DirectoryName,DisableConsolePrintPacket,DiscreteDelta,%
+      DisplayAnimation,DisplayEndPacket,DisplayFlushImagePacket,DisplayForm,%
+      DisplayPacket,DisplayRules,DisplaySetSizePacket,DisplayString,%
+      DivisionFreeRowReduction,DOSTextFormat,DoubleExponential,DoublyInfinite,%
+      Down,DragAndDrop,DrawHighlighted,DualLinearProgramming,%
+      DumpGet,DumpSave,Edit,Editable,%
+      EditButtonSettings,EditCellTagsSettings,EditDefinition,EditIn,%
+      Element,EliminationOrder,EllipticExpPrime,EllipticNomeQ,%
+      EllipticReducedHalfPeriods,EllipticThetaPrime,Empty,EnableConsolePrintPacket,%
+      Encoding,EndAdd,EndDialogPacket,EndFrontEndInteractionPacket,%
+      EndOfLine,EndOfString,Enter,EnterExpressionPacket,%
+      EnterTextPacket,EqualColumns,EqualRows,EquatedTo,%
+      Erfi,ErrorBox,ErrorBoxOptions,ErrorNorm,%
+      ErrorPacket,ErrorsDialogSettings,Evaluatable,EvaluatePacket,%
+      EvaluationCell,EvaluationCompletionAction,EvaluationMonitor,EvaluationNotebook,%
+      Evaluator,EvaluatorNames,EventEvaluator,ExactNumberQ,%
+      ExactRootIsolation,Except,ExcludedForms,Exists,%
+      ExitDialog,ExponentPosition,ExponentStep,Export,%
+      ExportAutoReplacements,ExportPacket,ExportString,ExpressionPacket,%
+      ExpToTrig,Extension,ExternalCall,ExternalDataCharacterEncoding,%
+      Extract,Fail,FEDisableConsolePrintPacket,FEEnableConsolePrintPacket,%
+      Fibonacci,File,FileFormat,FileInformation,%
+      FileName,FileNameDialogSettings,FindFit,FindInstance,%
+      FindMaximum,FindSettings,FitAll,FlushPrintOutputPacket,%
+      Font,FontColor,FontFamily,FontName,%
+      FontPostScriptName,FontProperties,FontReencoding,FontSize,%
+      FontSlant,FontSubstitutions,FontTracking,FontVariations,%
+      FontWeight,ForAll,FormatRules,FormatTypeAutoConvert,%
+      FormatValues,FormBox,FormBoxOptions,Forward,%
+      ForwardBackward,FourierCosTransform,FourierParameters,FourierSinTransform,%
+      FourierTransform,FractionalPart,FractionBox,FractionBoxOptions,%
+      FractionLine,FrameBox,FrameBoxOptions,FresnelC,%
+      FresnelS,FromContinuedFraction,FromDigits,FrontEndExecute,%
+      FrontEndObject,FrontEndStackSize,FrontEndToken,FrontEndTokenExecute,%
+      FrontEndVersion,Full,FullAxes,FullSimplify,%
+      FunctionExpand,FunctionInterpolation,GaussKronrod,GaussPoints,%
+      GenerateBitmapCaches,GenerateConditions,GeneratedCell,GeneratedParameters,%
+      Generic,GetBoundingBoxSizePacket,GetContext,GetFileName,%
+      GetFrontEndOptionsDataPacket,GetLinebreakInformationPacket,%
+      GetMenusPacket,GetPageBreakInformationPacket,%
+      Glaisher,GlobalPreferences,GlobalSession,Gradient,%
+      GraphicsData,GraphicsGrouping,Gray,Green,%
+      Grid,GridBaseline,GridBox,GridBoxOptions,%
+      GridCreationSettings,GridDefaultElement,GridFrame,GridFrameMargins,%
+      GroupPageBreakWithin,HarmonicNumber,Hash,HashTable,%
+      HeadCompose,HelpBrowserLookup,HelpBrowserNotebook,HelpBrowserSettings,%
+      HessenbergDecomposition,Hessian,HoldAllComplete,HoldComplete,%
+      HoldPattern,Horizontal,HorizontalForm,HorizontalScrollPosition,%
+      HTMLSave,Hypergeometric0F1Regularized,Hypergeometric1F1Regularized,%
+      Hypergeometric2F1Regularized,%
+      HypergeometricPFQ,HypergeometricPFQRegularized,HyperlinkCreationSettings,Hyphenation,%
+      HyphenationOptions,IgnoreCase,ImageCache,ImageCacheValid,%
+      ImageMargins,ImageOffset,ImageRangeCache,ImageRegion,%
+      ImageResolution,ImageRotated,ImageSize,Import,%
+      ImportAutoReplacements,ImportString,IncludeFileExtension,IncludeSingularTerm,%
+      IndentingNewlineSpacings,IndentMaxFraction,IndexCreationOptions,Inequality,%
+      InexactNumberQ,InexactNumbers,Inherited,InitializationCell,%
+      InitializationCellEvaluation,InitializationCellWarning,%
+      InlineCounterAssignments,InlineCounterIncrements,%
+      InlineRules,InputAliases,InputAutoFormat,InputAutoReplacements,%
+      InputGrouping,InputNamePacket,InputNotebook,InputPacket,%
+      InputSettings,InputStringPacket,InputToBoxFormPacket,InputToInputForm,%
+      InputToStandardForm,InsertionPointObject,IntegerExponent,IntegerPart,%
+      Integers,Interactive,Interlaced,InterpolationOrder,%
+      InterpolationPoints,InterpolationPrecision,InterpretationBox,%
+      InterpretationBoxOptions,%
+      InterpretTemplate,InterruptSettings,Interval,IntervalIntersection,%
+      IntervalMemberQ,IntervalUnion,InverseBetaRegularized,InverseEllipticNomeQ,%
+      InverseErf,InverseErfc,InverseFourierCosTransform,
+      InverseFourierSinTransform,%
+      InverseFourierTransform,InverseGammaRegularized,InverseJacobiCD,%
+      InverseJacobiCN,%
+      InverseJacobiCS,InverseJacobiDC,InverseJacobiDN,InverseJacobiDS,%
+      InverseJacobiNC,InverseJacobiND,InverseJacobiNS,InverseJacobiSC,%
+      InverseJacobiSD,InverseLaplaceTransform,InverseWeierstrassP,InverseZTransform,%
+      Jacobian,JacobiCD,JacobiCN,JacobiCS,%
+      JacobiDC,JacobiDN,JacobiDS,JacobiNC,%
+      JacobiND,JacobiNS,JacobiSC,JacobiSD,%
+      JordanDecomposition,K,Khinchin,KleinInvariantJ,%
+      KroneckerDelta,Language,LanguageCategory,LaplaceTransform,%
+      Larger,Launch,LayoutInformation,Left,%
+      LetterCharacter,Lexicographic,LicenseID,LimitsPositioning,%
+      LimitsPositioningTokens,LinearSolveFunction,LinebreakAdjustments,LineBreakWithin,%
+      LineForm,LineIndent,LineSpacing,LineWrapParts,%
+      LinkActivate,LinkClose,LinkConnect,LinkConnectedQ,%
+      LinkCreate,LinkError,LinkFlush,LinkHost,%
+      LinkInterrupt,LinkLaunch,LinkMode,LinkObject,%
+      LinkOpen,LinkOptions,LinkPatterns,LinkProtocol,%
+      LinkRead,LinkReadHeld,LinkReadyQ,Links,%
+      LinkWrite,LinkWriteHeld,ListConvolve,ListCorrelate,%
+      Listen,ListInterpolation,ListQ,LiteralSearch,%
+      LongestMatch,LongForm,Loopback,LUBackSubstitution,%
+      LUDecomposition,MachineID,MachineName,MachinePrecision,%
+      MacintoshSystemPageSetup,Magenta,Magnification,MakeBoxes,%
+      MakeExpression,MakeRules,Manual,MatchLocalNameQ,%
+      MathematicaNotation,MathieuC,MathieuCharacteristicA,MathieuCharacteristicB,%
+      MathieuCharacteristicExponent,MathieuCPrime,MathieuS,MathieuSPrime,%
+      MathMLForm,MathMLText,MatrixRank,Maximize,%
+      MaxIterations,MaxPlotPoints,MaxPoints,MaxRecursion,%
+      MaxStepFraction,MaxSteps,MaxStepSize,Mean,%
+      Median,MeijerG,MenuPacket,MessageOptions,%
+      MessagePacket,MessagesNotebook,MetaCharacters,Method,%
+      MethodOptions,Minimize,MinRecursion,MinSize,%
+      Mode,ModularLambda,MonomialOrder,MonteCarlo,%
+      Most,MousePointerNote,MultiDimensional,MultilaunchWarning,%
+      MultilineFunction,MultiplicativeOrder,Multiplicity,Nand,%
+      NeedCurrentFrontEndPackagePacket,NeedCurrentFrontEndSymbolsPacket,%
+      NestedScriptRules,NestWhile,%
+      NestWhileList,NevilleThetaC,NevilleThetaD,NevilleThetaN,%
+      NevilleThetaS,Newton,Next,NHoldAll,%
+      NHoldFirst,NHoldRest,NMaximize,NMinimize,%
+      NonAssociative,NonPositive,Nor,Norm,%
+      NormalGrouping,NormalSelection,NormFunction,Notebook,%
+      NotebookApply,NotebookAutoSave,NotebookClose,NotebookConvert,%
+      NotebookConvertSettings,NotebookCreate,NotebookCreateReturnObject,NotebookDefault,%
+      NotebookDelete,NotebookDirectory,NotebookFind,NotebookFindReturnObject,%
+      NotebookGet,NotebookGetLayoutInformationPacket,NotebookGetMisspellingsPacket,%
+      NotebookInformation,%
+      NotebookLocate,NotebookObject,NotebookOpen,NotebookOpenReturnObject,%
+      NotebookPath,NotebookPrint,NotebookPut,NotebookPutReturnObject,%
+      NotebookRead,NotebookResetGeneratedCells,Notebooks,NotebookSave,%
+      NotebookSaveAs,NotebookSelection,NotebookSetupLayoutInformationPacket,%
+      NotebooksMenu,%
+      NotebookWrite,NotElement,NProductExtraFactors,NProductFactors,%
+      NRoots,NSumExtraTerms,NSumTerms,NumberMarks,%
+      NumberMultiplier,NumberString,NumericFunction,NumericQ,%
+      NValues,Offset,OLEData,OneStepRowReduction,%
+      Open,OpenFunctionInspectorPacket,OpenSpecialOptions,OptimizationLevel,%
+      OptionInspectorSettings,OptionQ,OptionsPacket,OptionValueBox,%
+      OptionValueBoxOptions,Orange,Ordering,Oscillatory,%
+      OutputAutoOverwrite,OutputFormData,OutputGrouping,OutputMathEditExpression,%
+      OutputNamePacket,OutputToOutputForm,OutputToStandardForm,Over,%
+      Overflow,Overlaps,Overscript,OverscriptBox,%
+      OverscriptBoxOptions,OwnValues,PadLeft,PadRight,%
+      PageBreakAbove,PageBreakBelow,PageBreakWithin,PageFooterLines,%
+      PageFooters,PageHeaderLines,PageHeaders,PalettePath,%
+      PaperWidth,ParagraphIndent,ParagraphSpacing,ParameterVariables,%
+      ParentConnect,ParentForm,Parenthesize,PasteBoxFormInlineCells,%
+      Path,PatternTest,PeriodicInterpolation,Pick,%
+      Piecewise,PiecewiseExpand,Pink,Pivoting,%
+      PixelConstrained,Placeholder,Plain,Plot3Matrix,%
+      PointForm,PolynomialForm,PolynomialReduce,Polynomials,%
+      PowerModList,Precedence,PreferencesPath,PreserveStyleSheet,%
+      Previous,PrimaryPlaceholder,Primes,PrincipalValue,%
+      PrintAction,PrintingCopies,PrintingOptions,PrintingPageRange,%
+      PrintingStartingPageNumber,PrintingStyleEnvironment,PrintPrecision,%
+      PrivateCellOptions,%
+      PrivateEvaluationOptions,PrivateFontOptions,PrivateNotebookOptions,PrivatePaths,%
+      ProductLog,PromptForm,Purple,Quantile,%
+      QuasiMonteCarlo,QuasiNewton,RadicalBox,RadicalBoxOptions,%
+      RandomSeed,RationalFunctions,Rationals,RawData,%
+      RawMedium,RealBlockForm,Reals,Reap,%
+      Red,Refine,Refresh,RegularExpression,%
+      Reinstall,Release,Removed,RenderingOptions,%
+      RepeatedString,ReplaceList,Rescale,ResetMenusPacket,%
+      Resolve,ResumePacket,ReturnExpressionPacket,ReturnInputFormPacket,%
+      ReturnPacket,ReturnTextPacket,Right,Root,%
+      RootReduce,RootSum,Row,RowAlignments,%
+      RowBox,RowLines,RowMinHeight,RowsEqual,%
+      RowSpacings,RSolve,RuleCondition,RuleForm,%
+      RulerUnits,Saveable,SaveAutoDelete,ScreenRectangle,%
+      ScreenStyleEnvironment,ScriptBaselineShifts,ScriptLevel,ScriptMinSize,%
+      ScriptRules,ScriptSizeMultipliers,ScrollingOptions,ScrollPosition,%
+      Second,SectionGrouping,Selectable,SelectedNotebook,%
+      Selection,SelectionAnimate,SelectionCell,SelectionCellCreateCell,%
+      SelectionCellDefaultStyle,SelectionCellParentStyle,SelectionCreateCell,%
+      SelectionDuplicateCell,%
+      SelectionEvaluate,SelectionEvaluateCreateCell,SelectionMove,SelectionSetStyle,%
+      SelectionStrategy,SendFontInformationToKernel,SequenceHold,SequenceLimit,%
+      SeriesCoefficient,SetBoxFormNamesPacket,SetEvaluationNotebook,%
+      SetFileLoadingContext,%
+      SetNotebookStatusLine,SetOptionsPacket,SetSelectedNotebook,%
+      SetSpeechParametersPacket,%
+      SetValue,ShortestMatch,ShowAutoStyles,ShowCellBracket,%
+      ShowCellLabel,ShowCellTags,ShowClosedCellArea,ShowContents,%
+      ShowCursorTracker,ShowGroupOpenCloseIcon,ShowPageBreaks,ShowSelection,%
+      ShowShortBoxForm,ShowSpecialCharacters,ShowStringCharacters,%
+      ShrinkWrapBoundingBox,%
+      SingleLetterItalics,SingularityDepth,SingularValueDecomposition,%
+      SingularValueList,%
+      SinhIntegral,Smaller,Socket,SolveDelayed,%
+      SoundAndGraphics,Sow,Space,SpaceForm,%
+      SpanAdjustments,SpanCharacterRounding,SpanLineThickness,SpanMaxSize,%
+      SpanMinSize,SpanningCharacters,SpanSymmetric,Sparse,%
+      SparseArray,SpeakTextPacket,SpellingDictionaries,SpellingDictionariesPath,%
+      SpellingOptions,SpellingSuggestionsPacket,Spherical,Split,%
+      SqrtBox,SqrtBoxOptions,StandardDeviation,StandardForm,%
+      StartingStepSize,StartOfLine,StartOfString,StartupSound,%
+      StepMonitor,StieltjesGamma,StoppingTest,StringCases,%
+      StringCount,StringExpression,StringFreeQ,StringQ,%
+      StringReplaceList,StringReplacePart,StringSplit,StripBoxes,%
+      StripWrapperBoxes,StructuredSelection,StruveH,StruveL,%
+      StyleBox,StyleBoxAutoDelete,StyleBoxOptions,StyleData,%
+      StyleDefinitions,StyleForm,StyleMenuListing,StyleNameDialogSettings,%
+      StylePrint,StyleSheetPath,Subresultants,SubscriptBox,%
+      SubscriptBoxOptions,Subsets,Subsuperscript,SubsuperscriptBox,%
+      SubsuperscriptBoxOptions,SubtractFrom,SubValues,SugarCube,%
+      SuperscriptBox,SuperscriptBoxOptions,SuspendPacket,SylvesterMatrix,%
+      SymbolName,Syntax,SyntaxForm,SyntaxPacket,%
+      SystemException,SystemHelpPath,SystemStub,Tab,%
+      TabFilling,TabSpacings,TagBox,TagBoxOptions,%
+      TaggingRules,TagStyle,TargetFunctions,TemporaryVariable,%
+      TensorQ,TeXSave,TextAlignment,TextBoundingBox,%
+      TextData,TextJustification,TextLine,TextPacket,%
+      TextParagraph,TextRendering,TextStyle,ThisLink,%
+      TimeConstraint,TimeVariable,TitleGrouping,ToBoxes,%
+      ToColor,ToFileName,Toggle,ToggleFalse,%
+      Tolerance,TooBig,Top,ToRadicals,%
+      Total,Tr,TraceAction,TraceInternal,%
+      TraceLevel,TraditionalForm,TraditionalFunctionNotation,TraditionalNotation,%
+      TraditionalOrder,TransformationFunctions,TransparentColor,Trapezoidal,%
+      TrigExpand,TrigFactor,TrigFactorList,TrigReduce,%
+      TrigToExp,Tuples,UnAlias,Underflow,%
+      Underoverscript,UnderoverscriptBox,UnderoverscriptBoxOptions,Underscript,%
+      UnderscriptBox,UnderscriptBoxOptions,UndocumentedTestFEParserPacket,%
+      UndocumentedTestGetSelectionPacket,%
+      UnitStep,Up,URL,Using,%
+      V2Get,Value,ValueBox,ValueBoxOptions,%
+      ValueForm,Variance,Verbatim,Verbose,%
+      VerboseConvertToPostScriptPacket,VerifyConvergence,VerifySolutions,Version,%
+      VersionNumber,Vertical,VerticalForm,ViewPointSelectorSettings,%
+      Visible,VisibleCell,WeierstrassHalfPeriods,WeierstrassInvariants,%
+      WeierstrassSigma,WeierstrassZeta,White,Whitespace,%
+      WhitespaceCharacter,WindowClickSelect,WindowElements,WindowFloating,%
+      WindowFrame,WindowFrameElements,WindowMargins,WindowMovable,%
+      WindowSize,WindowTitle,WindowToolbars,WindowWidth,%
+      WordBoundary,WordCharacter,WynnDegree,XMLElement},%
+   morendkeywords={$,$AddOnsDirectory,$AnimationDisplayFunction,%
+      $AnimationFunction,%
+      $Assumptions,$BaseDirectory,$BoxForms,$ByteOrdering,%
+      $CharacterEncoding,$ConditionHold,$CurrentLink,$DefaultPath,%
+      $ExportEncodings,$ExportFormats,$FormatType,$FrontEnd,%
+      $HistoryLength,$HomeDirectory,$ImportEncodings,$ImportFormats,%
+      $InitialDirectory,$InstallationDate,$InstallationDirectory,%
+      $InterfaceEnvironment,%
+      $LaunchDirectory,$LicenseExpirationDate,$LicenseID,$LicenseProcesses,%
+      $LicenseServer,$MachineDomain,$MaxExtraPrecision,$MaxLicenseProcesses,%
+      $MaxNumber,$MaxPiecewiseCases,$MaxPrecision,$MaxRootDegree,%
+      $MinNumber,$MinPrecision,$NetworkLicense,$NumberMarks,%
+      $Off,$OutputForms,$ParentLink,$ParentProcessID,%
+      $PasswordFile,$PathnameSeparator,$PreferencesDirectory,$PrintForms,%
+      $PrintLiteral,$ProcessID,$ProcessorType,$ProductInformation,%
+      $ProgramName,$PSDirectDisplay,$RandomState,$RasterFunction,%
+      $RootDirectory,$SetParentLink,$SoundDisplay,$SuppressInputFormHeads,%
+      $SystemCharacterEncoding,$SystemID,$TemporaryPrefix,$TextStyle,%
+      $TopDirectory,$TraceOff,$TraceOn,$TracePattern,%
+      $TracePostAction,$TracePreAction,$UserAddOnsDirectory,$UserBaseDirectory,%
+      $UserName,Constant,Flat,HoldAll,%
+      HoldAllComplete,HoldFirst,HoldRest,Listable,%
+      Locked,NHoldAll,NHoldFirst,NHoldRest,%
+      NumericFunction,OneIdentity,Orderless,Protected,%
+      ReadProtected,SequenceHold},%
+  }%
+%%
+%% Mathematica definitions (c) 1999 Michael Wiese
+%%
+\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}%
+  {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,%
+      AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,%
+      AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,%
+      AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,%
+      Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,%
+      Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,%
+      ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,%
+      ContourLines,Contours,ContourShading,ContourSmoothing,%
+      ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,%
+      Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,%
+      DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,%
+      DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,%
+      Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,%
+      ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,%
+      FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,%
+      Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,%
+      FromDate,FullGraphics,FullOptions,GammaRegularized,%
+      GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,%
+      GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,%
+      InputStream,Install,InString,IntegerDigits,InterpolatingFunction,%
+      InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,%
+      InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,%
+      LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,%
+      MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,%
+      MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,%
+      NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,%
+      PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,%
+      PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,%
+      PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,%
+      QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,%
+      RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,%
+      ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,%
+      RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,%
+      SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,%
+      SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,%
+      SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,%
+      SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,%
+      SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,%
+      StreamPosition,Streams,StringByteCount,StringConversion,%
+      StringDrop,StringInsert,StringPosition,StringReplace,%
+      StringReverse,StringTake,StringToStream,SurfaceColor,%
+      SyntaxLength,SyntaxQ,TableAlignments,TableDepth,%
+      TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,%
+      TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,%
+      ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,%
+      TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,%
+      TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,%
+      UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,%
+      WordSearch,WordSeparators},%
+   morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,%
+      $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,%
+      $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,%
+      $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,%
+      $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,%
+      $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,%
+      $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,%
+      $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,%
+      $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,%
+      $VersionNumber}%
+  }%
+\lst@definelanguage[1.0]{Mathematica}%
+  {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,%
+      AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,%
+      ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,%
+      ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,%
+      AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,%
+      BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,%
+      BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,%
+      ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,%
+      ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,%
+      ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,%
+      Complement,Complex,CompoundExpression,Condition,Conjugate,%
+      Constants,Context,Continuation,Continue,ContourGraphics,%
+      ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,%
+      D,Dashing,Decompose,Decrement,Default,Definition,Denominator,%
+      DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,%
+      DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,%
+      Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,%
+      Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,%
+      EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,%
+      EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,%
+      Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,%
+      ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,%
+      Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,%
+      Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,%
+      FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,%
+      FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,%
+      FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,%
+      Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,%
+      Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,%
+      HiddenSurface,Hold,HoldForm,Hypergeometric0F1,Hypergeometric1F1,%
+      Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,%
+      Implies,In,Increment,Indent,Infix,Information,Inner,Input,%
+      InputForm,InputString,Insert,Integer,IntegerQ,Integrate,%
+      Intersection,Inverse,InverseFourier,InverseJacobiSN,%
+      InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,%
+      Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,%
+      LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,%
+      Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,%
+      ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,%
+      LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,%
+      MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,%
+      MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,%
+      Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,%
+      NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,%
+      NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,%
+      NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,%
+      NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,%
+      OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,%
+      OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,%
+      ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,%
+      PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,%
+      PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,%
+      Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,%
+      PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,%
+      Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,%
+      PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,%
+      Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,%
+      Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,%
+      Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,%
+      Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,%
+      RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,%
+      RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,%
+      Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,%
+      SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,%
+      Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,%
+      Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,%
+      SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,%
+      StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,%
+      StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,%
+      Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,%
+      TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,%
+      Text,TextForm,Thickness,Thread,Through,Throw,Ticks,%
+      TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,%
+      ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,%
+      Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,%
+      ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,%
+      WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,%
+      Xor,ZeroTest,Zeta},%
+   morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,%
+      Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,%
+      HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,%
+      Modular,None,Null,OneIdentity,Orderless,Pi,Protected,%
+      ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,%
+      $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,%
+      $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,%
+      $Urgent,$Version},%
+   sensitive,%
+   morecomment=[s]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% Octave definition (c) 2001,2002 Ulrich G. Wortmann
+%%
+\lst@definelanguage{Octave}%
+  {morekeywords={gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,%
+      zlabel,zoom,endwhile,endfunction,printf,case,switch,otherwise,%
+      system,lsode,endfor,error,ones,oneplot,__gnuplot_set__,do,until},%
+   sensitive=t,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[l]\%,%
+   morestring=[m]',%
+   morestring=[m]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal}
+  {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan
+   morekeywords={dynamic,external,forward,global,module,nil,operator,%
+      priority,sum,type,use,dispose,mark,page,release,cimatrix,%
+      cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,%
+      interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,%
+      eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,%
+      ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}%
+  }%
+\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal}
+  {morekeywords={asm,constructor,destructor,implementation,inline,%
+      interface,nil,object,shl,shr,string,unit,uses,xor},%
+   morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,%
+      DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,%
+      Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,%
+      GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,%
+      GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,%
+      GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,%
+      InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,%
+      MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,%
+      ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,%
+      Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,%
+      Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,%
+      Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,%
+      Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,%
+      Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,%
+      Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,%
+      FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,%
+      GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,%
+      GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,%
+      GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,%
+      GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,%
+      InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,%
+      MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,%
+      OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,%
+      PutImage,PutPixel,Randomize,Rectangle,Release,Rename,%
+      RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,%
+      SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,%
+      SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,%
+      SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,%
+      SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,%
+      SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,%
+      SwapVectors,TextBackground,TextColor,TextMode,Truncate,%
+      UnpackTime,Val,Window}%
+  }%
+\lst@definelanguage[Standard]{Pascal}%
+  {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+      do,downto,else,end,false,file,for,function,get,goto,if,in,%
+      integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+      put,procedure,read,readln,real,record,repeat,reset,rewrite,set,%
+      text,then,to,true,type,unpack,until,var,while,with,write,%
+      writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Perl}%
+  {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,%
+      chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,%
+      continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,%
+      each,else,elsif,endgrent,endhostent,endnetent,endprotoent,%
+      endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,%
+      flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,%
+      getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,%
+      getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,%
+      getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,%
+      getpwent,getpwnam,getpwuid,getservbyname,getservbyport,%
+      getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,%
+      import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,%
+      link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,%
+      msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,%
+      pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,%
+      read,readdir,readlink,recv,redo,ref,rename,require,reset,return,%
+      reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,%
+      semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,%
+      setpriority,setprotoent,setpwent,setservent,setsockopt,shift,%
+      shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,%
+      socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,%
+      substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,%
+      telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,%
+      unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,%
+      wait,waitpid,wantarray,warn,while,write,y},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+   MoreSelectCharTable=%
+      \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}%
+  }[keywords,comments,strings]%
+%%
+%% POV definition (c) 1999 Berthold H\"ollmann
+%%
+\lst@definelanguage{POV}%
+  {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,%
+      agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,%
+      arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,%
+      atan2,atanh,average,background,bezier_spline,bicubic_patch,%
+      black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,%
+      break,brick,brick_size,brightness,brilliance,bumps,bump_map,%
+      bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,%
+      clock_delta,color,color_map,colour,colour_map,component,%
+      composite,concat,cone,confidence,conic_sweep,control0,control1,%
+      cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,%
+      cylinder,cylindrical,debug,declare,default,defined,degrees,%
+      density,density_file,density_map,dents,difference,diffuse,%
+      dimensions,dimension_size,direction,disc,distance,%
+      distance_maximum,div,eccentricity,else,emission,end,error,%
+      error_bound,exp,extinction,fade_distance,fade_power,falloff,%
+      falloff_angle,false,fclose,file_exists,filter,finish,fisheye,%
+      flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,%
+      fopen,frequency,gif,global_settings,gradient,granite,%
+      gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,%
+      hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,%
+      interior,interpolate,intersection,intervals,inverse,ior,irid,%
+      irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,%
+      light_source,linear_spline,linear_sweep,local,location,log,%
+      looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,%
+      material,material_map,matrix,max,max_intersections,max_iteration,%
+      max_trace_level,media,media_attenuation,media_interaction,merge,%
+      mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,%
+      normal,normal_map,no_shadow,number_of_waves,object,octaves,off,%
+      offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,%
+      perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,%
+      planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,%
+      precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,%
+      quick_color,quick_colour,quilted,radial,radians,radiosity,radius,%
+      rainbow,ramp_wave,rand,range,ratio,read,reciprocal,%
+      recursion_limit,red,reflection,reflection_exponent,refraction,%
+      render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,%
+      samples,scale,scallop_wave,scattering,seed,shadowless,sin,%
+      sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,%
+      smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,%
+      spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,%
+      strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,%
+      text,texture,texture_map,tga,thickness,threshold,tightness,tile2,%
+      tiles,torus,track,transform,translate,transmit,triangle,%
+      triangle_wave,true,ttf,turbulence,turb_depth,type,u,%
+      ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,%
+      u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,%
+      vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,%
+      width,wood,wrinkles,write,x,y,yes,z},%
+   moredirectives={break,case,debug,declare,default,else,end,fclose,%
+      fopen,local,macro,read,render,statistics,switch,undef,version,%
+      warning,write},%
+   moredelim=*[directive]\#,%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]",%
+  }[keywords,directives,comments,strings]%
+%%
+%% Python definition (c) 1998 Michael Weber
+%% Additional definitions (2013) Alexis Dimitriadis
+%%
+\lst@definelanguage{Python}%
+  {morekeywords={access,and,break,class,continue,def,del,elif,else,%
+      except,exec,finally,for,from,global,if,import,in,is,lambda,not,%
+      or,pass,print,raise,return,try,while},%
+  % Built-ins
+   morekeywords=[2]{abs,all,any,basestring,bin,bool,bytearray,callable,chr,
+     classmethod,cmp,compile,complex,delattr,dict,dir,divmod,enumerate,eval,
+     execfile,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,
+     help,hex,id,input,int,isinstance,issubclass,iter,len,list,locals,long,map,
+     max,memoryview,min,next,object,oct,open,ord,pow,property,range,raw_input,
+     reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,
+     sum,super,tuple,type,unichr,unicode,vars,xrange,zip,apply,buffer,coerce,
+     intern},
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morestring=[b]',%
+   morestring=[b]",%
+   morecomment=[s]{'''}{'''},% used for documentation text (mulitiline strings)
+   morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn
+   morestring=[s]{r'}{'},% `raw' strings
+   morestring=[s]{r"}{"},%
+   morestring=[s]{r'''}{'''},%
+   morestring=[s]{r"""}{"""},%
+   morestring=[s]{u'}{'},% unicode strings
+   morestring=[s]{u"}{"},%
+   morestring=[s]{u'''}{'''},%
+   morestring=[s]{u"""}{"""}%
+  }%
+%%
+%% Scilab definition (c) 2002,2003 Jean-Philippe Grivet
+%%
+\lst@definelanguage{Scilab}%
+  {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,%
+      addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,%
+      amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,%
+      arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,%
+      asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,%
+      auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,%
+      besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,%
+      bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,%
+      bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,%
+      cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,%
+      cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,%
+      chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,%
+      chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,%
+      clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,%
+      coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,%
+      cond,conj,connex,contour2di,contour2d,contourf,contour,%
+      contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,%
+      convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,%
+      cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,%
+      curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,%
+      dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,%
+      delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,%
+      derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,%
+      dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,%
+      dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,%
+      dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,%
+      edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,%
+      elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,%
+      ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,%
+      eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,%
+      exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,%
+      fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,%
+      file,filter,findm,findobj,findx0BD,find_freq,find_path,find,%
+      findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,%
+      formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,%
+      fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,%
+      fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,%
+      fullrfk,fullrf,full,fun2string,funcprot,functions,function,%
+      funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,%
+      genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,%
+      getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,%
+      getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,%
+      getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,%
+      givens,glever,glist,global,glue,gpeche,graduate,grand,%
+      graphics_entities,graph_2_mat,graph_center,graph_complement,%
+      graph_diameter,graph_power,graph_simp,graph_sum,graph_union,%
+      graph-list,graycolormap,grayplot,graypolarplot,grep,group,%
+      gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,%
+      hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,%
+      hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,%
+      householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,%
+      iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,%
+      ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,%
+      ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,%
+      int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,%
+      interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,%
+      inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,%
+      iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,%
+      justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,%
+      kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,%
+      leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,%
+      lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,%
+      linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,%
+      lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,%
+      log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,%
+      lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,%
+      lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,%
+      make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,%
+      mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,%
+      mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,%
+      mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,%
+      min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,%
+      min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,%
+      mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,%
+      mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,%
+      names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,%
+      nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,%
+      netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,%
+      nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,%
+      null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,%
+      obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,%
+      ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,%
+      paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,%
+      pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,%
+      phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,%
+      plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,%
+      plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,%
+      polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,%
+      predecessors,predef,printf,printing,print,prod,profile,projsl,%
+      projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,%
+      pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,%
+      pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,%
+      pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,%
+      pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,%
+      pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,%
+      pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,%
+      quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,%
+      readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,%
+      repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,%
+      rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,%
+      rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,%
+      save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,%
+      sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,%
+      semidef,sensi,setbpt,seteventhandler,setfield,setmenu,%
+      setscicosvars,set,sfact,sgrid,shortest_path,showprofile,%
+      show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,%
+      sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,%
+      solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,%
+      spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,%
+      spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,%
+      square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,%
+      stabil,stacksize,standard_define,standard_draw,standard_input,%
+      standard_origin,standard_output,startup,stdevf,stdev,steadycos,%
+      str2code,strange,strcat,strindex,strings,string,stripblanks,%
+      strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,%
+      subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,%
+      sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,%
+      systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,%
+      texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,%
+      tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,%
+      translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,%
+      trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,%
+      uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,%
+      unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,%
+      varargout,variancef,variance,varn,warning,wavread,wavwrite,%
+      wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,%
+      wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,%
+      with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,%
+      xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,%
+      xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,%
+      xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,%
+      xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,%
+      xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,%
+      xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,%
+      x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,%
+      zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,%
+      msscanf,mucomp,%
+      ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,%
+      CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,%
+      CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,%
+      DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,%
+      EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,%
+      GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,%
+      INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,%
+      MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,%
+      PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,%
+      ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,%
+      SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,%
+      TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,%
+      TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,%
+      \%asn,\%helps,\%k,\%sn},%
+   alsoletter=\%,% chmod
+   sensitive,%
+   morecomment=[l]//,%
+   morestring=[b]",%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%%
+%% SQL definition (c) 1998 Christian Haul
+%%                (c) 2002 Neil Conway
+%%                (c) 2002 Robert Frank
+%%                (c) 2003 Dirk Jesko
+%%
+\lst@definelanguage{SQL}%
+  {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,%
+      AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,%
+      CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,%
+      COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,%
+      CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,%
+      CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,%
+      DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,%
+      DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,%
+      EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,%
+      GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,%
+      INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,%
+      ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,%
+      MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,%
+      NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,%
+      PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,%
+      RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,%
+      SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,%
+      TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,%
+      TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,%
+      TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,%
+      VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,%
+      AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF
+      LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF
+      MIN,MAX,UNION,UPDATE,% RF
+      ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ
+      ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ
+   morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ
+      INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here
+   sensitive=false,% DJ
+   morecomment=[l]--,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% VHDL definition (c) 1997 Kai Wollenweber
+%%
+\lst@definelanguage{VHDL}%
+  {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,%
+      ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,%
+      COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,%
+      FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,%
+      INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,%
+      NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,%
+      PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,%
+      RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,%
+      SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,%
+      WHILE,XOR,XNOR,%
+      DISCONNECT,ELIF,WITH},% Arnaud Tisserand
+   sensitive=f,% 1998 Gaurav Aggarwal
+   morecomment=[l]--,%
+   morestring=[d]{"}%
+  }[keywords,comments,strings]%
+%%
+%% VHDL-AMS definition (c) Steffen Klupsch
+%%
+\lst@definelanguage[AMS]{VHDL}[]{VHDL}%
+  {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,%
+      PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,%
+      TOLERANCE,UNAFFACTED,UNITS}}
+\lst@definelanguage{XSLT}[]{XML}%
+  {morekeywords={%
+     % main elements
+     xsl:stylesheet,xsl:transform,%
+     % childs of the main element
+     xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,%
+     xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,%
+     xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,%
+     % 21 directives
+     xsl:apply-imports,xsl:apply-templates,xsl:attribute,%
+     xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,%
+     xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,%
+     xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,%
+     xsl:value-of,xsl:variable,xsl:when,xsl:with-param},%
+   alsodigit={-},%
+  }%
+\lst@definelanguage{Ant}[]{XML}%
+  {morekeywords={%
+     project,target,patternset,include,exclude,excludesfile,includesfile,filterset,%
+     filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,%
+     filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,%
+     filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,%
+     regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,%
+     expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,%
+     classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,%
+     extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,%
+     dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,%
+     dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,%
+     patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,%
+     format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,%
+     p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,%
+     doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,%
+     translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,%
+     jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,%
+     support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,%
+     classes,webinf,rename,sequential,serverdeploy,generic,property,move,%
+     copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,%
+     p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,%
+     coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,%
+     iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,%
+     rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,%
+     stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,%
+     antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,%
+     rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,%
+     equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,%
+     untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,%
+     ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,%
+     tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,%
+     javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,%
+     soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,%
+     addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,%
+     success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,%
+     src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator},
+   deletekeywords={default},%
+  }
+\lst@definelanguage{XML}%
+  {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,%
+      IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,%
+      INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,%
+      PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by #
+      xml,xml:space,xml:lang,version,standalone,default,preserve},%
+   alsoother=$,%
+   alsoletter=:,%
+   tag=**[s]<>,%
+   morestring=[d]",% ??? doubled
+   morestring=[d]',% ??? doubled
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+      \lst@CArgX[CDATA[\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@tagmode
+               \expandafter\lst@BeginCDATA
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+      \lst@CArgX]]\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@GPmode
+               \expandafter\lst@EndComment
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+  }[keywords,comments,strings,html]%
+\endinput
+%%
+%% End of file `lstlang1.sty'.
Index: doc/LaTeXmacros/listings/lstlang2.sty
===================================================================
--- doc/LaTeXmacros/listings/lstlang2.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstlang2.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,1816 @@
+%%
+%% This is file `lstlang2.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `lang2')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{lstlang2.sty}
+    [2015/06/04 1.6 listings language file]
+%%
+%% Abap definition by Knut Lickert
+%%
+\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}%
+  {morekeywords={try,endtry},%
+  }[keywords,comments,strings]
+\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}%
+  {morekeywords={method,ref,class,create,object,%
+        methods,endmethod,private,protected,public,section,%
+        catch,system-exceptions,endcatch,%
+        },%
+   moreprocnamekeys={class},%
+   literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,%
+  }[keywords,comments,strings,procnames]
+\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}%
+\lst@definelanguage[R/2 5.0]{ABAP}%
+  {sensitive=f,%
+   procnamekeys={report,program,form,function,module},%
+   morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,%
+        authority-check,before,binary,blank,break-point,calendar,call,%
+        case,change,changing,check,clear,cnt,co,collect,commit,common,%
+        component,compute,condense,corresponding,cos,cp,cs,currency-conversion,%
+        cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,%
+        describe,detail,dialog,directory,div,divide,do,documentation,%
+        during,dynpro,else,end-of-page,end-of-selection,endat,endcase,%
+        enddo,endfor,endform,endif,endloop,endmodule,endselect,%
+        endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,%
+        field,fields,field-groups,field-symbols,find,for,form,format,free,%
+        from,function,generating,get,giving,hide,id,if,import,%
+        importing,in,incl,include,initial,initialization,input,insert,%
+        interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count,
+        line-selection,list-processing,load,local,log,logfile,loop,%
+        margin,mark,mask,memory,menue,message,mod,modify,module,move,%
+        move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,%
+        number,obligatory,occurs,of,on,or,others,output,parameter,%
+        parameters,parts,perform,pf-status,places,position,process,%
+        raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,%
+        replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,%
+        segments,select,select-options,selection-screen,set,shift,sin,%
+        single,sqrt,start-of-selection,statement,structure,submit,%
+        subtract,summary,summing,suppress,system,table,tables,task,%
+        text,time,to,top-of-page,trace,transaction,transfer,%
+        transfer-dynpro,translate,type,unpack,update,user-command,%
+        using,value,when,where,while,window,with,workfile,write,},%
+   morecomment=[l]",%
+   morecomment=[f][commentstyle][0]*,%
+   morestring=[d]'%
+  }[keywords,comments,strings,procnames]
+\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}%
+  {deletekeywords={function,importing,exporting,changing,exceptions,%
+        raise,raising}%
+  }[keywords,comments,strings]
+%%
+%% ACM and ACMscript definition
+%% (c) 2013 Stefan Pinnow
+%%
+\lst@definelanguage{ACM}{
+  morekeywords={
+    abs,After,acos,And,As,asin,atan,At,Call,Compatibility,Connect,cos,cosh,%
+    Create,Delay,Description,Difference,Do,Else,ElseIf,End,EndFor,EndIf,%
+    EndParallel,EndState,EndSwitch,EndText,EndWith,exp,External,Fixed,For,%
+    ForEach,Free,Global,Hidden,If,Implementation,In,Initial,Input,InterSection,%
+    IntegerSet,Invoke,Is,Language,Library,Link,Log10,LogE,Max,Min,Model,Of,%
+    Once,Options,Output,Parallel,Parameter,Pause,Port,Print,Private,%
+    Procedure,Product,Ramp,Repeat,Restart,Return,Round,Runs,Sigma,sin,sinh,%
+    Size,SnapShot,sqr,sqrt,SRamp,State,Stream,StringSet,Structure,Switch,%
+    SubRoutine,SymDiff,tan,tanh,Task,Text,Time,Then,Truncate,Union,Until,%
+    Uses,Variable,Wait,When,With,WithIn,WorkSpace%
+  },%
+  sensitive=false,%
+  morecomment=[l]{//},%
+  morecomment=[s]{/*}{*/},%
+  string=[b]{"},%
+}[keywords,comments,strings]%
+\lst@definelanguage{ACMscript}[]{VBScript}{%
+  morekeywords={%
+    ElseIf,False,In,Resume,True%
+  },%
+  deletekeywords={%
+    Abs,Array,Clear,CreateObject,CStr,Err,ForReading,ForWriting,%
+    OpenTextFile,Replace,WriteLine%
+  }%
+}[keywords,comments,strings]%
+%%
+%% Corba IDL definition (c) 1999 Jens T. Berger Thielemann
+%%
+\lst@definelanguage[CORBA]{IDL}%
+  {morekeywords={any,attribute,boolean,case,char,const,context,default,%
+      double,enum,exception,fixed,float,in,inout,interface,long,module,%
+      native,Object,octet,oneway,out,raises,readonly,sequence,short,%
+      string,struct,switch,typedef,union,unsigned,void,wchar,wstring,%
+      FALSE,TRUE},%
+   sensitive,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning},%
+   moredelim=*[directive]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%%
+%% (Objective) Caml definition (c) 1999 Patrick Cousot
+%%
+%% Objective CAML and Caml light are freely available, together with a
+%% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix,
+%% Windows and Macintosh OS operating systems.
+%%
+\lst@definelanguage[Objective]{Caml}[light]{Caml}
+  {deletekeywords={not,prefix,value,where},%
+   morekeywords={assert,asr,class,closed,constraint,external,false,%
+      functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,%
+      module,new,open,parser,private,sig,struct,true,val,virtual,when,%
+      object,ref},% TH
+  }%
+\lst@definelanguage[light]{Caml}
+  {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,%
+      fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,%
+      to,try,type,value,where,while,with},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[b]",%
+   moredelim=*[directive]\#,%
+   moredirectives={open,close,include}%
+  }[keywords,comments,strings,directives]%
+\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}%
+  {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,%
+      COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,%
+      ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,%
+      RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,%
+      SUPPRESS,TITLE,WHEN-COMPILED},%
+  }%
+\lst@definelanguage[1985]{Cobol}[1974]{Cobol}%
+  {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,%
+      ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,%
+      CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,%
+      END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,%
+      END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,%
+      END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,%
+      FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,%
+      PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,%
+      STANDARD-2,TEST,THEN,TRUE},%
+  }%
+\lst@definelanguage[1974]{Cobol}%
+  {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,%
+      ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,%
+      BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,%
+      CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,%
+      COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,%
+      CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,%
+      COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,%
+      DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,%
+      DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,%
+      DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,%
+      DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,%
+      EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,%
+      ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,%
+      FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,%
+      GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,%
+      IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,%
+      INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,%
+      JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,%
+      LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,%
+      LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,%
+      MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,%
+      OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,%
+      ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,%
+      PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,%
+      PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,%
+      QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,%
+      REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,%
+      REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,%
+      REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,%
+      SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,%
+      SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,%
+      SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,%
+      STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,%
+      SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,%
+      TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,%
+      UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,%
+      WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},%
+   alsodigit=-,%
+   sensitive=f,% ???
+   morecomment=[f][commentstyle][6]*,%
+   morestring=[d]"% ??? doubled
+  }[keywords,comments,strings]%
+\lst@definelanguage{Delphi}%
+  {morekeywords={and,as,asm,array,begin,case,class,const,constructor,%
+      destructor,div,do,downto,else,end,except,exports,file,finally,%
+      for,function,goto,if,implementation,in,inherited,inline,%
+      initialization,interface,is,label,library,mod,nil,not,object,of,%
+      or,packed,procedure,program,property,raise,record,repeat,set,%
+      shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,%
+      xor,%
+      absolute,abstract,assembler,at,cdecl,default,dynamic,export,%
+      external,far,forward,index,name,near,nodefault,on,override,%
+      private,protected,public,published,read,resident,storedDir,%
+      virtual,write},%
+   morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,%
+      AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,%
+      ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,%
+      ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,%
+      Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,%
+      DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,%
+      Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,%
+      DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,%
+      Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,%
+      ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,%
+      FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,%
+      FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,%
+      FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,%
+      FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,%
+      FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,%
+      GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,%
+      IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,%
+      LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,%
+      Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,%
+      Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,%
+      RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,%
+      SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,%
+      Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,%
+      StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,%
+      StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,%
+      StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,%
+      StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,%
+      TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,%
+      WhereY,Write,WriteBuf,WriteChar,Writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morecomment=[l]{//},% 2001 Christian Gudrian
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Eiffel}%
+  {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,%
+      creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,%
+      ensure,expanded,export,external,false,feature,from,frozen,if,%
+      implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,%
+      like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,%
+      REAL,redefine,rename,require,rescue,Result,retry,select,%
+      separate,STRING,strip,then,true,undefine,unique,until,variant,%
+      when,xor},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]",%
+  }[keywords,comments,strings]%
+%%
+%% Euphoria definition (c) 1998 Detlef Reimers
+%%
+\lst@definelanguage{Euphoria}%
+  {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,%
+      call_proc,call_func,c_proc,c_func,clear_screen,close,%
+      command_line,compare,constant,cos,do,date,else,elsif,end,exit,%
+      find,floor,for,function,getc,getenv,get_key,gets,global,%
+      get_pixel,if,include,integer,length,log,match,machine_func,%
+      machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,%
+      or_bits,procedure,puts,position,prepend,print,printf,power,peek,%
+      poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,%
+      routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,%
+      trace,tan,while,with,without,xor,xor_bits},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% GAP definition
+%% (c) 2013 Heiko Oberdiek
+%%
+\lst@definelanguage{GAP}{%
+  morekeywords={%
+    Assert,Info,IsBound,QUIT,%
+    TryNextMethod,Unbind,and,break,%
+    continue,do,elif,%
+    else,end,false,fi,for,%
+    function,if,in,local,%
+    mod,not,od,or,%
+    quit,rec,repeat,return,%
+    then,true,until,while%
+  },%
+  sensitive,%
+  morecomment=[l]\#,%
+  morestring=[b]",%
+  morestring=[b]',%
+}[keywords,comments,strings]
+%%
+%% Guarded Command Language (GCL)  definition
+%% (c) 2002 Mark van Eijk
+%%
+\lst@definelanguage{GCL}%
+  {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},%
+   literate={|[}{\ensuremath{|\hskip -0.1em[}}2%
+            {]|}{\ensuremath{]\hskip -0.1em|}}2%
+    {[]}{\ensuremath{[\hskip -0.1em]}}2%
+    {->}{\ensuremath{\rightarrow}~}2%
+    {==}{\ensuremath{\equiv}~}2%
+    {>=}{\ensuremath{\geq}~}2%
+    {<=}{\ensuremath{\leq}~}2%
+    {/\\}{\ensuremath{\land}~}2%
+    {\\/}{\ensuremath{\lor}~}2%
+    {!}{\ensuremath{\lnot}}1%
+    {!=}{\ensuremath{\neq}~}2%
+    {max}{\ensuremath{\uparrow}}1%
+    {min}{\ensuremath{\downarrow}}1,%
+   sensitive=f,%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%%
+%% gnuplot definition (c) Christoph Giess
+%%
+\lst@definelanguage{Gnuplot}%
+  {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,%
+       besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,%
+       inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,%
+       sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,%
+       tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,%
+       help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,%
+       set,show,shell,splot,test,update,angles,arrow,autoscale,border,%
+       boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,%
+       format,function,functions,grid,hidden3d,isosamples,key,keytitle,%
+       label,logscale,mapping,offsets,output,parametric,pointsize,%
+       polar,rrange,samples,size,style,surface,terminal,tics,time,%
+       timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,%
+       xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,%
+       ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,%
+       zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,%
+       with,index,every,thru,smooth},%
+   sensitive,%
+   comment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%%
+%% http://gretl.sourceforge.net/gretl-help/cmdref.html
+%% (c) 2013 Ignacio D\'iaz-Emparanza
+%%
+\lst@definelanguage{hansl}{%
+  % $-variables are internal functions in hansl
+  keywordsprefix ={\$},
+  morekeywords={ % hansl commands:
+    add,adf,anova,append,ar,ar1,%
+    arbond,arch,arima,biprobit,boxplot,break,%
+    catch,chow,clear,coeffsum,coint,coint2,%
+    corr,corrgm,cusum,data,dataset,debug,%
+    delete,diff,difftest,discrete,dpanel,dummify,%
+    duration,elif,else,end,endif,endloop,%
+    eqnprint,equation,estimate,fcast,foreign,fractint,%
+    freq,function,garch,genr,gmm,gnuplot,%
+    graphpg,hausman,heckit,help,hsk,hurst,%
+    if,include,info,intreg,join,kalman,%
+    kpss,labels,lad,lags,ldiff,leverage,%
+    levinlin,logistic,logit,logs,loop,mahal,%
+    makepkg,markers,meantest,mle,modeltab,modprint,%
+    modtest,mpols,negbin,nls,normtest,nulldata,%
+    ols,omit,open,orthdev,outfile,panel,%
+    pca,pergm,poisson,print,printf,probit,%
+    pvalue,qlrtest,qqplot,quantreg,quit,rename,%
+    reset,restrict,rmplot,run,runs,scatters,%
+    sdiff,set,setinfo,setobs,setmiss,shell,%
+    smpl,spearman,sprintf,square,sscanf,store,%
+    summary,system,tabprint,textplot,tobit,tsls,%
+    var,varlist,vartest,vecm,vif,wls,%
+    xcorrgm,xtab,scalar,series,matrix,string},%
+  morekeywords=[2]{ %  Functions
+    abs,acos,acosh,aggregate,argname,%
+    asin,asinh,atan,atanh,atof,%
+    bessel,BFGSmax,bkfilt,boxcox,bwfilt,%
+    cdemean,cdf,cdiv,ceil,cholesky,%
+    chowlin,cmult,cnorm,colname,colnames,%
+    cols,corr,corrgm,cos,cosh,%
+    cov,critical,cum,deseas,det,%
+    diag,diagcat,diff,digamma,dnorm,%
+    dsort,dummify,eigengen,eigensym,eigsolve,%
+    epochday,errmsg,exp,fcstats,fdjac,%
+    fft,ffti,filter,firstobs,fixname,%
+    floor,fracdiff,gammafun,getenv,getline,%
+    ghk,gini,ginv,halton,hdprod,%
+    hpfilt,I,imaxc,imaxr,imhof,%
+    iminc,iminr,inbundle,infnorm,inlist,%
+    int,inv,invcdf,invmills,invpd,%
+    irf,irr,isconst,isnan,isnull,%
+    isodate,iwishart,kdensity,kfilter,ksimul,%
+    ksmooth,kurtosis,lags,lastobs,ldet,%
+    ldiff,lincomb,ljungbox,lngamma,log,%
+    log10,log2,loess,logistic,lower,%
+    lrvar,max,maxc,maxr,mcorr,%
+    mcov,mcovg,mean,meanc,meanr,%
+    median,mexp,min,minc,minr,%
+    missing,misszero,mlag,mnormal,mols,%
+    monthlen,movavg,mpols,mrandgen,mread,%
+    mreverse,mrls,mshape,msortby,muniform,%
+    mwrite,mxtab,nadarwat,nelem,ngetenv,%
+    nobs,normal,npv,NRmax,nullspace,%
+    obs,obslabel,obsnum,ok,onenorm,%
+    ones,orthdev,pdf,pergm,pmax,%
+    pmean,pmin,pnobs,polroots,polyfit,%
+    princomp,prodc,prodr,psd,psdroot,%
+    pshrink,psum,pvalue,pxsum,qform,%
+    qnorm,qrdecomp,quadtable,quantile,randgen,%
+    randgen1,randint,rank,ranking,rcond,%
+    readfile,regsub,remove,replace,resample,%
+    round,rownames,rows,sd,sdc,%
+    sdiff,selifc,selifr,seq,setnote,%
+    simann,sin,sinh,skewness,sort,%
+    sortby,sqrt,sscanf,sst,strlen,%
+    strncmp,strsplit,strstr,strstrip,strsub,%
+    sum,sumall,sumc,sumr,svd,%
+    tan,tanh,toepsolv,tolower,toupper,%
+    tr,transp,trimr,typestr,uniform,%
+    uniq,unvech,upper,urcpval,values,%
+    var,varname,varnum,varsimul,vec,%
+    vech,weekday,wmean,wsd,wvar,%
+    xmax,xmin,xpx,zeromiss,zeros,%
+  },%
+  sensitive=t,%
+  morecomment=[l]{\#},%
+  morecomment=[s]{/*}{*/},%
+  morestring=[b]{"}}%
+\lstalias{gretl}{hansl}
+%%
+%% Haskell98 as implemented in Hugs98. See http://www.haskell.org
+%% All keywords from Prelude and Standard Libraries
+%% (c) 1999 Peter Bartke
+%%
+\lst@definelanguage{Haskell}%
+  {otherkeywords={=>},%
+   morekeywords={abstype,if,then,else,case,class,data,default,deriving,%
+      hiding,if,in,infix,infixl,infixr,import,instance,let,module,%
+      newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,%
+      Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,%
+      FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,%
+      Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,%
+      SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,%
+      Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,%
+      Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,%
+      MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,%
+      Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,%
+      Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,%
+      accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,%
+      approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,%
+      bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,%
+      compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,%
+      decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,%
+      digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,%
+      elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,%
+      enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,%
+      filter,filterM,find,findIndex,findIndices,flip,floatDigits,%
+      floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,%
+      foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,%
+      fromIntegral,fromJust,fromMaybe,fromRat,fromRational,%
+      fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,%
+      genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,%
+      getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,%
+      group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,%
+      hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,%
+      hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,%
+      hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,%
+      hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,%
+      hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,%
+      inRange,insert,insertBy,interact,intersect,intersectBy,%
+      intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,%
+      ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,%
+      isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,%
+      isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,%
+      isIllegalOperation,isInfinite,isJust,isLower,isNaN,%
+      isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,%
+      isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,%
+      join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,%
+      liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,%
+      lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,%
+      mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,%
+      maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,%
+      mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,%
+      null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,%
+      polar,pred,print,product,properFraction,putChar,putStr,putStrLn,%
+      quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,%
+      rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,%
+      readList,readLitChar,readLn,readParen,readOct,readSigned,reads,%
+      readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,%
+      reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,%
+      sequence_,setStdGen,show,showChar,showEFloat,showFFloat,%
+      showFloat,showGFloat,showInt,showList,showLitChar,showParen,%
+      showSigned,showString,shows,showsPrec,significand,signum,sin,%
+      sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,%
+      strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,%
+      tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,%
+      truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,%
+      unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,%
+      userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,%
+      zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,%
+      zipWith7},%
+   sensitive,%
+   morecomment=[l]--,%
+   morecomment=[n]{\{-}{-\}},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%%
+%% IDL definition (c) 1998 Juergen Heim
+%%
+\lst@definelanguage{IDL}%
+  {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,%
+      endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,%
+      mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,%
+      xor,on_error,openw,openr,openu,print,printf,printu,plot,read,%
+      readf,readu,writeu,stop},%
+   sensitive=f,%
+   morecomment=[l];,%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%%
+%% Inform definition (c) 2003 Jonathan Sauer
+%%
+\lst@definelanguage{inform}{%
+    % Language keywords
+    morekeywords={breakdo,else,false,for,has,hasnt,if,%
+                in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,%
+                private,property,provides,return,rfalse,rtrue,self,string,%
+                switch,to,true,until,while,with,%
+                creature,held,multiexcept,multiheld,multiinside,noun,number,%
+                scope,topic},%
+    %
+    % Inform functions
+    morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,%
+                new_line,parent,print,print_ret,read,remove,restore,sibling,%
+                save,spaces,quit,style,bold,underline,reverse,roman remaining,%
+                create,destroy,recreate,copy},%
+    %
+    % Inform definitions
+    morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,%
+                Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,%
+                Property,Verb,Release,Serial,Statusline},%
+    %
+    % Library attributes
+    morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,%
+                enterable,female,general,light,lockable locked,male,moved,%
+                neuter,on,open,openable,pluralname,proper,scenery,scored,%
+                static,supporter,switchable,talkable,transparent,visited,%
+                workflag,worn},%
+    %
+    % Library properties
+    morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,%
+                out_to,u_to,d_to,add_to_scope,after,article,articles,before,%
+                cant_go,capacity,daemon,describe,description,door_dir,door_to,%
+                each_turn,found_in,grammar,initial,inside_description,invent,%
+                life,list_together,name number,orders,parse_name,plural,%
+                react_after,react_before,short_name,short_name_indef,time_left,%
+                time_out,when_closed,when_open,when_on,when_off,%
+                with_key},%
+    %
+    % Library routines
+    morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,%
+                CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,%
+                IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,%
+                MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,%
+                ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,%
+                PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,%
+                StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,%
+                UnsignedCompare,WordAddress,WordInProperty,WordLength,%
+                WriteListFrom,YesOrNo},%
+    %
+    % Library,entry points
+    morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,%
+                DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,%
+                Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,%
+                ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,%
+                UnknownVerb},%
+    %
+    % Library constants
+    morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,%
+                ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,%
+                ISARE_BIT,CONCEAL_BIT},%
+    %
+    % Library,meta actions
+    morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,%
+                NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,%
+                LMode2,Lmode3},%
+    %
+    % Library,main actions
+    morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,%
+                Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,%
+                Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,%
+                Wear},%
+    %
+    % Library,stub actions
+    morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,%
+                Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,%
+                Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,%
+                Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,%
+                Wait,Wake,WakeOther,Wave,WaveHands,Yes},%
+    %
+    otherkeywords={->,-->},%
+    sensitive=false,%
+    morestring=[d]{"},%
+    morecomment=[l]{!}%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Lisp}%
+  {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,%
+      append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,%
+      atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,%
+      char,character,characterp,choose,chunk,cis,close,clrhash,coerce,%
+      collect,commonp,compile,complement,complex,complexp,concatenate,%
+      conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,%
+      count,delete,denominator,describe,directory,disassemble,%
+      documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,%
+      equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,%
+      expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,%
+      float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,%
+      funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,%
+      gethash,identity,imagpart,import,inspect,integerp,intern,%
+      intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,%
+      length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,%
+      logior,lognand,lognor,lognot,logtest,logxor,macroexpand,%
+      makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,%
+      mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,%
+      nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,%
+      nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,%
+      oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,%
+      position,positions,pprint,previous,princ,print,proclaim,provide,%
+      random,rassoc,rational,rationalize,rationalp,read,readtablep,%
+      realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,%
+      rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,%
+      search,second,series,set,seventh,shadow,signal,signum,sin,sinh,%
+      sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,%
+      subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,%
+      symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,%
+      typep,unexport,unintern,union,until,values,vector,vectorp,warn,%
+      write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,%
+      defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,%
+      defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,%
+      dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,%
+      incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,%
+      producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,%
+      setf,shiftf,step,time,trace,typecase,unless,untrace,when},%
+   sensitive,% ???
+   alsodigit=-,%
+   morecomment=[l];,%
+   morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%%
+%% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de
+%%
+\lst@definelanguage[Auto]{Lisp}%
+  {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,%
+      action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,%
+      apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,%
+      atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,%
+      cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,%
+      defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,%
+      dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,%
+      distof,done_dialog,end_image,end_list,entdel,entget,entlast,%
+      entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,%
+      eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,%
+      function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,%
+      getcorner,getdist,getenv,getfiled,getint,getkword,getorient,%
+      getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,%
+      grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,%
+      last,layoutlist,length,list,listp,load,load_dialog,log,logand,%
+      logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,%
+      mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,%
+      null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,%
+      quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,%
+      reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,%
+      setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,%
+      ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,%
+      start_dialog,start_image,start_list,strcase,strcat,strlen,subst,%
+      substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,%
+      textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,%
+      vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,%
+      vl-bb-ref,vl-bb-set,vl-catch-all-apply,%
+      vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,%
+      vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,%
+      vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,%
+      vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,%
+      vl-file-size,vl-file-systime,vl-filename-base,%
+      vl-filename-directory,vl-filename-extension,vl-filename-mktemp,%
+      vl-get-resource,vl-list*,vl-list->string,%
+      vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,%
+      vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,%
+      vl-member-if-not,vl-position,vl-prin1-to-string,%
+      vl-princ-to-string,vl-propagate,vl-registry-delete,%
+      vl-registry-descendents,vl-registry-read,vl-registry-write,%
+      vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,%
+      vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,%
+      vl-string-mismatch,vl-string-position,vl-string-right-trim,%
+      vl-string-search,vl-string-subst,vl-string-translate,%
+      vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,%
+      vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,%
+      vlax-add-cmd,vlax-create-object,vlax-curve-getArea,%
+      vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,%
+      vlax-curve-getEndParam,vlax-curve-getEndPoint,%
+      vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,%
+      vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,%
+      vlax-curve-getStartParam,vlax-curve-getStartPoint,%
+      vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,%
+      vlax-curve-getClosestPointTo,%
+      vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,%
+      vlax-curve-getSecondDeriv,vlax-dump-object,%
+      vlax-ename->vla-object,vlax-erased-p,vlax-for,%
+      vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,%
+      vlax-get-property,vlax-import-type-library,vlax-invoke-method,%
+      vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,%
+      vlax-ldata-test,vlax-make-safearray,vlax-make-variant,%
+      vlax-map-collection,vlax-method-applicable-p,%
+      vlax-object-released-p,vlax-product-key,%
+      vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,%
+      vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,%
+      vlax-safearray-get-dim,vlax-safearray-get-element,%
+      vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,%
+      vlax-safearray-put-element,vlax-safearray-type,%
+      vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,%
+      vlax-variant-change-type,vlax-variant-type,vlax-variant-value,%
+      vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,%
+      vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,%
+      vlr-command-reactor,vlr-current-reaction-name,vlr-data,%
+      vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,%
+      vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,%
+      vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,%
+      vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,%
+      vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,%
+      vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,%
+      vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,%
+      vlr-remove,vlr-remove-all,vlr-set-notification,%
+      vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,%
+      vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,%
+      vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,%
+      write-char,write-line,xdroom,xdsize,zerop},%
+   alsodigit=->,%
+   otherkeywords={1+,1-},%
+   sensitive=false,%
+   morecomment=[l];,%
+   morecomment=[l];;,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%%
+%% Lua definitions (c) 2013 Stephan Hennig
+%%
+\lst@definelanguage[5.0]{Lua}{%
+  alsoletter={.},%
+  morekeywords=[1]{%
+    and, break, do, else, elseif, end, false, for, function, if, in,%
+    local, nil, not, or, repeat, return, then, true, until, while,%
+  },%
+  morekeywords=[2]{%
+    _G, _LOADED, _REQUIREDNAME, _VERSION, LUA_PATH,%
+    assert, collectgarbage, dofile, error, gcinfo, getfenv,%
+    getmetatable, ipairs, loadfile, loadlib, loadstring, newproxy,%
+    next, pairs, pcall, print, rawequal, rawget, rawset, require,%
+    setfenv, setmetatable, tonumber, tostring, type, unpack, xpcall,%
+    coroutine, coroutine.create, coroutine.resume,%
+    coroutine.status, coroutine.wrap, coroutine.yield,%
+    _TRACEBACK, debug, debug.debug, debug.gethook, debug.getinfo,%
+    debug.getlocal, debug.getupvalue, debug.sethook, debug.setlocal,%
+    debug.setupvalue,debug.traceback,%
+    io, io.close, io.flush, io.input, io.lines, io.open, io.output,%
+    io.popen, io.read, io.stderr, io.stdin, io.stdout, io.tmpfile,%
+    io.type, io.write,%
+    __pow, math, math.abs, math.acos, math.asin, math.atan, math.atan2,%
+    math.ceil, math.cos, math.deg, math.exp, math.floor, math.frexp,%
+    math.ldexp, math.log, math.log10, math.max, math.min, math.mod,%
+    math.pi, math.pow, math.rad, math.random, math.randomseed, math.sin,%
+    math.sqrt, math.tan,%
+    os, os.clock, os.date, os.difftime, os.execute, os.exit, os.getenv,%
+    os.remove, os.rename, os.setlocale, os.time, os.tmpname,%
+    string, string.byte, string.char, string.dump, string.find,%
+    string.format, string.gfind, string.gsub, string.len, string.lower,%
+    string.rep, string.sub, string.upper,%
+    table, table.concat, table.foreach, table.foreachi, table.getn,%
+    table.insert, table.remove, table.setn, table.sort,%
+  },%
+  morekeywords=[2]{%
+    _PROMPT, _PROMPT2, arg,%
+  },%
+  sensitive=true,%
+  % single line comments
+  morecomment=[l]{--},%
+  % multi line comments
+  morecomment=[s]{--[[}{]]},%
+  % backslash escaped strings
+  morestring=[b]",%
+  morestring=[b]',%
+  % multi line strings
+  morestring=[s]{[[}{]]},%
+}[keywords,comments,strings]%
+\lst@definelanguage[5.1]{Lua}[5.0]{Lua}{%
+  deletekeywords=[2]{%
+    _LOADED, _REQUIREDNAME, LUA_PATH, gcinfo, loadlib,%
+    _TRACEBACK,%
+    __pow, math.mod,%
+    string.gfind,%
+    table.foreach, table.foreachi, table.getn, table.setn,%
+  },%
+  morekeywords=[2]{%
+    load, select,%
+    coroutine.running,%
+    debug.getfenv, debug.getmetatable, debug.getregistry, debug.setfenv,%
+    debug.setmetatable,%
+    math.cosh, math.fmod, math.huge, math.modf, math.sinh, math.tanh,%
+    module, package, package.config, package.cpath, package.loaded,%
+    package.loaders, package.loadlib, package.path, package.preload,%
+    package.seeall,%
+    string.gmatch, string.match, string.reverse,%
+    table.maxn,%
+  },%
+  morecomment=[s]{--[=[}{]=]},%
+  morecomment=[s]{--[==[}{]==]},%
+  morecomment=[s]{--[===[}{]===]},%
+  morecomment=[s]{--[====[}{]====]},%
+  morecomment=[s]{--[=====[}{]=====]},%
+  morecomment=[s]{--[======[}{]======]},%
+  morecomment=[s]{--[=======[}{]=======]},%
+  morecomment=[s]{--[========[}{]========]},%
+  morecomment=[s]{--[=========[}{]=========]},%
+  morecomment=[s]{--[==========[}{]==========]},%
+  morestring=[s]{[=[}{]=]},%
+  morestring=[s]{[==[}{]==]},%
+  morestring=[s]{[===[}{]===]},%
+  morestring=[s]{[====[}{]====]},%
+  morestring=[s]{[=====[}{]=====]},%
+  morestring=[s]{[======[}{]======]},%
+  morestring=[s]{[=======[}{]=======]},%
+  morestring=[s]{[========[}{]========]},%
+  morestring=[s]{[=========[}{]=========]},%
+  morestring=[s]{[==========[}{]==========]},%
+}[keywords,comments,strings]%
+\lst@definelanguage[5.2]{Lua}[5.1]{Lua}{%
+  morekeywords=[1]{%
+    goto,%
+  },%
+  deletekeywords=[2]{%
+    getfenv, loadstring, module, newproxy, setfenv, unpack,%
+    debug.getfenv, debug.setfenv,%
+    math.log10,%
+    package.loaders, package.seeall,%
+    table.maxn,%
+  },%
+  morekeywords=[2]{%
+    rawlen,%
+    bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+    bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+    bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+    debug.getuservalue, debug.setuservalue, debug.upvalueid,%
+    debug.upvaluejoin,%
+    package.searchers, package.searchpath,%
+    table.pack, table.unpack,%
+  },%
+  morekeywords=[2]{%
+    _ENV,%
+  },%
+  moredelim=[s][keywordstyle3]{::}{::},%
+}[keywords,comments,strings]%
+\lst@definelanguage[5.3]{Lua}[5.2]{Lua}{%
+  deletekeywords=[2]{%
+    bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+    bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+    bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+    math.atan2, math.cosh, math.frexp, math.ldexp, math.pow,%
+    math.sinh, math.tanh,%
+  },%
+  morekeywords=[2]{%
+    coroutine.isyieldable,%
+    math.maxinteger, math.mininteger, math.tointeger, math.type,%
+    math.ult,%
+    string.pack, string.packsize, string.unpack,%
+    table.move,%
+    utf8, utf8.char, utf8.charpattern, utf8.codepoint, utf8.codes,%
+    utf8.len, utf8.offset,%
+  },%
+}[keywords,comments,strings]%
+%%
+%% Make definitions (c) 2000 Rolf Niepraschk
+%%
+\lst@definelanguage[gnu]{make}%
+  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,%
+      @,^,<,\%,+,?,*,% Markus Pahlow
+      export,unexport,include,override,define,ifdef,ifneq,ifeq,else,%
+      endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,%
+      sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,%
+      words,firstword,wildcard,shell,origin,foreach,%
+      @D,@F,*D,*F,\%D,\%F,<D,<F,^D,^F,+D,+F,?D,?F,%
+      AR,AS,CC,CXX,CO,CPP,FC,GET,LEX,PC,YACC,YACCR,MAKEINFO,TEXI2DVI,%
+      WEAVE,CWEAVE,TANGLE,CTANGLE,RM,M2C,LINT,COMPILE,LINK,PREPROCESS,%
+      CHECKOUT,%
+      ARFLAGS,ASFLAGS,CFLAGS,CXXFLAGS,COFLAGS,CPPFLAGS,FFLAGS,GFLAGS,%
+      LDFLAGS,LOADLIBES,LFLAGS,PFLAGS,RFLAGS,YFLAGS,M2FLAGS,MODFLAGS,%
+      LINTFLAGS,MAKEINFO_FLAGS,TEXI2DVI_FLAGS,COFLAGS,GFLAGS,%
+      OUTPUT_OPTION,SCCS_OUTPUT_OPTION,% missing comma: Markus Pahlow
+      .PHONY,.SUFFIXES,.DEFAULT,.PRECIOUS,.INTERMEDIATE,.SECONDARY,%
+      .IGNORE,.SILENT,.EXPORT_ALL_VARIABLES,MAKEFILES,VPATH,MAKESHELL,%
+      MAKELEVEL,MAKECMDGOALS,SUFFIXES},%
+   sensitive=true,
+   morecomment=[l]\#,%
+   morestring=[b]"%
+  }[keywords,comments,strings,make]%
+\lst@definelanguage{make}
+  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morestring=[b]"%
+  }[keywords,comments,strings,make]%
+%%
+%% Mercury definition (c) 1997 Dominique de Waleffe
+%% Extended (c) 2001 Ralph Becket
+%%
+\lst@definelanguage{Mercury}%
+  {otherkeywords={::,->,-->,--->,:-,==,=>,<=,<=>},%
+   morekeywords={module,include_module,import_module,interface,%
+      end_module,implementation,mode,is,failure,semidet,nondet,det,%
+      multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,%
+      where,with_type,pred,func,lambda,impure,semipure,if,then,else,%
+      some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,%
+      minimal_model,fact_table,type_spec,terminates,does_not_terminate,%
+      check_termination,promise_only_solution,unsafe_promise_unique,%
+      source_file,obsolete,import,export,c_header_code,c_code,%
+      foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,%
+      thread_safe,not_thread_safe},%
+   sensitive=t,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%%
+%% Miranda definition (c) 1998 Peter Bartke
+%%
+%% Miranda: pure lazy functional language with polymorphic type system,
+%%          garbage collection and functions as first class citizens
+%%
+\lst@definelanguage{Miranda}%
+  {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,%
+     with,bool,char,num,sys_message,False,True,Appendfile,Closefile,%
+     Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,%
+     \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,%
+     decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,%
+     foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,%
+     init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,%
+     log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,%
+     numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,%
+     scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,%
+     subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,%
+     until,zip2,zip3,zip4,zip5,zip6,zip},%
+   sensitive,%
+   morecomment=[l]||,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%%
+%% ML definition (c) 1999 Torben Hoffmann
+%%
+\lst@definelanguage{ML}%
+  {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,%
+       eqtype,exception,fn,fun,functor,handle,if,in,include,infix,%
+       infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,%
+       signature,struct,structure,then,type,val,with,withtype,while},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% Oz definition (c) Andres Becerra Sandoval
+%%
+\lst@definelanguage{Oz}%
+  {morekeywords={andthen,at,attr,case,catch,choice,class,%
+      cond,declare,define,dis,div,else,elsecase,%
+      elseif,end,export,fail,false,feat,finally,%
+      from,fun,functor,if,import,in,local,%
+      lock,meth,mod,not,of,or,orelse,%
+      prepare,proc,prop,raise,require,self,skip,%
+      then,thread,true,try,unit},%
+   sensitive=true,%
+   morecomment=[l]{\%},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%%
+%% PHP definition by Luca Balzerani
+%%
+\lst@definelanguage{PHP}%
+  {morekeywords={%
+  %--- core language
+    <?,?>,::,break,case,continue,default,do,else,%
+    elseif,for,foreach,if,include,require,phpinfo,%
+    switch,while,false,FALSE,true,TRUE,%
+  %--- apache functions
+    apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,%
+    virtual,apache_child_terminate,apache_setenv,%
+  %--- array functions
+    array,array_change_key_case,array_chunk,array_count_values,%
+    array_filter,array_flip,array_fill,array_intersect,%
+    array_keys,array_map,array_merge,array_merge_recursive,%
+    array_pad,array_pop,array_push,array_rand,array_reverse,%
+    array_shift,array_slice,array_splice,array_sum,array_unique,%
+    array_values,array_walk,arsort,asort,compact,count,current,each,%
+    extract,in_array,array_search,key,krsort,ksort,list,natsort,%
+    next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,%
+    usort,%
+  %--- aspell functions
+    aspell_new,aspell_check,aspell_check_raw,aspell_suggest,%
+  %--- bc functions
+    bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,%
+  %--- bzip2 functions
+    bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,%
+    bzopen,bzread,bzwrite,%
+  %--- calendar functions
+    JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,%
+    JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,%
+    unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,%
+  %--- ccvs functions
+    ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,%
+    ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,%
+    ccvs_report,ccvs_command,ccvs_textvalue,%
+  %--- classobj functions
+    call_user_method,call_user_method_array,class_exists,get_class,%
+    get_class_vars,get_declared_classes,get_object_vars,%
+    is_a,is_subclass_of,method_exists,%
+  %--- com functions
+    COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,%
+    com_set,com_addref,com_release,com_isenum,com_load_typelib,%
+  %--- cpdf functions
+    cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,%
+    cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,%
+    cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,%
+    cpdf_finalize,cpdf_finalize_page,%
+    cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,%
+    cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,%
+    cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,%
+    cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,%
+    cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,%
+    cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,%
+    cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,%
+    cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,%
+    cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,%
+    cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,%
+    cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,%
+    cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,%
+    cpdf_set_action_url,%
+  %--- crack functions
+    crack_opendict,crack_closedict,crack_check,crack_getlastmessage,%
+  %--- ctype functions
+    ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,%
+    ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,%
+  %--- curl functions
+    curl_init,curl_setopt,curl_exec,curl_close,curl_version,%
+    curl_error,curl_getinfo,%
+  %--- cybercash functions
+    cybercash_encr,cybercash_decr,cybercash_base64_encode,%
+  %--- cybermut functions
+    cybermut_creerformulairecm,cybermut_testmac,%
+  %--- cyrus functions
+    cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,%
+    cyrus_close,%
+  %--- datetime functions
+    checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,%
+    microtime,mktime,strftime,time,strtotime,%
+  %--- dbase functions
+    dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,%
+    dbase_delete_record,dbase_get_record,%
+    dbase_numfields,dbase_numrecords,%
+  %--- dba functions
+    dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,%
+    dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,%
+  %--- dbm functions
+    dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,%
+    dbmfirstkey,dbmnextkey,dblist,%
+  %--- dbx functions
+    dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,%
+  %--- dio functions
+    dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,%
+    dio_close,%
+  %--- dir functions
+    chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,%
+  %--- dotnet functions
+    dotnet_load,%
+  %--- errorfunc functions
+    error_log,error_reporting,restore_error_handler,%
+    trigger_error,user_error,%
+  %--- exec functions
+    escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,%
+  %--- fbsql functions
+    fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,%
+    fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,%
+    fbsql_database_password,fbsql_data_seek,fbsql_db_query,%
+    fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,%
+    fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,%
+    fbsql_field_flags,fbsql_field_name,fbsql_field_len,%
+    fbsql_field_table,fbsql_field_type,fbsql_free_result,%
+    fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,%
+    fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,%
+    fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,%
+    fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,%
+    fbsql_get_autostart_info,fbsql_hostname,fbsql_password,%
+    fbsql_username,%
+  %--- fdf functions
+    fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,%
+    fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,%
+    fdf_get_file,fdf_set_flags,fdf_set_opt,%
+    fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,%
+  %--- filepro functions
+    filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,%
+    filepro_fieldcount,filepro_rowcount,%
+  %--- filesystem functions
+    basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,%
+    diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,%
+    fgetss,file_get_contents,file,file_exists,fileatime,filectime,%
+    fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,%
+    fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,%
+    set_file_buffer,is_dir,is_executable,is_file,is_link,%
+    is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,%
+    parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,%
+    rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,%
+  %--- fribidi functions
+    fribidi_log2vis,%
+  %--- ftp functions
+    ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,%
+    ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,%
+    ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,%
+    ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,%
+  %--- funchand functions
+    call_user_func_array,call_user_func,create_function,%
+    func_get_args,func_num_args,function_exists,%
+    register_shutdown_function,register_tick_function,%
+  %--- gettext functions
+    bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,%
+    dngettext,gettext,ngettext,textdomain,%
+  %--- gmp functions
+    gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,%
+    gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,%
+    gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,%
+    gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,%
+    gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,%
+    gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,%
+  %--- http functions
+    header,headers_sent,setcookie,%
+  %--- hw functions
+    hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,%
+    hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,%
+    hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,%
+    hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,%
+    hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,%
+    hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,%
+    hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,%
+    hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,%
+    hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,%
+    hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,%
+    hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,%
+    hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,%
+    hw_insertanchors,hw_getrellink,hw_changeobject,%
+  %--- ibase functions
+    ibase_connect,ibase_pconnect,ibase_close,ibase_query,%
+    ibase_fetch_row,ibase_fetch_object,ibase_field_info,%
+    ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,%
+    ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,%
+    ibase_blob_close,ibase_blob_create,ibase_blob_echo,%
+    ibase_blob_import,ibase_blob_info,ibase_blob_open,%
+  %--- icap functions
+    icap_open,icap_close,icap_fetch_event,icap_list_events,%
+    icap_delete_event,icap_snooze,icap_list_alarms,%
+    icap_rename_calendar,icap_delete_calendar,icap_reopen,%
+  %--- iconv functions
+    iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,%
+  %--- ifx functions
+    ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,%
+    ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,%
+    ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,%
+    ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,%
+    ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,%
+    ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,%
+    ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,%
+    ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,%
+  %--- iisfunc functions
+    iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,%
+    iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,%
+    iis_set_script_map,iis_get_script_map,iis_set_app_settings,%
+    iis_stop_server,iis_stop_service,iis_start_service,%
+  %--- image functions
+    exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,%
+    imagealphablending,imagearc,imagefilledarc,imageellipse,%
+    imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,%
+    imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,%
+    imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,%
+    imagecolorset,imagecolorsforindex,imagecolorstotal,%
+    imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,%
+    imagecreate,imagecreatetruecolor,imagetruecolortopalette,%
+    imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,%
+    imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,%
+    imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,%
+    imagefilledrectangle,imagefilltoborder,imagefontheight,%
+    imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,%
+    imageline,imageloadfont,imagepalettecopy,imagepolygon,%
+    imagepsencodefont,imagepsfreefont,imagepsloadfont,%
+    imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,%
+    imagesetstyle,imagesettile,imagesetthickness,imagestring,%
+    imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,%
+    imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,%
+  %--- imap functions
+    imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,%
+    imap_bodystruct,imap_check,imap_clearflag_full,imap_close,%
+    imap_delete,imap_deletemailbox,imap_errors,imap_expunge,%
+    imap_fetchbody,imap_fetchheader,imap_fetchstructure,%
+    imap_getmailboxes,imap_getsubscribed,imap_header,%
+    imap_headers,imap_last_error,imap_listmailbox,%
+    imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,%
+    imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,%
+    imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,%
+    imap_rfc822_parse_headers,imap_rfc822_write_address,%
+    imap_search,imap_setacl,imap_set_quota,imap_setflag_full,%
+    imap_status,imap_subscribe,imap_uid,imap_undelete,%
+    imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,%
+  %--- info functions
+    assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,%
+    get_defined_constants,get_extension_funcs,getmygid,%
+    get_loaded_extensions,get_magic_quotes_gpc,%
+    getlastmod,getmyinode,getmypid,getmyuid,get_required_files,%
+    ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,%
+    phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,%
+    set_time_limit,version_compare,zend_logo_guid,zend_version,%
+  %--- ircg functions
+    ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,%
+    ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,%
+    ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,%
+    ircg_is_conn_alive,ircg_lookup_format_messages,%
+    ircg_set_on_die,ircg_set_file,ircg_get_username,%
+    ircg_nickname_unescape,%
+  %--- java functions
+    java_last_exception_clear,java_last_exception_get,%
+  %--- ldap functions
+    ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,%
+    ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,%
+    ldap_first_attribute,ldap_first_entry,ldap_free_result,%
+    ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,%
+    ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,%
+    ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,%
+    ldap_set_option,ldap_unbind,ldap_8859_to_t61,%
+    ldap_next_reference,ldap_parse_reference,ldap_parse_result,%
+    ldap_sort,ldap_start_tls,ldap_t61_to_8859,%
+  %--- mail functions
+    mail,ezmlm_hash,%
+  %--- math functions
+    abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,%
+    cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,%
+    hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,%
+    max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,%
+    rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,%
+  %--- mbstring functions
+    mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,%
+    mb_detect_order,mb_substitute_character,mb_output_handler,%
+    mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,%
+    mb_convert_encoding,mb_detect_encoding,mb_convert_kana,%
+    mb_decode_mimeheader,mb_convert_variables,%
+    mb_decode_numericentity,mb_send_mail,mb_get_info,%
+    mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,%
+    mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,%
+    mb_ereg_search_getregs,mb_ereg_search_getpos,%
+  %--- mcal functions
+    mcal_open,mcal_popen,mcal_reopen,mcal_close,%
+    mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,%
+    mcal_append_event,mcal_store_event,mcal_delete_event,%
+    mcal_list_alarms,mcal_event_init,mcal_event_set_category,%
+    mcal_event_set_description,mcal_event_set_start,%
+    mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,%
+    mcal_date_valid,mcal_time_valid,mcal_day_of_week,%
+    mcal_date_compare,mcal_next_recurrence,%
+    mcal_event_set_recur_daily,mcal_event_set_recur_weekly,%
+    mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,%
+    mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,%
+  %--- mcrypt functions
+    mcrypt_get_cipher_name,mcrypt_get_block_size,%
+    mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,%
+    mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,%
+    mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,%
+    mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,%
+    mcrypt_enc_is_block_algorithm_mode,%
+    mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,%
+    mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,%
+    mcrypt_enc_get_modes_name,mcrypt_module_self_test,%
+    mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,%
+    mcrypt_module_get_algo_key_size,%
+  %--- mhash functions
+    mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,%
+  %--- misc functions
+    connection_aborted,connection_status,connection_timeout,%
+    define,defined,die,eval,exit,get_browser,highlight_file,%
+    ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,%
+    usleep,%
+  %--- mnogosearch functions
+    udm_add_search_limit,udm_alloc_agent,udm_api_version,%
+    udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,%
+    udm_free_agent,udm_free_ispell_data,udm_free_res,%
+    udm_get_res_field,udm_get_res_param,udm_load_ispell_data,%
+    udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,%
+  %--- msession functions
+    msession_connect,msession_disconnect,msession_count,%
+    msession_destroy,msession_lock,msession_unlock,msession_set,%
+    msession_uniq,msession_randstr,msession_find,msession_list,%
+    msession_set_array,msession_listvar,msession_timeout,%
+    msession_getdata,msession_setdata,msession_plugin,%
+  %--- msql functions
+    msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,%
+    msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,%
+    msql_fetch_field,msql_fetch_object,msql_fetch_row,%
+    msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,%
+    msql_free_result,msql_freeresult,msql_list_fields,%
+    msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,%
+    msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,%
+    msql_regcase,msql_result,msql_select_db,msql_selectdb,%
+  %--- mssql functions
+    mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,%
+    mssql_fetch_object,mssql_fetch_row,mssql_field_length,%
+    mssql_field_seek,mssql_field_type,mssql_free_result,%
+    mssql_min_error_severity,mssql_min_message_severity,%
+    mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,%
+    mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,%
+    mssql_guid_string,mssql_init,mssql_rows_affected,%
+  %--- muscat functions
+    muscat_setup,muscat_setup_net,muscat_give,muscat_get,%
+  %--- mysql functions
+    mysql_affected_rows,mysql_change_user,mysql_character_set_name,%
+    mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,%
+    mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,%
+    mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,%
+    mysql_fetch_row,mysql_field_flags,mysql_field_name,%
+    mysql_field_seek,mysql_field_table,mysql_field_type,%
+    mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,%
+    mysql_list_tables,mysql_num_fields,mysql_num_rows,%
+    mysql_ping,mysql_query,mysql_unbuffered_query,%
+    mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,%
+    mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,%
+  %--- network functions
+    checkdnsrr,closelog,debugger_off,debugger_on,%
+    fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,%
+    getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,%
+    pfsockopen,socket_get_status,socket_set_blocking,%
+    syslog,%
+  %--- nis functions
+    yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,%
+    yp_errno,yp_err_string,yp_all,yp_cat,%
+  %--- oci8 functions
+    OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,%
+    OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,%
+    OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,%
+    OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,%
+    OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,%
+    OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,%
+    OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,%
+    OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,%
+    OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,%
+    OCICollTrim,%
+  %--- oracle functions
+    Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,%
+    Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,%
+    Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,%
+    Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,%
+  %--- outcontrol functions
+    flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,%
+    ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,%
+  %--- ovrimos functions
+    ovrimos_connect,ovrimos_close,ovrimos_longreadlen,%
+    ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,%
+    ovrimos_result,ovrimos_result_all,ovrimos_num_rows,%
+    ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,%
+    ovrimos_free_result,ovrimos_commit,ovrimos_rollback,%
+  %--- pcntl functions
+    pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,%
+    pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,%
+    pcntl_exec,%
+  %--- pcre functions
+    preg_match,preg_match_all,preg_replace,preg_replace_callback,%
+    preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,%
+  %--- pdf functions
+    pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,%
+    pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,%
+    pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,%
+    pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,%
+    pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,%
+    pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,%
+    pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,%
+    pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,%
+    pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,%
+    pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,%
+    pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,%
+    pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,%
+    pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,%
+    pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,%
+    pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,%
+    pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,%
+    pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,%
+    pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,%
+    pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,%
+    pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,%
+    pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,%
+    pdf_set_info_title,pdf_set_leading,pdf_set_parameter,%
+    pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,%
+    pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,%
+    pdf_stringwidth,pdf_stroke,pdf_translate,%
+  %--- pfpro functions
+    pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,%
+  %--- pgsql functions
+    pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,%
+    pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,%
+    pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,%
+    pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,%
+    pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,%
+    pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,%
+    pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,%
+    pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,%
+    pg_send_query,pg_cancel_query,pg_connection_busy,%
+    pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,%
+    pg_result_error,%
+  %--- posix functions
+    posix_kill,posix_getpid,posix_getppid,posix_getuid,%
+    posix_getgid,posix_getegid,posix_setuid,posix_seteuid,%
+    posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,%
+    posix_setpgid,posix_getpgid,posix_getsid,posix_uname,%
+    posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,%
+    posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,%
+  %--- printer functions
+    printer_open,printer_abort,printer_close,printer_write,%
+    printer_set_option,printer_get_option,printer_create_dc,%
+    printer_start_doc,printer_end_doc,printer_start_page,%
+    printer_create_pen,printer_delete_pen,printer_select_pen,%
+    printer_delete_brush,printer_select_brush,printer_create_font,%
+    printer_select_font,printer_logical_fontheight,%
+    printer_draw_rectangle,printer_draw_elipse,printer_draw_text,%
+    printer_draw_chord,printer_draw_pie,printer_draw_bmp,%
+  %--- pspell functions
+    pspell_add_to_personal,pspell_add_to_session,pspell_check,%
+    pspell_config_create,pspell_config_ignore,pspell_config_mode,%
+    pspell_config_repl,pspell_config_runtogether,%
+    pspell_new,pspell_new_config,pspell_new_personal,%
+    pspell_store_replacement,pspell_suggest,%
+  %--- qtdom functions
+    qdom_tree,qdom_error,%
+  %--- readline functions
+    readline,readline_add_history,readline_clear_history,%
+    readline_info,readline_list_history,readline_read_history,%
+  %--- recode functions
+    recode_string,recode,recode_file,%
+  %--- regex functions
+    ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,%
+  %--- sem functions
+    sem_get,sem_acquire,sem_release,sem_remove,shm_attach,%
+    shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,%
+  %--- sesam functions
+    sesam_connect,sesam_disconnect,sesam_settransaction,%
+    sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,%
+    sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,%
+    sesam_field_array,sesam_fetch_row,sesam_fetch_array,%
+    sesam_free_result,%
+  %--- session functions
+    session_start,session_destroy,session_name,session_module_name,%
+    session_id,session_register,session_unregister,session_unset,%
+    session_get_cookie_params,session_set_cookie_params,%
+    session_encode,session_set_save_handler,session_cache_limiter,%
+    session_write_close,%
+  %--- shmop functions
+    shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,%
+  %--- snmp functions
+    snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,%
+    snmprealwalk,%
+  %--- strings functions
+    addcslashes,addslashes,bin2hex,chop,chr,chunk_split,%
+    count_chars,crc32,crypt,echo,explode,get_html_translation_table,%
+    hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,%
+    localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,%
+    print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,%
+    setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,%
+    strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,%
+    strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,%
+    strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,%
+    strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,%
+    vsprintf,wordwrap,%
+  %--- swf functions
+    swf_openfile,swf_closefile,swf_labelframe,swf_showframe,%
+    swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,%
+    swf_removeobject,swf_nextid,swf_startdoaction,%
+    swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,%
+    swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,%
+    swf_actiongotolabel,swf_enddoaction,swf_defineline,%
+    swf_definepoly,swf_startshape,swf_shapelinesolid,%
+    swf_shapefillsolid,swf_shapefillbitmapclip,%
+    swf_shapemoveto,swf_shapelineto,swf_shapecurveto,%
+    swf_shapearc,swf_endshape,swf_definefont,swf_setfont,%
+    swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,%
+    swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,%
+    swf_startbutton,swf_addbuttonrecord,swf_oncondition,%
+    swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,%
+    swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,%
+  %--- sybase functions
+    sybase_affected_rows,sybase_close,sybase_connect,%
+    sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,%
+    sybase_field_seek,sybase_free_result,sybase_get_last_message,%
+    sybase_min_error_severity,sybase_min_message_severity,%
+    sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,%
+    sybase_select_db,%
+  %--- uodbc functions
+    odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,%
+    odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,%
+    odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,%
+    odbc_fetch_object,odbc_field_name,odbc_field_num,%
+    odbc_field_len,odbc_field_precision,odbc_field_scale,%
+    odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,%
+    odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,%
+    odbc_tableprivileges,odbc_columns,odbc_columnprivileges,%
+    odbc_primarykeys,odbc_foreignkeys,odbc_procedures,%
+    odbc_specialcolumns,odbc_statistics,%
+  %--- url functions
+    base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,%
+    urlencode,%
+  %--- var functions
+    doubleval,empty,floatval,gettype,get_defined_vars,%
+    import_request_variables,intval,is_array,is_bool,is_double,%
+    is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,%
+    is_scalar,is_string,isset,print_r,serialize,settype,strval,%
+    unset,var_dump,var_export,is_callable,%
+  %--- vpopmail functions
+    vpopmail_add_domain,vpopmail_del_domain,%
+    vpopmail_add_domain_ex,vpopmail_del_domain_ex,%
+    vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,%
+    vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,%
+    vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,%
+  %--- w32api functions
+    w32api_set_call_method,w32api_register_function,%
+    w32api_deftype,w32api_init_dtype,%
+  %--- wddx functions
+    wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,%
+    wddx_add_vars,wddx_deserialize,%
+  %--- xml functions
+    xml_parser_create,xml_set_object,xml_set_element_handler,%
+    xml_set_processing_instruction_handler,xml_set_default_handler,%
+    xml_set_notation_decl_handler,%
+    xml_parse,xml_get_error_code,xml_error_string,%
+    xml_get_current_column_number,xml_get_current_byte_index,%
+    xml_parser_free,xml_parser_set_option,xml_parser_get_option,%
+    utf8_encode,xml_parser_create_ns,%
+    xml_set_start_namespace_decl_handler,%
+  %--- xslt functions
+    xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,%
+    xslt_set_sax_handler,xslt_set_scheme_handler,%
+    xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,%
+  %--- yaz functions
+    yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,%
+    yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,%
+    yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,%
+    yaz_wait,yaz_sort,%
+  %--- zip functions
+    zip_close,zip_entry_close,zip_entry_compressedsize,%
+    zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,%
+    zip_read,%
+  %--- zlib functions
+    gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,%
+    gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,%
+    gzdeflate,gzinflate,gzencode,},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+%%
+%% Prolog definition (c) 1997 Dominique de Waleffe
+%%
+\lst@definelanguage{Prolog}%
+  {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,%
+      assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,%
+      eof,fail,file,findall,write,functor,getc,integer,is,length,%
+      listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,%
+      private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,%
+      retract,retractall,save,see,seeing,seen,sh,skip,statistics,%
+      subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,%
+      untrace,var,write},%
+   sensitive=f,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%%
+%% classic rexx listings definition
+%% by Patrick TJ McPhee <ptjm@interlog.com>
+%%
+\lst@definelanguage{Rexx}
+  {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,%
+                 interpret,leave,nop,numeric,options,otherwise,parse,%
+                 procedure,pull,push,queue,return,say,signal,then,to,%
+                 trace,when},%
+   sensitive=false,%
+   morecomment=[n]{/*}{*/},%
+   morestring=[d]{'},%
+   morestring=[d]{"},%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Ruby}%
+  {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,%
+      case,class,def,defined?,do,else,elsif,end,ensure,false,for,%
+      if,in,module,next,nil,not,or,redo,rescue,retry,return,self,%
+      super,then,true,undef,unless,until,when,while,yield},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[s]{=BEGIN}{=END},%
+   morestring=[b]',%
+   morestring=[b]",%
+   morestring=[s]{\%q/}{/},%
+   morestring=[s]{\%q!}{!},%
+   morestring=[s]{\%q\{}{\}},%
+   morestring=[s]{\%q(}{)},%
+   morestring=[s]{\%q[}{]},%
+   morestring=[s]{\%q-}{-},%
+   morestring=[s]{\%Q/}{/},%
+   morestring=[s]{\%Q!}{!},%
+   morestring=[s]{\%Q\{}{\}},%
+   morestring=[s]{\%Q(}{)},%
+   morestring=[s]{\%Q[}{]},%
+   morestring=[s]{\%Q-}{-}%
+  }[keywords,comments,strings]%
+%%
+%% SHELXL definition (c) 1999 Aidan Philip Heerdegen
+%%
+\lst@definelanguage{SHELXL}%
+  {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,%
+      REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,%
+      MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,%
+      EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,%
+      FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,%
+      WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,%
+      FMAP,GRID,PLAN,MOLE},%
+   sensitive=false,%
+   alsoother=_,% Makes the syntax highlighting ignore the underscores
+   morecomment=[l]{! },%
+  }%
+%%
+%% Tcl/Tk definition (c) Gerd Neugebauer
+%%
+\lst@definelanguage[tk]{tcl}[]{tcl}%
+  {morekeywords={activate,add,separator,radiobutton,checkbutton,%
+      command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,%
+      canvasy,cascade,cget,checkbutton,config,configu,configur,%
+      configure,clipboard,create,arc,bitmap,image,line,oval,polygon,%
+      rectangle,text,textwindow,curselection,delete,destroy,end,entry,%
+      entrycget,event,focus,font,actual,families,measure,metrics,names,%
+      frame,get,grab,current,release,status,grid,columnconfigure,%
+      rowconfigure,image,image,create,bitmap,photo,delete,height,types,%
+      widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,%
+      menu,menubutton,message,move,option,add,clear,get,readfile,pack,%
+      photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,%
+      selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,%
+      tkwait,window,variable,visibility,toplevel,unknown,update,winfo,%
+      class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,%
+      width,height,wm,aspect,client,command,deiconify,focusmodel,frame,%
+      geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,%
+      iconwindow,maxsize,minsize,overrideredirect,positionfrom,%
+      protocol,sizefrom,state,title,transient,withdraw,xview,yview,%
+      yposition,%
+      -accelerator,-activebackground,-activeborderwidth,%
+      -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,%
+      -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,%
+      -borderwidth,-button,-capstyle,-channel,-class,-closeenough,%
+      -colormap,-column,-columnspan,-command,-confine,-container,%
+      -count,-cursor,-data,-default,-detail,-digits,-direction,%
+      -displayof,-disableforeground,-elementborderwidth,-expand,%
+      -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,%
+      -fontmap,-foreground,-format,-from,-gamma,-global,-height,%
+      -highlightbackground,-highlightcolor,-highlightthickness,-icon,%
+      -image,-in,-insertbackground,-insertborderwidth,-insertofftime,%
+      -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,%
+      -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,%
+      -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,%
+      -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,%
+      -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,%
+      -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,%
+      -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,%
+      -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,%
+      -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,%
+      -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,%
+      -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,%
+      -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,%
+      -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,%
+      -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,%
+      -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,%
+      -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,%
+      activate,add,addtag,bbox,cget,clone,configure,coords,%
+      curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,%
+      entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,%
+      icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,%
+      moveto,own,post,postcascade,postscript,put,redither,ranges,%
+      scale,select,show,tag,type,unpost,xscrollcommand,xview,%
+      yscrollcommand,yview,yposition}%
+  }%
+\lst@definelanguage[]{tcl}%
+  {alsoletter={.:,*=&-},%
+   morekeywords={after,append,array,names,exists,anymore,donesearch,%
+      get,nextelement,set,size,startsearch,auto_mkindex,binary,break,%
+      case,catch,cd,clock,close,concat,console,continue,default,else,%
+      elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,%
+      fconfigure,fcopy,file,atime,dirname,executable,exists,extension,%
+      isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,%
+      rootname,size,stat,tail,type,writable,-permissions,-group,-owner,%
+      -archive,-hidden,-readonly,-system,-creator,-type,-force,%
+      fileevent,flush,for,foreach,format,gets,glob,global,history,if,%
+      incr,info,argsbody,cmdcount,commands,complete,default,exists,%
+      globals,level,library,locals,patchlevel,procs,script,tclversion,%
+      vars,interp,join,lappend,lindex,linsert,list,llength,lrange,%
+      lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,%
+      -real,-dictionary,-increasing,-decreasing,-index,-command,load,%
+      namespace,open,package,forget,ifneeded,provide,require,unknown,%
+      vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,%
+      regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,%
+      socket,source,split,string,compare,first,index,last,length,match,%
+      range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,%
+      time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,%
+      vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,%
+      hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round%
+      },%
+   morestring=[d]",%
+   morecomment=[f]\#,%
+   morecomment=[l]{;\#},%
+   morecomment=[l]{[\#},%
+   morecomment=[l]{\{\#}%
+  }[keywords,comments,strings]%
+%%
+%% VBScript definition (c) 2000 Sonja Weidmann
+%%
+\lst@definelanguage{VBScript}%
+  {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,%
+      Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,%
+      Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,%
+      Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,%
+      CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,%
+      Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,%
+      FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,%
+      IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,%
+      LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,%
+      MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,%
+      ScriptEngineBuildVersion,ScriptEngineMajorVersion,%
+      ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,%
+      StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,%
+      UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,%
+      Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,%
+      CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,%
+      DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,%
+      FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,%
+      GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,%
+      GetExtensionName,GetFile,GetFileName,GetFolder,%
+      GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,%
+      MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,%
+      ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,%
+      WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,%
+      Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,%
+      RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,%
+      TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,%
+      Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,%
+      vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,%
+      vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,%
+      vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,%
+      vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,%
+      vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,%
+      vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,%
+      vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,%
+      vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,%
+      vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,%
+      vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,%
+      vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,%
+      vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,%
+      vbYellow,vbYesNo,vbYesNoCancel},%
+   sensitive=f,%
+   morecomment=[l]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% VRML definition (c) 2001 Oliver Baum
+%%
+\lst@definelanguage[97]{VRML}
+  {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,%
+      eventIn,eventOut,exposedField,field,Introduction,Anchor,%
+      Appearance,AudioClip,Background,Billboard,Box,Collision,Color,%
+      ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,%
+      Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,%
+      Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,%
+      Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,%
+      NormalInterpolator,OrientationInterpolator,PixelTexture,%
+      PlaneSensor,PointLight,PointSet,PositionInterpolator,%
+      ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,%
+      SphereSensor,SpotLight,Switch,Text,TextureCoordinate,%
+      TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,%
+      VisibilitySensor,WorldInfo},%
+   morecomment=[l]\#,% bug: starts comment in the first column
+   morestring=[b]"%
+  }[keywords,comments,strings]
+\endinput
+%%
+%% End of file `lstlang2.sty'.
Index: doc/LaTeXmacros/listings/lstlang3.sty
===================================================================
--- doc/LaTeXmacros/listings/lstlang3.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstlang3.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,1616 @@
+%%
+%% This is file `lstlang3.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx  (with options: `lang3')
+%% 
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\ProvidesFile{lstlang3.sty}
+    [2015/06/04 1.6 listings language file]
+\lst@definelanguage[68]{Algol}%
+  {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,%
+      char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,%
+      end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,%
+      goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,%
+      minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,%
+      overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,%
+      round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,%
+      timesab,to,true,union,up,upb,void,while},%
+   sensitive=f,% ???
+   morecomment=[s]{\#}{\#},%
+   keywordcomment={co,comment}%
+  }[keywords,comments,keywordcomments]%
+\lst@definelanguage[60]{Algol}%
+  {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,%
+      false,for,goto,if,integer,label,own,power,procedure,real,step,%
+      string,switch,then,true,until,value,while},%
+   sensitive=f,% ???
+   keywordcommentsemicolon={end}{else,end}{comment}%
+  }[keywords,keywordcomments]%
+%%
+%% Motorola 68K definition (c) 2006 Michael Franke
+%%
+\lst@definelanguage[Motorola68k]{Assembler}%
+ {morekeywords={ABCD,ADD,%
+ADDA,ADDI,ADDQ,ADDX,AND,ANDI,ASL,ASR,BCC,BLS,BCS,BLT,BEQ,BMI,BF,BNE,BGE,BPL,%
+BGT,BT,BHI,BVC,BLE,BVS,BCHG,BCLR,BRA,BSET,BSR,BTST,CHK,CLR,CMP,CMPA,CMPI,CMPM,%
+DBCC,DBLS,DBCS,DBLT,DBEQ,DBMI,DBF,DBNE,DBGE,DBPL,DBGT,DBT,DBHI,DBVC,DBLE,DBVS,DIVS,%
+DIVU,EOR,EORI,EXG,EXT,ILLEGAL,JMP,JSR,LEA,LINK,LSL,LSR,MOVE,MOVEA,MOVEM,MOVEP,MOVEQ,%
+MULS,MULU,NBCD,NEG,NEGX,NOP,NOT,OR,ORI,PEA,RESET,ROL,ROR,ROXL,ROXR,RTE,RTR,RTS,SBCD,%
+SCC,SLS,SCS,SLT,SEQ,SMI,SF,SNE,SGE,SPL,SGT,ST,SHI,SVC,SLE,SVS,STOP,SUB,SUBA,SUBI,SUBQ,%
+SUBX,SWAP,TAS,TRAP,TRAPV,TST,UNLK},%
+   sensitive=false,%
+   morecomment=[l]*,%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%%
+%% x86masm definition (c) 2002 Andrew Zabolotny
+%%
+\lst@definelanguage[x86masm]{Assembler}%
+  {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,%
+      si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,%
+      db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,%
+      st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,%
+      btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,%
+      cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,%
+      inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,%
+      je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,%
+      jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,%
+      lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,%
+      loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,%
+      movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,%
+      popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,%
+      repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,%
+      setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,%
+      setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,%
+      setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,%
+      shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,%
+      test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,%
+      fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,%
+      fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,%
+      fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,%
+      fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,%
+      fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,%
+      fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},%
+   morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,%
+      .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,%
+      endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,%
+      .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,%
+      .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,%
+      ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,%
+      .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,%
+      name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.%
+      radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,%
+      .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,%
+      word,.xall,.xcref,.xlist},%
+   alsoletter=.,alsodigit=?,%
+   sensitive=f,%
+   morestring=[b]",%
+   morestring=[b]',%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%%
+%% Clean definition (c) 1999 Jos\'e Romildo Malaquias
+%%
+%% Clean 1.3 :  some standard functional language: pure, lazy,
+%%              polymorphic type system, modules, type classes,
+%%              garbage collection, functions as first class citizens
+%%
+\lst@definelanguage{Clean}%
+  {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,%
+      [,],!,.,\\\\,;,_},%
+   morekeywords={from,definition,implementation,import,module,system,%
+      case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},%
+   morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,%
+      File,ProcId},%
+   sensitive,%
+   morecomment=[l]//,% missing comma: Markus Pahlow
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage{CIL}%
+  {morekeywords=[1]{assembly,beforefieldinit,class,default,cdecl,cil,corflags,%
+                    culture,custom,data,entrypoint,fastcall,field,file,%
+                    hidebysig,hash,il,imagebase,locals,managed,marshall,%
+                    maxstack,mresource,method,module,namespace,publickey,%
+                    stdcall,subsystem,thiscall,unmanaged,vararg,ver,vtfixup,%
+                   % types
+                    bool,char,float32,float64,int,int8,int16,int32,%
+                    int64,method,native,object,string,modopt,modreq,pinned,%
+                    typedref,valuetype,unsigned,void,%
+                   % defining types
+                    abstract,ansi,auto,autochar,beforefieldinit,boxed,class,%
+                    explicit,extends,implements,interface,famandassem,family,%
+                    famorassem,inherits,nested,override,pack,private,property,%
+                    public,rtspecialname,sealed,sequential,serializable,size,%
+                    specialname,static,unicode,%
+                   % postfix
+                    algorithm,alignment,extern,init,from,nometadata,with},%
+  morekeywords=[2]{add,and,arglist,beq,bge,bgt,ble,blt,bne,br,break,brfalse,%
+                    brtrue,call,calli,ceq,cgt,ckfinite,clt,conv,cpblk,div,%
+                    dup,endfilter,endfinally,initblk,jmp,ldarg,ldarga,ldc,%
+                    ldftn,ldind,ldloc,ldloca,ldnull,leave,localloc,mul,neg,%
+                    nop,not,or,pop,rem,ret,shl,shr,starg,stind,stloc,sub,%
+                    switch,xor,%
+                   % prefix
+                    tail,unaligned,volatile,%
+                   % postfix
+                    un,s,ovf,%
+                   % object
+                    box,callvirt,castclass,cpobj,cctor,ctor,initobj,isinst,%
+                    ldelem,ldelema,ldfld,ldflda,ldlen,ldobj,ldsfld,ldsflda,%
+                    ldstr,ldtoken,ldvirtftn,mkrefany,newarr,newobj,refanytype,%
+                    refanyval,rethrow,sizeof,stelem,stfld,stobj,stsfld,throw,%
+                    unbox},%
+  sensitive=true,%
+  morecomment=[l]{//},%
+  morestring=[b]"%
+}[keywords,comments,strings]%
+\lst@definelanguage{Comal 80}%
+  {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,%
+      ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,%
+      MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,%
+      SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},%
+   sensitive=f,% ???
+   morecomment=[l]//,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage[WinXP]{command.com}%
+  {morekeywords={assoc,at,attrib,bootcfg,break,cacls,call,cd,chcp,chdir,%
+      chkdsk,chkntfs,cls,cmd,cmdextversion,color,comp,compact,convert,copy,%
+      date,defined,del,dir,diskcomp,diskcopy,do,doskey,echo,else,endlocal,%
+      erase,errorlevel,exist,exit,fc,find,findstr,for,format,ftype,goto,%
+      graftabl,help,if,in,label,md,mkdir,mode,more,move,not,off,path,%
+      pause,popd,print,prompt,pushd,rd,recover,ren,rename,replace,rmdir,%
+      set,setlocal,shift,sort,start,subst,time,title,tree,type,ver,%
+      verify,vol,xcopy},%
+   sensitive=false,%
+   alsoother={@},%
+   alsoletter={\%~:-/},%
+   morecomment=[l]{rem},%
+   morecomment=[l]{reM},%
+   morecomment=[l]{rEm},%
+   morecomment=[l]{rEM},%
+   morecomment=[l]{Rem},%
+   morecomment=[l]{ReM},%
+   morecomment=[l]{REm},%
+   morecomment=[l]{REM},%
+   morestring=[d]"%
+}[keywords,comments,strings]%
+\lst@definelanguage{Comsol}%
+  {morekeywords={%
+      adaption,arc1,arc2,arrayr,assemble,asseminit,beziercurve2,block2,%
+      block3,bsplinecurve2,bsplinecurve3,bsplinesurf3,bypassplot,cardg,%
+      ccoeffgroup,chamfer,checkgeom,circ1,circ2,coeff2cell,comsol,%
+      cone2,cone3,Contents,createhexes,createprisms,createquads,csgbl2,%
+      csgbl3,csgcmpbz,csgimplbz,csginitaux,csginitnr,csgproputil,%
+      csgrbconv,csgunique3,csguniquep,csgversion,csgvvovl,curve2,%
+      curve3,cylinder2,cylinder3,dat2str,defastget,display,drawgetobj,%
+      drawreobj,drawsetobj,dst,duplicate,dxflayers,dxfread,dxfwrite,%
+      econe2,econe3,eigloop,elcconstr,elcplbnd,elcplextr,elcplproj,%
+      elcplscalar,elempty,elemreobj,eleqc,eleqw,elevate,elgeom,ellip1,%
+      ellip2,ellipsoid2,ellipsoid3,ellipsoidgen_fl23,elmat,elovar,%
+      elpconstr,elshape,elvar,elvarm,embed,extrude,face3,faceprim3,%
+      fastsetop,fem2jxfem,femblocksu,femdiff,femeig,femexport,femgui,%
+      femimport,femiter,femlab,femlin,femmesh,femmeshexp,femnlin,%
+      femplot,femsfun,femsim,femsimlowlevel,femsimserver,femsol,%
+      femsolver,femstate,femstruct,femtime,femwave,festyle,fieldnames,%
+      fillet,fl1d,fl2d,fl3d,flaction,flafun,flappconvert,flappobj,%
+      flaxisequal,flbase,flbinary,flc1hs,flc2hs,flcanpnt,flcell2draw,%
+      flclear,flcolorbar,flcompact,flconeplot,flcontour2mesh,%
+      flcontour2meshaux,flconvreact,flconvreact1d,flconvreact2d,%
+      flconvreact3d,flcyl,fldc1hs,fldc2hs,fldegree,fldegreer3,%
+      fldegreet3,fldimvarsget,fldisp,fldraw2cell,fldrawnow,fldsmhs,%
+      fldsmsign,flevalmat,flexch,flexchprop,flfastgeom,flform,flgc,%
+      flgcbo,flgdconv,flgeom2cellstr,flgeomadj,flgeomarcize,flgeomec,%
+      flgeomed,flgeomepol,flgeomes,flgeomfc,flgeomfd,flgeomfdp,%
+      flgeomff1,flgeomff2,flgeomfn,flgeomfs,flgeomgetlocalsys,%
+      flgeominit,flgeominitprop,flgeomitransform,flgeomloft,flgeommesh,%
+      flgeomnbs,flgeomnes,flgeomnmr,flgeomnv,flgeompsinv,flgeomrmsing,%
+      flgeomrotp,flgeomsd,flgeomsdim,flgeomse,flgeomsf2,flgeomspm,%
+      flgeomtransform,flgeomud,flgeomvtx,flgetdraw,flheat,flheat1d,%
+      flheat2d,flheat3d,flhelmholtz,flhelmholtz1d,flhelmholtz2d,%
+      flhelmholtz3d,flim2curve,flinterp1,fliscont,flismember,%
+      flisnumeric,fljaction,fllaplace,fllaplace1d,fllaplace2d,%
+      fllaplace3d,flload,flloadfl,flloadmatfile,flloadmfile,%
+      fllobj2cellstr,flmakeevalstr,flmapsoljac,flmat2str,flmatch,%
+      flmesh2spline,flmesh2splineaux,flml65setup,flngdof,flnull,%
+      flnullorth,flpde,flpdeac,flpdec,flpdec1d,flpdec2d,flpdec3d,%
+      flpdedc,flpdedc2d,flpdedc3d,flpdedf,flpdedf1d,flpdedf2d,%
+      flpdedf3d,flpdees,flpdees2d,flpdees3d,flpdeg,flpdeg1d,flpdeg2d,%
+      flpdeg3d,flpdeht,flpdeht1d,flpdeht2d,flpdeht3d,flpdems,flpdems2d,%
+      flpdems3d,flpdens,flpdens2d,flpdens3d,flpdepn,flpdeps,flpdesm3d,%
+      flpdew,flpdew1d,flpdew2d,flpdew3d,flpdewb,flpdewb1d,flpdewb2d,%
+      flpdewb3d,flpdewc,flpdewc1d,flpdewc2d,flpdewc3d,flpdewe,%
+      flpdewe3d,flpdewp,flpdewp2d,flpdewp3d,flplot,flpoisson,%
+      flpoisson1d,flpoisson2d,flpoisson3d,flpric2,flpric3,flreobj,%
+      flreport,flresolvepath,flsave,flschrodinger,flschrodinger1d,%
+      flschrodinger2d,flschrodinger3d,flsde,flsdp,flsdt,flsetalpha,%
+      flsetdraw,flsmhs,flsmsign,flspnull,fltherm_cond1,fltrg,flversion,%
+      flversions,flverver,flwave,flwave1d,flwave2d,flwave3d,%
+      flwriteghist,formstr,gdsread,gencyl2,gencyl3,genextrude,%
+      genextrudeaux,geom,geom0,geom0get,geom1,geom1get,geom2,geom2get,%
+      geom3,geom3get,geom3j2m,geom3m2j,geomaddlblmargin,geomanalyze,%
+      geomarrayr,geomassign,geomcoerce,geomcomp,geomconnect,geomcopy,%
+      geomcsg,geomdel,geomedit,geomexport,geomfile,geomget,%
+      geomgetlabels,geomgetwrkpln,geomimport,geominfo,geominfoaux,%
+      geomlblplot,geomload,geomnumparse,geomobject,geomparse,geomplot,%
+      geomplot1,geomplot2,geomplot3,geomposition,geomproputil,%
+      geomreconstruct,geomreobj,geomserver,geomspline,geomsurf,%
+      geomupdate,get,getfemgeom,getisocurve,getjptr,getmesh,getsdim,%
+      getvmatrixexch,handlesolnumstr,helix1,helix2,helix3,hexahedron2,%
+      hexahedron3,histfrommat,idst,igesread,importplotdata,isempty,%
+      isfield,isfunc,isscript,javaclass,jproputil,jptr2geom,jptrgeom1,%
+      jptrgeom1_fl23,jptrgeom2,jptrgeom2_fl23,jptrgeom3,jptrgeom3_fl23,%
+      keiter,line1,line2,loadobj,loft,matlabinterpdata,mesh2geom,%
+      meshassign,meshcaseadd,meshcasedel,meshcaseutil,meshcheck,%
+      meshembed,meshenrich,meshenrich1,meshenrich2,meshenrich3,%
+      meshexport,meshextend,meshextrude,meshget,meshimport,meshinit,%
+      meshintegrate,meshmap,meshoptim,meshparse,meshplot,meshplot1,%
+      meshplot2,meshplot3,meshplotproputil,meshpoi,meshproputil,%
+      meshptplot,meshqual,meshrefine,meshrevolve,meshsmooth,%
+      meshsmooth2,meshsweep,meshvolume,minus,mirror,mkreflparams,%
+      mmsolve,modetype,move,moveglobalfields,mphproputil,mtimes,%
+      multiphysics,mypostinterp,notscript,onlyelsconstr,outassign,%
+      paramgeom,pde2draw,pde2equ,pde2fem,pde2geom,pdeblxpd,plus,point1,%
+      point2,point3,poisson,poly1,poly2,postanim,postapplysettings,%
+      postarrow,postarrowbnd,postcolorbar,postcont,postcontdomind,%
+      postcoord,postcopyprop,postcrossplot,postdistrprops,posteval,%
+      postflow,postfnd,postgeomplot,postgetfem,postgetstylecolor,%
+      postglobaleval,postglobalplot,postgp,postinit,postint,postinterp,%
+      postiso,postlin,postmakecontcol,postmax,postmaxmin,postmin,%
+      postmkcontbar,postmknormexpr,postmovie,postnewplot,%
+      postoldmaxminprops,postpd2pm,postplot,postplotconstants,%
+      postpm2pd,postprinc,postprincbnd,postprocgui,postproputil,%
+      postslice,postsurf,posttet,posttitle,print2file,pyramid2,%
+      pyramid3,rect1,rect2,restorefields,revolve,rmfield,rotate,%
+      rotmatrix,scale,serialize,set,setmesh,sh2str,sharg_2_5,shbub,%
+      shdisc,shdiv,shherm,shlag,shvec,simplecoerce,simreobj,slblocks,%
+      solassign,solid0,solid1,solid2,solid3,solidprim3,solproputil,%
+      solsize,solveraddcases,sphere2,sphere3,spiceimport,splineaux,%
+      split,splittoprim,square1,square2,stlread,submode,submodes,%
+      subsasgn,subsref,tangent,taucs,tetrahedron2,tetrahedron3,%
+      tobsplines,torus2,torus3,transform,update,updateassoc,%
+      updateassocinfo,updatefem,updateguistruct,updateobj,vrmlread,%
+      xmeshinfo,xmeshinit},%
+   sensitive=false,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Elan}%
+  {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,%
+      COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,%
+      ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,%
+      INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,%
+      PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,%
+      TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,%
+      maxint,sign,abs,min,max,random,initializerandom,subtext,code,%
+      replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,%
+      pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,%
+      arctand,int,real,lastconversionok,put,putline,line,page,get,%
+      getline,input,output,sequentialfile,maxlinelaenge,reset,eof,%
+      close,complexzero,complexone,complexi,complex,realpart,imagpart,%
+      dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,%
+      replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},%
+   sensitive,%
+   morestring=[d]"%
+  }[keywords,strings]%
+%%
+%% Erlang definition (c) 2003 Daniel Gazard
+%%
+\lst@definelanguage{erlang}%
+  {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,%
+      binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,%
+      date,div,element,erase,end,exit,export,float,float_to_list,%
+      get,halt,hash,hd,if,info,import,integer,integer_to_list,%
+      length,link,list,list_to_atom,list_to_float,list_to_integer,%
+      list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,%
+      processes,put,receive,reference,register,registered,rem,%
+      round,self,setelement,size,spawn,throw,time,tl,trace,trunc,%
+      tuple,tuple_to_list,unlink,unregister,whereis,error,false,%
+      infinity,nil,ok,true,undefined,when},%
+   otherkeywords={->,!,[,],\{,\}},%
+   morecomment=[l]\%,%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Scala}%
+  {morekeywords={abstract,case,catch,class,def,%
+    do,else,extends,false,final,finally,%
+    for,if,implicit,import,lazy,match,mixin,%
+    new,null,object,override,package,%
+    private,protected,requires,return,sealed,%
+    super,this,trait,true,try,%
+    type,val,var,while,with,yield},%+
+otherkeywords={=,=>,<-,<\%,<:,>:,\#,@},%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]',%
+   morestring=[b]""",%
+  }[keywords,comments,strings]%
+\lst@definelanguage{ksh}
+  {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,%
+      for,in,do,done,select,case,esac,while,until,function,%
+      time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,%
+      glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,umask,unalias,%
+      unset,wait,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]',%
+   morestring=[d]`%
+  }[keywords,comments,strings]%
+\lst@definelanguage{Lingo}
+  {morekeywords={abort,after,and,before,do,down,halt,me,new,not,of,%
+      on,or,otherwise,pass,put,result,return,set,tell,the,then,to,with,%
+      repeat,while,case,if,else,true,false,global,property,\_global,\_key,%
+      \_mouse,\_movie,\_player,\_sound,\_system,abbr,abbrev,abbreviated,abs,%
+      actionsenabled,activateapplication,activatewindow,active3drenderer,%
+      activecastlib,activewindow,actorlist,add,addat,addbackdrop,addcamera,%
+      addchild,addmodifier,addoverlay,addprop,addtoworld,addvertex,alert,%
+      alerthook,alignment,allowcustomcaching,allowgraphicmenu,allowsavelocal,%
+      allowtransportcontrol,allowvolumecontrol,allowzooming,alphathreshold,%
+      ambient,ambientcolor,ancestor,angle,anglebetween,animationenabled,%
+      antialias,antialiasthreshold,append,applicationname,applicationpath,%
+      appminimize,atan,attenuation,attributevalue,auto,autoblend,automask,%
+      autotab,axisangle,back,backcolor,backdrop,backgroundcolor,backspace,%
+      beep,beepon,beginrecording,beginsprite,beveldepth,beveltype,bgcolor,%
+      bias,bitand,bitmap,bitmapsizes,bitnot,bitor,bitrate,bitspersample,%
+      bitxor,blend,blendconstant,blendconstantlist,blendfactor,blendfunction,%
+      blendfunctionlist,blendlevel,blendrange,blendsource,blendsourcelist,%
+      blendtime,bone,bonesplayer,border,both,bottom,bottomcap,bottomradius,%
+      bottomspacing,boundary,boundingsphere,box,boxdropshadow,boxtype,%
+      breakconnection,breakloop,brightness,broadcastprops,browsername,%
+      buffersize,build,buttonsenabled,buttonstyle,buttontype,bytesstreamed,%
+      boolean,cachedocverify,cachesize,call,callancestor,camera,cameracount,%
+      cameraposition,camerarotation,cancelidleload,castlib,castlibnum,%
+      castmemberlist,center,centerregpoint,centerstage,changearea,channelcount,%
+      char,characterset,charpostoloc,chars,charspacing,chartonum,%
+      checkboxaccess,checkboxtype,checkmark,checknetmessages,child,chunksize,%
+      clearatrender,clearcache,clearerror,clearframe,clearglobals,clearvalue,%
+      clickloc,clickmode,clickon,clone,clonedeep,clonemodelfromcastmember,%
+      clonemotionfromcastmember,close,closed,closewindow,closexlib,collision,%
+      collisiondata,collisionnormal,color,world,colorbuffer,colorbufferdepth,%
+      colordepth,colorlist,colorrange,colors,colorsteps,commanddown,comments,%
+      compressed,connecttonetserver,constrainh,constraint,constrainv,,%
+      continue,controldown,controller,copypixels,copyrightinfo,copyto,%
+      copytoclipboard,cos,count,cpuhogticks,creaseangle,creases,[contains],%
+      createfolder,createmask,creatematte,creationdate,creator,crop,cross,%
+      crossproduct,cuepassed,cuepointnames,cuepointtimes,currentloopstate,%
+      currentspritenum,currenttime,cursor,cursorsize,curve,cylinder,ate,day,%
+      deactivateapplication,deactivatewindow,debug,debugplaybackenabled,%
+      decaymode,defaultrect,defaultrectmode,delay,delete,deleteall,deleteat,%
+      deletecamera,deletefolder,deleteframe,deletegroup,deletelight,%
+      deletemodel,deletemodelresource,deletemotion,deleteone,deleteprop,%
+      deleteshader,deletetexture,deletevertex,density,depth,depthbufferdepth,%
+      desktoprectlist,diffuse,diffusecolor,diffuselightmap,%
+      digitalvideotimescale,digitalvideotype,direction,directionalcolor,%
+      directionalpreset,directtostage,disableimagingtransformation,displayface,%
+      displaymode,distanceto,distribution,dither,done,doneparsing,dot,%
+      dotproduct,doubleclick,downloadnetthing,drag,draw,drawrect,dropshadow,%
+      duplicate,duplicateframe,duration,editable,editshortcutsenabled,%
+      elapsedtime,emissive,emitter,empty,emulatemultibuttonmouse,enabled,%
+      enablehotspot,end,endangle,endcolor,endframe,endrecording,endsprite,%
+      endtime,enter,enterframe,environment,erase,error,eventpassmode,%
+      exchange,exists,exit,exitframe,exitlock,exp,externalevent,%
+      externalparamcount,externalparamname,externalparamvalue,extractalpha,%
+      extrude3d,face,fadein,fadeout,fadeto,far,field,fieldofview,filename,%
+      fill,fillcolor,fillcycles,filldirection,filled,fillmode,filloffset,%
+      fillscale,findempty,findlabel,findpos,findposnear,finishidleload,%
+      firstindent,fixedlinespace,fixedrate,fixstagesize,flashrect,flashtostage,%
+      flat,fliph,flipv,float,floatp,floatprecision,flush,flushinputevents,%
+      fog,folderchar,font,fontsize,fontstyle,forecolor,forget,frame,%
+      framecount,framelabel,framepalette,framerate,frameready,framescript,%
+      framesound1,framesound2,framestohms,frametempo,frametransition,freeblock,%
+      freebytes,fromcastmember,fromimageobject,front,frontwindow,%
+      generatenormals,getaprop,getat,getbehaviordescription,getbehaviortooltip,%
+      getboneid,geterror,geterrorstring,gethardwareinfo,gethotspotrect,getlast,%
+      getlatestnetid,getnetaddresscookie,getneterrorstring,getnetmessage,%
+      getnetoutgoingbytes,getnettext,getnormalized,getnthfilenameinfolder,%
+      getnumberwaitingnetmessages,getone,getpeerconnectionlist,getpixel,%
+      getplaylist,getpos,getpref,getprop,getpropat,getpropertydescriptionlist,%
+      getrendererservices,getstreamstatus,gettemppath,getworldtransform,globals,%
+      glossmap,go,gotoframe,gotonetmovie,gotonetpage,gradienttype,gravity,%
+      group,handler,handlers,height,heightvertices,high,highlightpercentage,%
+      highlightstrength,hilite,hither,hittest,hmstoframes,hold,hotspot,html,%
+      hyperlink,hyperlinkclicked,hyperlinkrange,hyperlinks,hyperlinkstate,%
+      id3tags,identity,idle,idlehandlerperiod,idleloaddone,idleloadmode,%
+      idleloadperiod,idleloadtag,idlereadchunksize,ilk,image,imagecompression,%
+      imageenabled,imagequality,immovable,importfileinto,inflate,ink,inker,%
+      inlineimeenabled,insertbackdrop,insertframe,insertoverlay,inside,%
+      installmenu,instance,integer,integerp,interface,interpolate,%
+      interpolateto,intersect,index,interval,inverse,invert,invertmask,%
+      isbusy,isinworld,isoktoattach,ispastcuepoint,item,itemdelimiter,kerning,%
+      kerningthreshold,key,keyboardfocussprite,keycode,keydown,keydownscript,%
+      keyframeplayer,keypressed,keyup,keyupscript,label,labellist,last,%
+      lastchannel,lastclick,lastevent,lastframe,lastkey,lastroll,left,%
+      leftindent,length,lengthvertices,level,lifetime,light,line,linearlist,%
+      linecolor,linecount,linedirection,lineheight,lineoffset,linepostolocv,%
+      linesize,linkas,linked,list,listp,loaded,loadfile,loc,loch,locked,%
+      locktranslation,loctocharpos,locv,locvtolinepos,locz,lod,log,long,%
+      loop,loopcount,loopendtime,loopsremaining,loopstarttime,machinetype,%
+      magnitude,map,mapImageToStage,mapmembertostage,mapstagetomember,margin,%
+      marker,markerlist,mask,max,maxinteger,maxspeed,mci,media,mediaready,%
+      member,membernum,members,memorysize,menu,mesh,meshdeform,milliseconds,%
+      min,minspeed,modal,mode,model,modela,modelb,modelresource,%
+      modelsunderloc,modelsunderray,modelunderloc,modified,modifiedby,%
+      modifieddate,modifier,modifiers,month,mostrecentcuepoint,motion,%
+      mousechar,mousedown,mousedownscript,mouseenter,mouseh,mouseitem,%
+      mouseleave,mouselevel,mouseline,mouseloc,mousemember,mouseoverbutton,%
+      mouseup,mouseupoutside,mouseupscript,mousev,mousewithin,mouseword,move,%
+      moveablesprite,movetoback,movetofront,movevertex,movevertexhandle,%
+      movewindow,movie,movieaboutinfo,moviecopyrightinfo,moviefilefreesize,%
+      moviefilesize,moviefileversion,movieimagecompression,movieimagequality,%
+      moviename,moviepath,movierate,movietime,moviextralist,mpeglayer,%
+      multiply,multisound,name,near,nearfiltering,neighbor,netabort,netdone,%
+      neterror,netlastmoddate,netmime,netpresent,netstatus,nettextresult,%
+      netthrottleticks,newcamera,newcurve,newgroup,newlight,newmesh,newmodel,%
+      newmodelresource,newmotion,newshader,newtexture,next,none,normalize,%
+      normallist,normals,nothing,notify,nudge,number,numchannels,%
+      numparticles,numsegments,numtochar,objectp,offset,open,openresfile,%
+      openwindow,openxlib,optiondown,organizationname,originalfont,originh,%
+      originmode,originpoint,originv,orthoheight,overlay,pageheight,palette,%
+      palettemapping,paletteref,paletteindex,pan,paragraph,param,paramcount,%
+      parent,parsestring,particle,pasteclipboardinto,path,pathname,%
+      pathstrength,pattern,pause,pausedatstart,pausestate,percentplayed,%
+      percentstreamed,period,perpendicularto,persistent,pi,picture,picturep,%
+      plane,platform,play,playbackmode,playfile,playing,playlist,playnext,%
+      playrate,point,pointat,pointatorientation,pointinhyperlink,%
+      pointofcontact,pointtochar,pointtoitem,pointtoline,pointtoparagraph,%
+      pointtoword,position,positionreset,posterframe,postnettext,power,%
+      preferred3drenderer,preload,preloadbuffer,preloadeventabort,preloadmember,%
+      preloadmode,preloadmovie,preloadnetthing,preloadram,preloadtime,%
+      premultiply,prepareframe,preparemovie,prerotate,prescale,pretranslate,%
+      previous,primitives,printfrom,productversion,projection,projectionangle,%
+      propList,proxyserver,pttohotspotid,puppet,puppetpalette,puppetsound,%
+      puppetsprite,puppettempo,puppettransition,purgepriority,%
+      qtregisteraccesskey,qtunregisteraccesskey,quad,quality,queue,quit,quote,%
+      radius,ramneeded,random,randomseed,randomvector,rateshift,rawnew,read,%
+      readvalue,recordfont,rect,ref,reflectionmap,reflectivity,region,%
+      registerforevent,registerscript,regpoint,regpointvertex,removebackdrop,%
+      removefromworld,removelast,removemodifier,removeoverlay,rename,renderer,%
+      rendererdevicelist,renderformat,renderstyle,resetworld,resizewindow,%
+      resolution,resolve,resolvea,resolveb,resource,restart,resume,%
+      reverttoworlddefaults,rewind,rgb,rgba4444,rgba5550,rgba5551,rgba5650,%
+      rgba8880,rgba8888,right,rightindent,rightmousedown,rightmouseup,%
+      rollover,romanlingo,rootlock,rootnode,rotate,rotation,rotationreset,%
+      rtf,runmode,runpropertydialog,safeplayer,samplecount,samplerate,%
+      samplesize,save,savedlocal,savemovie,scale,scalemode,score,scorecolor,%
+      scoreselection,script,scriptexecutionstyle,scriptinstancelist,scriptlist,%
+      scriptnum,scriptsenabled,scripttext,scripttype,scrollbyline,scrollbypage,%
+      scrolltop,sds,searchcurrentfolder,searchpath,searchpaths,seconds,%
+      selectedtext,selection,selend,selstart,sendallsprites,sendevent,%
+      sendnetmessage,sendsprite,serialnumber,setalpha,setaprop,setat,%
+      setcollisioncallback,setflashproperty,setnetbufferlimits,%
+      setnetmessagehandler,setpixel,setplaylist,setpref,setprop,setscriptlist,%
+      settrackenabled,setvariable,shader,shaderlist,shadowpercentage,%
+      shadowstrength,shapetype,shiftdown,shininess,shockwave3d,short,%
+      showglobals,showlocals,showprops,showresfile,showxlib,shutdown,%
+      silhouettes,sin,size,sizerange,skew,sleep,smoothness,sort,sound,%
+      soundbusy,soundchannel,sounddevice,sounddevicelist,soundenabled,%
+      soundkeepdevice,soundlevel,soundmixmedia,source,sourcerect,space,%
+      specular,specularcolor,specularlightmap,sphere,spotangle,spotdecay,%
+      sprite,spritenum,spritespacetoworldspace,sqrt,stage,stagebottom,%
+      stagecolor,stageleft,stageright,stagetoflash,stagetop,standard,%
+      startangle,startframe,startmovie,starttime,starttimer,state,static,%
+      status,stepframe,stilldown,stop,stopevent,stopmovie,stoptime,stream,%
+      streammode,streamname,streamsize,streamstatus,string,stringp,%
+      strokecolor,strokewidth,style,subdivision,sweep,swing,switchcolordepth,%
+      symbol,symbolp,systemdate,tab,tabcount,tabs,tan,target,%
+      tellstreamstatus,tension,text,texture,texturecoordinatelist,%
+      texturecoordinates,texturelayer,texturelist,texturemember,texturemode,%
+      texturemodelist,texturerenderformat,texturerepeat,texturerepeatlist,%
+      texturetransform,texturetransformlist,texturetype,thumbnail,ticks,tilt,%
+      time,timeout,timeouthandler,timeoutkeydown,timeoutlapsed,timeoutlength,%
+      timeoutlist,timeoutmouse,timeoutplay,timeoutscript,timer,timescale,%
+      title,titlevisible,toon,top,topcap,topradius,topspacing,trace,%
+      traceload,tracelogfile,trackcount,trackenabled,tracknextkeytime,%
+      tracknextsampletime,trackpreviouskeytime,trackprevioussampletime,%
+      trackstarttime,trackstoptime,tracktext,tracktype,trails,transform,%
+      transitiontype,translate,triggercallback,trimwhitespace,tunneldepth,%
+      tweened,tweenmode,type,[transparent],union,unload,unloadmember,%
+      unloadmovie,unregisterallevents,update,updateframe,updatelock,%
+      updatemovieenabled,updatestage,url,usealpha,usediffusewithtexture,%
+      usefastquads,usehypertextstyles,uselineoffset,userdata,username,value,%
+      vector,version,vertex,vertexlist,vertices,video,videoforwindowspresent,%
+      viewh,viewpoint,viewscale,viewv,visibility,visible,void,voidp,volume,%
+      volumeinfo,wait,waitfornetconnection,warpmode,width,widthvertices,wind,%
+      window,windowlist,windowpresent,windowtype,word,wordwrap,world,%
+      worldposition,worldspacetospritespace,worldtransform,wraptransform,%
+      wraptransformlist,write,writevalue,,xaxis,xtra,xtralist,xtras,,yaxis,%
+      year,yon,zaxis,zoombox,zoomwindow,repeat,Conditional,Boolean,TypeDef,%
+      Statement,Operator,String,Comment,Identifier,Special,x,y,z}
+   sensitive=false,
+   morecomment=[l]{--},
+   morestring=[b]",
+  }[keywords,comments,strings]%
+\lst@definelanguage{LLVM}{%
+  morekeywords={%
+    ret,br,switch,indirectbr,invoke,resume,unreachable,%
+    add,fadd,sub,fsub,mul,fmul,udiv,sdiv,fdiv,urem,srem,frem,%
+    shl,lshr,ashr,and,or,xor,%
+    extractelement,insertelement,shufflevector,%
+    extractvalue,insertvalue,%
+    alloca,load,store,fence,cmpxchg,atomicrmw,getelementptr,%
+    trunc,zext,sext,fptrunc,fpext,fptoui,fptosi,uitofp,sitofp,ptrtoint,%
+    inttoptr,bitcast,to,%
+    icmp,fcmp,phi,select,call,va_arg,landingpad,%
+    xchg,add,sub,and,nand,or,xor,max,min,umax,umin,%
+    eq,ne,ugt,uge,ult,ule,sgt,sge,slt,sle,%
+    false,oeq,ogt,oge,olt,ole,one,ord,ueq,ugt,uge,ult,ule,une,uno,true,%
+    private,linker_private,linker_private_weak,linker_private_weak_def_auto,%
+    internal,available_externally,linkonce,common,weak,appending,extern_weak,%
+    linkonce_odr,weak_odr,external,dllimport,dllexport,%
+    define,declare,%
+    zeroext,signext,inreg,byval,sret,noalias,nocapture,next,%
+    gc,%
+    address_safety,alignstack,alwaysinline,nonlazybind,inlinehint,naked,%
+    noimplicitfloat,noinline,noredzone,noreturn,nounwind,optsize,readnone,%
+    readonly,returns_twice,ssp,sspreq,uwtable,%
+    module,asm,%
+    target,datalayout,%
+    sideeffect,alignstack,%
+    nuw,nsw,exact,inbounds,unnamed_addr},%
+  morekeywords=[2]{%
+    i1,i2,i4,i8,i16,i32,i64,i128,i256,i512,i1024,% <-- Most common integers
+    half,float,double,x86_fp80,fp128,ppc_fp128,x86mmx,%
+    void,label,metadata},%
+  alsoletter=.,%
+  sensitive=false,%
+  morecomment=[l];,%
+  morestring=[b]"%
+}
+\lst@definelanguage{Logo}%
+  {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,%
+      cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,%
+      describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,%
+      errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,%
+      fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,%
+      fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,%
+      help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,%
+      local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,%
+      not,numberp,oflush,openr,openread,openw,openwrite,op,output,%
+      pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,%
+      rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,%
+      se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,%
+      sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,%
+      to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,%
+      mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,%
+      ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,%
+      lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,%
+      penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,%
+      scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,%
+      showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,%
+      display,dpy},%
+   sensitive=f% ???
+  }[keywords]%
+%%
+%% MetaPost definition (c) 2004 Brooks Moses
+%%   This definition is based on the language specifications
+%%   contained in the _User's Manual for Metapost_, with the core
+%%   language enhancements that are described in the _Drawing
+%%   Graphs with MetaPost_ documentation.
+%%
+\lst@definelanguage{MetaPost}%
+  {% keywords[1] = MetaPost primitives (not found in following tables)
+   morekeywords={end,begingroup,endgroup,beginfig,endfig,def,vardef,%
+      primary,secondary,tertiary,primarydef,secondarydef,tertiarydef,%
+      expr,suffix,text,enddef,if,fi,else,elseif,for,forsuffixes,%
+      forever,endfor,upto,downto,stop,until,tension,controls,on,off,%
+      btex,etex,within,input},
+   % keywords[2] = Operators (Tables 6-9 in MetaPost User's manual)
+   morekeywords=[2]{abs,and,angle,arclength,arctime,ASCII,bbox,bluepart,%
+      boolean,bot,ceiling,center,char,color,cosd,cutafter,cutbefore,%
+      cycle,decimal,dir,direction,directionpoint,directiontime,div,%
+      dotprod,floor,fontsize,greenpart,hex,infont,intersectionpoint,%
+      intersectiontimes,inverse,known,length,lft,llcorner,lrcorner,%
+      makepath,makepen,mexp,mlog,mod,normaldeviate,not,numeric,oct,%
+      odd,or,pair,path,pen,penoffset,picture,point,postcontrol,%
+      precontrol,redpart,reverse,rotated,round,rt,scaled,shifted,%
+      sind,slanted,sqrt,str,string,subpath,substring,top,transform,%
+      transformed,ulcorner,uniformdeviate,unitvector,unknown,%
+      urcorner,whatever,xpart,xscaled,xxpart,xypart,ypart,yscaled,%
+      yxpart,yypart,zscaled,of,reflectedabout,rotatedaround,ulft,urt,%
+      llft,lrt,readfrom,write,stroked,filled,textual,clipped,bounded,%
+      pathpart,penpart,dashpart,textpart,fontpart},%
+   % keywords[3] = Commands (Table 10)
+   morekeywords=[3]{addto,clip,cutdraw,draw,drawarrow,drawdblarrow,%
+      fill,filldraw,interim,let,loggingall,newinternal,pickup,%
+      save,setbounds,shipout,show,showdependencies,showtoken,%
+      showvariable,special,tracingall,tracingnone,undraw,unfill,%
+      unfilldraw,to,also,contour,doublepath,withcolor,withpen,%
+      dashed,randomseed},%
+   % keywords[4] = Function-Like Macros (Table 11)
+   morekeywords=[4]{boxit,boxjoin,bpath,buildcycle,circleit,dashpattern,%
+      decr,dotlabel,dotlabels,drawboxed,drawboxes,drawoptions,%
+      drawunboxed,fixpos,fixsize,incr,interpath,label,labels,max,min,pic,%
+      thelabel,z,image},%
+   % keywords[5] = Internal and Predefined Variables (Tables 3, 4)
+   morekeywords=[5]{ahangle,ahlength,bboxmargin,charcode,circmargin,%
+      day,defaultdx,defaultdy,defaultpen,defaultscale,labeloffset,%
+      linecap,linejoin,miterlimit,month,pausing,prologues,showstopping,%
+      time,tracingcapsules,tracingchoices,tracingcommands,%
+      tracingequations,tracinglostchars,tracingmacros,tracingonline,%
+      tracingoutput,tracingrestores,tracingspecs,tracingstats,%
+      tracingtitles,truecorners,warningcheck,year},
+   morekeywords=[5]{background,currentpen,currentpicture,cuttings,%
+      defaultfont},%
+   % keywords[6] = Predefined Constants (Table 5)
+   morekeywords=[6]{beveled,black,blue,bp,butt,cc,cm,dd,ditto,down,%
+      epsilon,evenly,false,fullcircle,green,halfcircle,identity,%
+      in,infinity,left,mitered,mm,nullpicture,origin,pc,pencircle,%
+      pt,quartercircle,red,right,rounded,squared,true,unitsquare,%
+      up,white,withdots},
+   sensitive=false,%
+   alsoother={0123456789$},%
+   morecomment=[l]\%,%
+   morestring=[mf]{input\ },%
+   morestring=[b]"%
+  }[keywords,comments,strings,mf]%
+%%
+%% Mizar definition (c) 2003 Adam Grabowski
+%%
+%% Mizar is freely available at URL www.mizar.org for the Linux x86,
+%% Solaris x86, and Windows operating systems.
+%%
+\lst@definelanguage{Mizar}%
+  {otherkeywords={->,(\#,\#),.=),\&},%
+   morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,%
+      @proof,according,aggregate,and,antonym,as,associativity,assume,%
+      asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,%
+      clusters,coherence,commutativity,compatibility,connectedness,%
+      consider,consistency,constructors,contradiction,correctness,def,%
+      deffunc,define,definition,definitions,defpred,end,environ,equals,%
+      ex,exactly,existence,for,from,func,given,hence,hereby,holds,%
+      idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,%
+      let,means,mode,non,not,notation,now,of,or,otherwise,over,per,%
+      pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,%
+      reflexivity,requirements,reserve,scheme,schemes,section,selector,%
+      set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,%
+      theorem,theorems,thesis,thus,to,transitivity,uniqueness,%
+      vocabulary,where},%
+   sensitive=t,%
+   morecomment=[l]::%
+  }[keywords,comments]%
+\lst@definelanguage{Modula-2}%
+  {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,%
+      EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,%
+      OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,%
+      TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,%
+      CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,%
+      LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,%
+      VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage{MuPAD}{%
+   morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,%
+      otherwise,for,from,to,step,downto,in,end_for,while,end_while,%
+      repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,%
+      intersect,subset,proc,begin,end_proc,domain,end_domain,category,%
+      end_category,axiom,end_axiom,quit,delete,frame},%
+   morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,%
+      RD_NAN,name,local,option,save,inherits,of,do},%
+   otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,%
+      @,@@,\$},%
+   sensitive=true,%
+   morecomment=[l]{//},%
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]{`}%
+  }[keywords,comments,strings]
+\lst@definelanguage{NASTRAN}
+  {morekeywords={ENDDATA},%
+   morecomment=[l]$,%
+   MoreSelectCharTable=%
+        \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}%
+        {\lst@ifmode\else \ifnum\lst@length=\z@
+             \lst@EnterMode{\lst@GPmode}{\lst@modetrue
+                  \let\lst@currstyle\lst@gkeywords@sty}%
+         \fi \fi}%
+        {\ifnum\lst@mode=\lst@GPmode
+             \lst@XPrintToken \lst@LeaveMode
+         \fi}%
+  }[keywords,comments]%
+\lst@definelanguage{Oberon-2}%
+  {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,%
+      ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,%
+      LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,%
+      REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,%
+      WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,%
+      MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%%
+%% OCL definition (c) 2000 Achim D. Brucker
+%%
+%% You are allowed to use, modify and distribute this code either under
+%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0
+%% or later).
+%%
+\lst@definelanguage[decorative]{OCL}[OMG]{OCL}
+  {otherkeywords={@pre},%
+   morendkeywords={name,attributes,associatoinEnds,operations,%
+      supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,%
+      oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,%
+      min,div,mod,size,concat,toUpper,toLower,substring,includes,%
+      excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,%
+      exists,forAll,isUnique,sortedBy,iterate,union,intersection,%
+      including,excluding,symmetricDifference,select,reject,collect,%
+      asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,%
+      first,last,true,false,isQuery}%
+  }%
+\lst@definelanguage[OMG]{OCL}%
+    {morekeywords={context,pre,inv,post},%
+    ndkeywords={or,xor,and,not,implies,if,then,else,endif},%
+    morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,%
+       OclType,OclAny,OclExpression,Enumeration,Collection,},%
+    sensitive=t,%
+    morecomment=[l]--,%
+    morestring=[d]'%
+   }[keywords,comments,strings]%
+\lst@definelanguage{Plasm}%
+  {sensitive=false,%
+   morekeywords={aa,abs,ac,acolor,acos,actor,al,alias,align,and,%
+      animation,animation,appearance,apply,ar,arc,as,asin,assoc,atan,%
+      axialcamera,axialcameras,basehermite,bbox,bbox,bernstein,%
+      bernsteinbasis,bezier,beziercurve,beziermanifold,bezierstripe,%
+      beziersurface,bigger,biggest,bilinearsurface,binormal,%
+      biquadraticsurface,black,blend,blue,bottom,box,brown,bspize,%
+      bspline,bsplinebasis,c,cabinet,camera,cart,case,cat,catch,ceil,%
+      centeredcameras,centralcavalier,char,charseq,choose,circle,%
+      circumference,class,cmap,color,comp,computecoords,cone,%
+      conicalsurface,cons,control,convexcoords,convexhull,coonspatch,%
+      copy,cos,cosh,crease,crosspolytope,cube,cubiccardinal,%
+      cubiccardinalbasis,cubichermite,cubicubspline,cubicubsplinebasis,%
+      cuboid,curl,curvature,curve2cspath,curve2mapvect,cyan,cylinder,%
+      cylindricalsurface,d,deboor,def,depol,depth_sort,depth_test,%
+      derbernstein,derbernsteinbase,derbezier,determinant,difference,%
+      differencepr,dim,dimetric,dirproject,displaygraph,displaynubspline,%
+      displaynurbspline,distl,distr,div,divergence,dodecahedron,dot,down,%
+      dp,drawedges,drawforks,drawtree,ds,dsphere,dump,dumprep,ellipse,%
+      embed,end,eq,ex,exp,explode,export,extract_bodies,extract_polygons,%
+      extract_wires,extrude,extrusion,fact,false,feature,ff,fillcolor,%
+      filter,finitecone,first,flash,flashani,floor,fontcolor,fontheight,%
+      fontspacing,fontwidth,fractalsimplex,frame,frame,frameflash,fromto,%
+      gausscurvature,ge,grad,gradient,gradmap,gray,green,gt,help,hermite,%
+      hermitebasis,hermitesurface,hexahedron,icosahedron,id,idnt,if,in,%
+      inarcs,innerprod,inset,insl,insr,intersection,intersectionpr,%
+      intervals,intmax,intmin,intsto,inv,isa,isanimpol,isbool,ischar,%
+      isclosedshape,iscloseto,isempty,iseven,isfun,isfunvect,isge,isgt,%
+      isint,isintneg,isinto,isintpos,isle,islt,ismat,ismatof,isnat,%
+      isnull,isnum,isnumneg,isnumpos,isodd,isometric,isorthoshape,ispair,%
+      ispoint,ispointseq,ispol,ispoldim,ispolytope,ispurepol,isreal,%
+      isrealneg,isrealpos,isrealvect,isseq,isseqof,isshape,issimplex,%
+      issqrmat,isstring,isvect,iszero,jacobian,join,joints,k,last,le,%
+      left,leftcavalier,len,less,lesseq,lex,lift,light,linecolor,%
+      linesize,list,ln,load,loadlib,loop,lt,lxmy,magenta,map,mapshapes,%
+      markersize,mat,matdotprod,material,mathom,max,mean,meanpoint,med,%
+      merge,mesh,min,minkowski,mirror,mixedprod,mk,mkframe,mkpol,%
+      mkvector,mkversork,mod,model,move,mul,multextrude,mxby,mxmy,mxty,%
+      myfont,n,nat2string,neq,ngon,norm2,normalmap,not,nu_grid,nubspline,%
+      nubsplineknots,nurbspline,nurbsplineknots,octahedron,offset,%
+      onepoint,open,optimize,or,orange,ord,ortho,orthoproject,orthox,%
+      orthoy,orthoz,outarcs,outerloop,outerwarp,pairdiff,parallel,%
+      pascaltriangle,pdiff,pdifference,permutahedron,permutations,%
+      perspective,perspective,pi,pivotop,plane,planemapping,pmap,%
+      points2shape,polar,polyline,polymarker,polypoint,power,powerset,%
+      presort,principalnormal,print,prism,profileprodsurface,%
+      progressivesum,project,projection,purple,pyramid,q,quadarray,%
+      quadmesh,quote,r,raise,range,rationalbezier,rationalblend,%
+      rationalbspline,rationalize,red,rev,reverse,rgbacolor,right,%
+      rightcavalier,ring,rn,rotatedtext,rotationalsurface,rotn,rtail,%
+      ruledsurface,rxmy,s,save,scalarmatprod,scalarvectprod,schlegel2d,%
+      schlegel3d,sdifference,sdifferencepr,segment,sel,setand,setdiff,%
+      setfontcolor,setor,setxor,sex,shape_0,shape_1,shape2points,%
+      shape2pol,shapeclosed,shapecomb,shapediff,shapedist,%
+      shapeinbetweening,shapeinf,shapejoin,shapelen,shapenorm,%
+      shapenormal,shapeprod,shaperot,shapesum,shapesup,shapezero,shift,%
+      showprop,sign,signal,simplex,simplexpile,sin,sinh,size,skeleton,%
+      skew,smaller,smallest,solidifier,solidify,sort,sphere,spline,%
+      splinesampling,splitcells,splitpols,sqr,sqrt,star,string,%
+      stringtokens,struct,sub,svg,sweep,t,tail,tan,tangent,tanh,%
+      tensorprodsurface,tetrahedron,text,texture,textwithattributes,%
+      thinsolid,threepoints,time,tmax,tmin,top,torus,torusmap,trace,%
+      trans,tree,trianglefan,trianglestripe,trimetric,true,truncone,tt,%
+      tube,twopoints,uk,ukpol,ukpolf,union,unionpr,unitvect,unprune,up,%
+      vect2dtoangle,vect2mat,vectdiff,vectnorm,vectprod,vectsum,view,%
+      viewmodel,viewmodel,vrml,warp,warp,where,white,with,xcavalier,xor,%
+      xquadarray,xx,ycavalier,yellow},%
+   moredirectives={loadlib},%
+   otherkeywords={-,+,*,**,/,~,|,..,^,\&,\&\&,\#,\#\#},%
+   morecomment=[s]{\%}{\%},%
+   morestring=[b]',%
+   literate={~}{{$\sim$}}{1} {^}{$\wedge$}{1},%
+  }[keywords,directives,comments,strings]%
+\lst@definelanguage{PL/I}%
+  {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,%
+      BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,%
+      COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,%
+      ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,%
+      FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,%
+      INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,%
+      LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,%
+      NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,%
+      OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,%
+      RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,%
+      SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,%
+      VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},%
+   sensitive=f,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%%
+%% PostScript language definition (c) 2005 Christophe Jorssen.
+%%
+\lst@definelanguage{PostScript}{%
+  morekeywords={abs,add,aload,anchorsearch,and,arc,arcn,arct,arcto,array,ashow,
+    astore,atan,awidthshow,begin,bind,bitshift,bytesavailable,cachestatus,
+    ceiling,charpath,clear,cleartomark,cleardictstack,clip,clippath,closefile,
+    closepath,colorimage,concat,concatmatrix,condition,copy,copypage,cos,count,
+    countdictstack,countexecstack,counttomark,cshow,currentblackgeneration,
+    currentcacheparams,currentcmykcolor,currentcolor,currentcolorrendering,
+    currentcolorscreen,currentcolorspace,currentcolortransfer,currentcontext,
+    currentdash,currentdevparams,currentdict,currentfile,currentflat,currentfont,
+    currentglobal,currentgray,currentgstate,currenthalftone,currenthalftonephase,
+    currenthsbcolor,currentlinecap,currentlinejoin,currentlinewidth,currentmatrix,
+    currentmiterlimit,currentobjectformat,currentpacking,currentpagedevice,
+    currentpoint,currentrgbcolor,currentscreen,currentshared,currentstrokeadjust,
+    currentsystemparams,currenttransfer,currentundercolorremoval,currentuserparams,
+    curveto,cvi,cvlit,cvn,cvr,cvrs,cvs,cvx,def,defaultmatrix,definefont,
+    defineresource,defineusername,defineuserobject,deletefile,detach,deviceinfo,
+    dict,dictstack,div,dtransform,dup,
+    echo,eexec,end,eoclip,eofill,eoviewclip,eq,erasepage,errordict,exch,exec,
+    execform,execstack,execuserobject,executeonly,executive,exit,
+    exp,false,file,filenameforall,fileposition,fill,filter,findencoding,findfont,
+    findresource,flattenpath,floor,flush,flushfile,FontDirectory,for,forall,fork,ge,
+    get,getinterval,globaldict,GlobalFontDirectory,glyphshow,grestore,grestoreall,
+    gsave,gstate,gt,identmatrix,idiv,idtransform,if,ifelse,image,
+    imagemask,index,ineofill,infill,initclip,initgraphics,initmatrix,initviewclip,
+    instroke,internaldict,inueofill,inufill,inustroke,
+    invertmatrix,ISOLatin1Encoding,itransform,join,kshow,
+    known,languagelevel,le,length,lineto,ln,load,lock,log,loop,lt,
+    makefont,makepattern,mark,matrix,maxlength,mod,monitor,moveto,mul,ne,neg,
+    newpath,noaccess,not,notify,null,nulldevice,or,packedarray,
+    pathbbox,pathforall,pop,print,printobject,product,prompt,pstack,put,putinterval,
+    quit,rand,rcurveto,read,readhexstring,readline,readonly,readstring,
+    realtime,rectclip,rectfill,rectstroke,rectviewclip,renamefile,repeat,resetfile,
+    resourceforall,resourcestatus,restore,reversepath,revision,rlineto,rmoveto,roll,
+    rootfont,rotate,round,rrand,run,save,scale,scalefont,scheck,search,selectfont,
+    serialnumber,setbbox,setblackgeneration,setcachedevice,setcachedevice2,
+    setcachelimit,setcacheparams,setcharwidth,setcmykcolor,setcolor,
+    setcolorrendering,setcolorscreen,setcolorspace,setcolortransfer,setdash,
+    setdevparams,setfileposition,setflat,setfont,setglobal,setgray,setgstate,
+    sethalftone,sethalftonephase,sethsbcolor,setlinecap,setlinejoin,setlinewidth,
+    setmatrix,setmiterlimit,setobjectformat,setoverprint,setpacking,setpagedevice,
+    setpattern,setrgbcolor,setscreen,setshared,setstrokeadjust,setsystemparams,
+    settransfer,setucacheparams,setundercolorremoval,setuserparams,setvmthreshold,
+    shareddict,show,showpage,sin,sqrt,srand,stack,
+    StandardEncoding,start,startjob,status,statusdict,stop,stopped,store,string,
+    stringwidth,stroke,strokepath,sub,systemdict,transform,
+    translate,true,truncate,type,token,uappend,ucache,ucachestatus,
+    ueofill,ufill,undef,
+    upath,userdict,UserObjects,
+    usertime,ustroke,ustrokepath,version,viewclip,viewclippath,vmreclaim,
+    vmstatus,wait,wcheck,where,widthshow,write,writehexstring,writeobject,
+    writestring,wtranslation,xcheck,xor,xshow,xyshow,yield,yshow},
+  sensitive,
+  morecomment=[l]\%}[keywords,comments]
+%%
+%% Promela definition (c) 2004 William Thimbleby
+%%
+\lst@definelanguage{Promela}
+  {morekeywords={active,assert,atomic,bit,bool,break,byte,chan,d_step,%
+      Dproctype,do,else,empty,enabled,fi,full,goto,hidden,if,init,int,%
+      len,mtype,nempty,never,nfull,od,of,pcvalue,printf,priority,%
+      proctype,provided,run,short,skip,timeout,typedef,unless,unsigned,%
+      xr,xs,true,false,inline,eval},%
+   moredirectives={define,ifdef,ifndef,if,if,else,endif,undef,include},%
+   moredelim=*[directive]\#,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%%
+%% PSTricks definition (c) 2006 Herbert Voss
+%%
+\lst@definelanguage{PSTricks}%
+  {morekeywords={%
+    begin,end,definecolor,multido,%
+    KillGlue,DontKillGlue,pslbrace,bsrbrace,psscalebox,psset,pstVerb,pstverb,%
+    pst@def,,psframebox,psclip,endclip,endpspicture,psframe,
+%%    pspicture,%
+    multirput,multips,Rput,rput,uput,cput,lput,%
+    newrgbcolor,newgray,newcmykcolor,
+%%
+%% pstricks-add
+    psStep,psgraph,psbrace,psPrintValue,
+%%
+%% pst-plot
+    psvlabel,pshlabel,psplot,psline,pscustom,pscurve,psccurve,%
+    readdata,savedata,fileplot,dataplot,listplot,%
+    psecurce,psgraph,parametricplot,%
+    psellipse,psaxes,ncline,nccurve,psbezier,parabola,%
+    qdisk,qline,clipbox,endpsclip,%
+    psgrid,pscircle,pscirclebox,psdiabox,pstribox,%
+    newpsfontdot,psdot,psdots,%
+    pspolygon,psdiamond,psoval,pstriangle,%
+    psarc,psarcn,psellipticarc,psellipticarcn,pswedge,psellipticwedge,
+    pcline,pcdiag,pcdiagg,pccurve,pccurve,pcecurve,%
+    scalebox,scaleboxto,psmathboxtrue,everypsbox,psverbboxtrue,overlaybox,%
+    psoverlay,putoverlaybox,%
+    newpsstyle,newpsobject,%
+    moveto,newpath,closepath,stroke,fill,gsave,grestore,msave,mrestore,translate,scale,%
+    swapaxes,rotate,openshadow,closedshadow,movepath,lineto,rlineto,curveto,rcurveto,%
+    code,dim,coor,rcoor,file,arrows,setcolor,%
+    rotateleft,rotateright,rotatedown,%
+%%
+%% pst-node
+    nput,naput,nbput,ncput,%
+    ncarc,ncbox,ncangle,ncangles,ncloop,ncdiag,ncdiagg,ncarcbox,ncbar,%
+    cnodeput,nccircle,%
+    pnode,rnode,Rnode,Cnode,cnode,fnode,%
+    circlenode,ovalnode,trinode,dianode,%
+    psmatrix,endpsmatrix,psspan,%
+%%
+%% pst-tree
+    pstree,Tcircle,TCircle,Ttri,Tn,TC,Tc,Tfan,TR,Tr,Tdia,Toval,Tdot,Tp,Tf,%
+    skiplevel,skiplevels,endskiplevels,tspace,tlput,%
+%%
+%% pst-text
+    pscharpath,pstextpath,
+%%
+%% pst-barcode
+    psbarcode,
+%%
+%% pst-coil
+    psboxfill,pscoil,psCoil,pszigzag,nccoil,
+    psshadow,pstilt,psTilt,ThreeDput,
+%%
+%% pst-gr3d
+    PstGridThreeDNodeProcessor,%
+%%
+%% pst-vue3d
+    PstGridThreeD,
+    AxesThreeD,LineThreeD,DieThreeD,FrameThreeD,SphereCircleThreeD,SphereMeridienThreeD,
+    QuadrillageThreeD,TetraedreThreeD,PyramideThreeD,ConeThreeD,CylindreThreeD,
+    DodecahedronThreeD,ConeThreeD,SphereThreeD,SphereInverseThreeD,DemiSphereThreeD,
+    SphereCreuseThreeD,SphereCircledThreeD,PortionSphereThreeD,pNodeThreeD,CubeThreeD,%
+%%
+%% pst-3dplot
+    pstThreeDCoor,pstThreeDDot,pstThreeDTriangle,pstThreeDCircle,pstPlanePut,%
+    pstThreeDBox,pstThreeDEllipse,pstThreeDLine,pstThreeDPut,%
+    pstThreeDNode,pstThreeDSquare,psplotThreeD,parametricplotThreeD,fileplotThreeD,%
+    dataplotThreeD,pstScalePoints,%
+%%
+%% pst-circ
+    resistor,battery,Ucc,Icc,capacitor,coil,diode,Zener,LED,lamp,switch,wire,tension,
+    circledipole,multidipole,OA,transistor,Tswitch,potentiometer,transformer,
+    optoCoupler,logic,
+%%
+%% pst-eucl
+    pstTriangle,pstMediatorAB,pstInterLL,pstMiddleAB,pstProjection,pstCircleOA,pstLineAB,%
+%%
+%% pst-func
+    psBessel,psPolynomial,psFourier,psGaussI,psGauss,psSi,pssi,psCi,psci,%
+%%
+%% pst-infixplot
+    psPlot,
+%%
+%% pst-ob3d
+    PstDie,PstCube,
+%%
+%% pst-poly
+    PstPolygon,pspolygonbox,
+%%
+%% pst-bar
+    psbarchart,readpsbardata,psbarscale,newpsbarstyle,%
+%%
+%% pst-lens
+    PstLens,%
+%%
+%% pst-geo
+    WorldMap,WorldMapII,WorldMapThreeD,WorldMapThreeDII,pnodeMap,MapPut,%
+%%
+%% pst-autoseg
+    asr,firstnode,merge,massoc,labelmerge,%
+%%
+%% gastex
+    node,imark,fmark,rmark,drawqbpedge,drawedge,drawloop,%
+%%
+%% pst-labo
+    Distillation,Ballon,
+%%
+%% pst-optic
+    lens,Transform,%
+%%
+%% pst-light3d
+    PstLightThreeDText,%
+%%
+%% calendrier
+    Calendrier,%
+%%
+%% pst-osci
+    Oscillo%
+  },%
+   sensitive,%
+   alsoother={0123456789$_},%
+   morecomment=[l]\% %
+  }[keywords,comments]%
+%%
+%% Reduce definition (c) 2002 Geraint Paul Bevan
+%%
+\lst@definelanguage{Reduce}%
+  {morekeywords={%
+%% reserved identifiers
+abs,acos,acosh,acot,acoth,acsc,acsch,%
+adjprec,algebraic,algint,allbranch,allfac,and,%
+antisymmetric,append,arglength,array,asec,asech,%
+asin,asinh,atan,atan2,atanh,begin,bfspace,bye,%
+card_no,ceiling,clear,clearrules,coeff,coeffn,%
+cofactor,combineexpt,combinelogs,comment,comp,%
+complex,conj,cons,cont,cos,cosh,cot,coth,cramer,%
+cref,csc,csch,decompose,define,defn,deg,demo,den,%
+depend,det,df,difference,dilog,display,div,do,e,%
+echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,%
+evallhseqp,eval_mode,even,evenp,exp,expandlogs,%
+expr,expt,ezgcd,factor,factorial,factorize,fexpr,%
+first,fix,fixp,floor,for,forall,foreach,fort,%
+fort_width,freeof,fullroots,g,gcd,geq,go,goto,%
+greaterp,high_pow,hypot,i,if,ifactor,impart,in,%
+index,infinity,infix,input,int,integer,interpol,%
+intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,%
+let,lhs,linear,linelength,lisp,list,listargp,%
+listargs,ln,load,load_package,log,log10,logb,%
+low_pow,lterm,macro,mainvar,mass,mat,match,%
+mateigen,matrix,max,mcd,member,memq,min,minus,mkid,%
+modular,msg,mshell,multiplicities,nat,neq,nero,%
+nextprime,nil,nodepend,noncom,nonzero,nosplit,%
+nospur,nullspace,num,numberp,odd,off,on,operator,%
+or,order,ordp,out,output,part,pause,period,pf,pi,%
+plus,precedence,precise,precision,pret,pri,primep,%
+print_precision,procedure,product,quit,quotient,%
+random,random_new_seed,rank,rat,ratarg,rational,%
+rationalize,ratpri,real,rederr,reduct,remainder,%
+remfac,remind,repart,repeat,rest,resultant,retry,%
+return,reverse,revpri,rhs,rlisp88,%
+root_multiplicity,round,roundall,roundbf,rounded,%
+saveas,savestructr,scalar,sec,sech,second,set,%
+setmod,setq,share,showrules,showtime,shut,sign,sin,%
+sinh,smacro,solve,solvesingular,spur,sqrt,structr,%
+sub,sum,symbolic,symmetric,t,tan,tanh,third,time,%
+times,tp,tra,trace,trfac,trigform,trint,until,%
+varname,vecdim,vector,weight,when,where,while,%
+write,ws,wtlevel,%
+%% identifiers with spaces
+%% for all,for each,go to,such that,%
+},%
+  sensitive=false,%
+  morecomment=[l]\%,%
+  morecomment=[s]{COMMENT}{;},%
+  morecomment=[s]{COMMENT}{$},%
+  morestring="%
+ }[keywords,comments,strings]%
+%%
+%% RSL definition (c) 2004 Brian Christensen
+%%
+\lst@definelanguage{RSL}%
+  {morekeywords={Bool,Char,devt_relation,Int,Nat,Real,Text,Unit,abs,any,%
+      as,axiom,card,case,channel,chaos,class,do,dom,elems,else,elsif,end,%
+      extend,false,for,hd,hide,if,in,inds,initialise,int,len,let,local,%
+      object,of,out,post,pre,read,real,rng,scheme,skip,stop,swap,%
+      test_case,theory,then,tl,true,type,until,use,value,variable,while,%
+      with,write},%
+literate=%
+{<}{$<$}{1}%
+{>}{$>$}{1}%
+{[}{$[$}{1}%%
+{]}{$]$}{1}%%
+{^}{{\mbox{$\widehat{\;}$}}}{1}%%
+{'}{{\raisebox{1ex}[1ex][0ex]{\protect\scriptsize$\prime$}}}{1}%%
+{||}{{\mbox{$\parallel$}}}{2}%%
+{|-}{$\vdash$}{1}%%
+{|=|}{{\mbox{$\lceil\!\rceil\!\!\!\!\!\!\;\lfloor\!\rfloor$}}}{1}%%
+{**}{$\uparrow$}{1}%
+{/\\}{$\wedge$}{1}%%
+{inter}{$\cap$}{1}%%
+{-\\}{$\lambda$}{1}%%
+{->}{$\rightarrow$}{1}%%
+{-m->}{{\mbox{$\rightarrow \hspace{-2.5\lst@width} _{m}\;$}}}{1}%
+{-~m->}{{\mbox{$\stackrel{\sim}{\mbox{$\rightarrow\hspace{-2.5\lst@width} _{m}\;$}}$}}}{1}%
+{-~->}{{\mbox{$\stackrel{\sim}{\rightarrow}$}}}{1}%%
+{-set}{\bf{-set}}{4}%%
+{-list}{{$^{\ast}$}}{1}%%
+{-inflist}{$^\omega$}{1}%
+{-infset}{{\mbox{{\bf -infset}}}}{7}%
+{\#}{$\circ$}{1}%
+{:-}{{\raisebox{.4ex}{\tiny $\bullet$}}}{1}%%
+{=}{$=$}{1}%%
+{==}{$==$}{2}%%
+{=>}{$\Rightarrow$}{1}%%
+{\ is\protect\^^M}{{$\;\equiv$}}{2}%
+{\ is\ }{{$\equiv$}}{3}%%
+{\ isin\protect\^^M}{$\;\in$}{2}%%
+{~}{$\sim$}{1}%%
+{~=}{$\neq$}{1}%%
+{~isin}{$\notin$}{1}%%
+{+>}{$\mapsto$}{1}%%
+{++}{}{1}%
+{|^|}{{\mbox{$\lceil\!\rceil$}}}{1}%%
+{\\/}{$\vee$}{1}%%
+{exists}{$\exists$}{1}%%
+{union}{$\cup$}{1}%%
+{>=}{$\geq$}{1}%%
+{><}{$\times$}{1}%%
+{>>}{$\supset$}{1}%
+{>>=}{$\supseteq$}{1}%%
+{<=}{$\leq$}{1}%%
+{<<}{$\subset$}{1}%
+{<.}{$\langle$}{1}%%
+{<<=}{$\subseteq$}{1}%%
+{<->}{$\leftrightarrow$}{1}%%
+{[=}{$\sqsubseteq$}{1}%%
+{\{=}{$\preceq$}{1}%%
+{\ all\protect\^^M}{$\forall$}{2}%%
+{\ all\ }{$\forall$}{3}%%
+{!!}{$\dagger$}{1}%%
+{always}{$\Box$}{1}%%
+{.>}{$\rangle$}{1}%%
+{`alpha}{$\alpha$}{1}%
+{`beta}{$\beta$}{1}%
+{`gamma}{$\gamma$}{1}%
+{`delta}{$\delta$}{1}%
+{`epsilon}{$\epsilon$}{1}%
+{`zeta}{$\zeta$}{1}%
+{`eta}{$\eta$}{1}%
+{`theta}{$\theta$}{1}%
+{`iota}{$\iota$}{1}%
+{`kappa}{$\kappa$}{1}%
+{`mu}{$\mu$}{1}%
+{`nu}{$\nu$}{1}%
+{`xi}{$\xi$}{1}%
+{`pi}{$\pi$}{1}%
+{`rho}{$\rho$}{1}%
+{`sigma}{$\sigma$}{1}%
+{`tau}{$\tau$}{1}%
+{`upsilon}{$\upsilon$}{1}%
+{`phi}{$\phi$}{1}%
+{`chi}{$\chi$}{1}%
+{`psi}{$\psi$}{1}%
+{`omega}{$\omega$}{1}%
+{`Gamma}{$\Gamma$}{1}%
+{`Delta}{$\Delta$}{1}%
+{`Theta}{$\Theta$}{1}%
+{`Lambda}{$\Lambda$}{1}%
+{`Xi}{$\Xi$}{1}%
+{`Pi}{$\Pi$}{1}%
+{`Sigma}{$\Sigma$}{1}%
+{`Upsilon}{$\Upsilon$}{1}%
+{`Phi}{$\Phi$}{1}%
+{`Psi}{$\Psi$}{1}%
+{`Omega}{$\Omega$}{1},%
+   sensitive=true,%
+   morecomment=[l]{--},%
+   morecomment=[s]{/*}{*/}%
+  }[keywords,comments]%
+\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}%
+\lst@definelanguage[DEC]{Simula}[67]{Simula}%
+  {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,%
+      options,or,protected,short}%
+  }%
+\lst@definelanguage[CII]{Simula}[67]{Simula}%
+  {morekeywords={and,equiv,exit,impl,not,or,stop}}%
+\lst@definelanguage[67]{Simula}%
+  {morekeywords={activate,after,array,at,before,begin,boolean,%
+      character,class,comment,delay,detach,do,else,end,external,false,%
+      for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,%
+      notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,%
+      simset,simulation,step,switch,text,then,this,to,true,until,value,%
+      virtual,when,while},%
+   sensitive=f,%
+   keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},%
+   morestring=[d]",%
+   morestring=[d]'%
+  }[keywords,keywordcomments,strings]%
+%%
+%% SPARQL definition (c) 2006 Christoph Kiefer
+%%
+\lst@definelanguage{SPARQL}%
+  {morekeywords={BASE,PREFIX,SELECT,DISTINCT,CONSTRUCT,DESCRIBE,ASK,%
+        FROM,NAMED,WHERE,ORDER,BY,ASC,DESC,LIMIT,OFFSET,OPTIONAL,%
+        GRAPH,UNION,FILTER,a,STR,LANG,LANGMATCHES,DATATYPE,BOUND,%
+        isIRI,isURI,isBLANK,isLITERAL,REGEX,true,false},%
+   sensitive=false,%
+   morecomment=[l]\#,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+\lst@definelanguage{S}[]{R}{}
+\lst@definelanguage[PLUS]{S}[]{R}{}
+\lst@definelanguage{R}%
+  {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,%
+      aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,%
+      approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,%
+      atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,%
+      axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,%
+      beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,%
+      c,C,call,Call,case,cat,category,cbind,ceiling,character,char,%
+      charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,%
+      coef,coefficients,co,col,colnames,colors,colours,commandArgs,%
+      comment,complete,complex,conflicts,Conj,contents,contour,%
+      contrasts,contr,control,helmert,contrib,convolve,cooks,coords,%
+      distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,%
+      create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,%
+      data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,%
+      debugger,Defunct,default,delay,delete,deltat,demo,de,density,%
+      deparse,dependencies,Deprecated,deriv,description,detach,%
+      dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,%
+      dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,%
+      dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,%
+      download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,%
+      duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,%
+      emacs,end,environment,env,erase,eval,equal,evalq,example,exists,%
+      exit,exp,expand,expression,External,extract,extractAIC,factor,%
+      fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,%
+      For,formals,format,formatC,formula,Fortran,forwardsolve,frame,%
+      frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,%
+      gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,%
+      getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,%
+      gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,%
+      ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,%
+      installed,integer,interaction,interactive,Internal,intersect,%
+      inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,%
+      layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,%
+      licence,license,lines,list,lm,load,local,locator,log,log10,log1p,%
+      log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,%
+      mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,%
+      matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,%
+      missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,%
+      names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,%
+      nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,%
+      numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,%
+      options,or,order,ordered,outer,package,packages,page,pairlist,%
+      pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,%
+      pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,%
+      pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,%
+      pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,%
+      postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,%
+      print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,%
+      psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,%
+      qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,%
+      qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,%
+      qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,%
+      rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,%
+      csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,%
+      relevel,remove,rep,repeat,replace,replications,report,require,%
+      resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,%
+      rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,%
+      rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,%
+      rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,%
+      search,searchpaths,segments,seq,sequence,setdiff,setequal,set,%
+      setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,%
+      spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,%
+      storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,%
+      subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,%
+      sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,%
+      tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,%
+      time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,%
+      ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,%
+      unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,%
+      variable,vector,Version,vi,warning,warnings,weighted,weights,%
+      which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,%
+      xpdrows,xy,xyinch,yinch,zapsmall,zip},%
+   otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},%
+   alsoother={._$},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]'% 2001 Robert Denham
+  }%
+\lst@definelanguage{SAS}%
+  {procnamekeys={proc},%
+   morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,%
+      TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,%
+      DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,%
+      CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,%
+      LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,%
+      POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,%
+      PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,%
+      CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,%
+      RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,%
+      UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,%
+      MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,%
+      LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,%
+      RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,%
+      SHOW},%
+   otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},%
+   morestring=[d]'%
+   }[keywords,comments,strings,procnames]%
+\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}%
+  {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,%
+      AtEndOfPackage,ClassError,ClassInfo,ClassWarning,%
+      ClassWarningNoLine,CurrentOption,DeclareErrorFont,%
+      DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,%
+      DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,%
+      DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,%
+      DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,%
+      DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,%
+      DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,%
+      DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,%
+      DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,%
+      DeclareTextCommandDefault,DeclareTextComposite,%
+      DeclareTextCompositeCommand,DeclareTextFontCommand,%
+      DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,%
+      GenericError,GenericInfo,GenericWarning,IfFileExists,%
+      InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,%
+      OptionNotUsed,PackageError,PackageInfo,PackageWarning,%
+      PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,%
+      ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,%
+      ProvidesPackage,ProvideTextCommand,RequirePackage,%
+      RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,%
+      TextSymbolUnavailable,UseTextAccent,UseTextSymbol},%
+   morekeywords={array,center,displaymath,document,enumerate,eqnarray,%
+      equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
+      picture,sloppypar,tabbing,tabular,trivlist,verbatim}%
+  }%
+\lst@definelanguage[LaTeX]{TeX}[common]{TeX}%
+  {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,%
+      addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,%
+      arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,%
+      baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,%
+      bibliography,bibliographystyle,bibstyle,bigskip,boldmath,%
+      botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,%
+      citation,cite,cleardoublepage,clearpage,cline,columnsep,%
+      columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,%
+      dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,%
+      defaultscriptratio,defaultscriptscriptratio,depth,Diamond,%
+      displaymath,document,documentclass,documentstyle,doublerulesep,%
+      em,emph,endarray,endcenter,enddisplaymath,enddocument,%
+      endenumerate,endeqnarray,endequation,endflushleft,endflushright,%
+      enditemize,endlist,endlrbox,endmath,endminipage,endpicture,%
+      endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,%
+      enlargethispage,ensuremath,enumerate,eqnarray,equation,%
+      evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,%
+      fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,%
+      fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,%
+      fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,%
+      frame,framebox,fussy,glossary,headheight,headsep,height,hline,%
+      hspace,I,include,includeonly,index,inputlineno,intextsep,%
+      itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,%
+      labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,%
+      leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,%
+      leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,%
+      linewidth,list,listfiles,listfiles,listparindent,lrbox,%
+      makeatletter,makeatother,makebox,makeglossary,makeindex,%
+      makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,%
+      marginparsep,marginparwidth,markboth,markright,math,mathbf,%
+      mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,%
+      mathunderscore,mathversion,mbox,mdseries,mho,minipage,%
+      multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,%
+      newenvironment,newfont,newhelp,newlabel,newlength,newline,%
+      newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,%
+      nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,%
+      nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,%
+      numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,%
+      pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,%
+      paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,%
+      protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,%
+      ref,refstepcounter,renewcommand,renewenvironment,restorecr,%
+      reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,%
+      rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,%
+      selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,%
+      shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,%
+      smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,%
+      subparagraphmark,subsectionmark,subsubsectionmark,sum,%
+      suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,%
+      tabularnewline,textasciicircum,textasciitilde,textbackslash,%
+      textbar,textbf,textbraceleft,textbraceright,textbullet,%
+      textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,%
+      textellipsis,textemdash,textendash,textexclamdown,textfloatsep,%
+      textfraction,textgreater,textheight,textit,textless,textmd,%
+      textnormal,textparagraph,textperiodcentered,textquestiondown,%
+      textquotedblleft,textquotedblright,textquoteleft,textquoteright,%
+      textregistered,textrm,textsc,textsection,textsf,textsl,%
+      textsterling,textsuperscript,texttrademark,texttt,textunderscore,%
+      textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,%
+      thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,%
+      thispagestyle,title,today,topfigrule,topfraction,topmargin,%
+      topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,%
+      typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,%
+      usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,%
+      vspace,width,%
+      normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,%
+      huge,Huge}%
+  }%
+\lst@definelanguage[plain]{TeX}[common]{TeX}%
+  {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,%
+      columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,%
+      fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,%
+      leqalignno,magnification,makefootline,makeheadline,midinsert,mit,%
+      mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,%
+      pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,%
+      settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,%
+      tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,%
+      tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,%
+      ttraggedright,vfootnote}%
+  }%
+\lst@definelanguage[common]{TeX}[primitive]{TeX}
+  {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,%
+      alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,%
+      Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,%
+      bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,%
+      Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,%
+      bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,%
+      biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,%
+      braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,%
+      buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,%
+      centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,%
+      copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,%
+      ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,%
+      displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,%
+      Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,%
+      endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,%
+      flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,%
+      frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,%
+      grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,%
+      hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,%
+      imath,in,inf,infty,int,interdisplaylinepenalty,%
+      interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,%
+      kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,%
+      ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,%
+      leftharpoondown,leftharpoonup,leftline,leftrightarrow,%
+      Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,%
+      ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,%
+      longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,%
+      Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,%
+      mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,%
+      medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,%
+      nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,%
+      newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,%
+      newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,%
+      nonfrenchspacing,normalbaselines,normalbaselineskip,%
+      normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,%
+      oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,%
+      ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,%
+      overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,%
+      perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,%
+      prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,%
+      rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,%
+      rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,%
+      rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,%
+      rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,%
+      sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,%
+      smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,%
+      sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,%
+      subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,%
+      tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,%
+      triangle,triangleleft,triangleright,u,underbar,underbrace,%
+      uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,%
+      upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,%
+      vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,%
+      widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}%
+  }%
+\lst@definelanguage[primitive]{TeX}%
+  {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,%
+      abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,%
+      atopwithdelims,badness,baselineskip,batchmode,begingroup,%
+      belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,%
+      boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,%
+      closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,%
+      deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,%
+      delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,%
+      discretionary,displayindent,displaylimits,displaystyle,%
+      displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,%
+      edef,else,emergencystretch,end,endcsname,endgroup,endinput,%
+      endlinechar,eqno,errhelp,errmessage,errorcontextlines,%
+      errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,%
+      everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,%
+      finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,%
+      fontname,futurelet,gdef,global,globaldefs,halign,hangafter,%
+      hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,%
+      holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,%
+      hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,%
+      ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,%
+      ignorespaces,immediate,indent,input,insert,insertpenalties,%
+      interlinepenalty,jobname,kern,language,lastbox,lastkern,%
+      lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,%
+      leqno,let,limits,linepenalty,lineskip,lineskiplimit,long,%
+      looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,%
+      mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,%
+      mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,%
+      maxdepth,meaning,medmuskip,message,mkern,month,moveleft,%
+      moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,%
+      noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,%
+      nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,%
+      output,outputpenalty,over,overfullrule,overline,overwithdelims,%
+      pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,%
+      pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,%
+      parindent,parshape,parskip,patterns,pausing,penalty,%
+      postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,%
+      prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,%
+      righthyphenmin,rightskip,romannumeral,scriptfont,%
+      scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,%
+      scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,%
+      showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,%
+      skipdef,spacefactor,spaceskip,span,special,splitbotmark,%
+      splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,%
+      textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,%
+      tolerance,topmark,topskip,tracingcommands,tracinglostchars,%
+      tracingmacros,tracingonline,tracingoutput,tracingpages,%
+      tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,%
+      underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,%
+      uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,%
+      vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,%
+      widowpenalty,write,xdef,xleaders,xspaceskip,year},%
+   sensitive,%
+   alsoother={0123456789$_},%$ to make Emacs fontlocking happy
+   morecomment=[l]\%%
+  }[keywords,tex,comments]%
+%%
+%% Verilog definition (c) 2003 Cameron H. G. Wright <c.h.g.wright@ieee.org>
+%%   Based on the IEEE 1364-2001 Verilog HDL standard
+%%   Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis,"
+%%        Prentice Hall, 2003. ISBN: 0-13-044911-3
+%%
+\lst@definelanguage{Verilog}%
+  {morekeywords={% reserved keywords
+      always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,%
+      casez,cell,cmos,config,deassign,default,defparam,design,disable,%
+      edge,else,end,endcase,endconfig,endfunction,endgenerate,%
+      endmodule,endprimitive,endspecify,endtable,endtask,event,for,%
+      force,forever,fork,function,generate,genvar,highz0,highz1,if,%
+      ifnone,incdir,include,initial,inout,input,instance,integer,join,%
+      large,liblist,library,localparam,macromodule,medium,module,nand,%
+      negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,%
+      parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,%
+      pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,%
+      release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,%
+      showcancelled,signed,small,specify,specparam,strong0,strong1,%
+      supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,%
+      tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,%
+      weak1,while,wire,wor,xnor,xor},%
+   morekeywords=[2]{% system tasks and functions
+      $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,%
+      $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,%
+      $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,%
+      $nokey},%
+   morekeywords=[3]{% compiler directives
+      `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,%
+      `define,`else,`elsif,`endcelldefine,`endif,`endprotect,%
+      `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,%
+      `no_accelerate,`noexpand_vectornets,`noremove_gatenames,%
+      `nounconnected_drive,`protect,`protected,`remove_gatenames,%
+      `remove_netnames,`resetall,`timescale,`unconnected_drive},%
+   alsoletter=\`,%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+\endinput
+%%
+%% End of file `lstlang3.sty'.
Index: doc/LaTeXmacros/listings/lstmisc.sty
===================================================================
--- doc/LaTeXmacros/listings/lstmisc.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ doc/LaTeXmacros/listings/lstmisc.sty	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,2084 @@
+%%
+%% This is file `lstmisc.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% listings.dtx  (with options: `misc,0.21')
+%% 
+%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\def\filedate{2015/06/04}
+\def\fileversion{1.6}
+\ProvidesFile{lstmisc.sty}
+             [\filedate\space\fileversion\space(Carsten Heinz)]
+\lst@CheckVersion\fileversion
+    {\typeout{^^J%
+     ***^^J%
+     *** This file requires `listings.sty' version \fileversion.^^J%
+     *** You have a serious problem, so I'm exiting ...^^J%
+     ***^^J}%
+     \batchmode \@@end}
+\lst@BeginAspect{writefile}
+\newtoks\lst@WFtoken % global
+\lst@AddToHook{InitVarsBOL}{\global\lst@WFtoken{}}
+\newwrite\lst@WF
+\global\let\lst@WFifopen\iffalse % init
+\gdef\lst@WFWriteToFile{%
+  \begingroup
+   \let\lst@UM\@empty
+   \expandafter\edef\expandafter\lst@temp\expandafter{\the\lst@WFtoken}%
+   \immediate\write\lst@WF{\lst@temp}%
+  \endgroup
+  \global\lst@WFtoken{}}
+\gdef\lst@WFAppend#1{%
+    \global\lst@WFtoken=\expandafter{\the\lst@WFtoken#1}}
+\gdef\lst@BeginWriteFile{\lst@WFBegin\@gobble}
+\gdef\lst@BeginAlsoWriteFile{\lst@WFBegin\lst@OutputBox}
+\begingroup \catcode`\^^I=11
+\gdef\lst@WFBegin#1#2{%
+    \begingroup
+    \let\lst@OutputBox#1%
+    \def\lst@Append##1{%
+        \advance\lst@length\@ne
+        \expandafter\lst@token\expandafter{\the\lst@token##1}%
+        \ifx ##1\lst@outputspace \else
+            \lst@WFAppend##1%
+        \fi}%
+    \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}%
+    \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}%
+    \let\lst@DeInit\lst@WFDeInit
+    \let\lst@MProcessListing\lst@WFMProcessListing
+    \lst@WFifopen\else
+        \immediate\openout\lst@WF=#2\relax
+        \global\let\lst@WFifopen\iftrue
+        \@gobbletwo\fi\fi
+    \fi}
+\endgroup
+\gdef\lst@EndWriteFile{%
+    \immediate\closeout\lst@WF \endgroup
+    \global\let\lst@WFifopen\iffalse}
+\global\let\lst@WFMProcessListing\lst@MProcessListing
+\global\let\lst@WFDeInit\lst@DeInit
+\lst@AddToAtTop\lst@WFMProcessListing{\lst@WFWriteToFile}
+\lst@AddToAtTop\lst@WFDeInit{%
+    \ifnum\lst@length=\z@\else \lst@WFWriteToFile \fi}
+\lst@EndAspect
+\lst@BeginAspect{strings}
+\gdef\lst@stringtypes{d,b,m,bd,db,s}
+\gdef\lst@StringKey#1#2{%
+    \lst@Delim\lst@stringstyle #2\relax
+        {String}\lst@stringtypes #1%
+                     {\lst@BeginString\lst@EndString}%
+        \@@end\@empty{}}
+\lst@Key{string}\relax{\lst@StringKey\@empty{#1}}
+\lst@Key{morestring}\relax{\lst@StringKey\relax{#1}}
+\lst@Key{deletestring}\relax{\lst@StringKey\@nil{#1}}
+\lst@Key{stringstyle}{}{\def\lst@stringstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty}
+\lst@Key{showstringspaces}t[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces}
+\gdef\lst@BeginString{%
+    \lst@DelimOpen
+        \lst@ifexstrings\else
+        {\lst@ifshowstringspaces
+             \lst@keepspacestrue
+             \let\lst@outputspace\lst@visiblespace
+         \fi}}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexstrings\iffalse}
+\gdef\lst@EndString{\lst@DelimClose\lst@ifexstrings\else}
+\gdef\lst@StringDM@d#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4}
+\gdef\lst@StringDM@b#1#2\@empty#3#4#5{%
+    \let\lst@ifbstring\iftrue
+    \lst@CArg #2\relax\lst@DefDelimBE
+       {\lst@ifletter \lst@Output \lst@letterfalse \fi}%
+       {\ifx\lst@lastother\lstum@backslash
+            \expandafter\@gobblethree
+        \fi}{}#3{#1}{#5}#4}
+\global\let\lst@ifbstring\iffalse % init
+\lst@AddToHook{SelectCharTable}{%
+    \lst@ifbstring
+        \lst@CArgX \\\\\relax \lst@CDefX{}%
+           {\lst@ProcessOther\lstum@backslash
+            \lst@ProcessOther\lstum@backslash
+            \let\lst@lastother\relax}%
+           {}%
+    \fi}
+\global\let\lst@StringDM@bd\lst@StringDM@b
+\global\let\lst@StringDM@db\lst@StringDM@bd
+\gdef\lst@StringDM@m#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimBE{}{}%
+        {\let\lst@next\@gobblethree
+         \lst@ifletter\else
+             \lst@IfLastOtherOneOf{)].0123456789\lstum@rbrace'}%
+                 {}%
+                 {\let\lst@next\@empty}%
+         \fi
+         \lst@next}#3{#1}{#5}#4}
+\gdef\lst@StringDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+\lst@SaveOutputDef{"7D}\lstum@rbrace
+\lst@EndAspect
+\lst@BeginAspect{mf}
+\lst@AddTo\lst@stringtypes{,mf}
+\lst@NewMode\lst@mfinputmode
+\gdef\lst@String@mf#1\@empty#2#3#4{%
+  \lst@CArg #1\relax\lst@DefDelimB
+       {}{}{\lst@ifletter \expandafter\@gobblethree \fi}%
+       \lst@BeginStringMFinput\lst@mfinputmode{#4\lst@Lmodetrue}%
+  \@ifundefined{lsts@semicolon}%
+  {\lst@DefSaveDef{`\;}\lsts@semicolon{% ; and space end the filename
+      \ifnum\lst@mode=\lst@mfinputmode
+          \lst@XPrintToken
+          \expandafter\lst@LeaveMode
+      \fi
+      \lsts@semicolon}%
+   \lst@DefSaveDef{`\ }\lsts@space{%
+      \ifnum\lst@mode=\lst@mfinputmode
+          \lst@XPrintToken
+          \expandafter\lst@LeaveMode
+      \fi
+      \lsts@space}%
+  }{}}
+\gdef\lst@BeginStringMFinput#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+      \begingroup
+        \lst@mode\lst@nomode
+        #3\lst@XPrintToken
+      \endgroup
+      \lst@ResetToken
+    \lst@EnterMode{#1}{\def\lst@currstyle#2}%
+    \lst@ifshowstringspaces
+         \lst@keepspacestrue
+         \let\lst@outputspace\lst@visiblespace
+    \fi}
+\lst@EndAspect
+\lst@BeginAspect{comments}
+\lst@NewMode\lst@commentmode
+\gdef\lst@commenttypes{l,f,s,n}
+\gdef\lst@CommentKey#1#2{%
+    \lst@Delim\lst@commentstyle #2\relax
+        {Comment}\lst@commenttypes #1%
+                {\lst@BeginComment\lst@EndComment}%
+        i\@empty{\lst@BeginInvisible\lst@EndInvisible}}
+\lst@Key{comment}\relax{\lst@CommentKey\@empty{#1}}
+\lst@Key{morecomment}\relax{\lst@CommentKey\relax{#1}}
+\lst@Key{deletecomment}\relax{\lst@CommentKey\@nil{#1}}
+\lst@Key{commentstyle}{}{\def\lst@commentstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\itshape}
+\gdef\lst@BeginComment{%
+    \lst@DelimOpen
+        \lst@ifexcomments\else
+        \lsthk@AfterBeginComment}
+\gdef\lst@EndComment{\lst@DelimClose\lst@ifexcomments\else}
+\lst@AddToHook{AfterBeginComment}{}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexcomments\iffalse}
+\gdef\lst@BeginInvisible#1#2#3\@empty{%
+    \lst@TrackNewLines \lst@XPrintToken
+    \lst@BeginDropOutput{#1}}
+\gdef\lst@EndInvisible#1\@empty{\lst@EndDropOutput}
+\gdef\lst@CommentDM@l#1#2\@empty#3#4#5{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}
+\gdef\lst@CommentDM@f#1{%
+    \@ifnextchar[{\lst@Comment@@f{#1}}%
+                 {\lst@Comment@@f{#1}[0]}}
+\gdef\lst@Comment@@f#1[#2]#3\@empty#4#5#6{%
+    \lst@CArg #3\relax\lst@DefDelimB{}{}%
+        {\lst@CalcColumn
+         \ifnum #2=\@tempcnta\else
+             \expandafter\@gobblethree
+         \fi}%
+        #4{#1}{#6\lst@Lmodetrue}}
+\gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{%
+    \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}%
+    \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
+\gdef\lst@CommentDM@n#1#2#3\@empty#4#5#6{%
+    \ifx\@empty#3\@empty\else
+        \def\@tempa{#2}\def\@tempb{#3}%
+        \ifx\@tempa\@tempb
+            \PackageError{Listings}{Identical delimiters}%
+            {These delimiters make no sense with nested comments.}%
+        \else
+            \lst@CArg #2\relax\lst@DefDelimB
+                {}%
+                {\ifnum\lst@mode=#1\relax \expandafter\@gobble \fi}%
+                {}#4{#1}{#6}%
+            \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}%
+        \fi
+    \fi}
+\lst@EndAspect
+\lst@BeginAspect{pod}
+\lst@Key{printpod}{false}[t]{\lstKV@SetIf{#1}\lst@ifprintpod}
+\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{#1}\lst@ifpodcomment}
+\lst@AddToHookExe{SetLanguage}{\let\lst@ifpodcomment\iffalse}
+\lst@NewMode\lst@PODmode
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifpodcomment
+         \lst@CArgX =\relax\lst@DefDelimB{}{}%
+           {\ifnum\@tempcnta=\z@
+                \lst@ifprintpod\else
+                    \def\lst@bnext{\lst@BeginDropOutput\lst@PODmode}%
+                    \expandafter\expandafter\expandafter\@gobblethree
+                \fi
+            \else
+               \expandafter\@gobblethree
+            \fi}%
+           \lst@BeginComment\lst@PODmode{{\lst@commentstyle}}%
+         \lst@CArgX =cut\^^M\relax\lst@DefDelimE
+           {\lst@CalcColumn}%
+           {\ifnum\@tempcnta=\z@\else
+                \expandafter\@gobblethree
+            \fi}%
+           {}%
+           \lst@EndComment\lst@PODmode
+     \fi}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{html}
+\gdef\lst@tagtypes{s}
+\gdef\lst@TagKey#1#2{%
+    \lst@Delim\lst@tagstyle #2\relax
+        {Tag}\lst@tagtypes #1%
+                     {\lst@BeginTag\lst@EndTag}%
+        \@@end\@empty{}}
+\lst@Key{tag}\relax{\lst@TagKey\@empty{#1}}
+\lst@Key{tagstyle}{}{\def\lst@tagstyle{#1}}
+\lst@AddToHook{EmptyStyle}{\let\lst@tagstyle\@empty}
+\gdef\lst@BeginTag{%
+    \lst@DelimOpen
+        \lst@ifextags\else
+        {\let\lst@ifkeywords\iftrue
+         \lst@ifmarkfirstintag \lst@firstintagtrue \fi}}
+\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifextags\iffalse}
+\gdef\lst@EndTag{\lst@DelimClose\lst@ifextags\else}
+\lst@Key{usekeywordsintag}t[t]{\lstKV@SetIf{#1}\lst@ifusekeysintag}
+\lst@Key{markfirstintag}f[t]{\lstKV@SetIf{#1}\lst@ifmarkfirstintag}
+\gdef\lst@firstintagtrue{\global\let\lst@iffirstintag\iftrue}
+\global\let\lst@iffirstintag\iffalse
+\lst@AddToHook{PostOutput}{\lst@tagresetfirst}
+\lst@AddToHook{Output}
+    {\gdef\lst@tagresetfirst{\global\let\lst@iffirstintag\iffalse}}
+\lst@AddToHook{OutputOther}{\gdef\lst@tagresetfirst{}}
+\lst@AddToHook{Output}
+    {\ifnum\lst@mode=\lst@tagmode
+         \lst@iffirstintag \let\lst@thestyle\lst@gkeywords@sty \fi
+         \lst@ifusekeysintag\else \let\lst@thestyle\lst@gkeywords@sty\fi
+     \fi}
+\lst@NewMode\lst@tagmode
+\lst@AddToHook{Init}{\global\let\lst@ifnotag\iftrue}
+\lst@AddToHook{SelectCharTable}{\let\lst@ifkeywords\lst@ifnotag}
+\gdef\lst@Tag@s#1#2\@empty#3#4#5{%
+    \global\let\lst@ifnotag\iffalse
+    \lst@CArg #1\relax\lst@DefDelimB {}{}%
+        {\ifnum\lst@mode=\lst@tagmode \expandafter\@gobblethree \fi}%
+        #3\lst@tagmode{#5}%
+    \lst@CArg #2\relax\lst@DefDelimE {}{}{}#4\lst@tagmode}%
+\gdef\lst@BeginCDATA#1\@empty{%
+    \lst@TrackNewLines \lst@PrintToken
+    \lst@EnterMode\lst@GPmode{}\let\lst@ifmode\iffalse
+    \lst@mode\lst@tagmode #1\lst@mode\lst@GPmode\relax\lst@modetrue}
+\lst@EndAspect
+\lst@BeginAspect{escape}
+\lst@Key{texcl}{false}[t]{\lstKV@SetIf{#1}\lst@iftexcl}
+\lst@AddToHook{TextStyle}{\let\lst@iftexcl\iffalse}
+\lst@AddToHook{EOL}
+    {\ifnum\lst@mode=\lst@TeXLmode
+         \expandafter\lst@escapeend
+         \expandafter\lst@LeaveAllModes
+         \expandafter\lst@ReenterModes
+     \fi}
+\lst@AddToHook{AfterBeginComment}
+    {\lst@iftexcl \lst@ifLmode \lst@ifdropinput\else
+         \lst@PrintToken
+         \lst@LeaveMode \lst@InterruptModes
+         \lst@EnterMode{\lst@TeXLmode}{\lst@modetrue\lst@commentstyle}%
+         \expandafter\expandafter\expandafter\lst@escapebegin
+     \fi \fi \fi}
+\lst@NewMode\lst@TeXLmode
+\gdef\lst@ActiveCDefX#1{\lst@ActiveCDefX@#1}
+\gdef\lst@ActiveCDefX@#1#2#3{
+    \catcode`#1\active\lccode`\~=`#1%
+    \lowercase{\lst@CDefIt~}{#2}{#3}{}}
+\gdef\lst@Escape#1#2#3#4{%
+    \lst@CArgX #1\relax\lst@CDefX
+        {}%
+        {\lst@ifdropinput\else
+         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken
+         \lst@InterruptModes
+         \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}%
+         \ifx\^^M#2%
+             \lst@CArg #2\relax\lst@ActiveCDefX
+                 {}%
+                 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}%
+                 {\lst@MProcessListing}%
+         \else
+             \lst@CArg #2\relax\lst@ActiveCDefX
+                 {}%
+                 {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes
+                  \lst@newlines\z@ \lst@whitespacefalse}%
+                 {}%
+         \fi
+         #3\lst@escapebegin
+         \fi}%
+        {}}
+\lst@NewMode\lst@TeXmode
+\lst@Key{escapebegin}{}{\def\lst@escapebegin{#1}}
+\lst@Key{escapeend}{}{\def\lst@escapeend{#1}}
+\lst@Key{escapechar}{}
+    {\ifx\@empty#1\@empty
+         \let\lst@DefEsc\relax
+     \else
+         \def\lst@DefEsc{\lst@Escape{#1}{#1}{}{}}%
+     \fi}
+\lst@AddToHook{TextStyle}{\let\lst@DefEsc\@empty}
+\lst@AddToHook{SelectCharTable}{\lst@DefEsc}
+\lst@Key{escapeinside}{}{\lstKV@TwoArg{#1}%
+    {\let\lst@DefEsc\@empty
+     \ifx\@empty##1@empty\else \ifx\@empty##2\@empty\else
+         \def\lst@DefEsc{\lst@Escape{##1}{##2}{}{}}%
+     \fi\fi}}
+\lst@Key{mathescape}{false}[t]{\lstKV@SetIf{#1}\lst@ifmathescape}
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifmathescape \lst@Escape{\$}{\$}%
+        {\setbox\@tempboxa=\hbox\bgroup$}%
+        {$\egroup \lst@CalcLostSpaceAndOutput}\fi}
+\lst@EndAspect
+\lst@BeginAspect{keywords}
+\global\let\lst@ifsensitive\iftrue % init
+\global\let\lst@ifsensitivedefed\iffalse % init % \global
+\lst@ifsavemem\else
+\gdef\lst@KeywordTest#1#2#3{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#1@\the\lst@token\endcsname
+    \endgroup
+    \ifx\@gtempa\relax\else
+        \let\lst@thestyle\@gtempa
+    \fi}
+\gdef\lst@KEYWORDTEST{%
+    \uppercase\expandafter{\expandafter
+        \lst@KEYWORDTEST@\the\lst@token}\relax}
+\gdef\lst@KEYWORDTEST@#1\relax#2#3#4{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#2@#1\endcsname
+    \endgroup
+    \ifx\@gtempa\relax\else
+        \let\lst@thestyle\@gtempa
+    \fi}
+\gdef\lst@WorkingTest#1#2#3{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#1@\the\lst@token\endcsname
+    \endgroup
+    \@gtempa}
+\gdef\lst@WORKINGTEST{%
+    \uppercase\expandafter{\expandafter
+        \lst@WORKINGTEST@\the\lst@token}\relax}
+\gdef\lst@WORKINGTEST@#1\relax#2#3#4{%
+    \begingroup \let\lst@UM\@empty
+    \global\expandafter\let\expandafter\@gtempa
+        \csname\@lst#2@#1\endcsname
+    \endgroup
+    \@gtempa}
+\gdef\lst@DefineKeywords#1#2#3{%
+    \lst@ifsensitive
+        \def\lst@next{\lst@for#2}%
+    \else
+        \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}%
+    \fi
+    \lst@next\do
+    {\expandafter\ifx\csname\@lst#1@##1\endcsname\relax
+        \global\expandafter\let\csname\@lst#1@##1\endcsname#3%
+     \fi}}
+\gdef\lst@UndefineKeywords#1#2#3{%
+    \lst@ifsensitivedefed
+        \def\lst@next{\lst@for#2}%
+    \else
+        \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}%
+    \fi
+    \lst@next\do
+    {\expandafter\ifx\csname\@lst#1@##1\endcsname#3%
+        \global\expandafter\let\csname\@lst#1@##1\endcsname\relax
+     \fi}}
+\fi
+\lst@ifsavemem
+\gdef\lst@IfOneOutOf#1\relax#2{%
+    \def\lst@temp##1,#1,##2##3\relax{%
+        \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}%
+    \def\lst@next{\lst@IfOneOutOf@#1\relax}%
+    \expandafter\lst@next#2\relax\relax}
+\gdef\lst@IfOneOutOf@#1\relax#2#3{%
+    \ifx#2\relax
+        \expandafter\@secondoftwo
+    \else
+        \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax
+        \expandafter\lst@next
+    \fi}
+\ifx\iffalse\else\fi
+\gdef\lst@IOOOfirst#1\relax#2#3{\fi#2}
+\gdef\lst@IFONEOUTOF#1\relax#2{%
+    \uppercase{\def\lst@temp##1,#1},##2##3\relax{%
+        \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}%
+    \def\lst@next{\lst@IFONEOUTOF@#1\relax}%
+    \expandafter\lst@next#2\relax}
+\gdef\lst@IFONEOUTOF@#1\relax#2#3{%
+    \ifx#2\relax
+        \expandafter\@secondoftwo
+    \else
+        \uppercase
+            {\expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}%
+        \expandafter\lst@next
+    \fi}
+\gdef\lst@KWTest{%
+    \begingroup \let\lst@UM\@empty
+    \expandafter\xdef\expandafter\@gtempa\expandafter{\the\lst@token}%
+    \endgroup
+    \expandafter\lst@IfOneOutOf\@gtempa\relax}
+\gdef\lst@KeywordTest#1#2#3{\lst@KWTest #2{\let\lst@thestyle#3}{}}
+\global\let\lst@KEYWORDTEST\lst@KeywordTest
+\gdef\lst@WorkingTest#1#2#3{\lst@KWTest #2#3{}}
+\global\let\lst@WORKINGTEST\lst@WorkingTest
+\fi
+\lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive}
+\lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}
+\lst@AddToHook{Init}
+    {\lst@ifsensitive\else
+         \let\lst@KeywordTest\lst@KEYWORDTEST
+         \let\lst@WorkingTest\lst@WORKINGTEST
+         \let\lst@IfOneOutOf\lst@IFONEOUTOF
+     \fi}
+\gdef\lst@MakeMacroUppercase#1{%
+    \ifx\@undefined#1\else \uppercase\expandafter
+        {\expandafter\def\expandafter#1\expandafter{#1}}%
+    \fi}
+\gdef\lst@InstallTest#1#2#3#4#5#6#7#8{%
+    \lst@AddToHook{TrackKeywords}{\lst@TrackKeywords{#1}#2#4#6#7#8}%
+    \lst@AddToHook{PostTrackKeywords}{\lst@PostTrackKeywords#2#3#4#5}}
+\lst@AddToHook{Init}{\lsthk@TrackKeywords\lsthk@PostTrackKeywords}
+\lst@AddToHook{TrackKeywords}
+    {\global\let\lst@DoDefineKeywords\@empty}% init
+\lst@AddToHook{PostTrackKeywords}
+    {\lst@DoDefineKeywords
+     \global\let\lst@DoDefineKeywords\@empty}% init
+\lst@AddToHook{Output}{\lst@ifkeywords \lsthk@DetectKeywords \fi}
+\lst@AddToHook{DetectKeywords}{}% init
+\lst@AddToHook{ModeTrue}{\let\lst@ifkeywords\iffalse}
+\lst@AddToHookExe{Init}{\let\lst@ifkeywords\iftrue}
+\gdef\lst@InstallTestNow#1#2#3#4#5{%
+    \@ifundefined{\string#2#1}%
+    {\global\@namedef{\string#2#1}{}%
+     \edef\@tempa{%
+         \noexpand\lst@AddToHook{\ifx#5dDetectKeywords\else Output\fi}%
+         {\ifx #4w\noexpand\lst@WorkingTest
+             \else\noexpand\lst@KeywordTest \fi
+          {#1}\noexpand#2\noexpand#3}}%
+     \lst@ifsavemem
+         \@tempa
+     \else
+         \@ifundefined{\@lst#1@if@ins}%
+             {\@tempa \global\@namedef{\@lst#1@if@ins}{}}%
+             {}%
+     \fi}
+    {}}
+\gdef\lst@TrackKeywords#1#2#3#4#5#6{%
+    \lst@false
+    \def\lst@arg{{#1}#4}%
+    \expandafter\expandafter\expandafter\lst@TK@
+        \expandafter\lst@arg#2\relax\relax
+    \lst@ifsavemem\else
+        \def\lst@arg{{#1}#4#2}%
+        \expandafter\expandafter\expandafter\lst@TK@@
+            \expandafter\lst@arg#3\relax\relax
+    \fi
+    \lst@if \lst@InstallTestNow{#1}#2#4#5#6\fi}
+\gdef\lst@TK@#1#2#3#4{%
+  \ifx\lst@ifsensitive\lst@ifsensitivedefed
+    \ifx#3#4\else
+      \lst@true
+      \lst@ifsavemem\else
+          \lst@UndefineKeywords{#1}#4#2%
+          \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}%
+      \fi
+    \fi
+  \else
+    \ifx#3\relax\else
+      \lst@true
+      \lst@ifsavemem\else
+          \lst@UndefineKeywords{#1}#4#2%
+          \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}%
+      \fi
+    \fi
+  \fi
+  \lst@ifsavemem \ifx#3\relax\else
+      \lst@ifsensitive\else \lst@MakeMacroUppercase#3\fi
+  \fi \fi
+  \ifx#3\relax
+      \expandafter\@gobblethree
+  \fi
+  \lst@TK@{#1}#2}
+\gdef\lst@TK@@#1#2#3#4#5{%
+    \ifx#4\relax
+        \expandafter\@gobblefour
+    \else
+        \lst@IfSubstring{#4#5}#3{}{\lst@UndefineKeywords{#1}#5#2}%
+    \fi
+    \lst@TK@@{#1}#2#3}
+\lst@AddToHook{InitVars}
+    {\global\let\lst@ifsensitivedefed\lst@ifsensitive}
+\gdef\lst@PostTrackKeywords#1#2#3#4{%
+    \lst@ifsavemem\else
+        \global\let#3#1%
+        \global\let#4#2%
+    \fi}
+\lst@Key{classoffset}\z@{\def\lst@classoffset{#1}}
+\gdef\lst@InstallFamily#1#2#3#4#5{%
+    \lst@Key{#2}\relax{\lst@UseFamily{#2}##1\relax\lst@MakeKeywords}%
+    \lst@Key{more#2}\relax
+        {\lst@UseFamily{#2}##1\relax\lst@MakeMoreKeywords}%
+    \lst@Key{delete#2}\relax
+        {\lst@UseFamily{#2}##1\relax\lst@DeleteKeywords}%
+    \ifx\@empty#3\@empty\else
+        \lst@Key{#3}{#4}{\lstKV@OptArg[\@ne]{##1}%
+            {\@tempcnta\lst@classoffset \advance\@tempcnta####1\relax
+             \@namedef{lst@#3\ifnum\@tempcnta=\@ne\else \the\@tempcnta
+                             \fi}{####2}}}%
+    \fi
+    \expandafter\lst@InstallFamily@
+        \csname\@lst @#2@data\expandafter\endcsname
+        \csname\@lst @#5\endcsname {#1}{#2}{#3}}
+\gdef\lst@InstallFamily@#1#2#3#4#5#6#7#8{%
+    \gdef#1{{#3}{#4}{#5}#2#7}%
+    \long\def\lst@temp##1{#6}%
+    \ifx\lst@temp\@gobble
+        \lst@AddTo#1{s#8}%
+    \else
+        \lst@AddTo#1{w#8}%
+        \global\@namedef{lst@g#4@wp}##1{#6}%
+    \fi}
+\gdef\lst@UseFamily#1{%
+    \def\lst@family{#1}%
+    \@ifnextchar[\lst@UseFamily@{\lst@UseFamily@[\@ne]}}
+\gdef\lst@UseFamily@[#1]{%
+    \@tempcnta\lst@classoffset \advance\@tempcnta#1\relax
+    \lst@ProvideFamily\lst@family
+    \lst@UseFamily@a
+        {\lst@family\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}
+\gdef\lst@UseFamily@a#1{%
+    \expandafter\lst@UseFamily@b
+       \csname\@lst @#1@list\expandafter\endcsname
+       \csname\@lst @#1\expandafter\endcsname
+       \csname\@lst @#1@also\expandafter\endcsname
+       \csname\@lst @g#1\endcsname}
+\gdef\lst@UseFamily@b#1#2#3#4#5\relax#6{\lstKV@XOptArg[]{#5}#6#1#2#3#4}
+\gdef\lst@ProvideFamily#1{%
+    \@ifundefined{lstfam@#1\ifnum\@tempcnta=\@ne\else\the\@tempcnta\fi}%
+    {\global\@namedef{lstfam@#1\ifnum\@tempcnta=\@ne\else
+                                        \the\@tempcnta\fi}{}%
+     \expandafter\expandafter\expandafter\lst@ProvideFamily@
+         \csname\@lst @#1@data\endcsname
+         {\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}%
+    {}}%
+\gdef\lst@ProvideFamily@#1#2#3#4#5#6#7#8{%
+    \expandafter\xdef\csname\@lst @g#2#8@sty\endcsname
+    {\if #6w%
+         \expandafter\noexpand\csname\@lst @g#2@wp\endcsname{#8}%
+     \else
+         \expandafter\noexpand\csname\@lst @#3#8\endcsname
+     \fi}%
+    \ifx\@empty#3\@empty\else
+        \edef\lst@temp{\noexpand\lst@AddToHook{Init}{%
+            \noexpand\lst@ProvideStyle\expandafter\noexpand
+                \csname\@lst @#3#8\endcsname\noexpand#4}}%
+        \lst@temp
+    \fi
+    \expandafter\lst@ProvideFamily@@
+         \csname\@lst @#2#8@list\expandafter\endcsname
+         \csname\@lst @#2#8\expandafter\endcsname
+         \csname\@lst @#2#8@also\expandafter\endcsname
+         \csname\@lst @g#2#8@list\expandafter\endcsname
+         \csname\@lst @g#2#8\expandafter\endcsname
+         \csname\@lst @g#2#8@sty\expandafter\endcsname
+         {#1}#5#6#7}
+\gdef\lst@ProvideFamily@@#1#2#3#4#5#6#7#8{%
+    \gdef#1{#2#5}\global\let#2\@empty \global\let#3\@empty % init
+    \gdef#4{#2#5}\global\let#5\@empty % init
+    \if #8l\relax
+        \lst@AddToHook{SetLanguage}{\def#1{#2#5}\let#2\@empty}%
+    \fi
+    \lst@InstallTest{#7}#1#2#4#5#6}
+\gdef\lst@InstallKeywords#1#2#3#4#5{%
+    \lst@Key{#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeKeywords}%
+    \lst@Key{more#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeMoreKeywords}%
+    \lst@Key{delete#2}\relax
+        {\lst@UseFamily{#2}[\@ne]##1\relax\lst@DeleteKeywords}%
+    \ifx\@empty#3\@empty\else
+        \lst@Key{#3}{#4}{\@namedef{lst@#3}{##1}}%
+    \fi
+    \expandafter\lst@InstallFamily@
+        \csname\@lst @#2@data\expandafter\endcsname
+        \csname\@lst @#5\endcsname {#1}{#2}{#3}}
+\gdef\lst@ProvideStyle#1#2{%
+    \ifx#1\@undefined \let#1#2%
+    \else\ifx#1\relax \let#1#2\fi\fi}
+\gdef\lst@BuildClassList#1#2,{%
+    \ifx\relax#2\@empty\else
+        \ifx\@empty#2\@empty\else
+            \lst@lExtend#1{\csname\@lst @#2\expandafter\endcsname
+                           \csname\@lst @g#2\endcsname}%
+        \fi
+        \expandafter\lst@BuildClassList\expandafter#1
+    \fi}
+\gdef\lst@DeleteClassesIn#1#2{%
+    \expandafter\lst@DCI@\expandafter#1#2\relax\relax}
+\gdef\lst@DCI@#1#2#3{%
+    \ifx#2\relax
+        \expandafter\@gobbletwo
+    \else
+        \def\lst@temp##1#2#3##2{%
+            \lst@lAddTo#1{##1}%
+            \ifx ##2\relax\else
+                \expandafter\lst@temp
+            \fi ##2}%
+        \let\@tempa#1\let#1\@empty
+        \expandafter\lst@temp\@tempa#2#3\relax
+    \fi
+    \lst@DCI@#1}
+\gdef\lst@MakeKeywords[#1]#2#3#4#5#6{%
+    \def#3{#4#6}\let#4\@empty \let#5\@empty
+    \lst@MakeMoreKeywords[#1]{#2}#3#4#5#6}
+\gdef\lst@MakeMoreKeywords[#1]#2#3#4#5#6{%
+    \lst@BuildClassList#3#1,\relax,%
+    \lst@DefOther\lst@temp{,#2}\lst@lExtend#4\lst@temp}
+\gdef\lst@DeleteKeywords[#1]#2#3#4#5#6{%
+    \lst@MakeKeywords[#1]{#2}\@tempa\@tempb#5#6%
+    \lst@DeleteClassesIn#3\@tempa
+    \lst@DeleteKeysIn#4\@tempb}
+\lst@InstallFamily k{keywords}{keywordstyle}\bfseries{keywordstyle}{}ld
+\gdef\lst@DefKeywordstyle#1#2\@nil@{%
+   \@namedef{lst@keywordstyle\ifnum\@tempcnta=\@ne\else\the\@tempcnta
+                             \fi}{#1#2}}%
+\lst@Key{keywordstyle}{\bfseries}{\lstKV@OptArg[\@ne]{#1}%
+  {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax
+   \@ifstar{\lst@DefKeywordstyle{\uppercase\expandafter{%
+                                 \expandafter\lst@token
+                                 \expandafter{\the\lst@token}}}}%
+           {\lst@DefKeywordstyle{}}##2\@nil@}}
+\lst@Key{ndkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeKeywords}%
+\lst@Key{morendkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeMoreKeywords}%
+\lst@Key{deletendkeywords}\relax
+    {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@DeleteKeywords}%
+\lst@Key{ndkeywordstyle}\relax{\@namedef{lst@keywordstyle2}{#1}}%
+\lst@Key{keywordsprefix}\relax{\lst@DefActive\lst@keywordsprefix{#1}}
+\global\let\lst@keywordsprefix\@empty
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@keywordsprefix\@empty\else
+         \expandafter\lst@CArg\lst@keywordsprefix\relax
+             \lst@CDef{}%
+                      {\lst@ifletter\else
+                           \global\let\lst@prefixkeyword\@empty
+                       \fi}%
+                      {}%
+     \fi}
+\lst@AddToHook{Init}{\global\let\lst@prefixkeyword\relax}
+\lst@AddToHook{Output}
+    {\ifx\lst@prefixkeyword\@empty
+         \let\lst@thestyle\lst@gkeywords@sty
+         \global\let\lst@prefixkeyword\relax
+     \fi}%
+\lst@Key{otherkeywords}{}{%
+    \let\lst@otherkeywords\@empty
+    \lst@for{#1}\do{%
+      \lst@MakeActive{##1}%
+      \lst@lExtend\lst@otherkeywords{%
+          \expandafter\lst@CArg\lst@temp\relax\lst@CDef
+              {}\lst@PrintOtherKeyword\@empty}}}
+\lst@AddToHook{SelectCharTable}{\lst@otherkeywords}
+\gdef\lst@PrintOtherKeyword#1\@empty{%
+    \lst@XPrintToken
+    \begingroup
+      \lst@modetrue \lsthk@TextStyle
+      \let\lst@ProcessDigit\lst@ProcessLetter
+      \let\lst@ProcessOther\lst@ProcessLetter
+      \lst@lettertrue
+      #1%
+  \lst@SaveToken
+    \endgroup
+\lst@RestoreToken
+\global\let\lst@savedcurrstyle\lst@currstyle
+\let\lst@currstyle\lst@gkeywords@sty
+    \lst@Output
+\let\lst@currstyle\lst@savedcurrstyle}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{emph}
+\lst@InstallFamily e{emph}{emphstyle}{}{emphstyle}{}od
+\lst@EndAspect
+\lst@BeginAspect[keywords]{tex}
+\lst@InstallFamily {cs}{texcs}{texcsstyle}\relax{keywordstyle}
+    {\ifx\lst@lastother\lstum@backslash
+         \expandafter\let\expandafter\lst@thestyle
+                         \csname lst@texcsstyle#1\endcsname
+     \fi}
+    ld
+\lst@Key{texcsstyle}\relax
+  {\@ifstar{\lst@true\lst@DefTexcsstyle}%
+           {\lst@false\lst@DefTexcsstyle}#1\@nil@}
+\gdef\lst@DefTexcsstyle#1\@nil@{%
+    \let\lst@iftexcsincludebs\lst@if
+    \lstKV@OptArg[\@ne]{#1}%
+    {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax
+     \@namedef{lst@texcsstyle\ifnum\@tempcnta=\@ne\else
+                                   \the\@tempcnta \fi}{##2}}}%
+\global\let\lst@iftexcsincludebs\iffalse
+\let\lst@iftexcsincludebs\iffalse
+\lst@AddToHook{SelectCharTable}
+{\lst@iftexcsincludebs \ifx\@empty\lst@texcs\else
+     \lst@DefSaveDef{`\\}\lsts@texcsbs
+      {\lst@ifletter
+           \lst@Output
+       \else
+           \lst@OutputOther
+       \fi
+       \lst@Merge\lsts@texcsbs}%
+ \fi \fi}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{directives}
+\lst@NewMode\lst@CDmode
+\lst@AddToHook{EOL}{\ifnum\lst@mode=\lst@CDmode \lst@LeaveMode \fi}
+\lst@InstallKeywords{d}{directives}{directivestyle}\relax{keywordstyle}
+    {\ifnum\lst@mode=\lst@CDmode
+         \let\lst@thestyle\lst@directivestyle
+     \fi}
+    ld
+\global\let\lst@directives\@empty % init
+\lst@AddTo\lst@delimtypes{,directive}
+\gdef\lst@Delim@directive#1\@empty#2#3#4{%
+    \lst@CArg #1\relax\lst@DefDelimB
+        {\lst@CalcColumn}%
+        {}%
+        {\ifnum\@tempcnta=\z@
+             \def\lst@bnext{#2\lst@CDmode{#4\lst@Lmodetrue}%
+                \let\lst@currstyle\lst@directivestyle}%
+ \fi
+ \@gobblethree}%
+        #2\lst@CDmode{#4\lst@Lmodetrue}}
+\lst@AddTo\lst@stringtypes{,directive}
+\gdef\lst@StringDM@directive#1#2#3\@empty{%
+    \lst@CArg #2\relax\lst@CDef
+        {}%
+        {\let\lst@bnext\lst@CArgEmpty
+         \ifnum\lst@mode=\lst@CDmode
+             \def\lst@bnext{\lst@BeginString{#1}}%
+         \fi
+         \lst@bnext}%
+        \@empty
+    \lst@CArg #3\relax\lst@CDef
+        {}%
+        {\let\lst@enext\lst@CArgEmpty
+         \ifnum #1=\lst@mode
+             \let\lst@bnext\lst@EndString
+         \fi
+         \lst@bnext}%
+        \@empty}
+\lst@EndAspect
+\lst@BeginAspect[keywords,comments]{keywordcomments}
+\lst@NewMode\lst@KCmode \lst@NewMode\lst@KCSmode
+\gdef\lst@BeginKC{\aftergroup\aftergroup\aftergroup\lst@BeginKC@}%
+\gdef\lst@BeginKC@{%
+    \lst@ResetToken
+    \lst@BeginComment\lst@KCmode{{\lst@commentstyle}\lst@modetrue}%
+                     \@empty}%
+\gdef\lst@BeginKCS{\aftergroup\aftergroup\aftergroup\lst@BeginKCS@}%
+\gdef\lst@BeginKCS@{%
+    \lst@ResetToken
+    \lst@BeginComment\lst@KCSmode{{\lst@commentstyle}\lst@modetrue}%
+                     \@empty}%
+\lst@AddToHook{PostOutput}{\lst@KCpost \global\let\lst@KCpost\@empty}
+\global\let\lst@KCpost\@empty % init
+\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken
+    \let\lst@thestyle\lst@identifierstyle \lsthk@Output}
+\lst@InstallKeywords{kc}{keywordcomment}{}\relax{}
+    {\ifnum\lst@mode=\lst@KCmode
+         \edef\lst@temp{\the\lst@token}%
+         \ifx\lst@temp\lst@KCmatch
+             \lst@EndKC
+         \fi
+     \else
+         \lst@ifmode\else
+             \xdef\lst@KCmatch{\the\lst@token}%
+             \global\let\lst@KCpost\lst@BeginKC
+         \fi
+     \fi}
+    lo
+\lst@Key{keywordcommentsemicolon}{}{\lstKV@ThreeArg{#1}%
+    {\def\lst@KCAkeywordsB{##1}%
+     \def\lst@KCAkeywordsE{##2}%
+     \def\lst@KCBkeywordsB{##3}%
+     \def\lst@KCkeywords{##1##2##3}}}
+\lst@AddToHook{SetLanguage}{%
+    \let\lst@KCAkeywordsB\@empty \let\lst@KCAkeywordsE\@empty
+    \let\lst@KCBkeywordsB\@empty \let\lst@KCkeywords\@empty}
+\lst@AddToHook{SelectCharTable}
+    {\ifx\lst@KCkeywords\@empty\else
+        \lst@DefSaveDef{`\;}\lsts@EKC
+            {\lst@XPrintToken
+             \ifnum\lst@mode=\lst@KCmode \lst@EndComment\@empty \else
+             \ifnum\lst@mode=\lst@KCSmode \lst@EndComment\@empty
+             \fi \fi
+             \lsts@EKC}%
+     \fi}
+\gdef\lst@KCAWorkB{%
+    \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKC \fi}
+\gdef\lst@KCBWorkB{%
+    \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKCS \fi}
+\gdef\lst@KCAWorkE{\ifnum\lst@mode=\lst@KCmode \lst@EndKC \fi}
+\lst@ProvideFamily@@
+    \lst@KCAkeywordsB@list\lst@KCAkeywordsB \lst@KC@also
+    \lst@gKCAkeywordsB@list\lst@gKCAkeywordsB \lst@KCAWorkB
+    {kcb}owo % prefix, other key, working procedure, Output hook
+\lst@ProvideFamily@@
+    \lst@KCAkeywordsE@list\lst@KCAkeywordsE \lst@KC@also
+    \lst@gKCAkeywordsE@list\lst@gKCAkeywordsE \lst@KCAWorkE
+    {kce}owo
+\lst@ProvideFamily@@
+    \lst@KCBkeywordsB@list\lst@KCBkeywordsB \lst@KC@also
+    \lst@gKCBkeywordsB@list\lst@gKCBkeywordsB \lst@KCBWorkB
+    {kcs}owo
+\lst@EndAspect
+\lst@BeginAspect[keywords]{index}
+\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle}
+    {\csname\@lst @indexstyle#1\expandafter\endcsname
+         \expandafter{\the\lst@token}}
+    od
+\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{procnames}
+\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue}
+\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse}
+\lst@AddToHook{Init}{\lst@procnamefalse}
+\lst@AddToHook{DetectKeywords}
+    {\lst@ifprocname
+         \let\lst@thestyle\lst@procnamestyle
+         \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi
+         \lst@procnamefalse
+     \fi}
+\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}}
+\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc}
+\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi}
+\gdef\lst@indexproc{%
+    \@ifundefined{lst@indexstyle1}%
+        {\@namedef{lst@indexstyle1}##1{}}%
+        {}}
+\lst@InstallKeywords w{procnamekeys}{}\relax{}
+    {\global\let\lst@PNpost\lst@procnametrue}
+    od
+\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty}
+\global\let\lst@PNpost\@empty % init
+\lst@EndAspect
+\lst@BeginAspect{style}
+\@ifundefined{lststylefiles}
+    {\lst@UserCommand\lststylefiles{lststy0.sty}}{}
+\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue}
+\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse}
+\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset}
+\global\@namedef{lststy@$}{\lsthk@EmptyStyle}
+\lst@AddToHook{EmptyStyle}{}% init
+\lst@Key{style}\relax{%
+    \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles
+        \lsthk@SetStyle
+        {}}
+\lst@AddToHook{SetStyle}{}% init
+\lst@EndAspect
+\lst@BeginAspect{language}
+\@ifundefined{lstdriverfiles}
+    {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{}
+\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue}
+\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse}
+\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset}
+\lstdefinelanguage{}{}
+\lst@Key{language}\relax{\lstKV@OptArg[]{#1}%
+    {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
+         \lsthk@SetLanguage
+         {\lst@FindAlias[##1]{##2}%
+          \let\lst@language\lst@malias
+          \let\lst@dialect\lst@oalias}}}
+\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}%
+    {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
+         {}%
+         {\lst@FindAlias[##1]{##2}%
+          \let\lst@language\lst@malias
+          \let\lst@dialect\lst@oalias}}}
+\lst@AddToHook{SetLanguage}{}% init
+\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@}
+\gdef\lstalias@[#1]#2{\lstalias@b #2$#1}
+\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}}
+\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}}
+\lst@Key{defaultdialect}\relax
+    {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}}
+\gdef\lst@FindAlias[#1]#2{%
+    \lst@NormedDef\lst@oalias{#1}%
+    \lst@NormedDef\lst@malias{#2}%
+    \@ifundefined{lsta@\lst@malias}{}%
+        {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}%
+    \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%
+        {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%
+    \fi
+    \edef\lst@temp{\lst@malias $\lst@oalias}%
+    \@ifundefined{lsta@\lst@temp}{}%
+        {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}%
+    \expandafter\lst@FindAlias@\lst@temp $}
+\gdef\lst@FindAlias@#1$#2${%
+    \def\lst@malias{#1}\def\lst@oalias{#2}%
+    \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%
+        {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%
+    \fi}
+\gdef\lst@RequireLanguages#1{%
+    \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles
+    \ifx\lst@loadaspects\@empty\else
+        \lst@RequireAspects\lst@loadaspects
+    \fi}
+\global\let\lstloadlanguages\lst@RequireLanguages
+\lst@EndAspect
+\lst@BeginAspect{formats}
+\@ifundefined{lstformatfiles}
+    {\lst@UserCommand\lstformatfiles{lstfmt0.sty}}{}
+\lst@UserCommand\lstdefineformat{\lst@DefFormat\iftrue}
+\lst@UserCommand\lst@defineformat{\lst@DefFormat\iffalse}
+\gdef\lst@DefFormat{\lst@DefDriver{format}{fmt}\lst@UseFormat}
+\lstdefineformat{}{}
+\lst@Key{format}\relax{%
+    \lst@LAS{format}{fmt}{[]{#1}}\lst@NoAlias\lstformatfiles
+        \lsthk@SetFormat
+        {}}
+\lst@AddToHook{SetFormat}{\let\lst@fmtformat\@empty}% init
+\gdef\lst@fmtSplit#1#2{%
+    \def\lst@temp##1#2##2\relax##3{%
+        \ifnum##3=\z@
+            \ifx\@empty##2\@empty
+                \lst@false
+                \let\lst@fmta#1%
+                \let\lst@fmtb\@empty
+            \else
+                \expandafter\lst@temp#1\relax\@ne
+            \fi
+        \else
+            \def\lst@fmta{##1}\def\lst@fmtb{##2}%
+        \fi}%
+    \lst@true
+    \expandafter\lst@temp#1#2\relax\z@}
+\gdef\lst@IfNextCharWhitespace#1#2#3{%
+    \lst@IfSubstring#3\lst@whitespaces{#1}{#2}#3}
+\begingroup
+\catcode`\^^I=12\catcode`\^^J=12\catcode`\^^M=12\catcode`\^^L=12\relax%
+\lst@DefActive\lst@whitespaces{\ ^^I^^J^^M}% add ^^L
+\global\let\lst@whitespaces\lst@whitespaces%
+\endgroup
+\gdef\lst@fmtIfIdentifier#1{%
+    \ifx\relax#1\@empty
+        \expandafter\@secondoftwo
+    \else
+        \expandafter\lst@fmtIfIdentifier@\expandafter#1%
+    \fi}
+\gdef\lst@fmtIfIdentifier@#1#2\relax{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1=`_\else
+    \ifnum`#1<64\else
+    \ifnum`#1<91\let\lst@next\@firstoftwo\else
+    \ifnum`#1<97\else
+    \ifnum`#1<123\let\lst@next\@firstoftwo\else
+    \fi \fi \fi \fi \fi
+    \lst@next}
+\gdef\lst@fmtIfNextCharIn#1{%
+    \ifx\@empty#1\@empty \expandafter\@secondoftwo \else
+                         \def\lst@next{\lst@fmtIfNextCharIn@{#1}}%
+                         \expandafter\lst@next\fi}
+\gdef\lst@fmtIfNextCharIn@#1#2#3#4{%
+    \def\lst@temp##1#4##2##3\relax{%
+        \ifx \@empty##2\expandafter\@secondoftwo
+                 \else \expandafter\@firstoftwo \fi}%
+    \lst@temp#1#4\@empty\relax{#2}{#3}#4}
+\gdef\lst@fmtCDef#1{\lst@fmtCDef@#1}
+\gdef\lst@fmtCDef@#1#2#3#4#5#6#7{%
+    \lst@CDefIt#1{#2}{#3}%
+               {\lst@fmtIfNextCharIn{#5}{#4#2#3}{#6#4#2#3#7}}%
+               #4%
+               {}{}{}}
+\gdef\lst@fmtCDefX#1{\lst@fmtCDefX@#1}
+\gdef\lst@fmtCDefX@#1#2#3#4#5#6#7{%
+    \let#4#1%
+    \ifx\@empty#2\@empty
+        \def#1{\lst@fmtIfNextCharIn{#5}{#4}{#6#7}}%
+    \else \ifx\@empty#3\@empty
+        \def#1##1{%
+            \ifx##1#2%
+                \def\lst@next{\lst@fmtIfNextCharIn{#5}{#4##1}%
+                                                      {#6#7}}%
+            \else
+                 \def\lst@next{#4##1}%
+            \fi
+            \lst@next}%
+    \else
+        \def#1{%
+            \lst@IfNextCharsArg{#2#3}%
+                {\lst@fmtIfNextCharIn{#5}{\expandafter#4\lst@eaten}%
+                                         {#6#7}}%
+                {\expandafter#4\lst@eaten}}%
+    \fi \fi}
+\gdef\lst@UseFormat#1{%
+    \def\lst@fmtwhole{#1}%
+    \lst@UseFormat@}
+\gdef\lst@UseFormat@{%
+    \lst@fmtSplit\lst@fmtwhole,%
+    \let\lst@fmtwhole\lst@fmtb
+    \ifx\lst@fmta\@empty\else
+        \lst@fmtSplit\lst@fmta=%
+        \ifx\@empty\lst@fmta\else
+            \expandafter\lstKV@XOptArg\expandafter[\expandafter]%
+                \expandafter{\lst@fmtb}\lst@UseFormat@b
+        \fi
+    \fi
+    \ifx\lst@fmtwhole\@empty\else
+        \expandafter\lst@UseFormat@
+    \fi}
+\gdef\lst@UseFormat@b[#1]#2{%
+    \def\lst@fmtc{{#1}}\lst@lExtend\lst@fmtc{\expandafter{\lst@fmta}}%
+    \def\lst@fmtb{#2}%
+    \lst@fmtSplit\lst@fmtb\string
+    \ifx\@empty\lst@fmta
+        \lst@lAddTo\lst@fmtc{{}}%
+    \else
+        \lst@lExtend\lst@fmtc{\expandafter
+            {\expandafter\lst@fmtPre\expandafter{\lst@fmta}}}%
+    \fi
+    \ifx\@empty\lst@fmtb
+        \lst@lAddTo\lst@fmtc{{}}%
+    \else
+        \lst@lExtend\lst@fmtc{\expandafter
+            {\expandafter\lst@fmtPost\expandafter{\lst@fmtb}}}%
+    \fi
+    \expandafter\lst@UseFormat@c\lst@fmtc}
+\gdef\lst@UseFormat@c#1#2#3#4{%
+    \lst@fmtIfIdentifier#2\relax
+    {\lst@fmtIdentifier{#2}%
+     \lst@if\else \PackageWarning{Listings}%
+         {Cannot drop identifier in format definition}%
+     \fi}%
+    {\lst@if
+         \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDef}%
+     \else
+         \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDefX}%
+     \fi
+     \lst@DefActive\lst@fmtc{#1}%
+     \lst@lExtend\lst@fmtformat{\expandafter{\lst@fmtc}{#3}{#4}}}}
+\lst@AddToHook{SelectCharTable}{\lst@fmtformat}
+\global\let\lst@fmtformat\@empty
+\gdef\lst@fmtPre#1{%
+    \lst@PrintToken
+    \begingroup
+    \let\newline\lst@fmtEnsureNewLine
+    \let\space\lst@fmtEnsureSpace
+    \let\indent\lst@fmtIndent
+    \let\noindent\lst@fmtNoindent
+    #1%
+    \endgroup}
+\gdef\lst@fmtPost#1{%
+    \global\let\lst@fmtPostOutput\@empty
+    \begingroup
+    \def\newline{\lst@AddTo\lst@fmtPostOutput\lst@fmtEnsureNewLine}%
+    \def\space{\aftergroup\lst@fmtEnsurePostSpace}%
+    \def\indent{\lst@AddTo\lst@fmtPostOutput\lst@fmtIndent}%
+    \def\noindent{\lst@AddTo\lst@fmtPostOutput\lst@fmtNoindent}%
+    \aftergroup\lst@PrintToken
+    #1%
+    \endgroup}
+\lst@AddToHook{Init}{\global\let\lst@fmtPostOutput\@empty}
+\lst@AddToHook{PostOutput}
+    {\lst@fmtPostOutput \global\let\lst@fmtPostOutput\@empty}
+\gdef\lst@fmtEnsureSpace{%
+    \lst@ifwhitespace\else \expandafter\lst@ProcessSpace \fi}
+\gdef\lst@fmtEnsurePostSpace{%
+    \lst@IfNextCharWhitespace{}{\lst@ProcessSpace}}
+\lst@Key{fmtindent}{20pt}{\def\lst@fmtindent{#1}}
+\newdimen\lst@fmtcurrindent
+\lst@AddToHook{InitVars}{\global\lst@fmtcurrindent\z@}
+\gdef\lst@fmtIndent{\global\advance\lst@fmtcurrindent\lst@fmtindent}
+\gdef\lst@fmtNoindent{\global\advance\lst@fmtcurrindent-\lst@fmtindent}
+\gdef\lst@fmtEnsureNewLine{%
+    \global\advance\lst@newlines\@ne
+    \global\advance\lst@newlinesensured\@ne
+    \lst@fmtignoretrue}
+\lst@AddToAtTop\lst@DoNewLines{%
+    \ifnum\lst@newlines>\lst@newlinesensured
+        \global\advance\lst@newlines-\lst@newlinesensured
+    \fi
+    \global\lst@newlinesensured\z@}
+\newcount\lst@newlinesensured % global
+\lst@AddToHook{Init}{\global\lst@newlinesensured\z@}
+\gdef\lst@fmtignoretrue{\let\lst@fmtifignore\iftrue}
+\gdef\lst@fmtignorefalse{\let\lst@fmtifignore\iffalse}
+\lst@AddToHook{InitVars}{\lst@fmtignorefalse}
+\lst@AddToHook{Output}{\lst@fmtignorefalse}
+\gdef\lst@fmtUseLostSpace{%
+    \lst@ifnewline \kern\lst@fmtcurrindent \global\lst@lostspace\z@
+    \else
+        \lst@OldOLS
+    \fi}
+\lst@AddToHook{Init}
+    {\lst@true
+     \ifx\lst@fmtformat\@empty \ifx\lst@fmt\@empty \lst@false \fi\fi
+     \lst@if
+        \let\lst@OldOLS\lst@OutputLostSpace
+        \let\lst@OutputLostSpace\lst@fmtUseLostSpace
+        \let\lst@ProcessSpace\lst@fmtProcessSpace
+     \fi}
+\gdef\lst@fmtProcessSpace{%
+    \lst@ifletter
+        \lst@Output
+        \lst@fmtifignore\else
+            \lst@AppendOther\lst@outputspace
+        \fi
+    \else \lst@ifkeepspaces
+        \lst@AppendOther\lst@outputspace
+    \else \ifnum\lst@newlines=\z@
+        \lst@AppendSpecialSpace
+    \else \ifnum\lst@length=\z@
+            \global\advance\lst@lostspace\lst@width
+            \global\advance\lst@pos\m@ne
+        \else
+            \lst@AppendSpecialSpace
+        \fi
+    \fi \fi \fi
+    \lst@whitespacetrue}
+\lst@InstallTest{f}
+    \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt
+    \lst@gfmt@wp
+    wd
+\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty
+\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty
+\gdef\lst@gfmt@wp{%
+    \begingroup \let\lst@UM\@empty
+    \let\lst@PrintToken\@empty
+    \csname\@lst @fmt$\the\lst@token\endcsname
+    \endgroup}
+\gdef\lst@fmtIdentifier#1#2#3#4{%
+    \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}%
+    \@namedef{\@lst @fmt$\lst@fmta}{#3#4}}
+\lst@EndAspect
+\lst@BeginAspect{labels}
+\lst@Key{numbers}{none}{%
+    \let\lst@PlaceNumber\@empty
+    \lstKV@SwitchCases{#1}%
+    {none&\\%
+     left&\def\lst@PlaceNumber{\llap{\normalfont
+                \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\%
+     right&\def\lst@PlaceNumber{\rlap{\normalfont
+                \kern\linewidth \kern\lst@numbersep
+                \lst@numberstyle{\thelstnumber}}}%
+    }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
+\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}}
+\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}}
+\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}}
+\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne}
+\lst@Key{numberblanklines}{true}[t]
+    {\lstKV@SetIf{#1}\lst@ifnumberblanklines}
+\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline}
+\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse}
+\lst@Key{firstnumber}{auto}{%
+    \lstKV@SwitchCases{#1}%
+    {auto&\let\lst@firstnumber\@undefined\\%
+     last&\let\lst@firstnumber\c@lstnumber
+    }{\def\lst@firstnumber{#1\relax}}}
+\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@}
+\lst@AddToHook{PreInit}
+    {\ifx\lst@firstnumber\@undefined
+         \def\lst@firstnumber{\lst@lineno}%
+     \fi}
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline
+                       \else \lst@nololtrue \fi
+        \advance\@tempcnta\lst@advancenumber
+        \edef\lst@firstnumber{\the\@tempcnta\relax}%
+    \fi}
+\gdef\lst@SaveFirstNumber{%
+    \expandafter\xdef
+        \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi
+        \endcsname{\the\c@lstnumber}}
+\newcounter{lstnumber}% \global
+\global\c@lstnumber\@ne % init
+\renewcommand*\thelstnumber{\@arabic\c@lstnumber}
+\lst@AddToHook{EveryPar}
+    {\global\advance\c@lstnumber\lst@advancelstnum
+     \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}%
+     \lst@SkipOrPrintLabel}%
+\global\let\lst@advancelstnum\@ne
+\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}}
+\lst@AddToHook{InitVars}
+    {\global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum}
+\lst@AddToHook{ExitVars}
+    {\global\advance\c@lstnumber\lst@advancelstnum}
+\AtBeginDocument{%
+    \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting
+                                          \else \thelstlisting \fi
+                       .\thelstnumber}}
+\newcount\lst@skipnumbers % \global
+\lst@AddToHook{Init}
+    {\ifnum \z@>\lst@stepnumber
+         \let\lst@advancelstnum\m@ne
+         \edef\lst@stepnumber{-\lst@stepnumber}%
+     \fi
+     \ifnum \z@<\lst@stepnumber
+         \global\lst@skipnumbers\lst@firstnumber
+         \global\divide\lst@skipnumbers\lst@stepnumber
+         \global\multiply\lst@skipnumbers-\lst@stepnumber
+         \global\advance\lst@skipnumbers\lst@firstnumber
+         \ifnum\lst@skipnumbers>\z@
+             \global\advance\lst@skipnumbers -\lst@stepnumber
+         \fi
+     \else
+         \let\lst@SkipOrPrintLabel\relax
+     \fi}
+\gdef\lst@SkipOrPrintLabel{%
+    \ifnum\lst@skipnumbers=\z@
+        \global\advance\lst@skipnumbers-\lst@stepnumber\relax
+        \lst@PlaceNumber
+        \lst@numberfirstlinefalse
+    \else
+        \lst@ifnumberfirstline
+            \lst@PlaceNumber
+            \lst@numberfirstlinefalse
+        \fi
+    \fi
+    \global\advance\lst@skipnumbers\@ne}%
+\lst@AddToHook{OnEmptyLine}{%
+    \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@
+        \global\advance\lst@skipnumbers-\lst@stepnumber\relax
+    \fi\fi}
+\lst@EndAspect
+\lst@BeginAspect{lineshape}
+\lst@Key{xleftmargin}{\z@}{\def\lst@xleftmargin{#1}}
+\lst@Key{xrightmargin}{\z@}{\def\lst@xrightmargin{#1}}
+\lst@Key{resetmargins}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins}
+\lst@AddToHook{BoxUnsafe}{\let\lst@xleftmargin\z@
+                          \let\lst@xrightmargin\z@}
+\lst@AddToHook{TextStyle}{%
+    \let\lst@xleftmargin\z@ \let\lst@xrightmargin\z@
+    \let\lst@ifresetmargins\iftrue}
+\lst@Key{linewidth}\linewidth{\def\lst@linewidth{#1}}
+\lst@AddToHook{PreInit}{\linewidth\lst@linewidth\relax}
+\gdef\lst@parshape{%
+    \parshape\@ne \@totalleftmargin \linewidth}
+\lst@AddToHook{Init}
+    {\lst@ifresetmargins
+         \advance\linewidth\@totalleftmargin
+         \advance\linewidth\rightmargin
+         \@totalleftmargin\z@
+     \fi
+     \advance\linewidth-\lst@xleftmargin
+     \advance\linewidth-\lst@xrightmargin
+     \advance\@totalleftmargin\lst@xleftmargin\relax}
+\lst@Key{lineskip}{\z@}{\def\lst@lineskip{#1\relax}}
+\lst@AddToHook{Init}
+    {\parskip\z@
+     \ifdim\z@=\lst@lineskip\else
+         \@tempdima\baselineskip
+         \advance\@tempdima\lst@lineskip
+         \multiply\@tempdima\@cclvi
+         \divide\@tempdima\baselineskip\relax
+         \multiply\@tempdima\@cclvi
+         \edef\baselinestretch{\strip@pt\@tempdima}%
+         \selectfont
+     \fi}
+\lst@Key{breaklines}{false}[t]{\lstKV@SetIf{#1}\lst@ifbreaklines}
+\lst@Key{breakindent}{20pt}{\def\lst@breakindent{#1}}
+\lst@Key{breakautoindent}{t}[t]{\lstKV@SetIf{#1}\lst@ifbreakautoindent}
+\lst@Key{breakatwhitespace}{false}[t]%
+    {\lstKV@SetIf{#1}\lst@ifbreakatwhitespace}
+\lst@Key{prebreak}{}{\def\lst@prebreak{#1}}
+\lst@Key{postbreak}{}{\def\lst@postbreak{#1}}
+\lst@AddToHook{Init}
+    {\lst@ifbreaklines
+         \hbadness\@M \pretolerance\@M
+         \@rightskip\@flushglue \rightskip\@rightskip % \raggedright
+         \leftskip\z@skip \parindent\z@
+         \def\lst@parshape{\parshape\tw@ \@totalleftmargin\linewidth
+                           \lst@breakshape}%
+     \else
+         \let\lst@discretionary\@empty
+     \fi}
+\lst@AddToHook{OnNewLine}
+    {\lst@ifbreaklines \lst@breakNewLine \fi}
+\gdef\lst@discretionary{%
+    \lst@ifbreakatwhitespace
+        \lst@ifwhitespace \lst@@discretionary \fi
+    \else
+        \lst@@discretionary
+    \fi}%
+\gdef\lst@@discretionary{%
+    \discretionary{\let\space\lst@spacekern\lst@prebreak}%
+                  {\llap{\lsthk@EveryLine
+                   \kern\lst@breakcurrindent \kern-\@totalleftmargin}%
+                   \let\space\lst@spacekern\lst@postbreak}{}}
+\lst@AddToHook{PostOutput}{\lst@discretionary}
+\gdef\lst@spacekern{\kern\lst@width}
+\gdef\lst@breakNewLine{%
+    \@tempdima\lst@breakindent\relax
+    \lst@ifbreakautoindent \advance\@tempdima\lst@lostspace \fi
+    \@tempdimc-\@tempdima \advance\@tempdimc\linewidth
+                          \advance\@tempdima\@totalleftmargin
+    \xdef\lst@breakshape{\noexpand\lst@breakcurrindent \the\@tempdimc}%
+    \xdef\lst@breakcurrindent{\the\@tempdima}}
+\global\let\lst@breakcurrindent\z@ % init
+\gdef\lst@breakshape{\@totalleftmargin \linewidth}
+\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther}
+\lst@AddToHook{SelectCharTable}
+    {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi}
+\lst@EndAspect
+\lst@BeginAspect[lineshape]{frames}
+\lst@Key{framexleftmargin}{\z@}{\def\lst@framexleftmargin{#1}}
+\lst@Key{framexrightmargin}{\z@}{\def\lst@framexrightmargin{#1}}
+\lst@Key{framextopmargin}{\z@}{\def\lst@framextopmargin{#1}}
+\lst@Key{framexbottommargin}{\z@}{\def\lst@framexbottommargin{#1}}
+\lst@Key{backgroundcolor}{}{\def\lst@bkgcolor{#1}}
+\lst@Key{fillcolor}{}{\def\lst@fillcolor{#1}}
+\lst@Key{rulecolor}{}{\def\lst@rulecolor{#1}}
+\lst@Key{rulesepcolor}{}{\def\lst@rulesepcolor{#1}}
+\lst@AddToHook{Init}{%
+    \ifx\lst@fillcolor\@empty
+        \let\lst@fillcolor\lst@bkgcolor
+    \fi
+    \ifx\lst@rulesepcolor\@empty
+        \let\lst@rulesepcolor\lst@fillcolor
+    \fi}
+\lst@Key{rulesep}{2pt}{\def\lst@rulesep{#1}}
+\lst@Key{framerule}{.4pt}{\def\lst@framerulewidth{#1}}
+\lst@Key{framesep}{3pt}{\def\lst@frametextsep{#1}}
+\lst@Key{frameshape}{}{%
+    \let\lst@xrulecolor\@empty
+    \lstKV@FourArg{#1}%
+    {\uppercase{\def\lst@frametshape{##1}}%
+     \uppercase{\def\lst@framelshape{##2}}%
+     \uppercase{\def\lst@framershape{##3}}%
+     \uppercase{\def\lst@framebshape{##4}}%
+     \let\lst@ifframeround\iffalse
+     \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}%
+     \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}%
+     \def\lst@frame{##1##2##3##4}}}
+\lst@Key{frameround}\relax
+    {\uppercase{\def\lst@frameround{#1}}%
+     \expandafter\lstframe@\lst@frameround ffff\relax}
+\global\let\lst@frameround\@empty
+\lst@Key{frame}\relax{%
+    \let\lst@xrulecolor\@empty
+    \lstKV@SwitchCases{#1}%
+    {none&\let\lst@frame\@empty\\%
+     leftline&\def\lst@frame{l}\\%
+     topline&\def\lst@frame{t}\\%
+     bottomline&\def\lst@frame{b}\\%
+     lines&\def\lst@frame{tb}\\%
+     single&\def\lst@frame{trbl}\\%
+     shadowbox&\def\lst@frame{tRBl}%
+            \def\lst@xrulecolor{\lst@rulesepcolor}%
+            \def\lst@rulesep{\lst@frametextsep}%
+    }{\def\lst@frame{#1}}%
+    \expandafter\lstframe@\lst@frameround ffff\relax}
+\gdef\lstframe@#1#2#3#4#5\relax{%
+    \lst@IfSubstring T\lst@frame{\edef\lst@frame{t\lst@frame}}{}%
+    \lst@IfSubstring R\lst@frame{\edef\lst@frame{r\lst@frame}}{}%
+    \lst@IfSubstring B\lst@frame{\edef\lst@frame{b\lst@frame}}{}%
+    \lst@IfSubstring L\lst@frame{\edef\lst@frame{l\lst@frame}}{}%
+    \let\lst@frametshape\@empty \let\lst@framebshape\@empty
+    \lst@frameCheck
+        ltr\lst@framelshape\lst@frametshape\lst@framershape #4#1%
+    \lst@frameCheck
+        LTR\lst@framelshape\lst@frametshape\lst@framershape #4#1%
+    \lst@frameCheck
+        lbr\lst@framelshape\lst@framebshape\lst@framershape #3#2%
+    \lst@frameCheck
+        LBR\lst@framelshape\lst@framebshape\lst@framershape #3#2%
+    \let\lst@ifframeround\iffalse
+    \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}%
+    \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}%
+    \let\lst@framelshape\@empty \let\lst@framershape\@empty
+    \lst@IfSubstring L\lst@frame
+        {\def\lst@framelshape{YY}}%
+        {\lst@IfSubstring l\lst@frame{\def\lst@framelshape{Y}}{}}%
+    \lst@IfSubstring R\lst@frame
+        {\def\lst@framershape{YY}}%
+        {\lst@IfSubstring r\lst@frame{\def\lst@framershape{Y}}{}}}
+\gdef\lst@frameCheck#1#2#3#4#5#6#7#8{%
+    \lst@IfSubstring #1\lst@frame
+        {\if #7T\def#4{R}\else \def#4{Y}\fi}%
+        {\def#4{N}}%
+    \lst@IfSubstring #3\lst@frame
+        {\if #8T\def#6{R}\else \def#6{Y}\fi}%
+        {\def#6{N}}%
+    \lst@IfSubstring #2\lst@frame{\edef#5{#5#4Y#6}}{}}
+\lst@AddToHook{TextStyle}
+   {\let\lst@frame\@empty
+    \let\lst@frametshape\@empty
+    \let\lst@framershape\@empty
+    \let\lst@framebshape\@empty
+    \let\lst@framelshape\@empty
+    \let\lst@bkgcolor\@empty}
+\gdef\lst@frameMakeBoxV#1#2#3{%
+    \setbox#1\hbox{%
+      \color@begingroup \lst@rulecolor
+      \ifx\lst@framelshape\@empty
+      \else
+            \llap{%
+                \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}%
+                \kern\lst@framexleftmargin}%
+      \fi
+      \llap{\setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3%
+                            \lst@frameL}%
+            \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}%
+                                                  {\ht\z@}{\dp\z@}}%
+            \box\z@
+            \kern\lst@frametextsep\relax
+            \kern\lst@framexleftmargin}%
+      \rlap{\kern-\lst@framexleftmargin
+                    \@tempdima\linewidth
+            \advance\@tempdima\lst@framexleftmargin
+            \advance\@tempdima\lst@framexrightmargin
+            \lst@frameBlock\lst@bkgcolor\@tempdima{#2}{#3}%
+            \ifx\lst@framershape\@empty
+                \kern\lst@frametextsep\relax
+            \else
+                \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}%
+            \fi
+            \setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3%
+                            \lst@frameR}%
+            \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}%
+                                                  {\ht\z@}{\dp\z@}}%
+            \box\z@}%
+      \color@endgroup}}
+\gdef\lst@frameBlock#1#2#3#4{%
+    \color@begingroup
+      #1%
+      \setbox\z@\hbox{\vrule\@height#3\@depth#4%
+                      \ifx#1\@empty \@width\z@ \kern#2\relax
+                              \else \@width#2\relax \fi}%
+      \box\z@
+    \color@endgroup}
+\gdef\lst@frameR{%
+    \expandafter\lst@frameR@\lst@framershape\relax
+    \kern-\lst@rulesep}
+\gdef\lst@frameR@#1{%
+    \ifx\relax#1\@empty\else
+        \if #1Y\lst@framevrule \else \kern\lst@framerulewidth \fi
+        \kern\lst@rulesep
+        \expandafter\lst@frameR@b
+    \fi}
+\gdef\lst@frameR@b#1{%
+    \ifx\relax#1\@empty
+    \else
+        \if #1Y\color@begingroup
+               \lst@xrulecolor
+               \lst@framevrule
+               \color@endgroup
+        \else
+               \kern\lst@framerulewidth
+        \fi
+        \kern\lst@rulesep
+        \expandafter\lst@frameR@
+    \fi}
+\gdef\lst@frameL{%
+    \kern-\lst@rulesep
+    \expandafter\lst@frameL@\lst@framelshape\relax}
+\gdef\lst@frameL@#1{%
+    \ifx\relax#1\@empty\else
+        \kern\lst@rulesep
+        \if#1Y\lst@framevrule \else \kern\lst@framerulewidth \fi
+        \expandafter\lst@frameL@
+    \fi}
+\gdef\lst@frameH#1#2{%
+    \global\let\lst@framediml\z@ \global\let\lst@framedimr\z@
+    \setbox\z@\hbox{}\@tempcntb\z@
+    \expandafter\lst@frameH@\expandafter#1#2\relax\relax\relax
+            \@tempdimb\lst@frametextsep\relax
+    \advance\@tempdimb\lst@framerulewidth\relax
+            \@tempdimc-\@tempdimb
+    \advance\@tempdimc\ht\z@
+    \advance\@tempdimc\dp\z@
+    \setbox\z@=\hbox{%
+      \lst@frameHBkg\lst@fillcolor\@tempdimb\@firstoftwo
+      \if#1T\rlap{\raise\dp\@tempboxa\box\@tempboxa}%
+       \else\rlap{\lower\ht\@tempboxa\box\@tempboxa}\fi
+      \lst@frameHBkg\lst@rulesepcolor\@tempdimc\@secondoftwo
+      \advance\@tempdimb\ht\@tempboxa
+      \if#1T\rlap{\raise\lst@frametextsep\box\@tempboxa}%
+       \else\rlap{\lower\@tempdimb\box\@tempboxa}\fi
+      \rlap{\box\z@}%
+    }}
+\gdef\lst@frameH@#1#2#3#4{%
+    \ifx\relax#4\@empty\else
+        \lst@frameh \@tempcntb#1#2#3#4%
+        \advance\@tempcntb\@ne
+        \expandafter\lst@frameH@\expandafter#1%
+    \fi}
+\gdef\lst@frameHBkg#1#2#3{%
+    \setbox\@tempboxa\hbox{%
+        \kern-\lst@framexleftmargin
+        #3{\kern-\lst@framediml\relax}{\@tempdima\z@}%
+        \ifdim\lst@framediml>\@tempdimb
+            #3{\@tempdima\lst@framediml \advance\@tempdima-\@tempdimb
+               \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@}%
+              {\kern-\lst@framediml
+               \advance\@tempdima\lst@framediml\relax}%
+        \fi
+        #3{\@tempdima\z@
+           \ifx\lst@framelshape\@empty\else
+               \advance\@tempdima\@tempdimb
+           \fi
+           \ifx\lst@framershape\@empty\else
+               \advance\@tempdima\@tempdimb
+           \fi}%
+          {\ifdim\lst@framedimr>\@tempdimb
+              \advance\@tempdima\lst@framedimr\relax
+           \fi}%
+        \advance\@tempdima\linewidth
+        \advance\@tempdima\lst@framexleftmargin
+        \advance\@tempdima\lst@framexrightmargin
+        \lst@frameBlock#1\@tempdima#2\z@
+        #3{\ifdim\lst@framedimr>\@tempdimb
+               \@tempdima-\@tempdimb
+               \advance\@tempdima\lst@framedimr\relax
+               \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@
+           \fi}{}%
+        }}
+\gdef\lst@frameh#1#2#3#4#5{%
+    \lst@frameCalcDimA#1%
+    \lst@ifframeround \@getcirc\@tempdima \fi
+    \setbox\z@\hbox{%
+      \begingroup
+      \setbox\z@\hbox{%
+        \kern-\lst@framexleftmargin
+        \color@begingroup
+        \ifnum#1=\z@ \lst@rulecolor \else \lst@xrulecolor \fi
+        \lst@frameCornerX\llap{#2L}#3#1%
+        \ifdim\lst@framediml<\@tempdimb
+            \xdef\lst@framediml{\the\@tempdimb}%
+        \fi
+        \begingroup
+        \if#4Y\else \let\lst@framerulewidth\z@ \fi
+                \@tempdima\lst@framexleftmargin
+        \advance\@tempdima\lst@framexrightmargin
+        \advance\@tempdima\linewidth
+        \vrule\@width\@tempdima\@height\lst@framerulewidth \@depth\z@
+        \endgroup
+        \lst@frameCornerX\rlap{#2R}#5#1%
+        \ifdim\lst@framedimr<\@tempdimb
+            \xdef\lst@framedimr{\the\@tempdimb}%
+        \fi
+        \color@endgroup}%
+      \if#2T\rlap{\raise\dp\z@\box\z@}%
+       \else\rlap{\lower\ht\z@\box\z@}\fi
+      \endgroup
+      \box\z@}}
+\gdef\lst@frameCornerX#1#2#3#4{%
+    \setbox\@tempboxa\hbox{\csname\@lst @frame\if#3RR\fi #2\endcsname}%
+    \@tempdimb\wd\@tempboxa
+    \if #3R%
+        #1{\box\@tempboxa}%
+    \else
+        \if #3Y\expandafter#1\else
+               \@tempdimb\z@ \expandafter\vphantom \fi
+        {\box\@tempboxa}%
+    \fi}
+\gdef\lst@frameCalcDimA#1{%
+            \@tempdima\lst@rulesep
+    \advance\@tempdima\lst@framerulewidth
+    \multiply\@tempdima#1\relax
+    \advance\@tempdima\lst@frametextsep
+    \advance\@tempdima\lst@framerulewidth
+    \multiply\@tempdima\tw@}
+\lst@AddToHook{Init}{\lst@frameInit}
+\newbox\lst@framebox
+\gdef\lst@frameInit{%
+    \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi
+    \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi
+    \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}%
+    \lst@ifframeround
+        \lst@frameCalcDimA\z@ \@getcirc\@tempdima
+        \@tempdimb\@tempdima \divide\@tempdimb\tw@
+        \advance\@tempdimb -\@wholewidth
+        \edef\lst@frametextsep{\the\@tempdimb}%
+        \edef\lst@framerulewidth{\the\@wholewidth}%
+        \lst@frameCalcDimA\@ne \@getcirc\@tempdima
+        \@tempdimb\@tempdima \divide\@tempdimb\tw@
+        \advance\@tempdimb -\tw@\@wholewidth
+        \advance\@tempdimb -\lst@frametextsep
+        \edef\lst@rulesep{\the\@tempdimb}%
+    \fi
+    \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}%
+    \def\lst@framelr{\copy\lst@framebox}%
+    \ifx\lst@frametshape\@empty\else
+        \lst@frameH T\lst@frametshape
+        \ifvoid\z@\else
+            \par\lst@parshape
+            \@tempdima-\baselineskip \advance\@tempdima\ht\z@
+            \ifdim\prevdepth<\@cclvi\p@\else
+                \advance\@tempdima\prevdepth
+            \fi
+            \ifdim\@tempdima<\z@
+                \vskip\@tempdima\vskip\lineskip
+            \fi
+            \noindent\box\z@\par
+            \lineskiplimit\maxdimen \lineskip\z@
+        \fi
+        \lst@frameSpreadV\lst@framextopmargin
+    \fi}
+\lst@AddToHook{EveryLine}{\lst@framelr}
+\global\let\lst@framelr\@empty
+\lst@AddToHook{DeInit}
+    {\ifx\lst@framebshape\@empty\else \lst@frameExit \fi}
+\gdef\lst@frameExit{%
+    \lst@frameSpreadV\lst@framexbottommargin
+    \lst@frameH B\lst@framebshape
+    \ifvoid\z@\else
+        \everypar{}\par\lst@parshape\nointerlineskip\noindent\box\z@
+    \fi}
+\gdef\lst@frameSpreadV#1{%
+    \ifdim\z@=#1\else
+        \everypar{}\par\lst@parshape\nointerlineskip\noindent
+        \lst@frameMakeBoxV\z@{#1}{\z@}%
+        \box\z@
+    \fi}
+\gdef\lst@frameTR{%
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@
+    \kern-\lst@framerulewidth
+    \raise\lst@framerulewidth\hbox{%
+        \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}}
+\gdef\lst@frameBR{%
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@
+    \kern-\lst@framerulewidth
+    \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@}
+\gdef\lst@frameBL{%
+    \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@
+    \kern-\lst@framerulewidth
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@}
+\gdef\lst@frameTL{%
+    \raise\lst@framerulewidth\hbox{%
+        \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}%
+    \kern-\lst@framerulewidth
+    \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@}
+\gdef\lst@frameRoundT{%
+    \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}%
+    \ht\@tempboxa\lst@framerulewidth
+    \box\@tempboxa}
+\gdef\lst@frameRoundB{%
+    \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}%
+    \dp\@tempboxa\z@
+    \box\@tempboxa}
+\gdef\lst@frameRTR{%
+    \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth
+                           \kern.5\@tempdima \lst@frameRoundT \hss}}
+\gdef\lst@frameRBR{%
+    \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth
+    \advance\@tempcnta\@ne \kern.5\@tempdima \lst@frameRoundB \hss}}
+\gdef\lst@frameRBL{%
+    \advance\@tempcnta\tw@ \lst@frameRoundB
+    \kern-.5\@tempdima}
+\gdef\lst@frameRTL{%
+    \advance\@tempcnta\thr@@\lst@frameRoundT
+    \kern-.5\@tempdima}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{make}
+\lst@NewMode\lst@makemode
+\lst@AddToHook{Output}{%
+    \ifnum\lst@mode=\lst@makemode
+        \ifx\lst@thestyle\lst@gkeywords@sty
+            \lst@makekeytrue
+        \fi
+    \fi}
+\gdef\lst@makekeytrue{\let\lst@ifmakekey\iftrue}
+\gdef\lst@makekeyfalse{\let\lst@ifmakekey\iffalse}
+\global\lst@makekeyfalse % init
+\lst@Key{makemacrouse}f[t]{\lstKV@SetIf{#1}\lst@ifmakemacrouse}
+\gdef\lst@MakeSCT{%
+    \lst@ifmakemacrouse
+        \lst@ReplaceInput{$(}{%
+            \lst@PrintToken
+            \lst@EnterMode\lst@makemode{\lst@makekeyfalse}%
+            \lst@Merge{\lst@ProcessOther\$\lst@ProcessOther(}}%
+        \lst@ReplaceInput{)}{%
+            \ifnum\lst@mode=\lst@makemode
+                \lst@PrintToken
+                \begingroup
+                    \lst@ProcessOther)%
+                    \lst@ifmakekey
+                        \let\lst@currstyle\lst@gkeywords@sty
+                    \fi
+                    \lst@OutputOther
+                \endgroup
+                \lst@LeaveMode
+            \else
+                \expandafter\lst@ProcessOther\expandafter)%
+            \fi}%
+    \else
+        \lst@ReplaceInput{$(}{\lst@ProcessOther\$\lst@ProcessOther(}%
+    \fi}
+\lst@EndAspect
+\lst@BeginAspect{0.21}
+\lst@Key{labelstyle}{}{\def\lst@numberstyle{#1}}
+\lst@Key{labelsep}{10pt}{\def\lst@numbersep{#1}}
+\lst@Key{labelstep}{0}{%
+    \ifnum #1=\z@ \KV@lst@numbers{none}%
+            \else \KV@lst@numbers{left}\fi
+    \def\lst@stepnumber{#1\relax}}
+\lst@Key{firstlabel}\relax{\def\lst@firstnumber{#1\relax}}
+\lst@Key{advancelabel}\relax{\def\lst@advancenumber{#1\relax}}
+\let\c@lstlabel\c@lstnumber
+\lst@AddToHook{Init}{\def\thelstnumber{\thelstlabel}}
+\newcommand*\thelstlabel{\@arabic\c@lstlabel}
+\lst@Key{first}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{last}\relax{\def\lst@lastline{#1\relax}}
+\lst@Key{framerulewidth}{.4pt}{\def\lst@framerulewidth{#1}}
+\lst@Key{framerulesep}{2pt}{\def\lst@rulesep{#1}}
+\lst@Key{frametextsep}{3pt}{\def\lst@frametextsep{#1}}
+\lst@Key{framerulecolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@rulecolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@rulecolor{\color{##2}}%
+         \else
+             \def\lst@rulecolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{backgroundcolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@bkgcolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@bkgcolor{\color{##2}}%
+         \else
+             \def\lst@bkgcolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{framespread}{\z@}{\def\lst@framespread{#1}}
+\lst@AddToHook{PreInit}
+    {\@tempdima\lst@framespread\relax \divide\@tempdima\tw@
+     \edef\lst@framextopmargin{\the\@tempdima}%
+     \let\lst@framexrightmargin\lst@framextopmargin
+     \let\lst@framexbottommargin\lst@framextopmargin
+     \advance\@tempdima\lst@xleftmargin\relax
+     \edef\lst@framexleftmargin{\the\@tempdima}}
+\newdimen\lst@innerspread \newdimen\lst@outerspread
+\lst@Key{spread}{\z@,\z@}{\lstKV@CSTwoArg{#1}%
+    {\lst@innerspread##1\relax
+     \ifx\@empty##2\@empty
+         \divide\lst@innerspread\tw@\relax
+         \lst@outerspread\lst@innerspread
+     \else
+         \lst@outerspread##2\relax
+     \fi}}
+\lst@AddToHook{BoxUnsafe}{\lst@outerspread\z@ \lst@innerspread\z@}
+\lst@Key{wholeline}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins}
+\lst@Key{indent}{\z@}{\def\lst@xleftmargin{#1}}
+\lst@AddToHook{PreInit}
+    {\lst@innerspread=-\lst@innerspread
+     \lst@outerspread=-\lst@outerspread
+     \ifodd\c@page \advance\lst@innerspread\lst@xleftmargin
+             \else \advance\lst@outerspread\lst@xleftmargin \fi
+     \ifodd\c@page
+         \edef\lst@xleftmargin{\the\lst@innerspread}%
+         \edef\lst@xrightmargin{\the\lst@outerspread}%
+     \else
+         \edef\lst@xleftmargin{\the\lst@outerspread}%
+         \edef\lst@xrightmargin{\the\lst@innerspread}%
+     \fi}
+\lst@Key{defaultclass}\relax{\def\lst@classoffset{#1}}
+\lst@Key{stringtest}\relax{}% dummy
+\lst@Key{outputpos}\relax{\lst@outputpos#1\relax\relax}
+\lst@Key{stringspaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces}
+\lst@Key{visiblespaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{visibletabs}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+\lst@EndAspect
+\lst@BeginAspect{fancyvrb}
+\@ifundefined{FancyVerbFormatLine}
+    {\typeout{^^J%
+     ***^^J%
+     *** `listings.sty' needs `fancyvrb.sty' right now.^^J%
+     *** Please ensure its availability and try again.^^J%
+     ***^^J}%
+     \batchmode \@@end}{}
+\gdef\lstFV@fancyvrb{%
+    \lst@iffancyvrb
+        \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine\else
+            \let\lstFV@FVFL\FancyVerbFormatLine
+            \let\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \fi
+    \else
+        \ifx\lstFV@FVFL\@undefined\else
+            \let\FancyVerbFormatLine\lstFV@FVFL
+            \let\lstFV@FVFL\@undefined
+        \fi
+    \fi}
+\gdef\lstFV@VerbatimBegin{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \lsthk@TextStyle \lsthk@BoxUnsafe
+        \lsthk@PreSet
+        \lst@activecharsfalse
+        \let\normalbaselines\relax
+\xdef\lstFV@RestoreData{\noexpand\linewidth\the\linewidth\relax}%
+        \lst@Init\relax
+        \lst@ifresetmargins \advance\linewidth-\@totalleftmargin \fi
+\lstFV@RestoreData
+        \everypar{}\global\lst@newlines\z@
+        \lst@mode\lst@nomode \let\lst@entermodes\@empty
+        \lst@InterruptModes
+%% D.G. modification begin - Nov. 25, 1998
+        \let\@noligs\relax
+%% D.G. modification end
+    \fi}
+\gdef\lstFV@VerbatimEnd{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \global\setbox\lstFV@gtempboxa\box\@tempboxa
+        \global\let\@gtempa\FV@ProcessLine
+        \lst@mode\lst@Pmode
+        \lst@DeInit
+        \let\FV@ProcessLine\@gtempa
+        \setbox\@tempboxa\box\lstFV@gtempboxa
+        \par
+    \fi}
+\newbox\lstFV@gtempboxa
+\lst@AddTo\FV@VerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@VerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@LVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@LVerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@BVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@BVerbatimEnd\lstFV@VerbatimEnd
+\gdef\lstFV@FancyVerbFormatLine#1{%
+    \let\lst@arg\@empty \lst@FVConvert#1\@nil
+    \global\lst@newlines\z@
+    \vtop{\noindent\lst@parshape
+          \lst@ReenterModes
+          \lst@arg \lst@PrintToken\lst@EOLUpdate\lsthk@InitVarsBOL
+          \lst@InterruptModes}}
+\lst@Key{fvcmdparams}%
+    {\overlay\@ne}%
+    {\def\lst@FVcmdparams{,#1}}
+\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,#1}}
+\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}%
+\gdef\lst@FVConvertO@{%
+    \ifcase\@tempcnta
+        \expandafter\futurelet\expandafter\@let@token
+        \expandafter\lst@FVConvert@@
+    \else
+        \expandafter\lst@FVConvertO@a
+    \fi}
+\gdef\lst@FVConvertO@a#1{%
+    \lst@lAddTo\lst@arg{{#1}}\advance\@tempcnta\m@ne
+    \lst@FVConvertO@}%
+\gdef\lst@FVConvert@@{%
+    \ifcat\noexpand\@let@token\bgroup \expandafter\lst@FVConvertArg
+                                \else \expandafter\lst@FVConvert@ \fi}
+\gdef\lst@FVConvertArg#1{%
+    {\let\lst@arg\@empty
+     \lst@FVConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+     \lst@lExtend\lst@arg{\expandafter{\@gtempa\lst@PrintToken}}%
+     \lst@FVConvert}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvert
+    \fi}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+          \def\lst@temp##1,#1##2,##3##4\relax{%
+              \ifx##3\@empty \else \@tempcnta##2\relax \fi}%
+          \expandafter\lst@temp\lst@FVcmdparams,#1\z@,\@empty\relax
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvertO@
+    \fi}
+\lst@EndAspect
+\lst@BeginAspect[keywords,comments,strings,language]{lgrind}
+\gdef\lst@LGGetNames#1:#2\relax{%
+    \lst@NormedDef\lstlang@{#1}\lst@ReplaceInArg\lstlang@{|,}%
+    \def\lst@arg{:#2}}
+\gdef\lst@LGGetValue#1{%
+    \lst@false
+    \def\lst@temp##1:#1##2##3\relax{%
+        \ifx\@empty##2\else \lst@LGGetValue@{#1}\fi}
+    \expandafter\lst@temp\lst@arg:#1\@empty\relax}
+\gdef\lst@LGGetValue@#1{%
+    \lst@true
+    \def\lst@temp##1:#1##2:##3\relax{%
+        \@ifnextchar=\lst@LGGetValue@@{\lst@LGGetValue@@=}##2\relax
+        \def\lst@arg{##1:##3}}%
+    \expandafter\lst@temp\lst@arg\relax}
+\gdef\lst@LGGetValue@@=#1\relax{\def\lst@LGvalue{#1}}
+\gdef\lst@LGGetComment#1#2{%
+    \let#2\@empty
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,commentline={#2}}%
+            \let#2\@empty
+        \else
+            \edef#2{{#2}{\lst@LGvalue}}%
+        \fi
+    \fi}
+\gdef\lst@LGGetString#1#2{%
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,morestringizer=[l]{#2}}%
+        \else
+            \ifx #2\lst@LGvalue
+                \edef\lstlang@{\lstlang@,morestringizer=[d]{#2}}%
+            \else
+                \edef\lst@temp{\lst@LGe#2}%
+                \ifx \lst@temp\lst@LGvalue
+                    \edef\lstlang@{\lstlang@,morestringizer=[b]{#2}}%
+                \else
+                    \PackageWarning{Listings}%
+                    {String #2...\lst@LGvalue\space not supported}%
+                \fi
+            \fi
+        \fi
+    \fi}
+\gdef\lst@LGDefLang{%
+    \lst@LGReplace
+    \let\lstlang@\empty
+    \lst@LGGetValue{kw}%
+    \lst@if
+        \lst@ReplaceInArg\lst@LGvalue{{ },}%
+        \edef\lstlang@{\lstlang@,keywords={\lst@LGvalue}}%
+    \fi
+    \lst@LGGetValue{oc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,sensitive=f}%
+    \fi
+    \lst@LGGetValue{id}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,alsoletter=\lst@LGvalue}%
+    \fi
+    \lst@LGGetComment a\lst@LGa
+    \lst@LGGetComment c\lst@LGc
+    \ifx\lst@LGa\@empty
+        \ifx\lst@LGc\@empty\else
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGc}%
+        \fi
+    \else
+        \ifx\lst@LGc\@empty
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGa}%
+        \else
+            \edef\lstlang@{\lstlang@,doublecomment=\lst@LGc\lst@LGa}%
+        \fi
+    \fi
+    \lst@LGGetString s\lst@LGa
+    \lst@LGGetString l\lst@LGa
+    \lst@LGGetValue{tc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,lgrindef=\lst@LGvalue}%
+    \fi
+    \expandafter\xdef\csname\@lst LGlang@\lst@language@\endcsname
+        {\noexpand\lstset{\lstlang@}}%
+    \lst@ReplaceInArg\lst@arg{{: :}:}\let\lst@LGvalue\@empty
+    \expandafter\lst@LGDroppedCaps\lst@arg\relax\relax
+    \ifx\lst@LGvalue\@empty\else
+        \PackageWarningNoLine{Listings}{Ignored capabilities for
+            \space `\lst@language@' are\MessageBreak\lst@LGvalue}%
+    \fi}
+\gdef\lst@LGDroppedCaps#1:#2#3{%
+    \ifx#2\relax
+        \lst@RemoveCommas\lst@LGvalue
+    \else
+        \edef\lst@LGvalue{\lst@LGvalue,#2#3}%
+        \expandafter\lst@LGDroppedCaps
+    \fi}
+\begingroup
+\catcode`\/=0
+\lccode`\z=`\:\lccode`\y=`\^\lccode`\x=`\$\lccode`\v=`\|
+\catcode`\\=12\relax
+/lowercase{%
+/gdef/lst@LGReplace{/lst@ReplaceInArg/lst@arg
+    {{\:}{z }{\^}{y}{\$}{x}{\|}{v}{ \ }{ }{:\ :}{:}{\ }{ }{\(}({\)})}}
+/gdef/lst@LGe{\e}
+}
+/endgroup
+\gdef\lst@LGRead#1\par{%
+    \lst@LGGetNames#1:\relax
+    \def\lst@temp{endoflanguagedefinitions}%
+    \ifx\lstlang@\lst@temp
+        \let\lst@next\endinput
+    \else
+        \expandafter\lst@IfOneOf\lst@language@\relax\lstlang@
+            {\lst@LGDefLang \let\lst@next\endinput}%
+            {\let\lst@next\lst@LGRead}%
+    \fi
+    \lst@next}
+\lst@Key{lgrindef}\relax{%
+    \lst@NormedDef\lst@language@{#1}%
+    \begingroup
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\everypar{\lst@LGRead}%
+         \catcode`\\=12\catcode`\{=12\catcode`\}=12\catcode`\%=12%
+         \catcode`\#=14\catcode`\$=12\catcode`\^=12\catcode`\_=12\relax
+         \input{\lstlgrindeffile}%
+        }{}%
+    \endgroup
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\PackageError{Listings}%
+         {LGrind language \lst@language@\space undefined}%
+         {The language is not loadable. \@ehc}}%
+        {\lsthk@SetLanguage
+         \csname\@lst LGlang@\lst@language@\endcsname}}
+\@ifundefined{lstlgrindeffile}
+    {\lst@UserCommand\lstlgrindeffile{lgrindef.}}{}
+\lst@EndAspect
+\lst@BeginAspect[keywords]{hyper}
+\lst@Key{hyperanchor}\hyper@@anchor{\let\lst@hyperanchor#1}
+\lst@Key{hyperlink}\hyperlink{\let\lst@hyperlink#1}
+\lst@InstallKeywords{h}{hyperref}{}\relax{}
+    {\begingroup
+         \let\lst@UM\@empty \xdef\@gtempa{\the\lst@token}%
+     \endgroup
+     \lst@GetFreeMacro{lstHR@\@gtempa}%
+     \global\expandafter\let\lst@freemacro\@empty
+     \@tempcntb\@tempcnta \advance\@tempcntb\m@ne
+     \edef\lst@alloverstyle##1{%
+         \let\noexpand\lst@alloverstyle\noexpand\@empty
+         \noexpand\smash{\raise\baselineskip\hbox
+             {\noexpand\lst@hyperanchor{lst.\@gtempa\the\@tempcnta}%
+                                       {\relax}}}%
+         \ifnum\@tempcnta=\z@ ##1\else
+             \noexpand\lst@hyperlink{lst.\@gtempa\the\@tempcntb}{##1}%
+         \fi}%
+    }
+    od
+\lst@EndAspect
+\endinput
+%%
+%% End of file `lstmisc.sty'.
Index: doc/bibliography/cfa.bib
===================================================================
--- doc/bibliography/cfa.bib	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/bibliography/cfa.bib	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -2924,8 +2924,8 @@
 
 @unpublished{Bilson,
-	keywords = {generic programming, generics, polymorphism},
-	contributor  {a3moss@plg},
-	author = {Richard C. Bilson and Glen Ditchfield and Peter A. Buhr},
-	title = {Generic Programming with Inferred Models},
+    keywords	= {generic programming, generics, polymorphism},
+    contributor	= {a3moss@plg},
+    author	= {Richard C. Bilson and Glen Ditchfield and Peter A. Buhr},
+    title	= {Generic Programming with Inferred Models},
 }
 
Index: doc/refrat/Makefile
===================================================================
--- doc/refrat/Makefile	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/refrat/Makefile	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,6 +1,6 @@
 ## Define the appropriate configuration variables.
 
-TeXLIB = .:../bibliography/:../LaTeXmacros/:
-LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
+TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
+LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
 
Index: doc/refrat/refrat.tex
===================================================================
--- doc/refrat/refrat.tex	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/refrat/refrat.tex	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:52:25 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Fri Jun  3 09:43:48 2016
-%% Update Count     : 66
+%% Last Modified On : Sat Jun 18 19:21:30 2016
+%% Update Count     : 74
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -18,6 +18,8 @@
 
 % inline code ©...© (copyright symbol) emacs: C-q M-)
-% red highlighting ®...® (registered trademark sumbol) emacs: C-q M-.
-% latex escape §...§ (section symbol) emacs: C-q M-'
+% red highlighting ®...® (registered trademark symbol) emacs: C-q M-.
+% blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_
+% green highlighting ¢...¢ (cent symbol) emacs: C-q M-"
+% LaTex escape §...§ (section symbol) emacs: C-q M-'
 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^
 % math escape $...$ (dollar symbol)
@@ -32,13 +34,15 @@
 \usepackage{fullpage,times,comment}
 \usepackage{epic,eepic}
-\usepackage{upquote}									% switch curled `' to straight `'
+\usepackage{upquote}									% switch curled `'" to straight
 \usepackage{xspace}
 \usepackage{varioref}									% extended references
 \usepackage{listings}									% format program code
-\usepackage{footmisc}									% support label/reference in footnote
+\usepackage[flushmargin]{footmisc}						% support label/reference in footnote
 \usepackage{latexsym}                                   % \Box glyph
 \usepackage{mathptmx}                                   % better math font with "times"
+\usepackage[usenames]{color}
 \usepackage[pagewise]{lineno}
 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
+\input{common}                                          % bespoke macros used in the document
 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
 \usepackage{breakurl}
@@ -47,12 +51,13 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-% Bespoke macros used in the document.
-\input{common}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 % Names used in the document.
 
 \newcommand{\Version}{1.0.0}
+
+\newcommand{\Textbf}[2][red]{{\color{#1}{\textbf{#2}}}}
+\newcommand{\Emph}[2][red]{{\color{#1}\textbf{\emph{#2}}}}
+\newcommand{\R}[1]{\Textbf{#1}}
+\newcommand{\B}[1]{{\Textbf[blue]{#1}}}
+\newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -76,5 +81,6 @@
 }% author
 \date{
-DRAFT\\\today
+DRAFT \\
+\today
 }% date
 
@@ -390,14 +396,18 @@
 \end{itemize}
 
+
 \section{Lexical elements}
+
+
 \subsection{Keywords}
+
 \begin{syntax}
 \oldlhs{keyword}
-	\rhs ©forall©
-	\rhs ©lvalue©
-	\rhs ©trait©
-	\rhs ©dtype©
-	\rhs ©ftype©
-	\rhs ©otype©
+\rhs ©forall©
+\rhs ©lvalue©
+\rhs ©trait©
+\rhs ©dtype©
+\rhs ©ftype©
+\rhs ©otype©
 \end{syntax}
 
@@ -1107,11 +1117,12 @@
 \begin{syntax}
 \lhs{unary-expression}
-\rhs \nonterm{postfix-expression}
-\rhs ©++© \nonterm{unary-expression}
-\rhs ©--© \nonterm{unary-expression}
-\rhs \nonterm{unary-operator} \nonterm{cast-expression}
-\rhs ©sizeof© \nonterm{unary-expression}
-\rhs ©sizeof© ©(© \nonterm{type-name} ©)©
-\lhs{unary-operator} one of \rhs ©&© ©*© ©+© ©-© ©~© ©!©
+	\rhs \nonterm{postfix-expression}
+	\rhs ©++© \nonterm{unary-expression}
+	\rhs ©--© \nonterm{unary-expression}
+	\rhs \nonterm{unary-operator} \nonterm{cast-expression}
+	\rhs ©sizeof© \nonterm{unary-expression}
+	\rhs ©sizeof© ©(© \nonterm{type-name} ©)©
+\lhs{unary-operator} one of
+	\rhs ©&© ©*© ©+© ©-© ©~© ©!©
 \end{syntax}
 
Index: doc/user/Makefile
===================================================================
--- doc/user/Makefile	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/user/Makefile	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,6 +1,6 @@
 ## Define the appropriate configuration variables.
 
-TeXLIB = .:../bibliography/:../LaTeXmacros/:
-LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
+TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
+LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
 
Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ doc/user/user.tex	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Fri Jun 10 16:38:22 2016
-%% Update Count     : 394
+%% Last Modified On : Mon Jun 20 10:47:22 2016
+%% Update Count     : 575
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -21,9 +21,10 @@
 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_
 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-"
-% Latex escape §...§ (section symbol) emacs: C-q M-'
+% LaTex escape §...§ (section symbol) emacs: C-q M-'
 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^
 % math escape $...$ (dollar symbol)
 
 \documentclass[twoside,11pt]{article}
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -34,5 +35,5 @@
 \usepackage{fullpage,times,comment}
 \usepackage{epic,eepic}
-\usepackage{upquote}									% switch curled `'" to straight `'"
+\usepackage{upquote}									% switch curled `'" to straight
 \usepackage{xspace}
 \usepackage{varioref}									% extended references
@@ -49,4 +50,17 @@
 \renewcommand{\UrlFont}{\small\sf}
 
+\makeatletter
+\renewcommand{\pagestyle}[1]{
+  \@ifundefined{ps@#1}%
+    \undefinedpagestyle
+    {\def\@tempa{#1}\def\@tempb{headings}\def\@tempc{myheadings}%
+     \ifx\@tempa\@tempb\setlength{\topmargin}{-0.25in}\setlength{\headsep}{0.25in}%
+     \else\ifx\@tempa\@tempc\setlength{\topmargin}{-0.25in}\setlength{\headsep}{0.25in}\fi\fi%
+     \@nameuse{ps@#1}}}% pagestyle
+\makeatother
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 % Names used in the document.
 
@@ -60,4 +74,6 @@
 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}
 
+\newsavebox{\LstBox}
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -67,8 +83,4 @@
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\begin{document}
-\pagestyle{headings}
-\linenumbers                                            % comment out to turn off line numbering
 
 \title{\Huge
@@ -77,17 +89,22 @@
 Version 1.0						 	\\
 \vspace*{0.25in}
-\huge``describe not prescribe''		\\
+\huge``describe not prescribe''
 \vspace*{1in}
 }% title
+
 \author{\huge
-Peter A. Buhr and ...				\\
+Peter A. Buhr and ...
 }% author
+
 \date{
-DRAFT \\
-\today
+DRAFT \\ \today
 }% date
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+\pagestyle{headings}
 \pagenumbering{roman}
-\pagestyle{plain}
+\linenumbers                                            % comment out to turn off line numbering
 
 \maketitle
@@ -107,4 +124,5 @@
 
 \clearpage
+\markright{\CFA User Manual}
 \pagenumbering{arabic}
 
@@ -471,6 +489,6 @@
 \end{quote2}
 
-Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified\footnote{
-At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}},
+Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified,\footnote{
+At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}}
 e.g.:
 \begin{lstlisting}
@@ -485,4 +503,155 @@
 Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems.
 
+
+\section{Reference Pointers}
+
+Program variables are implicit pointers to memory locations generated by the compiler and automatically dereferenced, as in:
+\begin{quote2}
+\begin{tabular}{@{}l|l@{}}
+\multicolumn{1}{c|}{Variables} & \multicolumn{1}{c}{Compiler generated addresses (100, 104) and dereferencing} \\
+\hline
+\begin{lstlisting}
+int x, y;
+x = 3;
+y = x;
+\end{lstlisting}
+&
+\begin{lstlisting}
+int * const x = (int *)100, * const y = (int *)104;
+*x = 3;		// implicit dereference
+*y = *x;
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+A variable name only points to one location during its lifetime, i.e., it is a \Index{non-mutable} pointer.
+For example, the variables ©x© and ©y© are constant pointers.
+Variable addresses are usually not stored in memory and loaded before dereferencing;
+instead, variable addresses are stored in instructions, so an instruction fetch implicitly gets the variable's address.
+\begin{quote2}
+\begin{tabular}{@{}l|l@{}}
+\begin{lstlisting}
+x = x + 1
+&x = *(&x) + 1
+(100) = *(100) + 1
+\end{lstlisting}
+&
+\begin{lstlisting}
+ld		r1,(100)			// address of x
+add		r1,1
+st		r1,(100)			// address of x
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+Finally, the non-mutable nature of variables and the fact that there is no storage for a variable address means pointer assignment is impossible.
+Therefore, the expression ©x = y© only has one meaning, ©*x = *y©, i.e., copy the variable values, so explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of instruction decoding.
+
+A variable name is generalized by a \newterm{pointer}, which is a mutable pointer variable that can point to more than one memory location during its life-time (like an integer variable versus a literal).
+Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.:
+\begin{lstlisting}
+int x, y, z, ®*® p1, ®*® p2;
+p1 = ®&®x;					// p1 points to x
+p2 = p1;					// p2 also points to x
+p1 = ®&®y;					// p1 points to y
+p2 = p1 + 1;				// p2 points to z, pointer arithmetic
+\end{lstlisting}
+In many cases, a pointer name is anonymous (dynamically computed), so it cannot be stored directly in an instruction like a variable name.
+
+Pointers have a duality: an address in memory or the value at that address.
+In many cases, the compiler can infer which of these operations are needed:
+\begin{lstlisting}
+p2 = p1 + x;				// compiler infers *p2 = *p1 + x;
+\end{lstlisting}
+because adding the integer value of ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation.
+Algol68~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage.
+However, there are ambiguous cases, especially when pointer arithmetic is possible, as in C:
+\begin{lstlisting}
+p1 = p2;					// p1 = p2 or *p1 = *p2
+p1 = p1 + 1;				// p1 = p1 + 1 or *p1 = *p1 + 1
+\end{lstlisting}
+
+Most programming languages pick a default operation and supply an explicit operation to resolve the pointer-duality ambiguity.
+In C, the default operation for pointers is manipulate the pointer value and the pointed-to value is explicitly accessed by dereferencing ©*©.
+\begin{lstlisting}
+p1 = p2;					// pointer value assignment
+*p1 = *p1 + 1;				// pointed-to value assignment/operation
+\end{lstlisting}
+which works well for low-level memory management, such as ©malloc©/©free©, where manipulation of addresses in the primary operation, and data is only occasionally accessed.
+
+However, in the majority of pointer usages, the pointed-to value is required rather than the pointer address.
+\begin{lstlisting}
+*p2 = ((*p1 + *p2) * (*p2 - *p1)) / (*p1 - *p2);
+\end{lstlisting}
+And, it is tedious and error prone to explicitly write the dereferencing, especially when pointer arithmetic with integer values is allowed.
+It is better to have the compiler generate the dereferencing:
+\begin{lstlisting}
+p2 = ((p1 + p2) * (p2 - p1)) / (p1 - p2);
+\end{lstlisting}
+
+To provide this capability, it is necessary to switch the default operation to resolve the pointer-duality ambiguity, which requires a new kind of pointer called a \newterm{reference} pointer.
+\begin{lstlisting}
+int x, y, z, ®&® r1, ®&® r2;	// & denotes reference pointer
+r1 ®:=® &x;					// r1 points to x
+r2 ®:=® &r1;					// r2 also points to x
+r1 ®:=® &y;					// r1 points to y
+r2 ®:=® &r1 + 1;				// r2 points to z
+r2 = ((r1 + r2) * (r2 - r1)) / (r1 - r2); // implicit dereferencing
+\end{lstlisting}
+Hence, a reference pointer behaves like a variable name for the current variable it is pointing-to, so dereferencing a reference pointer returns the address of its pointed-to value, i.e., the address in the reference pointer.
+Notice, the explicit operator ©:=© to denote pointer assignment to a reference pointer to support both aspects of pointer duality.
+Note, \CC deals with the pointer duality by making a reference pointer a constant (©const©), like a plain variable, so there is no reference assignment.
+
+Like pointers, it is possible to use ©const© qualifiers with a reference:
+\begin{lstlisting}
+const int cx = 5;			// cannot change cx;
+const int & r3 = &cx;		// cannot change what r3 is pointing to
+r3 ®:=® &cx;					// can change r3
+r3 = 7;						// error, cannot change cx
+int & const r4 = &x;		// must be initialized, §\CC§ reference
+r4 ®:=® &x;					// error, cannot change r4
+const int & const r5 = &cx;	// must be initialized, §\CC§ reference
+r5 = 7;						// error, cannot change cx
+r5 ®:=® &cx;					// error, cannot change r5
+\end{lstlisting}
+Note, for type ©& const©, there is no pointer assignment, so ©r4 := &x© is disallowed, and the pointer value cannot be ©0©.
+Since there is only one meaning for ©r4 = x©, which is to change the value of the variable pointed to by ©r4©, therefore:
+\begin{itemize}
+\item
+it in impossible to take the address of ©r4© as it always means the address of what ©r4© is pointing to.
+\item
+the dereference at initialization is optional because there can only be one
+\begin{lrbox}{\LstBox}%
+\footnotesize%
+\begin{lstlisting}%
+void f( int p ) {...}
+void (*fp)( int ) = &f;		// equivalent initialization
+void (*fp)( int ) = f;		// missing dereference allowed
+\end{lstlisting}%
+\end{lrbox}%
+meaning.\footnote{
+This case is similar to initializing a routine pointer, where the routine constant should be dereferenced.
+\newline
+\usebox{\LstBox}
+}% footnote
+\begin{lstlisting}
+int & const r4 = &x;		// equivalent initialization
+int & const r4 = x;			// missing dereference allowed
+\end{lstlisting}
+\end{itemize}
+Similarly, when a ©const© reference is used for a parameters type, the call-site argument does not require a reference.
+\begin{lstlisting}
+void f( int & ri, int & const cri );
+f( &x, x );					// reference not required for second argument
+\end{lstlisting}
+Within routine ©f©, it is possible to change an argument by changing the corresponding parameter, and parameter ©ri© can be locally reassigned within ©f©.
+
+Finally, when a reference parameter has a ©const© value, it is possible to pass literals and expressions.
+\begin{lstlisting}
+void g( const int & ri, const int & const cri );
+f( &3, 3 );
+f( &(x + y), x + y );
+\end{lstlisting}
+At the call site, the compiler implicitly creates the necessary temporary that is subsequently pointed to by the reference parameter.
+Hence, changing the parameter only changes the temporary at the call site.
+For the non-©const© parameter, requiring the reference on the literal or expression makes it clear that nothing is changing at the call site and allows the call to proceed, where other languages require the programmer to explicitly create the temporary for the argument.
 
 \section{Type Operators}
@@ -808,6 +977,6 @@
 \subsection{Type Nesting}
 
-\CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
-\begin{quote2}
+\CFA allows \Index{type nesting}, and type qualification of the nested types (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
+\begin{figure}
 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}}
 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}}	& \multicolumn{1}{c}{\textbf{C Implicit Hoisting}}	& \multicolumn{1}{|c}{\textbf{\CFA}}	\\
@@ -870,5 +1039,7 @@
 \end{lstlisting}
 \end{tabular}
-\end{quote2}
+\caption{Type Nesting / Qualification}
+\label{f:TypeNestingQualification}
+\end{figure}
 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope.
 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does Java, rather than the \CC type-selection operator ``©::©''.
Index: src/GenPoly/ScopedMap.h
===================================================================
--- src/GenPoly/ScopedMap.h	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/GenPoly/ScopedMap.h	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -90,5 +90,5 @@
 				return next_valid();
 			}
-			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
+			iterator operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
 
 			iterator& operator-- () {
@@ -101,5 +101,5 @@
 				return prev_valid();
 			}
-			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
+			iterator operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
 
 			bool operator== (const iterator &that) {
@@ -166,5 +166,5 @@
 				return next_valid();
 			}
-			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
+			const_iterator operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
 
 			const_iterator& operator-- () {
@@ -177,5 +177,5 @@
 				return prev_valid();
 			}
-			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
+			const_iterator operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
 
 			bool operator== (const const_iterator &that) {
Index: src/GenPoly/ScopedSet.h
===================================================================
--- src/GenPoly/ScopedSet.h	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/GenPoly/ScopedSet.h	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -87,5 +87,5 @@
 				return next_valid();
 			}
-			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
+			iterator operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
 
 			iterator& operator-- () {
@@ -98,5 +98,5 @@
 				return prev_valid();
 			}
-			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
+			iterator operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
 
 			bool operator== (const iterator &that) {
@@ -163,5 +163,5 @@
 				return next_valid();
 			}
-			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
+			const_iterator operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
 
 			const_iterator& operator-- () {
@@ -174,5 +174,5 @@
 				return prev_valid();
 			}
-			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
+			const_iterator operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
 
 			bool operator== (const const_iterator &that) {
Index: src/Parser/lex.cc
===================================================================
--- src/Parser/lex.cc	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/Parser/lex.cc	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -382,6 +382,6 @@
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 181
-#define YY_END_OF_BUFFER 182
+#define YY_NUM_RULES 180
+#define YY_END_OF_BUFFER 181
 /* This struct is not used in this scanner,
    but its presence is necessary. */
@@ -391,103 +391,103 @@
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[889] =
+static yyconst flex_int16_t yy_accept[888] =
     {   0,
         0,    0,    0,    0,    0,    0,  115,  115,  118,  118,
-      182,  180,    7,    9,    8,  138,  117,  102,  143,  146,
+      181,  179,    7,    9,    8,  138,  117,  102,  143,  146,
       114,  125,  126,  141,  139,  129,  140,  132,  142,  107,
-      108,  109,  130,  131,  148,  150,  149,  151,  180,  102,
-      123,  180,  124,  144,  102,  104,  102,  102,  102,  102,
+      108,  109,  130,  131,  148,  150,  149,  151,  179,  102,
+      123,  179,  124,  144,  102,  104,  102,  102,  102,  102,
       102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  127,  147,  128,  145,    7,  180,    4,    4,
-      181,  105,  181,  106,  115,  116,  122,  118,  119,    7,
-        9,    0,    8,  155,  175,  102,    0,  167,  137,  160,
+      102,  102,  127,  147,  128,  145,    7,  179,    4,    4,
+      180,  105,  180,  106,  115,  116,  122,  118,  119,    7,
+        9,    0,    8,  155,  174,  102,    0,  167,  137,  160,
       168,  165,  152,  163,  153,  164,  162,    0,  112,    3,
 
         0,  166,  112,  110,    0,    0,  110,  110,    0,    0,
-      110,  109,  109,  109,    0,  109,  174,  135,  136,  134,
-      156,  158,  154,  159,  157,    0,    0,    0,    0,    0,
+      110,  109,  109,  109,    0,  109,  135,  136,  134,  156,
+      158,  154,  159,  157,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  103,
+      173,    0,  117,  114,  102,    0,    0,  170,    0,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,   38,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,   56,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  169,  161,    7,    0,    0,    0,
+
+        2,    0,    5,  105,    0,    0,    0,  115,    0,  121,
+      120,  120,    0,    0,    0,  118,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      103,  173,    0,  117,  114,  102,    0,    0,  170,    0,
+        0,  133,  112,  112,    0,  112,  112,    0,    0,    6,
+        0,  110,    0,    0,    0,  112,    0,  110,  110,  110,
+      110,    0,  111,    0,    0,  109,  109,  109,  109,    0,
+      171,  172,    0,  177,  175,    0,    0,    0,  103,    0,
+        0,    0,    0,    0,    0,    0,    0,  102,   17,  102,
       102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   38,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,   56,  102,
+      102,  102,  102,  102,  102,  102,  102,   14,  102,  102,
+
       102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  169,  161,    7,    0,    0,
-
-        0,    2,    0,    5,  105,    0,    0,    0,  115,    0,
-      121,  120,  120,    0,    0,    0,  118,    0,    0,    0,
+      102,  102,  102,  102,  102,  102,   50,  102,  102,  102,
+       63,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,   89,  102,  102,  102,  102,
+      102,  102,  102,    0,    0,    0,    0,    0,    0,    0,
+        0,  120,    0,    0,    0,    0,    0,  120,    0,    0,
+      178,    0,    0,    0,    0,    0,    0,    0,  112,    0,
+      112,    0,  112,    0,    0,  112,    0,  110,  110,    0,
+        0,  111,  111,    0,  111,    0,  111,  109,  109,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  176,
+
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,   21,  102,   24,  102,   27,  102,  102,
+      102,  102,  102,  102,  102,   41,  102,   43,  102,  102,
+      102,  102,  102,  102,  102,   55,  102,   66,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,   97,  102,  102,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  133,  112,  112,    0,  112,  112,    0,    0,
-        6,    0,  110,    0,    0,    0,  112,    0,  110,  110,
-      110,  110,    0,  111,    0,    0,  109,  109,  109,  109,
-        0,  171,  172,    0,  178,  176,    0,    0,    0,  103,
-        0,    0,    0,    0,    0,    0,    0,    0,  102,   17,
+        0,  120,    0,    0,    0,    0,    0,  112,    0,    0,
+        0,    0,    0,    0,  111,  111,    0,  113,    0,  111,
+
+      111,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  102,  102,   22,  102,  102,  102,
+      102,  102,  102,  102,   15,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,   23,
+       25,  102,   32,  102,  102,  102,  102,   40,  102,  102,
+      102,  102,   48,  102,  102,   53,  102,  102,   70,  102,
+      102,  102,   76,  102,  102,  102,  102,  102,   86,   88,
+      102,  102,   94,  102,  102,  101,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  113,    0,    0,  111,  113,
+
+      113,  113,  113,    0,  111,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  102,    0,  102,  102,  102,
       102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,   14,  102,
-
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   50,  102,  102,
-      102,   63,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   89,  102,  102,  102,
-      102,  102,  102,  102,    0,    0,    0,    0,    0,    0,
-        0,    0,  120,    0,    0,    0,    0,    0,  120,    0,
-        0,  179,    0,    0,    0,    0,    0,    0,    0,  112,
-        0,  112,    0,  112,    0,    0,  112,    0,  110,  110,
-        0,    0,  111,  111,    0,  111,    0,  111,  109,  109,
+      102,  102,  102,   58,  102,  102,  102,  102,  102,  102,
+      102,  102,   28,  102,  102,  102,   39,   42,   45,  102,
+      102,   51,  102,   60,   67,  102,  102,   75,   77,   80,
+       81,   83,   84,  102,  102,   91,  102,  102,    0,    1,
+        0,    0,    0,    0,    0,    0,  105,    0,    0,    0,
+      120,    0,    0,    0,    0,  113,    0,  113,  113,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
+
+       18,  102,  102,  102,  102,  102,  102,  102,   16,  102,
+      102,  102,   33,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,   36,   37,  102,   47,   52,
+      102,  102,  102,   90,  102,  102,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   10,
+       11,   29,   54,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,   59,   61,   64,  102,  102,   78,
+       92,  102,  102,   35,   46,   71,   72,  102,   95,   98,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
-      177,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,   21,  102,   24,  102,   27,  102,
-      102,  102,  102,  102,  102,  102,   41,  102,   43,  102,
-      102,  102,  102,  102,  102,  102,   55,  102,   66,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,   97,  102,  102,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  120,    0,    0,    0,    0,    0,  112,    0,
-        0,    0,    0,    0,    0,  111,  111,    0,  113,    0,
-
-      111,  111,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  102,  102,   22,  102,  102,
-      102,  102,  102,  102,  102,   15,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-       23,   25,  102,   32,  102,  102,  102,  102,   40,  102,
-      102,  102,  102,   48,  102,  102,   53,  102,  102,   70,
-      102,  102,  102,   76,  102,  102,  102,  102,  102,   86,
-       88,  102,  102,   94,  102,  102,  101,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  113,    0,    0,  111,
-
-      113,  113,  113,  113,    0,  111,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  102,    0,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,   58,  102,  102,  102,  102,  102,
-      102,  102,  102,   28,  102,  102,  102,   39,   42,   45,
-      102,  102,   51,  102,   60,   67,  102,  102,   75,   77,
-       80,   81,   83,   84,  102,  102,   91,  102,  102,    0,
-        1,    0,    0,    0,    0,    0,    0,  105,    0,    0,
-        0,  120,    0,    0,    0,    0,  113,    0,  113,  113,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  102,
-
-      102,   18,  102,  102,  102,  102,  102,  102,  102,   16,
-      102,  102,  102,   33,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   36,   37,  102,   47,
-       52,  102,  102,  102,   90,  102,  102,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       10,   11,   29,   54,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,   59,   61,   64,  102,  102,
-       78,   92,  102,  102,   35,   46,   71,   72,  102,   95,
-       98,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  102,   68,  102,  102,   12,  102,  102,
-
-       30,   34,  102,  102,  102,   65,  102,  102,  102,  102,
-      102,  102,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   57,  102,  102,  102,  102,
-      102,  102,  102,   49,   62,   73,   79,   93,   99,  102,
-      102,    0,    0,    0,    0,    0,    0,    0,    0,  102,
-      102,   13,   19,  102,  102,   31,  102,  102,  102,   26,
-       87,    0,    0,  102,  102,  102,  102,  102,  102,   74,
-      100,  102,   85,   20,  102,  102,   44,   82,  102,  102,
-      102,  102,  102,  102,  102,   96,   69,    0
+        0,    0,  102,   68,  102,  102,   12,  102,  102,   30,
+
+       34,  102,  102,  102,   65,  102,  102,  102,  102,  102,
+      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   57,  102,  102,  102,  102,  102,
+      102,  102,   49,   62,   73,   79,   93,   99,  102,  102,
+        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
+       13,   19,  102,  102,   31,  102,  102,  102,   26,   87,
+        0,    0,  102,  102,  102,  102,  102,  102,   74,  100,
+      102,   85,   20,  102,  102,   44,   82,  102,  102,  102,
+      102,  102,  102,  102,   96,   69,    0
     } ;
 
@@ -537,247 +537,247 @@
     } ;
 
-static yyconst flex_int16_t yy_base[1063] =
+static yyconst flex_int16_t yy_base[1062] =
     {   0,
-        0,   84, 2279, 2277,   94,    0,  177,  178,  179,  180,
-     2291, 2817,  191, 2817,  197,   55, 2817, 2237,   60,  173,
-     2817, 2817, 2817,   56,  188, 2817,  191,  189,  204,  216,
-      275,    0,  152, 2817,  216, 2257,  175,  344,  197,  237,
-     2817,  159, 2817,  220,  226, 2817,  181,  165,  212,  251,
-      241,  270,  205,  244,  235,  174,  227,  305,  274,  341,
-      220,  265, 2817,  227, 2817, 2253,  382,  405, 2817, 2262,
-     2817, 2228,  211, 2817,    0, 2817,  432,    0, 2817,  398,
-     2817,  411,  417, 2817,  504, 2227,  258, 2817, 2817, 2817,
-     2817, 2817, 2245, 2817, 2243, 2817, 2817, 2253,  565, 2817,
-
-     2268, 2817,  424,  419,  504,  522,  296,  237,  265,  417,
-      386,    0,  298,  285,  311,  403, 2817, 2817, 2817, 2817,
-     2238, 2817, 2817, 2817, 2237, 2235,  301,  331, 2248,  347,
-      442,  449,  359,  433,  427,  454, 2227,  465, 2176,  469,
-     2206, 2817,  319, 2817, 2817,  501, 2201, 2198, 2817, 2169,
-      425,  307,  467,  320,  337,  470,  431,  345,  509,  356,
-      439,  410,  490,  481,  500,  498,  502,  504,  424,  505,
-      541,  510,  465,  528,  542,  271,  520,  521, 2197,  544,
-      548,  549,  550,  561,  558,  570,  579,  587,  569,  585,
-      567,  601,  592,  593,  594, 2817, 2817,  665,  671, 2246,
-
-      677, 2817,  683, 2817, 2194,  565, 2188, 2185,    0,  674,
-     2817, 2817,  689, 2184, 2183, 2181,    0, 2202,  616,  630,
-      655,  698,  697,  659,  687,  688,  691, 2197,  694,  701,
-     2174, 2173, 2817,    0,  693,  723,  691,  714, 2171, 2204,
-     2817,  722,    0,  717,  768,  744,  808,  779,  606, 2817,
-     2161, 2136,    0,  794, 2180,  786,  702, 2817, 2154, 2129,
-      830, 2817, 2817, 2162, 2817, 2817,  708,  722, 2140, 2138,
-      710, 2132, 2131, 2130,    0, 2128,    0, 2097,  721,  727,
-      747,  748,  674,  591,  610,  723,  766,  793,  767,  770,
-      769,  792,  810,  763,  775,  806,  812,  820, 2125,  822,
-
-      824,  825,  828,  830,  831,  832,  836,  837,  460,  843,
-      846,  845,  844,  847,  848,  852,  859,  861,  858,  867,
-      865, 2124,  868,  869,  870,  873,  871,  872,  874,  875,
-      881,  876,  880,  882,  887,  888, 2123,  891,  940,  897,
-      899,  563,  902,  906,  960,  961, 2118, 2115, 2112,    0,
-     2111,    0,  952,  956, 2110,    0, 2108,    0, 2105,    0,
-     2126, 2817,  793,  939, 2105, 2101,    0, 2098,    0, 2817,
-      960,  986,  971, 2817,  977,  992, 1011, 2097, 2817, 2817,
-      985,  994, 1024,  982, 1058,  922, 1043,  993, 2817, 2817,
-     2096, 2094, 2091,    0, 2087,    0, 2083,    0, 2081,    0,
-
-     2817,  908,  953,  939,  991,  993,  998, 1003, 1000, 1026,
-     1006, 1037, 1020, 1038, 1048, 1041, 1049,  970, 1054, 1018,
-     1050, 1044, 1056, 1045, 2082, 1059, 2079, 1068, 2077, 1057,
-     1052, 1070, 1072, 1079, 1077, 1081, 2075, 1082, 2072, 1084,
-     1086, 1087, 1088, 1091, 1089, 1094, 2069, 1096, 2068, 1093,
-     1098, 1099, 1101, 1105, 1100, 1114, 1111, 1115, 1112, 1117,
-      686, 1118, 1126, 1130, 1127, 2067, 1131, 1132, 1183, 2062,
-        0, 2059,    0, 2056,    0, 2055,    0, 1178, 2054,    0,
-     2052,    0, 2049, 2046, 2045,    0, 2044,    0, 1184, 2042,
-     1190, 1149, 1206, 1192, 1150, 1185, 2817, 1230, 1242, 1264,
-
-     2051, 2024, 2035, 2034,    0, 2032,    0, 2029,    0, 2026,
-        0, 2025,    0, 2024,    0, 1166, 1206, 2025, 1207, 1190,
-     1227, 1145, 1241, 1184, 1135,  134, 1198, 1243, 1223, 1225,
-     1244, 1186, 1248, 1247, 1249, 1256, 1251, 1261, 1262, 1221,
-     2022, 1269, 1266, 2019, 1264, 1267, 1268, 1270, 2018, 1276,
-     1272, 1274, 1277, 2017, 1280, 1288, 2015, 1287, 1290, 2012,
-     1284, 1291, 1294, 2009, 1188, 1297, 1298, 1300, 1301, 1308,
-     2008, 1303, 1309, 2007, 1310, 1315, 2005, 2052, 1998,    0,
-     1997,    0, 1995,    0, 1992,    0, 1991,    0, 1990,    0,
-     1988,    0, 1955,    0, 1359, 1365, 1393, 1376, 1953, 2817,
-
-     1382, 1369, 1331, 1383, 1952, 2817, 1949,    0, 1946,    0,
-     1945,    0, 1944,    0,    0,    0, 1945,    0, 1370, 1316,
-     1317, 1345, 1325, 1372, 1373, 1378, 1377,  384, 1376, 1387,
-     1390, 1392, 1399, 1397,  773, 1400, 1430, 1407, 1404, 1411,
-     1410, 1412, 1418, 1942, 1413, 1415, 1423, 1939, 1938, 1937,
-     1421, 1425, 1935, 1426, 1932, 1931, 1429, 1433, 1930, 1928,
-     1925, 1924, 1923, 1921, 1435, 1314, 1918, 1439, 1431, 1964,
-     2817, 1907,    0, 1903,    0,    0,    0, 1890,    0,    0,
-        0, 2817,    0,    0,    0,    0, 1483, 1886, 2817, 2817,
-     1489, 1885,    0, 1883,    0,    0,    0,    0, 1880, 1445,
-
-     1465, 1882, 1442, 1470, 1467, 1479,  968, 1447, 1476, 1881,
-     1478, 1482, 1480, 1485, 1481, 1512, 1487, 1497, 1526, 1501,
-     1503, 1505, 1507, 1508, 1509, 1510, 1879, 1876, 1511, 1875,
-     1874, 1515, 1514, 1518, 1872, 1520, 1522,    0,    0,    0,
-     1866, 1865, 1864, 1570,    0, 1862, 1859, 1858, 1857, 1855,
-     1855, 1854, 1853, 1851, 1527, 1529, 1532, 1523, 1548, 1533,
-     1549, 1524, 1551, 1552, 1553, 1848, 1557, 1847, 1559, 1561,
-     1564, 1569, 1555, 1563, 1846, 1844, 1841, 1840, 1571, 1839,
-     1837, 1831, 1830, 1829, 1827, 1820, 1818, 1817, 1814, 1813,
-     1812, 1810, 1793, 1574, 1787, 1575, 1577, 1576, 1578, 1580,
-
-     1581, 1786, 1585, 1608, 1587, 1783, 1588, 1589, 1599, 1597,
-     1591, 1593, 1773, 1770, 1763, 1761, 1760, 1739, 1738, 1737,
-     1730, 1728, 1727, 1685, 1684, 1683, 1598, 1604, 1612, 1605,
-     1613, 1617, 1616, 1682, 1681, 1618, 1677, 1676, 1622, 1623,
-     1626, 1670, 1669, 1668, 1665, 1448, 1446, 1358, 1317, 1627,
-     1624, 1318, 1638, 1630, 1634, 1224, 1642, 1643, 1644, 1137,
-     1136, 1004,  733, 1628, 1649, 1650, 1651, 1652, 1654,  635,
-      602, 1656,  436,  296, 1658, 1659,  263,  232, 1660, 1662,
-     1663, 1665, 1666, 1667, 1670,  200,  166, 2817, 1742, 1755,
-     1768, 1778, 1788, 1801, 1811, 1824, 1837, 1850, 1858, 1868,
-
-     1875, 1882, 1889, 1896, 1903, 1910, 1917, 1924, 1931, 1944,
-     1951, 1955, 1963, 1966, 1973, 1980, 1987, 1990, 1997, 2003,
-     2016, 2029, 2036, 2043, 2050, 2057, 2060, 2067, 2070, 2077,
-     2080, 2087, 2090, 2097, 2100, 2107, 2110, 2117, 2120, 2127,
-     2135, 2142, 2149, 2156, 2163, 2166, 2173, 2176, 2183, 2186,
-     2193, 2199, 2212, 2219, 2226, 2229, 2236, 2239, 2246, 2249,
-     2256, 2259, 2266, 2269, 2276, 2279, 2286, 2293, 2296, 2303,
-     2306, 2313, 2320, 2327, 2330, 2337, 2340, 2347, 2350, 2357,
-     2360, 2367, 2370, 2377, 2383, 2396, 2403, 2410, 2413, 2420,
-     2423, 2430, 2433, 2440, 2443, 2450, 2453, 2460, 2463, 2470,
-
-     2473, 2480, 2483, 2490, 2497, 2500, 2507, 2510, 2517, 2520,
-     2527, 2530, 2533, 2539, 2546, 2555, 2562, 2569, 2572, 2579,
-     2582, 2585, 2591, 2598, 2601, 2604, 2607, 2610, 2613, 2616,
-     2619, 2626, 2629, 2636, 2639, 2642, 2645, 2648, 2658, 2665,
-     2668, 2671, 2674, 2681, 2688, 2695, 2698, 2705, 2712, 2719,
-     2726, 2733, 2740, 2747, 2754, 2761, 2768, 2775, 2782, 2789,
-     2796, 2803
+        0,   84, 2272, 2269,   94,    0,  177,  178,  179,  180,
+     2285, 2822,  191, 2822,  197,   55, 2822, 2231,   60,  173,
+     2822, 2822, 2822,   56,  188, 2822,  191,  189,  204,  216,
+      275,    0, 2249, 2822,  216, 2247,  152,  344,  155,  220,
+     2822,  159, 2822,  217,  226, 2822,  185,  154,  212,  251,
+      237,  270,  235,  257,  241,  205,  193,  305,  314,  333,
+      238,  228, 2822,  225, 2822, 2242,  402,  390, 2822, 2253,
+     2822, 2221,  235, 2822,    0, 2822,  426,    0, 2822,  417,
+     2822,  439,  451, 2822,  498, 2219,  264, 2822, 2822, 2822,
+     2822, 2822, 2235, 2822, 2232, 2822, 2822, 2244,  559, 2822,
+
+     2261, 2822,  438,  444,  511,  534,  289,  253,  197,  380,
+      305,    0,  319,  280,  198,  322, 2822, 2822, 2822, 2230,
+     2822, 2822, 2822, 2227, 2224,  218,  255, 2239,  298,  350,
+      368,  312,  440,  398,  405, 2220,  441, 2168,  446, 2196,
+     2822,  335, 2822, 2822,  468, 2190, 2189, 2822, 2162,  439,
+      282,  433,  372,  281,  437,  434,  428,  570,  444,  466,
+      464,  469,  475,  321,  492,  438,  471,  445,  474,  512,
+      489,  503,  496,  521,  276,  515,  516, 2189,  526,  510,
+      519,  525,  543,  522,  560,  553,  523,  561,  551,  544,
+      599,  582,  593,  584, 2822, 2822,  660,  651, 2236,  666,
+
+     2822,  678, 2822, 2183,  607, 2179, 2178,    0,  693, 2822,
+     2822,  684, 2176, 2156, 2154,    0, 2177,  578,  608,  617,
+      654,  679,  650,  683,  684,  687, 2172,  690,  691, 2147,
+     2146, 2822,    0,  683,  710,  686,  700, 2145, 2196, 2822,
+      714,    0,  427,  746,  764,  786,  808,  621, 2822, 2152,
+     2125,    0,  794, 2171,  795,  709, 2822, 2147, 2121,  832,
+     2822, 2822, 2152, 2822, 2822,  711,  714, 2129, 2129,  717,
+     2125, 2123, 2120,    0, 2117,    0, 2088,  694,  679,  712,
+      709,  711,  698,  566,  726,  743,  771,  741,  790,  784,
+      800,  795,  742,  744,  814,  816,  818, 2118,  819,  745,
+
+      820,  821,  822,  823,  824,  746,  825,  748,  659,  831,
+      826,  833,  838,  839,  848,  850,  851,  844,  834,  857,
+     2116,  858,  859,  860,  862,  861,  864,  865,  867,  868,
+      866,  871,  876,  872,  878, 2113,  880,  689,  881,  882,
+      892,  896,  893,  953,  954, 2109, 2108, 2106,    0, 2103,
+        0,  941,  945, 2102,    0, 2101,    0, 2099,    0, 2118,
+     2822,  940,  941, 2094, 2088,    0, 2086,    0, 2822,  953,
+      975,  964, 2822,  981,  997, 1021, 2084, 2822, 2822,  939,
+      940, 1006,  982, 1041,  310, 1039, 1004, 2822, 2822, 2081,
+     2079, 2077,    0, 2074,    0, 2071,    0, 2070,    0, 2822,
+
+      886,  941,  960,  962,  977,  976,  980,  982, 1017, 1010,
+     1002,  998, 1022, 1031, 1028, 1033, 1034, 1037, 1040, 1043,
+     1038, 1041, 1053, 2072, 1055, 2070, 1045, 2067, 1056, 1061,
+     1063, 1065, 1066, 1067, 1070, 2064, 1071, 2063, 1073, 1074,
+     1075, 1078, 1080, 1081, 1085, 2062, 1087, 2060, 1084, 1089,
+     1091, 1097, 1099, 1092, 1102, 1103, 1105, 1106, 1108,  905,
+     1109, 1116, 1110, 1122, 2057, 1120, 1123, 1179, 2051,    0,
+     2050,    0, 2049,    0, 2047,    0, 1166, 2044,    0, 2041,
+        0, 2040, 2039, 2037,    0, 2034,    0, 1173, 2031, 1179,
+     1137, 1195, 1181, 1178, 1176, 2822, 1219, 1231, 1253, 2042,
+
+     2017, 2027, 2024,    0, 2021,    0, 2020,    0, 2019,    0,
+     2017,    0, 2014,    0, 1141, 1172, 2014, 1180, 1155, 1196,
+     1157, 1216, 1207, 1231, 1125, 1210, 1232, 1214, 1187, 1236,
+     1235, 1237, 1238, 1272, 1249, 1252, 1250, 1253, 1254, 2013,
+     1261, 1256, 2012, 1260, 1263, 1264, 1257, 2010, 1271, 1268,
+     1269, 1273, 2007, 1275, 1282, 2006, 1283, 1284, 2005, 1276,
+     1286, 1289, 2003, 1294, 1291, 1296, 1295, 1297, 1310, 2000,
+     1305, 1308, 1999, 1307, 1300, 1998, 2046, 1960,    0, 1958,
+        0, 1957,    0, 1954,    0, 1951,    0, 1950,    0, 1949,
+        0, 1947,    0, 1355, 1361, 1389, 1372, 1944, 2822, 1378,
+
+     1325, 1365, 1379, 1941, 2822, 1940,    0, 1939,    0, 1937,
+        0, 1934,    0,    0,    0, 1936,    0, 1366, 1312, 1311,
+     1341, 1323, 1368, 1369, 1374, 1356, 1383, 1372, 1388, 1390,
+     1393, 1395, 1396, 1398, 1400, 1431, 1406, 1407, 1411, 1408,
+     1413, 1414, 1935, 1409, 1416, 1419, 1933, 1930, 1929, 1422,
+     1424, 1928, 1429, 1926, 1923, 1425, 1430, 1919, 1915, 1911,
+     1895, 1894, 1893, 1436, 1433, 1891, 1439, 1440, 1938, 2822,
+     1884,    0, 1883,    0,    0,    0, 1884,    0,    0,    0,
+     2822,    0,    0,    0,    0, 1486, 1878, 2822, 2822, 1492,
+     1877,    0, 1876,    0,    0,    0,    0, 1874, 1447, 1444,
+
+     1874, 1449, 1471, 1479, 1450, 1480, 1482, 1469, 1873, 1486,
+     1490, 1488, 1502, 1452, 1510, 1504, 1491, 1519, 1506, 1498,
+     1508, 1512, 1513, 1514, 1515, 1872, 1870, 1517, 1867, 1866,
+     1518, 1520, 1523, 1865, 1521, 1525,    0,    0,    0, 1860,
+     1857, 1856, 1575,    0, 1855, 1853, 1850, 1849, 1848, 1849,
+     1846, 1845, 1844, 1531, 1536, 1527, 1528, 1552, 1533, 1537,
+     1539, 1555, 1557, 1569, 1842, 1560, 1839, 1561, 1559, 1568,
+     1572, 1567, 1573, 1838, 1837, 1835, 1828, 1574, 1826, 1825,
+     1819, 1818, 1817, 1815, 1798, 1789, 1788, 1785, 1778, 1775,
+     1768, 1766, 1576, 1768, 1577, 1581, 1580, 1579, 1584, 1585,
+
+     1747, 1586, 1615, 1590, 1746, 1591, 1592, 1602, 1600, 1594,
+     1606, 1742, 1735, 1733, 1732, 1690, 1689, 1686, 1685, 1683,
+     1682, 1678, 1677, 1674, 1676, 1607, 1611, 1614, 1612, 1608,
+     1616, 1620, 1675, 1623, 1624, 1530, 1453, 1630, 1625, 1629,
+     1438, 1354, 1319, 1318, 1267, 1212, 1210, 1208, 1631, 1636,
+     1178, 1639, 1635, 1643, 1177, 1644, 1646, 1650, 1126,  964,
+      937,  903, 1651, 1652, 1654, 1655, 1656, 1658,  788,  752,
+     1660,  607,  487, 1662, 1663,  394,  357, 1664, 1666, 1668,
+     1670, 1669, 1672, 1674,  233,  137, 2822, 1747, 1760, 1773,
+     1783, 1793, 1806, 1816, 1829, 1842, 1855, 1863, 1873, 1880,
+
+     1887, 1894, 1901, 1908, 1915, 1922, 1929, 1936, 1949, 1956,
+     1960, 1968, 1971, 1978, 1985, 1992, 1995, 2002, 2008, 2021,
+     2034, 2041, 2048, 2055, 2062, 2065, 2072, 2075, 2082, 2085,
+     2092, 2095, 2102, 2105, 2112, 2115, 2122, 2125, 2132, 2140,
+     2147, 2154, 2161, 2168, 2171, 2178, 2181, 2188, 2191, 2198,
+     2204, 2217, 2224, 2231, 2234, 2241, 2244, 2251, 2254, 2261,
+     2264, 2271, 2274, 2281, 2284, 2291, 2298, 2301, 2308, 2311,
+     2318, 2325, 2332, 2335, 2342, 2345, 2352, 2355, 2362, 2365,
+     2372, 2375, 2382, 2388, 2401, 2408, 2415, 2418, 2425, 2428,
+     2435, 2438, 2445, 2448, 2455, 2458, 2465, 2468, 2475, 2478,
+
+     2485, 2488, 2495, 2502, 2505, 2512, 2515, 2522, 2525, 2532,
+     2535, 2538, 2544, 2551, 2560, 2567, 2574, 2577, 2584, 2587,
+     2590, 2596, 2603, 2606, 2609, 2612, 2615, 2618, 2621, 2624,
+     2631, 2634, 2641, 2644, 2647, 2650, 2653, 2663, 2670, 2673,
+     2676, 2679, 2686, 2693, 2700, 2703, 2710, 2717, 2724, 2731,
+     2738, 2745, 2752, 2759, 2766, 2773, 2780, 2787, 2794, 2801,
+     2808
     } ;
 
-static yyconst flex_int16_t yy_def[1063] =
+static yyconst flex_int16_t yy_def[1062] =
     {   0,
-      888,    1,  889,  889,  888,    5,  890,  890,  891,  891,
-      888,  888,  888,  888,  888,  888,  888,  892,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,   31,  888,  888,  888,  888,  888,  888,  893,  892,
-      888,  888,  888,  888,  892,  888,  892,  892,  892,  892,
-      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
-      892,  892,  888,  888,  888,  888,  888,  894,  888,  888,
-      888,  895,  888,  888,  896,  888,  888,  897,  888,  888,
-      888,  888,  888,  888,  888,  892,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-
-      898,  888,   99,   30,  888,  888,  888,  888,  899,   30,
-      888,   31,  888,  888,   31,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      900,  888,  888,  888,  888,  892,  901,  902,  888,  888,
-      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
-      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
-      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
-      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
-      892,  892,  892,  892,  892,  888,  888,  888,  894,  894,
-
-      894,  888,  894,  888,  895,  888,  903,  904,  896,  888,
-      888,  888,  888,  905,  906,  907,  897,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      908,  909,  888,   99,  888,  888,  888,  888,   99,  910,
-      888,  888,  104,  104,  888,  888,  888,  888,  888,  888,
-      888,  888,  911,  912,  913,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  900,
-      888,  914,  915,  916,  917,  918,  919,  888,  920,  920,
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  921,  922,  923,  924,  925,  926,
-      927,  928,  888,  888,  929,  930,  931,  932,  933,  934,
-      888,  888,  888,  888,  888,  935,  936,  937,  938,  888,
-      888,  888,  888,  888,  888,  888,  372,  377,  888,  888,
-      939,  940,  941,  888,  888,  888,  941,  888,  888,  888,
-      942,  943,  944,  945,  946,  947,  948,  949,  950,  951,
-
-      888,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  953,  954,
-      955,  956,  957,  958,  959,  960,  961,  888,  962,  963,
-      964,  965,  966,  966,  967,  968,  969,  970,  888,  489,
-      888,  971,  888,  971,  888,  888,  888,  888,  888,  888,
-
-      888,  888,  972,  973,  974,  975,  976,  977,  978,  979,
-      980,  981,  982,  983,  984,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  985,  985,  985,  986,  987,  988,
+      887,    1,  888,  888,  887,    5,  889,  889,  890,  890,
+      887,  887,  887,  887,  887,  887,  887,  891,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,   31,  887,  887,  887,  887,  887,  887,  892,  891,
+      887,  887,  887,  887,  891,  887,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  887,  887,  887,  887,  887,  893,  887,  887,
+      887,  894,  887,  887,  895,  887,  887,  896,  887,  887,
+      887,  887,  887,  887,  887,  891,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      897,  887,   99,   30,  887,  887,  887,  887,  898,   30,
+      887,   31,  887,  887,   31,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  899,
+      887,  887,  887,  887,  891,  900,  901,  887,  887,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  887,  887,  887,  893,  893,  893,
+
+      887,  893,  887,  894,  887,  902,  903,  895,  887,  887,
+      887,  887,  904,  905,  906,  896,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  907,
+      908,  887,   99,  887,  887,  887,  887,   99,  909,  887,
+      887,  104,  104,  887,  887,  887,  887,  887,  887,  887,
+      887,  910,  911,  912,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  899,  887,
+      913,  914,  915,  916,  917,  918,  887,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  920,  921,  922,  923,  924,  925,  926,
+      927,  887,  887,  928,  929,  930,  931,  932,  933,  887,
+      887,  887,  887,  887,  934,  935,  936,  937,  887,  887,
+      887,  887,  887,  887,  887,  371,  376,  887,  887,  938,
+      939,  940,  887,  887,  887,  940,  887,  887,  887,  941,
+      942,  943,  944,  945,  946,  947,  948,  949,  950,  887,
+
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  952,  953,  954,
+      955,  956,  957,  958,  959,  960,  887,  961,  962,  963,
+      964,  965,  965,  966,  967,  968,  969,  887,  488,  887,
+      970,  887,  970,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  971,  972,  973,  974,  975,  976,  977,  978,  979,
+      980,  981,  982,  983,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  985,  986,  987,  988,
       989,  990,  991,  992,  993,  994,  995,  996,  997,  998,
-      999, 1000, 1001, 1002,  888,  888,  888,  888, 1003,  888,
-
-      597,  888,  888,  888,  601,  888, 1004, 1005, 1006, 1007,
-     1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1014, 1014,
-     1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
-     1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
-     1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
-     1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
-     1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1016,
-      888, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025,
-     1026,  888, 1027, 1028, 1029, 1030,  888,  687,  888,  888,
-      888, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
-
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1040, 1041, 1042,
-     1043, 1044, 1045,  888, 1046, 1031, 1033, 1047, 1048, 1038,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1049, 1050, 1043, 1051, 1044, 1052, 1045, 1053, 1054,
-     1047, 1055, 1048, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1056, 1049, 1057, 1050, 1058, 1051, 1059, 1052,
-     1060, 1053, 1061, 1054, 1055, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1062, 1056, 1057, 1058, 1059, 1033, 1060, 1061, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1062, 1033, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039,
-     1039, 1039, 1039, 1039, 1039, 1039, 1039,    0,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888
+      999, 1000, 1001,  887,  887,  887,  887, 1002,  887,  596,
+
+      887,  887,  887,  600,  887, 1003, 1004, 1005, 1006, 1007,
+     1008, 1009, 1010, 1011, 1012, 1013, 1014, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1015,  887,
+     1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025,
+      887, 1026, 1027, 1028, 1029,  887,  686,  887,  887,  887,
+     1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1038,
+
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1039, 1040, 1041, 1042,
+     1043, 1044,  887, 1045, 1030, 1032, 1046, 1047, 1037, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1048, 1049, 1042, 1050, 1043, 1051, 1044, 1052, 1053, 1046,
+     1054, 1047, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1055, 1048, 1056, 1049, 1057, 1050, 1058, 1051, 1059,
+     1052, 1060, 1053, 1054, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1061, 1055, 1056, 1057, 1058, 1032, 1059, 1060, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1061, 1032, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038,    0,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887
     } ;
 
-static yyconst flex_int16_t yy_nxt[2903] =
+static yyconst flex_int16_t yy_nxt[2908] =
     {   0,
        12,   13,   14,   15,   15,   15,   13,   16,   17,   12,
@@ -800,308 +800,308 @@
        72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
        72,   72,   72,   72,   72,   71,   71,   71,   71,   76,
-       76,   79,   79,  117,  118,   90,   87,   79,   79,  628,
+       76,   79,   79,  123,  124,   90,  141,   79,   79,   87,
        76,   76,   80,   81,   82,   82,   82,   80,   82,   81,
 
-       83,   83,   83,   82,   91,   93,  124,  125,  147,   98,
-       95,   99,   99,   99,   99,   99,   99,   87,   87,   94,
-      100,   85,   96,   97,   85,  101,   87,  119,  142,   77,
-       77,   77,   77,   87,  148,  102,  103,  162,  104,  104,
-      104,  104,  105,  105,  120,  144,  121,  122,  183,  143,
-      145,  149,   87,  150,  160,  106,  161,   87,  196,  107,
-      207,  151,  152,  153,   87,  108,  109,  154,  155,  163,
-      156,  110,   87,  157,  158,  178,  164,  106,   87,   87,
-      251,  159,  165,  111,   87,  253,  208,   87,  184,   87,
-      194,  108,  146,   87,  109,  103,   87,  112,  112,  112,
-
-      112,  112,  112,   87,  252,  181,  179,  231,  170,  197,
-      171,  182,  166,  180,  106,   87,  167,   87,  113,  172,
-      255,  168,   87,   87,  114,  169,   87,  173,  259,  195,
-      115,  888,  264,  232,  265,  174,  106,  175,  189,  249,
-      176,  257,  116,  318,  177,  250,  190,  258,   87,  144,
-      114,  126,  260,  191,  145,  127,  128,   87,  129,   87,
-      130,  131,  264,  132,  265,  133,  261,  192,  272,  185,
-      186,  250,   87,  258,  134,  135,  136,  281,  264,  187,
-      265,  283,  188,  198,   81,   82,   82,   82,  198,   87,
-      264,  199,  265,   87,  273,  137,  146,   87,  138,   80,
-
-       81,   82,   82,   82,   80,  284,  201,  202,   87,  287,
-      193,  201,   82,   81,   82,   82,   82,   82,   82,   81,
-       83,   83,   83,   82,  299,  139,  140,  203,  203,  203,
-      203,  203,  203,  210,  211,  250,   87,  888,  210,  710,
-      212,  243,  243,  243,  243,  212,   99,   99,   99,   99,
-       99,   99,  258,  249,  213,  213,  213,  213,  264,  266,
-      265,  250,   87,  267,  264,  212,  265,  888,  266,  888,
-      257,  301,  256,  264,  244,  265,   87,   87,  258,  242,
-      264,  214,  265,   87,  212,  264,  268,  265,   87,  212,
-      212,   87,  279,  212,  212,  888,  264,  888,  265,  280,
-
-      264,  212,  265,  310,  212,  286,  212,  215,  212,  144,
-      216,  218,   87,  300,  145,  219,  220,   87,  435,   87,
-      221,  222,   87,  223,  103,  224,  105,  105,  105,  105,
-      105,  105,  315,   87,  225,  226,  227,  282,  304,  246,
-      285,  246,   87,  106,  247,  247,  247,  247,  247,  247,
-       87,  305,   87,   87,   87,  228,   87,   87,  229,  245,
-      307,   87,   87,  302,  303,  106,  288,  289,  290,  306,
-      291,  292,   87,   87,  293,  308,  294,  248,  311,  309,
-       87,  295,  296,  297,  314,  298,  230,  234,  234,  234,
-      234,  234,  234,   87,   87,  320,   87,  316,  312,  319,
-
-       87,   87,   87,  235,  236,  237,  324,  238,  237,  144,
-       87,  321,  317,   87,  347,   87,  313,  323,  322,   87,
-      239,   87,   87,  466,  326,  237,  236,  237,  329,  325,
-      238,   87,  237,  330,  327,  328,  332,   87,  338,   87,
-      348,  335,  336,   87,   87,   87,   87,  361,  407,  362,
-      331,  333,  334,   87,   87,  379,  339,  340,  342,  344,
-      343,  361,   87,  362,  337,  341,  198,   81,   82,   82,
-       82,  198,  201,  202,  199,  210,  211,  201,  201,  202,
-      210,  379,  408,  201,  345,  202,  361,   87,  362,  345,
-      361,  346,  362,  203,  203,  203,  203,  203,  203,  203,
-
-      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
-      203,  353,  353,  353,  353,  362,  362,  363,  361,  361,
-      362,  362,  361,  364,  362,  361,   87,  362,  361,  361,
-      362,  362,  361,  370,  362,  370,  370,  888,   87,  264,
-      371,  265,  371,  406,  354,  372,  372,  372,  372,  372,
-      372,  389,  374,  264,  374,  265,  370,  374,  370,  391,
-      235,  236,  237,  570,  238,  237,  247,  247,  247,  247,
-      247,  247,  376,   87,  374,   87,  374,  389,  373,   87,
-      409,  374,  237,  236,  237,  392,  402,  238,  888,  237,
-      105,  105,  105,  105,  105,  105,  246,  403,  246,   87,
-
-       87,  247,  247,  247,  247,  247,  247,  106,  105,  105,
-      105,  105,  105,  105,  382,   87,  405,  404,   87,   87,
-      420,   87,   87,  256,  361,   87,  362,   87,  717,  106,
-      377,  377,  377,  377,  377,  377,  421,  384,  410,  385,
-      415,  256,  414,  386,   87,   87,  235,  416,  237,  387,
-      238,  237,  112,  112,  112,  112,  112,  112,   87,  417,
-      411,  388,   87,  378,   87,  385,  412,  413,  237,  386,
-      237,  422,   87,  238,   87,  237,   87,   87,  418,  419,
-       87,  426,   87,   87,   87,  261,  427,  428,   87,   87,
-      424,  423,  425,  433,  434,   87,   87,   87,   87,   87,
-
-       87,  430,  429,  438,   87,  431,  432,  437,  440,  442,
-       87,   87,  439,   87,  436,  441,  443,   87,  444,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,  446,
-      448,  449,   87,   87,   87,  445,  450,  447,  452,   87,
-       87,  451,  457,   87,  456,  453,  455,  454,  144,   87,
-      458,   87,  463,  462,   87,  459,  460,  461,   87,  467,
-       87,  345,  202,  202,  465,  501,  345,  464,  346,  200,
-      361,  516,  362,  468,  212,  212,  212,  212,  353,  353,
-      353,  353,  372,  372,  372,  372,  372,  372,  371,  502,
-      371,   87,   87,  372,  372,  372,  372,  372,  372,  234,
-
-      234,  234,  234,  234,  234,   87,  518,  478,  489,  489,
-      489,  489,  489,  489,  243,  243,  243,  243,  105,  105,
-       87,  517,   87,  757,  235,  496,  237,  533,  238,  237,
-      493,  497,  375,  377,  377,  377,  377,  377,  377,  493,
-      494,  490,  497,   87,  382,   87,  237,  376,  237,  495,
-       87,  238,   87,  237,  520,   87,  493,  497,   87,  888,
-      496,  521,  519,  888,  522,  493,  378,  384,  497,  385,
-       87,  525,   87,  386,  523,  498,  536,  498,   87,  387,
-      499,  499,  499,  499,  499,  499,  384,  524,  385,   87,
-       87,  388,  386,   87,  527,  385,   87,   87,  503,  386,
-
-       87,   87,   87,  528,   87,  526,   87,  538,   87,   87,
-      388,   87,  540,  500,  385,  531,  529,  530,  386,  532,
-       87,  534,   87,  537,   87,  541,  544,  539,  535,   87,
-      543,   87,  542,   87,   87,  545,   87,  547,   87,   87,
-       87,   87,  549,   87,  548,   87,   87,  546,   87,  550,
-       87,   87,   87,   87,  553,  557,  551,   87,  555,  560,
-      552,  556,  554,   87,   87,  558,   87,   87,  559,   87,
-       87,  568,  561,  562,  564,  565,  569,  563,   87,   87,
-      567,  566,   87,   87,   87,  202,  572,   87,   87,   87,
-      575,  578,  571,  577,  493,  493,  573,   87,  627,  574,
-
-      212,  212,  212,  212,  494,  576,  489,  489,  489,  489,
-      489,  489,  377,  377,  377,  377,  377,  377,   87,  624,
-      493,  493,  235,  596,  237,  596,  238,  237,  597,  597,
-      597,  597,  597,  597,  600,  619,   87,  493,   87,  490,
-       87,  626,   87,  634,  237,  491,  237,  599,  660,  238,
-       87,  237,  499,  499,  499,  499,  499,  499,   87,   87,
-      600,  598,  622,  493,  601,  601,  601,  601,  601,  601,
-      629,  620,  637,   87,  621,   87,   87,   87,  642,   87,
-      602,  498,  603,  498,  604,  603,  499,  499,  499,  499,
-      499,  499,  623,   87,  631,   87,   87,  605,  632,   87,
-
-       87,   87,  603,   87,  603,  633,  625,  604,   87,  603,
-      630,  635,  636,   87,   87,  643,   87,  638,   87,   87,
-       87,   87,   87,  641,   87,  639,   87,  644,   87,   87,
-      640,  648,   87,  645,  646,  647,   87,  649,  651,   87,
-       87,  650,   87,   87,  652,  654,   87,  653,  655,   87,
-       87,  656,   87,   87,  665,   87,  658,  662,  657,  661,
-       87,   87,   87,  659,  666,  664,   87,   87,   87,   87,
-       87,  667,  888,  689,  663,  702,  735,   87,  703,  668,
-      669,  489,  489,  489,  489,  489,  489,  597,  597,  597,
-      597,  597,  597,  596,  705,  596,  689,   87,  597,  597,
-
-      597,  597,  597,  597,  601,  601,  601,  601,  601,  601,
-      704,  689,  689,  888,  595,  687,  687,  687,  687,  687,
-      687,  690,   87,  690,   87,   87,  690,  700,   87,   87,
-       87,  602,  707,  603,  689,  604,  603,  605,  708,   87,
-      701,  711,   87,  690,   87,  690,  709,  706,  688,   87,
-      690,   87,   87,  603,  719,  603,   87,  713,  604,   87,
-      603,  712,   87,   87,   87,   87,  714,   87,  715,  718,
-       87,  716,  722,   87,  720,   87,  721,   87,   87,  725,
-      723,   87,   87,   87,  728,   87,  724,   87,  726,  727,
-      732,   87,  733,  729,   87,  731,  734,   87,  737,   87,
-
-      736,  863,  758,  888,  730,  687,  687,  687,  687,  687,
-      687,  601,  601,  601,  601,  601,  601,   87,  751,   87,
-      753,  602,   87,  603,  755,  604,  603,  752,   87,  754,
-       87,   87,   87,   87,   87,  765,  760,   87,  688,   87,
-      763,  762,  766,  603,  691,  603,  759,  761,  604,   87,
-      603,  756,  768,   87,  764,   87,  769,   87,  767,   87,
-       87,   87,   87,   87,   87,  771,   87,   87,  770,  772,
-       87,  775,   87,  773,   87,   87,   87,  804,   87,   87,
-      780,   87,  774,  781,   87,   87,  776,  777,  778,  796,
-      797,  779,  687,  687,  687,  687,  687,  687,  795,  794,
-
-       87,   87,  801,   87,   87,   87,  802,   87,  799,   87,
-      798,   87,  805,   87,  806,   87,   87,  803,  800,  808,
-      807,   87,  810,   87,  809,  744,   87,   87,   87,   87,
-       87,  829,   87,   87,  834,  831,  832,   87,  811,   87,
-       87,   87,  835,   87,  837,   87,  812,  828,  827,   87,
-       87,   87,  830,  826,  838,  833,   87,   87,  839,  840,
-       87,  841,  836,  851,   87,   87,  853,  852,   87,   87,
-       87,  850,  856,  858,   87,   87,   87,  859,   87,   87,
-       87,  865,   87,  854,  860,  857,   87,  861,  864,  855,
-       87,  868,  867,  866,   87,   87,   87,  869,  870,  871,
-
-      872,   87,   87,   87,   87,  874,   87,  876,   87,  877,
-       87,   87,   87,  875,   87,   87,  873,   87,   87,   87,
-      888,  881,   87,  888,  888,  862,  880,  882,   87,   87,
-      878,  879,  887,   87,   87,   87,  885,  883,  884,  888,
-      888,  886,   69,   69,   69,   69,   69,   69,   69,   69,
-       69,   69,   69,   69,   69,   75,   75,   75,   75,   75,
-       75,   75,   75,   75,   75,   75,   75,   75,   78,   78,
-       78,   78,   78,   78,   78,   78,   78,   78,   78,   78,
-       78,   86,  849,  888,   86,  848,   86,   86,   86,   86,
-       86,  141,  888,  846,  888,  141,  141,  141,  141,  141,
-
-      141,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  205,  845,  888,  205,  844,  205,
-      205,  205,  205,  205,  209,  888,  209,  209,  843,  209,
-      209,  209,  209,  209,  209,   87,  209,  217,   87,   87,
-      217,  217,  217,  217,  217,  217,  217,  217,  888,  217,
-      240,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-      240,  240,  240,  254,  254,  825,  254,  888,  824,  822,
-      254,  270,  888,  820,  270,  888,  270,  270,  270,  270,
-      270,  274,  818,  274,  888,  816,  814,  274,  276,   87,
-      276,   87,   87,   87,  276,  349,   87,  349,   87,   87,
-
-       87,  349,  351,   87,  351,   87,   87,   87,  351,  355,
-      888,  355,  793,  791,  888,  355,  357,  888,  357,  788,
-      786,  784,  357,  359,   87,  359,   87,   87,   87,  359,
-      366,   87,  366,   87,   87,  750,  366,  368,  747,  368,
-      746,  744,  206,  368,  240,  240,  240,  240,  240,  240,
-      240,  240,  240,  240,  240,  240,  240,  381,  740,  381,
-      383,  383,  739,  383,  383,  383,  671,  383,  254,  254,
-       87,  254,  393,   87,  393,   87,   87,   87,  393,  395,
-       87,  395,   87,   87,   87,  395,  397,   87,  397,   87,
-       87,   87,  397,  274,   87,  274,  399,   87,  399,  698,
-
-      697,  695,  399,  276,  693,  276,   86,  691,  599,   86,
-      686,   86,   86,   86,   86,   86,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  469,
-      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  470,  685,  470,  683,  681,  679,  470,  472,
-      677,  472,  675,  673,  671,  472,  474,   87,  474,   87,
-       87,   87,  474,  349,   87,  349,  476,   87,  476,   87,
-       87,   87,  476,  351,   87,  351,  479,   87,  479,  618,
-      616,  614,  479,  355,  612,  355,  481,  610,  481,  608,
-      503,  606,  481,  357,  606,  357,  483,  595,  483,  594,
-
-      592,  484,  483,  359,  484,  359,  485,  590,  485,  588,
-      586,  584,  485,  366,  582,  366,  487,  580,  487,   87,
-       87,   87,  487,  368,   87,  368,  492,   87,  492,   87,
-      492,   87,  492,  381,   87,  381,  515,  381,  513,  381,
-      383,  383,  511,  383,  383,  383,  509,  383,  504,  507,
-      504,  505,  491,  488,  504,  506,  486,  506,  362,  362,
-      484,  506,  508,  482,  508,  480,  477,  475,  508,  393,
-      473,  393,  510,  471,  510,   87,   87,   87,  510,  395,
-      401,  395,  512,  400,  512,  398,  396,  394,  512,  397,
-      271,  397,  514,  266,  514,  265,  390,  390,  514,  399,
-
-      253,  399,   86,  380,  380,   86,  241,   86,   86,   86,
-       86,   86,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  469,  579,  375,  579,  369,  367,
-      365,  579,  470,  361,  470,  581,  360,  581,  358,  356,
-      352,  581,  472,  350,  472,  583,  206,  583,  202,   87,
-      278,  583,  474,  277,  474,  585,  275,  585,  271,  266,
-      269,  585,  476,  266,  476,  587,  264,  587,  263,  262,
-      241,  587,  479,  233,  479,  589,   85,  589,   85,   87,
-      206,  589,  481,  204,  481,  483,   85,  483,  123,   87,
-      888,  483,  591,   70,  591,   70,  888,  888,  591,  485,
-
-      888,  485,  593,  888,  593,  888,  888,  888,  593,  487,
-      888,  487,  492,  888,  492,  888,  492,  888,  492,  383,
-      888,  383,  888,  888,  888,  383,  607,  888,  607,  888,
-      888,  888,  607,  504,  888,  504,  609,  888,  609,  888,
-      888,  888,  609,  506,  888,  506,  611,  888,  611,  888,
-      888,  888,  611,  508,  888,  508,  613,  888,  613,  888,
-      888,  888,  613,  510,  888,  510,  615,  888,  615,  888,
-      888,  888,  615,  512,  888,  512,  617,  888,  617,  888,
-      888,  888,  617,  514,  888,  514,   86,  888,  888,   86,
-      888,   86,   86,   86,   86,   86,  670,  670,  670,  670,
-
-      670,  670,  670,  670,  670,  670,  670,  670,  670,  672,
-      888,  672,  888,  888,  888,  672,  579,  888,  579,  674,
-      888,  674,  888,  888,  888,  674,  581,  888,  581,  676,
-      888,  676,  888,  888,  888,  676,  583,  888,  583,  678,
-      888,  678,  888,  888,  888,  678,  585,  888,  585,  680,
-      888,  680,  888,  888,  888,  680,  587,  888,  587,  682,
-      888,  682,  888,  888,  888,  682,  589,  888,  589,  684,
-      888,  684,  888,  888,  888,  684,  591,  888,  591,   86,
-      888,   86,  888,  888,  888,   86,  593,  888,  593,  492,
-      888,  492,  888,  888,  888,  492,  692,  888,  692,  888,
-
-      888,  888,  692,  607,  888,  607,  694,  888,  694,  888,
-      888,  888,  694,  609,  888,  609,  696,  888,  696,  888,
-      888,  888,  696,  611,  888,  611,  141,  888,  141,  888,
-      888,  888,  141,  613,  888,  613,  699,  888,  699,  615,
-      888,  615,   86,  888,  888,   86,  888,   86,   86,   86,
-       86,   86,  617,  888,  617,  670,  670,  670,  670,  670,
-      670,  670,  670,  670,  670,  670,  670,  670,  738,  888,
-      738,  888,  888,  888,  738,  672,  888,  672,  205,  888,
-      205,  888,  888,  888,  205,  674,  888,  674,  741,  888,
-      741,  676,  888,  676,  205,  888,  888,  205,  888,  205,
-
-      205,  205,  205,  205,  678,  888,  678,  742,  888,  742,
-      680,  888,  680,  682,  888,  682,  743,  888,  743,  684,
-      888,  684,   86,  888,   86,  745,  888,  745,  888,  888,
-      888,  745,  692,  888,  692,  270,  888,  270,  888,  888,
-      888,  270,  694,  888,  694,  748,  888,  748,  696,  888,
-      696,  141,  888,  141,  749,  888,  749,  888,  888,  888,
-      749,   86,  888,  888,   86,  888,   86,   86,   86,   86,
-       86,  782,  888,  782,  738,  888,  738,  205,  888,  205,
-      783,  888,  783,  888,  888,  888,  783,  785,  888,  785,
-      888,  888,  888,  785,  787,  888,  787,  888,  888,  888,
-
-      787,  789,  888,  789,  790,  888,  790,  888,  888,  888,
-      790,  792,  888,  792,  888,  888,  888,  792,  813,  888,
-      813,  888,  888,  888,  813,  815,  888,  815,  888,  888,
-      888,  815,  817,  888,  817,  888,  888,  888,  817,  819,
-      888,  819,  888,  888,  888,  819,  821,  888,  821,  888,
-      888,  888,  821,  823,  888,  823,  888,  888,  888,  823,
-      617,  888,  617,  888,  888,  888,  617,  842,  888,  842,
-      888,  888,  888,  842,  678,  888,  678,  888,  888,  888,
-      678,  682,  888,  682,  888,  888,  888,  682,   86,  888,
-       86,  888,  888,  888,   86,  847,  888,  847,  888,  888,
-
-      888,  847,  141,  888,  141,  888,  888,  888,  141,  205,
-      888,  205,  888,  888,  888,  205,   11,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-
-      888,  888
+       83,   83,   83,   82,   91,   93,   87,  142,  146,   98,
+       95,   99,   99,   99,   99,   99,   99,  252,  887,   94,
+      100,   85,   96,   97,   85,  101,  161,  118,  143,   77,
+       77,   77,   77,  144,  147,  102,  103,   87,  104,  104,
+      104,  104,  105,  105,  119,   87,  120,  121,  148,  263,
+      149,  264,  254,  260,  183,  106,  195,   87,  159,  107,
+      160,  150,  151,  152,   87,  108,  109,  153,  154,  162,
+      155,  110,   87,  156,  157,  145,  163,  106,   87,  182,
+       87,  158,  164,  111,  206,   87,  263,   87,  264,   87,
+       87,  108,  194,   87,  109,  103,  250,  112,  112,  112,
+
+      112,  112,  112,   87,  169,  177,  170,  196,  193,   87,
+      207,  180,  165,  230,  106,  171,  166,  181,  113,  178,
+      251,  167,   87,  258,  114,  168,  179,  172,   87,  263,
+      115,  264,  248,   87,   87,  173,  106,  174,  249,  231,
+      175,  143,  116,  263,  176,  264,  144,  259,  317,  283,
+      114,  125,  280,  500,  249,  126,  127,   87,  128,  191,
+      129,  130,  256,  131,  249,  132,   87,  265,  257,  184,
+      185,  257,  248,   87,  133,  134,  135,  501,  188,  186,
+      249,  263,  187,  264,  271,   87,  189,  265,  145,  256,
+      305,  200,  201,  190,  257,  136,  200,  257,  137,  263,
+
+      887,  264,  192,  197,   81,   82,   82,   82,  197,   87,
+      272,  198,  202,  202,  202,  202,  202,  202,   80,   81,
+       82,   82,   82,   80,   87,  138,  139,  209,  210,  263,
+      887,  264,  209,  282,  211,  255,  263,  267,  264,  211,
+       82,   81,   82,   82,   82,   82,   87,  887,  212,  212,
+      212,  212,   82,   81,   83,   83,   83,   82,  887,  211,
+       99,   99,   99,   99,   99,   99,  242,  242,  242,  242,
+      266,  263,  263,  264,  264,  213,  143,  263,  211,  264,
+       87,  144,  375,  211,  211,   87,   87,  211,  211,   87,
+       87,   87,  286,  241,  887,  211,   87,   87,  211,  243,
+
+      211,  214,  211,  281,  215,  217,  278,  284,  285,  218,
+      219,  307,  298,  279,  220,  221,   87,  222,   87,  223,
+       87,   87,  887,   87,  309,  300,   87,   87,  224,  225,
+      226,  103,  303,  105,  105,  105,  105,  105,  105,   87,
+      299,   87,  301,  302,   87,  304,  308,  310,   87,  227,
+      106,  245,  228,  245,  306,   87,  246,  246,  246,  246,
+      246,  246,   87,  313,   87,  315,  244,   87,   87,  311,
+      314,   87,  106,   87,   87,   87,  323,   87,   87,  322,
+      229,  233,  233,  233,  233,  233,  233,  312,  333,  247,
+      319,  316,  328,  320,  318,   87,   87,  234,  235,  236,
+
+      321,  237,  236,   87,  324,   87,  325,  143,  335,  360,
+      331,  361,   87,   87,  238,  337,  326,  327,   87,  236,
+      235,  236,   87,  329,  237,  332,  236,  287,  288,  289,
+      336,  290,  291,  334,   87,  292,   87,  293,  407,  360,
+      330,  361,  294,  295,  296,   87,  297,  339,  360,  343,
+      361,   87,  200,  201,  338,  340,  346,  200,  341,   87,
+      342,  197,   81,   82,   82,   82,  197,  200,  201,  198,
+      378,  361,  200,  202,  202,  202,  202,  202,  202,  344,
+      201,  360,  347,  361,  344,  360,  345,  361,  202,  202,
+      202,  202,  202,  202,  209,  210,  378,  143,  361,  209,
+
+      202,  202,  202,  202,  202,  202,  352,  352,  352,  352,
+      360,   87,  361,  362,  360,  360,  361,  361,  360,  363,
+      361,  360,  360,  361,  361,  369,  369,  370,  369,  370,
+      435,   87,  371,  371,  371,  371,  371,  371,  373,  353,
+      373,   87,  263,  373,  264,  263,   87,  264,  369,  402,
+       87,  369,  234,  235,  236,  406,  237,  236,  388,  401,
+      373,   87,  373,   87,   87,  372,  390,  373,  105,  105,
+      105,  105,  105,  105,  236,  235,  236,  404,   87,  237,
+      405,  236,  403,  408,  388,  106,  246,  246,  246,  246,
+      246,  246,  391,   87,   87,   87,   87,   87,   87,  419,
+
+       87,  255,  425,  432,   87,  420,  434,  106,  376,  376,
+      376,  376,  376,  376,  381,  409,  413,  105,  105,  105,
+      105,  105,  105,   87,  234,  245,  236,  245,  237,  236,
+      246,  246,  246,  246,  246,  246,   87,  383,  410,  384,
+       87,  377,   87,  385,  411,  412,  236,   87,  236,  386,
+      255,  237,   87,  236,  112,  112,  112,  112,  112,  112,
+      414,  387,  415,  417,  418,  384,   87,  416,   87,  385,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,  421,
+      427,  426,  433,   87,  437,   87,   87,  260,  423,  424,
+       87,   87,  436,  429,  428,  422,   87,  430,  431,  439,
+
+       87,  438,   87,   87,  446,  441,  440,  442,  443,   87,
+       87,   87,   87,   87,   87,  445,   87,   87,   87,   87,
+       87,  448,  447,   87,   87,  444,  449,  451,   87,  456,
+       87,  450,   87,   87,   87,  452,  455,  454,   87,  453,
+      457,  462,  460,  461,   87,   87,  458,  464,   87,  515,
+      459,  463,  465,  466,  344,  201,  201,   87,  887,  344,
+      467,  345,  199,  211,  211,  211,  211,  352,  352,  352,
+      352,  360,  360,  361,  361,  371,  371,  371,  371,  371,
+      371,  370,  569,  370,  492,  492,  371,  371,  371,  371,
+      371,  371,  887,   87,  493,  494,  477,  488,  488,  488,
+
+      488,  488,  488,  233,  233,  233,  233,  233,  233,  516,
+      492,  492,   87,  234,   87,  236,   87,  237,  236,  242,
+      242,  242,  242,  105,  105,  495,  381,  517,   87,   87,
+      489,  496,   87,  518,   87,  236,  374,  236,  519,  520,
+      237,  521,  236,  376,  376,  376,  376,  376,  376,  383,
+       87,  384,  375,  496,   87,  385,  522,  496,  497,  887,
+      497,  386,   87,  498,  498,  498,  498,  498,  498,   87,
+      525,  495,  526,  387,   87,  524,  377,  384,  523,  496,
+       87,  385,  383,   87,  384,   87,   87,  527,  385,   87,
+       87,  532,   87,   87,  502,   87,  499,   87,  535,  528,
+
+      529,  537,  530,  531,  533,   87,  387,   87,   87,  541,
+      384,  534,  538,   87,  385,   87,  536,   87,   87,   87,
+      539,  540,   87,   87,  546,   87,   87,   87,  544,  542,
+       87,  548,   87,   87,  547,  543,   87,   87,  549,   87,
+      545,   87,  552,   87,   87,  550,  556,  554,  551,   87,
+      559,   87,  553,  555,   87,   87,  557,   87,   87,  558,
+       87,   87,   87,  564,  560,  567,  563,  568,   87,  561,
+      566,  562,   87,  565,   87,   87,  571,   87,   87,  573,
+      627,  201,  492,  570,  576,  574,  572,  577,  211,  211,
+      211,  211,  493,   87,  575,  488,  488,  488,  488,  488,
+
+      488,  376,  376,  376,  376,  376,  376,   87,  492,   87,
+      618,  234,  595,  236,  595,  237,  236,  596,  596,  596,
+      596,  596,  596,  492,   87,  599,  492,  621,  489,   87,
+       87,  623,   87,  236,  490,  236,  598,  619,  237,   87,
+      236,  498,  498,  498,  498,  498,  498,  620,   87,  492,
+      597,  599,  492,  600,  600,  600,  600,  600,  600,   87,
+      631,  622,   87,  887,  625,  887,   87,  862,   87,  601,
+      497,  602,  497,  603,  602,  498,  498,  498,  498,  498,
+      498,  624,  628,   87,   87,  630,  604,   87,   87,   87,
+       87,  602,  633,  602,  626,  636,  603,  632,  602,  629,
+
+      634,   87,   87,  635,   87,   87,   87,  642,   87,   87,
+      637,  641,   87,   87,  640,   87,   87,  643,  647,  639,
+       87,   87,  887,   87,   87,   87,  638,   87,   87,  644,
+      645,  646,  648,  650,   87,   87,   87,  649,   87,  653,
+      651,   87,  652,   87,  654,  655,   87,   87,   87,   87,
+      656,  657,   87,  660,  659,  661,  664,   87,  658,   87,
+       87,  663,   87,   87,   87,  668,  665,  688,  688,  662,
+      666,  701,  702,  887,  887,   87,  667,  488,  488,  488,
+      488,  488,  488,  596,  596,  596,  596,  596,  596,  595,
+      688,  595,  704,   87,  596,  596,  596,  596,  596,  596,
+
+      600,  600,  600,  600,  600,  600,  703,  688,   87,  887,
+      594,  686,  686,  686,  686,  686,  686,  689,   87,  689,
+       87,   87,  689,  699,   87,  708,   87,  601,  706,  602,
+      688,  603,  602,  604,  707,   87,  700,  710,  709,  689,
+       87,  689,   87,  705,  687,   87,  689,   87,   87,  602,
+       87,  602,   87,  716,  603,  718,  602,  712,   87,   87,
+       87,   87,  711,   87,  714,   87,   87,  713,   87,  717,
+      715,   87,  721,  719,   87,  724,   87,   87,  722,  720,
+      727,   87,   87,   87,  725,   87,  731,  723,   87,  732,
+      726,   87,   87,  861,  728,  734,   87,  733,  730,   87,
+
+      735,   87,   87,  729,   87,   87,  751,  736,  686,  686,
+      686,  686,  686,  686,  600,  600,  600,  600,  600,  600,
+      750,   87,  755,   87,  601,  763,  602,  752,  603,  602,
+      753,   87,   87,  764,   87,  756,  754,  757,   87,  758,
+       87,  687,   87,   87,  759,  767,  602,  690,  602,  761,
+       87,  603,  766,  602,   87,  760,   87,  762,   87,  765,
+       87,  768,   87,  769,   87,   87,   87,   87,  770,   87,
+       87,   87,   87,   87,  771,   87,  774,   87,  772,   87,
+       87,  779,   87,   87,  795,   87,  780,  773,   87,   87,
+      776,   87,  775,  803,  777,  796,  778,  686,  686,  686,
+
+      686,  686,  686,  793,   87,  794,  799,   87,  798,   87,
+      801,   87,   87,   87,  797,  804,  805,  800,  806,   87,
+       87,   87,  802,  807,   87,   87,   87,  808,   87,   87,
+      743,   87,   87,   87,  809,  828,   87,   87,   87,  830,
+      831,  833,   87,   87,   87,  834,   87,  836,  810,  811,
+      826,  827,   87,  829,   87,  825,  832,  837,   87,   87,
+       87,  838,  839,   87,   87,  835,   87,   87,   87,  851,
+      850,  855,   87,  852,  840,   87,   87,   87,  853,  857,
+      849,   87,   87,   87,  854,  858,  859,   87,   87,  856,
+      860,   87,  863,  864,  865,   87,   87,  866,   87,  868,
+
+      867,  869,   87,   87,   87,  870,   87,   87,   87,  873,
+       87,  875,   87,  876,   87,   87,   87,  874,   87,  872,
+       87,   87,   87,  871,   87,  880,   87,   87,   87,  887,
+      879,  881,  887,  848,  877,  878,  886,  887,  847,  884,
+      887,  845,  882,  883,  887,  844,  885,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       75,   75,   75,   75,   75,   75,   75,   75,   75,   75,
+       75,   75,   75,   78,   78,   78,   78,   78,   78,   78,
+       78,   78,   78,   78,   78,   78,   86,  887,  843,   86,
+      887,   86,   86,   86,   86,   86,  140,  842,   87,   87,
+
+      140,  140,  140,  140,  140,  140,  199,  199,  199,  199,
+      199,  199,  199,  199,  199,  199,  199,  199,  199,  204,
+       87,  887,  204,  824,  204,  204,  204,  204,  204,  208,
+      887,  208,  208,  823,  208,  208,  208,  208,  208,  208,
+      821,  208,  216,  887,  819,  216,  216,  216,  216,  216,
+      216,  216,  216,  887,  216,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  239,  239,  239,  253,  253,
+      817,  253,  887,  815,  813,  253,  269,   87,   87,  269,
+       87,  269,  269,  269,  269,  269,  273,   87,  273,   87,
+       87,   87,  273,  275,   87,  275,   87,   87,   87,  275,
+
+      348,   87,  348,  887,  792,  790,  348,  350,  887,  350,
+      887,  787,  785,  350,  354,  783,  354,   87,   87,   87,
+      354,  356,   87,  356,   87,   87,   87,  356,  358,  749,
+      358,  746,  745,  743,  358,  365,  205,  365,  739,  738,
+      670,  365,  367,   87,  367,   87,   87,   87,  367,  239,
+      239,  239,  239,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  380,   87,  380,  382,  382,   87,  382,  382,
+      382,   87,  382,  253,  253,   87,  253,  392,   87,  392,
+       87,   87,   87,  392,  394,   87,  394,   87,   87,  697,
+      394,  396,  696,  396,  694,  692,  690,  396,  273,  598,
+
+      273,  398,  685,  398,  684,  682,  680,  398,  275,  678,
+      275,   86,  676,  674,   86,  672,   86,   86,   86,   86,
+       86,  199,  199,  199,  199,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  468,  468,  468,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  469,  670,  469,
+       87,   87,   87,  469,  471,   87,  471,   87,   87,   87,
+      471,  473,   87,  473,   87,   87,   87,  473,  348,  617,
+      348,  475,  615,  475,  613,  611,  609,  475,  350,  607,
+      350,  478,  502,  478,  605,  605,  594,  478,  354,  593,
+      354,  480,  591,  480,  483,  483,  589,  480,  356,  587,
+
+      356,  482,  585,  482,  583,  581,  579,  482,  358,   87,
+      358,  484,   87,  484,   87,   87,   87,  484,  365,   87,
+      365,  486,   87,  486,   87,  514,  512,  486,  367,  510,
+      367,  491,  508,  491,  506,  491,  504,  491,  380,  490,
+      380,  487,  380,  485,  380,  382,  382,  361,  382,  382,
+      382,  361,  382,  503,  483,  503,  481,  479,  476,  503,
+      505,  474,  505,  472,  470,   87,  505,  507,   87,  507,
+       87,  400,  399,  507,  392,  397,  392,  509,  395,  509,
+      393,  270,  265,  509,  394,  264,  394,  511,  389,  511,
+      389,  252,  379,  511,  396,  379,  396,  513,  240,  513,
+
+      374,  368,  366,  513,  398,  364,  398,   86,  360,  359,
+       86,  357,   86,   86,   86,   86,   86,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      578,  355,  578,  351,  349,  205,  578,  469,  201,  469,
+      580,   87,  580,  277,  276,  274,  580,  471,  270,  471,
+      582,  265,  582,  268,  265,  263,  582,  473,  262,  473,
+      584,  261,  584,  240,  232,   85,  584,  475,   85,  475,
+      586,   87,  586,  205,  203,   85,  586,  478,  122,  478,
+      588,  117,  588,   87,  887,   70,  588,  480,   70,  480,
+      482,  887,  482,  887,  887,  887,  482,  590,  887,  590,
+
+      887,  887,  887,  590,  484,  887,  484,  592,  887,  592,
+      887,  887,  887,  592,  486,  887,  486,  491,  887,  491,
+      887,  491,  887,  491,  382,  887,  382,  887,  887,  887,
+      382,  606,  887,  606,  887,  887,  887,  606,  503,  887,
+      503,  608,  887,  608,  887,  887,  887,  608,  505,  887,
+      505,  610,  887,  610,  887,  887,  887,  610,  507,  887,
+      507,  612,  887,  612,  887,  887,  887,  612,  509,  887,
+      509,  614,  887,  614,  887,  887,  887,  614,  511,  887,
+      511,  616,  887,  616,  887,  887,  887,  616,  513,  887,
+      513,   86,  887,  887,   86,  887,   86,   86,   86,   86,
+
+       86,  669,  669,  669,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  669,  671,  887,  671,  887,  887,  887,
+      671,  578,  887,  578,  673,  887,  673,  887,  887,  887,
+      673,  580,  887,  580,  675,  887,  675,  887,  887,  887,
+      675,  582,  887,  582,  677,  887,  677,  887,  887,  887,
+      677,  584,  887,  584,  679,  887,  679,  887,  887,  887,
+      679,  586,  887,  586,  681,  887,  681,  887,  887,  887,
+      681,  588,  887,  588,  683,  887,  683,  887,  887,  887,
+      683,  590,  887,  590,   86,  887,   86,  887,  887,  887,
+       86,  592,  887,  592,  491,  887,  491,  887,  887,  887,
+
+      491,  691,  887,  691,  887,  887,  887,  691,  606,  887,
+      606,  693,  887,  693,  887,  887,  887,  693,  608,  887,
+      608,  695,  887,  695,  887,  887,  887,  695,  610,  887,
+      610,  140,  887,  140,  887,  887,  887,  140,  612,  887,
+      612,  698,  887,  698,  614,  887,  614,   86,  887,  887,
+       86,  887,   86,   86,   86,   86,   86,  616,  887,  616,
+      669,  669,  669,  669,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  737,  887,  737,  887,  887,  887,  737,
+      671,  887,  671,  204,  887,  204,  887,  887,  887,  204,
+      673,  887,  673,  740,  887,  740,  675,  887,  675,  204,
+
+      887,  887,  204,  887,  204,  204,  204,  204,  204,  677,
+      887,  677,  741,  887,  741,  679,  887,  679,  681,  887,
+      681,  742,  887,  742,  683,  887,  683,   86,  887,   86,
+      744,  887,  744,  887,  887,  887,  744,  691,  887,  691,
+      269,  887,  269,  887,  887,  887,  269,  693,  887,  693,
+      747,  887,  747,  695,  887,  695,  140,  887,  140,  748,
+      887,  748,  887,  887,  887,  748,   86,  887,  887,   86,
+      887,   86,   86,   86,   86,   86,  781,  887,  781,  737,
+      887,  737,  204,  887,  204,  782,  887,  782,  887,  887,
+      887,  782,  784,  887,  784,  887,  887,  887,  784,  786,
+
+      887,  786,  887,  887,  887,  786,  788,  887,  788,  789,
+      887,  789,  887,  887,  887,  789,  791,  887,  791,  887,
+      887,  887,  791,  812,  887,  812,  887,  887,  887,  812,
+      814,  887,  814,  887,  887,  887,  814,  816,  887,  816,
+      887,  887,  887,  816,  818,  887,  818,  887,  887,  887,
+      818,  820,  887,  820,  887,  887,  887,  820,  822,  887,
+      822,  887,  887,  887,  822,  616,  887,  616,  887,  887,
+      887,  616,  841,  887,  841,  887,  887,  887,  841,  677,
+      887,  677,  887,  887,  887,  677,  681,  887,  681,  887,
+      887,  887,  681,   86,  887,   86,  887,  887,  887,   86,
+
+      846,  887,  846,  887,  887,  887,  846,  140,  887,  140,
+      887,  887,  887,  140,  204,  887,  204,  887,  887,  887,
+      204,   11,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887
     } ;
 
-static yyconst flex_int16_t yy_chk[2903] =
+static yyconst flex_int16_t yy_chk[2908] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1124,309 +1124,309 @@
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    7,
-        8,    9,   10,   33,   33,   20,  526,    9,   10,  526,
+        8,    9,   10,   37,   37,   20,   39,    9,   10,  886,
         7,    8,   13,   13,   13,   13,   13,   13,   15,   15,
 
-       15,   15,   15,   15,   20,   25,   37,   37,   42,   28,
-       27,   28,   28,   28,   28,   28,   28,   48,  887,   25,
-       29,   25,   27,   27,   27,   29,   56,   35,   39,    7,
-        8,    9,   10,   47,   42,   29,   30,   48,   30,   30,
-       30,   30,   30,   30,   35,   40,   35,   35,   56,   39,
-       40,   44,  886,   44,   47,   30,   47,   53,   64,   30,
-       73,   45,   45,   45,   49,   30,   30,   45,   45,   49,
-       45,   30,   61,   45,   45,   53,   49,   30,   45,   57,
-      108,   45,   49,   30,  878,  109,   73,   55,   57,   40,
-       61,   30,   40,   51,   30,   31,   54,   31,   31,   31,
-
-       31,   31,   31,   50,  108,   55,   54,   87,   51,   64,
-       51,   55,   50,   54,   31,  877,   50,   62,   31,   51,
-      109,   50,   52,  176,   31,   50,   59,   52,  114,   62,
-       31,  115,  127,   87,  127,   52,   31,   52,   59,  107,
-       52,  113,   31,  176,   52,  107,   59,  113,  874,   60,
-       31,   38,  114,   59,   60,   38,   38,   58,   38,  152,
-       38,   38,  128,   38,  128,   38,  115,   60,  143,   58,
-       58,  107,  154,  113,   38,   38,   38,  152,  130,   58,
-      130,  154,   58,   67,   67,   67,   67,   67,   67,  155,
-      133,   67,  133,   60,  143,   38,   60,  158,   38,   80,
-
-       80,   80,   80,   80,   80,  155,   68,   68,  160,  158,
-       60,   68,   82,   82,   82,   82,   82,   82,   83,   83,
-       83,   83,   83,   83,  160,   38,   38,   68,   68,   68,
-       68,   68,   68,   77,   77,  111,  628,  110,   77,  628,
-       77,  104,  104,  104,  104,   77,  103,  103,  103,  103,
-      103,  103,  116,  111,   77,   77,   77,   77,  135,  131,
-      135,  111,  162,  134,  134,   77,  134,  110,  132,  104,
-      116,  162,  110,  131,  104,  131,  169,  151,  116,  103,
-      132,   77,  132,  157,   77,  136,  136,  136,  873,   77,
-       77,  161,  151,   77,   77,  110,  138,  104,  138,  151,
-
-      140,   77,  140,  169,   77,  157,   77,   77,   77,  146,
-       77,   85,  309,  161,  146,   85,   85,  173,  309,  153,
-       85,   85,  156,   85,  105,   85,  105,  105,  105,  105,
-      105,  105,  173,  164,   85,   85,   85,  153,  164,  106,
-      156,  106,  163,  105,  106,  106,  106,  106,  106,  106,
-      166,  164,  165,  146,  167,   85,  168,  170,   85,  105,
-      166,  159,  172,  163,  163,  105,  159,  159,  159,  165,
-      159,  159,  177,  178,  159,  167,  159,  106,  170,  168,
-      174,  159,  159,  159,  172,  159,   85,   99,   99,   99,
-       99,   99,   99,  171,  175,  178,  180,  174,  171,  177,
-
-      181,  182,  183,   99,   99,   99,  182,   99,   99,  192,
-      185,  180,  175,  184,  206,  342,  171,  181,  180,  191,
-       99,  189,  186,  342,  184,   99,   99,   99,  185,  183,
-       99,  187,   99,  186,  184,  184,  187,  190,  191,  188,
-      206,  189,  190,  284,  193,  194,  195,  219,  284,  219,
-      186,  187,  188,  192,  871,  249,  192,  193,  194,  195,
-      194,  220,  285,  220,  190,  193,  198,  198,  198,  198,
-      198,  198,  199,  199,  198,  210,  210,  199,  201,  201,
-      210,  249,  285,  201,  203,  203,  221,  870,  221,  203,
-      224,  203,  224,  199,  199,  199,  199,  199,  199,  201,
-
-      201,  201,  201,  201,  201,  203,  203,  203,  203,  203,
-      203,  213,  213,  213,  213,  222,  223,  225,  225,  226,
-      225,  226,  227,  227,  227,  229,  283,  229,  223,  222,
-      223,  222,  230,  237,  230,  235,  235,  244,  461,  267,
-      236,  267,  236,  283,  213,  236,  236,  236,  236,  236,
-      236,  257,  238,  268,  238,  268,  237,  238,  235,  271,
-      242,  242,  242,  461,  242,  242,  246,  246,  246,  246,
-      246,  246,  244,  279,  238,  286,  238,  257,  236,  280,
-      286,  238,  242,  242,  242,  271,  279,  242,  863,  242,
-      245,  245,  245,  245,  245,  245,  248,  280,  248,  281,
-
-      282,  248,  248,  248,  248,  248,  248,  245,  256,  256,
-      256,  256,  256,  256,  254,  294,  282,  281,  287,  289,
-      294,  291,  290,  245,  363,  635,  363,  295,  635,  245,
-      247,  247,  247,  247,  247,  247,  295,  254,  287,  254,
-      290,  256,  289,  254,  292,  288,  247,  291,  247,  254,
-      247,  247,  261,  261,  261,  261,  261,  261,  296,  292,
-      288,  254,  293,  247,  297,  254,  288,  288,  247,  254,
-      247,  296,  298,  247,  300,  247,  301,  302,  293,  293,
-      303,  301,  304,  305,  306,  261,  302,  303,  307,  308,
-      298,  297,  300,  307,  308,  310,  313,  312,  311,  314,
-
-      315,  305,  304,  312,  316,  306,  306,  311,  314,  316,
-      319,  317,  313,  318,  310,  315,  317,  321,  318,  320,
-      323,  324,  325,  327,  328,  326,  329,  330,  332,  319,
-      321,  323,  333,  331,  334,  318,  324,  320,  326,  335,
-      336,  325,  331,  338,  330,  327,  329,  328,  339,  340,
-      332,  341,  338,  336,  343,  333,  334,  335,  344,  343,
-      402,  345,  345,  346,  341,  386,  345,  340,  345,  346,
-      364,  402,  364,  344,  353,  353,  353,  353,  354,  354,
-      354,  354,  371,  371,  371,  371,  371,  371,  373,  386,
-      373,  404,  339,  373,  373,  373,  373,  373,  373,  375,
-
-      375,  375,  375,  375,  375,  403,  404,  353,  372,  372,
-      372,  372,  372,  372,  376,  376,  376,  376,  376,  376,
-      707,  403,  418,  707,  372,  384,  372,  418,  372,  372,
-      381,  384,  375,  377,  377,  377,  377,  377,  377,  382,
-      381,  372,  388,  405,  383,  406,  372,  376,  372,  382,
-      407,  372,  409,  372,  406,  408,  381,  384,  411,  862,
-      388,  407,  405,  387,  408,  382,  377,  383,  388,  383,
-      420,  411,  413,  383,  409,  385,  420,  385,  410,  383,
-      385,  385,  385,  385,  385,  385,  387,  410,  387,  412,
-      414,  383,  387,  416,  413,  383,  422,  424,  387,  383,
-
-      415,  417,  421,  414,  431,  412,  419,  422,  423,  430,
-      387,  426,  424,  385,  387,  416,  415,  415,  387,  417,
-      428,  419,  432,  421,  433,  426,  431,  423,  419,  435,
-      430,  434,  428,  436,  438,  432,  440,  434,  441,  442,
-      443,  445,  436,  444,  435,  450,  446,  433,  448,  438,
-      451,  452,  455,  453,  442,  446,  440,  454,  444,  451,
-      441,  445,  443,  457,  459,  448,  456,  458,  450,  460,
-      462,  459,  452,  453,  455,  456,  460,  454,  463,  465,
-      458,  457,  464,  467,  468,  469,  463,  525,  861,  860,
-      465,  469,  462,  468,  492,  495,  463,  522,  525,  464,
-
-      478,  478,  478,  478,  492,  467,  489,  489,  489,  489,
-      489,  489,  491,  491,  491,  491,  491,  491,  516,  522,
-      492,  495,  489,  493,  489,  493,  489,  489,  493,  493,
-      493,  493,  493,  493,  496,  516,  524,  494,  532,  489,
-      565,  524,  520,  532,  489,  491,  489,  494,  565,  489,
-      527,  489,  498,  498,  498,  498,  498,  498,  517,  519,
-      496,  493,  520,  494,  499,  499,  499,  499,  499,  499,
-      527,  517,  535,  540,  519,  529,  856,  530,  540,  521,
-      499,  500,  499,  500,  499,  499,  500,  500,  500,  500,
-      500,  500,  521,  523,  529,  528,  531,  499,  530,  534,
-
-      533,  535,  499,  537,  499,  531,  523,  499,  536,  499,
-      528,  533,  534,  538,  539,  542,  545,  536,  543,  546,
-      547,  542,  548,  539,  551,  537,  552,  543,  550,  553,
-      538,  548,  555,  545,  546,  547,  561,  550,  552,  558,
-      556,  551,  559,  562,  553,  556,  563,  555,  558,  566,
-      567,  559,  568,  569,  570,  572,  562,  567,  561,  566,
-      570,  573,  575,  563,  572,  569,  666,  576,  620,  621,
-      852,  573,  849,  603,  568,  620,  666,  623,  621,  575,
-      576,  595,  595,  595,  595,  595,  595,  596,  596,  596,
-      596,  596,  596,  598,  623,  598,  603,  622,  598,  598,
-
-      598,  598,  598,  598,  601,  601,  601,  601,  601,  601,
-      622,  602,  602,  848,  595,  597,  597,  597,  597,  597,
-      597,  604,  619,  604,  624,  625,  604,  619,  629,  627,
-      626,  597,  625,  597,  602,  597,  597,  601,  626,  630,
-      619,  629,  631,  604,  632,  604,  627,  624,  597,  634,
-      604,  633,  636,  597,  637,  597,  639,  631,  597,  638,
-      597,  630,  641,  640,  642,  645,  632,  646,  633,  636,
-      643,  634,  640,  651,  638,  647,  639,  652,  654,  643,
-      641,  657,  637,  669,  647,  658,  642,  665,  645,  646,
-      657,  668,  658,  651,  703,  654,  665,  700,  669,  708,
-
-      668,  847,  708,  846,  652,  687,  687,  687,  687,  687,
-      687,  691,  691,  691,  691,  691,  691,  701,  700,  705,
-      703,  687,  704,  687,  705,  687,  687,  701,  709,  704,
-      711,  706,  713,  715,  712,  716,  711,  714,  687,  717,
-      714,  713,  717,  687,  691,  687,  709,  712,  687,  718,
-      687,  706,  719,  720,  715,  721,  720,  722,  718,  723,
-      724,  725,  726,  729,  716,  722,  733,  732,  721,  723,
-      734,  726,  736,  724,  737,  758,  762,  765,  719,  755,
-      736,  756,  725,  737,  757,  760,  729,  732,  733,  757,
-      758,  734,  744,  744,  744,  744,  744,  744,  756,  755,
-
-      759,  761,  762,  763,  764,  765,  763,  773,  760,  767,
-      759,  769,  767,  770,  769,  774,  771,  764,  761,  771,
-      770,  772,  773,  779,  772,  744,  794,  796,  798,  797,
-      799,  798,  800,  801,  804,  800,  801,  803,  774,  805,
-      807,  808,  805,  811,  808,  812,  779,  797,  796,  810,
-      827,  809,  799,  794,  809,  803,  828,  830,  810,  811,
-      804,  812,  807,  828,  829,  831,  830,  829,  833,  832,
-      836,  827,  832,  836,  839,  840,  851,  839,  841,  850,
-      864,  851,  854,  831,  840,  833,  855,  841,  850,  831,
-      853,  855,  854,  853,  857,  858,  859,  857,  858,  859,
-
-      864,  865,  866,  867,  868,  866,  869,  868,  872,  869,
-      875,  876,  879,  867,  880,  881,  865,  882,  883,  884,
-      845,  879,  885,  844,  843,  842,  876,  880,  838,  837,
-      872,  875,  885,  835,  834,  826,  883,  881,  882,  825,
-      824,  884,  889,  889,  889,  889,  889,  889,  889,  889,
-      889,  889,  889,  889,  889,  890,  890,  890,  890,  890,
-      890,  890,  890,  890,  890,  890,  890,  890,  891,  891,
-      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
-      891,  892,  823,  822,  892,  821,  892,  892,  892,  892,
-      892,  893,  820,  819,  818,  893,  893,  893,  893,  893,
-
-      893,  894,  894,  894,  894,  894,  894,  894,  894,  894,
-      894,  894,  894,  894,  895,  817,  816,  895,  815,  895,
-      895,  895,  895,  895,  896,  814,  896,  896,  813,  896,
-      896,  896,  896,  896,  896,  806,  896,  897,  802,  795,
-      897,  897,  897,  897,  897,  897,  897,  897,  793,  897,
-      898,  898,  898,  898,  898,  898,  898,  898,  898,  898,
-      898,  898,  898,  899,  899,  792,  899,  791,  790,  789,
-      899,  900,  788,  787,  900,  786,  900,  900,  900,  900,
-      900,  901,  785,  901,  784,  783,  782,  901,  902,  781,
-      902,  780,  778,  777,  902,  903,  776,  903,  775,  768,
-
-      766,  903,  904,  754,  904,  753,  752,  751,  904,  905,
-      750,  905,  749,  748,  747,  905,  906,  746,  906,  743,
-      742,  741,  906,  907,  735,  907,  731,  730,  728,  907,
-      908,  727,  908,  710,  702,  699,  908,  909,  694,  909,
-      692,  688,  678,  909,  910,  910,  910,  910,  910,  910,
-      910,  910,  910,  910,  910,  910,  910,  911,  674,  911,
-      912,  912,  672,  912,  912,  912,  670,  912,  913,  913,
-      667,  913,  914,  664,  914,  663,  662,  661,  914,  915,
-      660,  915,  659,  656,  655,  915,  916,  653,  916,  650,
-      649,  648,  916,  917,  644,  917,  918,  617,  918,  613,
-
-      611,  609,  918,  919,  607,  919,  920,  605,  599,  920,
-      593,  920,  920,  920,  920,  920,  921,  921,  921,  921,
-      921,  921,  921,  921,  921,  921,  921,  921,  921,  922,
-      922,  922,  922,  922,  922,  922,  922,  922,  922,  922,
-      922,  922,  923,  591,  923,  589,  587,  585,  923,  924,
-      583,  924,  581,  579,  578,  924,  925,  577,  925,  574,
-      571,  564,  925,  926,  560,  926,  927,  557,  927,  554,
-      549,  544,  927,  928,  541,  928,  929,  518,  929,  514,
-      512,  510,  929,  930,  508,  930,  931,  506,  931,  504,
-      503,  502,  931,  932,  501,  932,  933,  490,  933,  487,
-
-      485,  484,  933,  934,  483,  934,  935,  481,  935,  479,
-      476,  474,  935,  936,  472,  936,  937,  470,  937,  466,
-      449,  447,  937,  938,  439,  938,  939,  437,  939,  429,
-      939,  427,  939,  940,  425,  940,  399,  940,  397,  940,
-      941,  941,  395,  941,  941,  941,  393,  941,  942,  392,
-      942,  391,  378,  368,  942,  943,  366,  943,  365,  361,
-      359,  943,  944,  357,  944,  355,  351,  349,  944,  945,
-      348,  945,  946,  347,  946,  337,  322,  299,  946,  947,
-      278,  947,  948,  276,  948,  274,  273,  272,  948,  949,
-      270,  949,  950,  269,  950,  264,  260,  259,  950,  951,
-
-      255,  951,  952,  252,  251,  952,  240,  952,  952,  952,
-      952,  952,  953,  953,  953,  953,  953,  953,  953,  953,
-      953,  953,  953,  953,  953,  954,  239,  954,  232,  231,
-      228,  954,  955,  218,  955,  956,  216,  956,  215,  214,
-      208,  956,  957,  207,  957,  958,  205,  958,  200,  179,
-      150,  958,  959,  148,  959,  960,  147,  960,  141,  139,
-      137,  960,  961,  129,  961,  962,  126,  962,  125,  121,
-      101,  962,  963,   98,  963,  964,   95,  964,   93,   86,
-       72,  964,  965,   70,  965,  966,   66,  966,   36,   18,
-       11,  966,  967,    4,  967,    3,    0,    0,  967,  968,
-
-        0,  968,  969,    0,  969,    0,    0,    0,  969,  970,
-        0,  970,  971,    0,  971,    0,  971,    0,  971,  972,
-        0,  972,    0,    0,    0,  972,  973,    0,  973,    0,
-        0,    0,  973,  974,    0,  974,  975,    0,  975,    0,
-        0,    0,  975,  976,    0,  976,  977,    0,  977,    0,
-        0,    0,  977,  978,    0,  978,  979,    0,  979,    0,
-        0,    0,  979,  980,    0,  980,  981,    0,  981,    0,
-        0,    0,  981,  982,    0,  982,  983,    0,  983,    0,
-        0,    0,  983,  984,    0,  984,  985,    0,    0,  985,
-        0,  985,  985,  985,  985,  985,  986,  986,  986,  986,
-
-      986,  986,  986,  986,  986,  986,  986,  986,  986,  987,
-        0,  987,    0,    0,    0,  987,  988,    0,  988,  989,
-        0,  989,    0,    0,    0,  989,  990,    0,  990,  991,
-        0,  991,    0,    0,    0,  991,  992,    0,  992,  993,
-        0,  993,    0,    0,    0,  993,  994,    0,  994,  995,
-        0,  995,    0,    0,    0,  995,  996,    0,  996,  997,
-        0,  997,    0,    0,    0,  997,  998,    0,  998,  999,
-        0,  999,    0,    0,    0,  999, 1000,    0, 1000, 1001,
-        0, 1001,    0,    0,    0, 1001, 1002,    0, 1002, 1003,
-        0, 1003,    0,    0,    0, 1003, 1004,    0, 1004,    0,
-
-        0,    0, 1004, 1005,    0, 1005, 1006,    0, 1006,    0,
-        0,    0, 1006, 1007,    0, 1007, 1008,    0, 1008,    0,
-        0,    0, 1008, 1009,    0, 1009, 1010,    0, 1010,    0,
-        0,    0, 1010, 1011,    0, 1011, 1012,    0, 1012, 1013,
-        0, 1013, 1014,    0,    0, 1014,    0, 1014, 1014, 1014,
-     1014, 1014, 1015,    0, 1015, 1016, 1016, 1016, 1016, 1016,
-     1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1017,    0,
-     1017,    0,    0,    0, 1017, 1018,    0, 1018, 1019,    0,
-     1019,    0,    0,    0, 1019, 1020,    0, 1020, 1021,    0,
-     1021, 1022,    0, 1022, 1023,    0,    0, 1023,    0, 1023,
-
-     1023, 1023, 1023, 1023, 1024,    0, 1024, 1025,    0, 1025,
-     1026,    0, 1026, 1027,    0, 1027, 1028,    0, 1028, 1029,
-        0, 1029, 1030,    0, 1030, 1031,    0, 1031,    0,    0,
-        0, 1031, 1032,    0, 1032, 1033,    0, 1033,    0,    0,
-        0, 1033, 1034,    0, 1034, 1035,    0, 1035, 1036,    0,
-     1036, 1037,    0, 1037, 1038,    0, 1038,    0,    0,    0,
-     1038, 1039,    0,    0, 1039,    0, 1039, 1039, 1039, 1039,
-     1039, 1040,    0, 1040, 1041,    0, 1041, 1042,    0, 1042,
-     1043,    0, 1043,    0,    0,    0, 1043, 1044,    0, 1044,
-        0,    0,    0, 1044, 1045,    0, 1045,    0,    0,    0,
-
-     1045, 1046,    0, 1046, 1047,    0, 1047,    0,    0,    0,
-     1047, 1048,    0, 1048,    0,    0,    0, 1048, 1049,    0,
-     1049,    0,    0,    0, 1049, 1050,    0, 1050,    0,    0,
-        0, 1050, 1051,    0, 1051,    0,    0,    0, 1051, 1052,
-        0, 1052,    0,    0,    0, 1052, 1053,    0, 1053,    0,
-        0,    0, 1053, 1054,    0, 1054,    0,    0,    0, 1054,
-     1055,    0, 1055,    0,    0,    0, 1055, 1056,    0, 1056,
-        0,    0,    0, 1056, 1057,    0, 1057,    0,    0,    0,
-     1057, 1058,    0, 1058,    0,    0,    0, 1058, 1059,    0,
-     1059,    0,    0,    0, 1059, 1060,    0, 1060,    0,    0,
-
-        0, 1060, 1061,    0, 1061,    0,    0,    0, 1061, 1062,
-        0, 1062,    0,    0,    0, 1062,  888,  888,  888,  888,
+       15,   15,   15,   15,   20,   25,   48,   39,   42,   28,
+       27,   28,   28,   28,   28,   28,   28,  109,  115,   25,
+       29,   25,   27,   27,   27,   29,   48,   35,   40,    7,
+        8,    9,   10,   40,   42,   29,   30,   47,   30,   30,
+       30,   30,   30,   30,   35,   57,   35,   35,   44,  126,
+       44,  126,  109,  115,   57,   30,   64,   56,   47,   30,
+       47,   45,   45,   45,   49,   30,   30,   45,   45,   49,
+       45,   30,   40,   45,   45,   40,   49,   30,   45,   56,
+       62,   45,   49,   30,   73,  885,  127,   53,  127,   51,
+       61,   30,   62,   55,   30,   31,  108,   31,   31,   31,
+
+       31,   31,   31,   50,   51,   53,   51,   64,   61,   54,
+       73,   55,   50,   87,   31,   51,   50,   55,   31,   54,
+      108,   50,   52,  114,   31,   50,   54,   52,  175,  129,
+       31,  129,  107,  154,  151,   52,   31,   52,  107,   87,
+       52,   60,   31,  132,   52,  132,   60,  114,  175,  154,
+       31,   38,  151,  385,  111,   38,   38,   58,   38,   60,
+       38,   38,  113,   38,  107,   38,   59,  130,  113,   58,
+       58,  116,  111,  164,   38,   38,   38,  385,   59,   58,
+      111,  130,   58,  130,  142,   60,   59,  131,   60,  116,
+      164,   68,   68,   59,  113,   38,   68,  116,   38,  131,
+
+      110,  131,   60,   67,   67,   67,   67,   67,   67,  877,
+      142,   67,   68,   68,   68,   68,   68,   68,   80,   80,
+       80,   80,   80,   80,  153,   38,   38,   77,   77,  134,
+      110,  134,   77,  153,   77,  110,  135,  135,  135,   77,
+       82,   82,   82,   82,   82,   82,  876,  243,   77,   77,
+       77,   77,   83,   83,   83,   83,   83,   83,  110,   77,
+      103,  103,  103,  103,  103,  103,  104,  104,  104,  104,
+      133,  133,  137,  133,  137,   77,  145,  139,   77,  139,
+      157,  145,  243,   77,   77,  152,  156,   77,   77,  155,
+      166,  150,  157,  103,  104,   77,  159,  168,   77,  104,
+
+       77,   77,   77,  152,   77,   85,  150,  155,  156,   85,
+       85,  166,  159,  150,   85,   85,  161,   85,  160,   85,
+      145,  162,  104,  167,  168,  161,  169,  163,   85,   85,
+       85,  105,  163,  105,  105,  105,  105,  105,  105,  873,
+      160,  171,  162,  162,  165,  163,  167,  169,  173,   85,
+      105,  106,   85,  106,  165,  172,  106,  106,  106,  106,
+      106,  106,  180,  171,  170,  173,  105,  176,  177,  170,
+      172,  181,  105,  174,  184,  187,  181,  182,  179,  180,
+       85,   99,   99,   99,   99,   99,   99,  170,  187,  106,
+      177,  174,  184,  179,  176,  183,  190,   99,   99,   99,
+
+      179,   99,   99,  189,  182,  186,  183,  191,  189,  218,
+      186,  218,  185,  188,   99,  190,  183,  183,  284,   99,
+       99,   99,  158,  185,   99,  186,   99,  158,  158,  158,
+      189,  158,  158,  188,  192,  158,  194,  158,  284,  219,
+      185,  219,  158,  158,  158,  193,  158,  192,  220,  194,
+      220,  191,  198,  198,  191,  192,  205,  198,  193,  872,
+      193,  197,  197,  197,  197,  197,  197,  200,  200,  197,
+      248,  221,  200,  198,  198,  198,  198,  198,  198,  202,
+      202,  223,  205,  223,  202,  221,  202,  221,  200,  200,
+      200,  200,  200,  200,  209,  209,  248,  338,  222,  209,
+
+      202,  202,  202,  202,  202,  202,  212,  212,  212,  212,
+      222,  309,  222,  224,  224,  225,  224,  225,  226,  226,
+      226,  228,  229,  228,  229,  234,  234,  235,  236,  235,
+      309,  279,  235,  235,  235,  235,  235,  235,  237,  212,
+      237,  338,  266,  237,  266,  267,  278,  267,  234,  279,
+      283,  236,  241,  241,  241,  283,  241,  241,  256,  278,
+      237,  281,  237,  282,  280,  235,  270,  237,  244,  244,
+      244,  244,  244,  244,  241,  241,  241,  281,  285,  241,
+      282,  241,  280,  285,  256,  244,  245,  245,  245,  245,
+      245,  245,  270,  288,  293,  286,  294,  300,  306,  293,
+
+      308,  244,  300,  306,  870,  294,  308,  244,  246,  246,
+      246,  246,  246,  246,  253,  286,  288,  255,  255,  255,
+      255,  255,  255,  287,  246,  247,  246,  247,  246,  246,
+      247,  247,  247,  247,  247,  247,  290,  253,  287,  253,
+      869,  246,  289,  253,  287,  287,  246,  292,  246,  253,
+      255,  246,  291,  246,  260,  260,  260,  260,  260,  260,
+      289,  253,  290,  292,  292,  253,  295,  291,  296,  253,
+      297,  299,  301,  302,  303,  304,  305,  307,  311,  295,
+      302,  301,  307,  310,  311,  312,  319,  260,  297,  299,
+      313,  314,  310,  304,  303,  296,  318,  305,  305,  313,
+
+      315,  312,  316,  317,  319,  315,  314,  316,  317,  320,
+      322,  323,  324,  326,  325,  318,  327,  328,  331,  329,
+      330,  322,  320,  332,  334,  317,  323,  325,  333,  330,
+      335,  324,  337,  339,  340,  326,  329,  328,  401,  327,
+      331,  337,  334,  335,  341,  343,  332,  340,  342,  401,
+      333,  339,  341,  342,  344,  344,  345,  460,  862,  344,
+      343,  344,  345,  352,  352,  352,  352,  353,  353,  353,
+      353,  362,  363,  362,  363,  370,  370,  370,  370,  370,
+      370,  372,  460,  372,  380,  381,  372,  372,  372,  372,
+      372,  372,  861,  402,  380,  381,  352,  371,  371,  371,
+
+      371,  371,  371,  374,  374,  374,  374,  374,  374,  402,
+      380,  381,  403,  371,  404,  371,  860,  371,  371,  375,
+      375,  375,  375,  375,  375,  383,  382,  403,  406,  405,
+      371,  383,  407,  404,  408,  371,  374,  371,  405,  406,
+      371,  407,  371,  376,  376,  376,  376,  376,  376,  382,
+      412,  382,  375,  387,  411,  382,  408,  383,  384,  386,
+      384,  382,  410,  384,  384,  384,  384,  384,  384,  409,
+      411,  387,  412,  382,  413,  410,  376,  382,  409,  387,
+      415,  382,  386,  414,  386,  416,  417,  413,  386,  418,
+      421,  417,  419,  422,  386,  420,  384,  427,  419,  414,
+
+      414,  421,  415,  416,  418,  423,  386,  425,  429,  427,
+      386,  418,  422,  430,  386,  431,  420,  432,  433,  434,
+      423,  425,  435,  437,  433,  439,  440,  441,  431,  429,
+      442,  435,  443,  444,  434,  430,  449,  445,  437,  447,
+      432,  450,  441,  451,  454,  439,  445,  443,  440,  452,
+      450,  453,  442,  444,  455,  456,  447,  457,  458,  449,
+      459,  461,  463,  455,  451,  458,  454,  459,  462,  452,
+      457,  453,  466,  456,  464,  467,  462,  525,  859,  463,
+      525,  468,  491,  461,  467,  464,  462,  468,  477,  477,
+      477,  477,  491,  515,  466,  488,  488,  488,  488,  488,
+
+      488,  490,  490,  490,  490,  490,  490,  519,  491,  521,
+      515,  488,  492,  488,  492,  488,  488,  492,  492,  492,
+      492,  492,  492,  494,  516,  495,  493,  519,  488,  855,
+      851,  521,  518,  488,  490,  488,  493,  516,  488,  529,
+      488,  497,  497,  497,  497,  497,  497,  518,  520,  494,
+      492,  495,  493,  498,  498,  498,  498,  498,  498,  523,
+      529,  520,  526,  848,  523,  847,  528,  846,  522,  498,
+      499,  498,  499,  498,  498,  499,  499,  499,  499,  499,
+      499,  522,  526,  524,  527,  528,  498,  531,  530,  532,
+      533,  498,  531,  498,  524,  534,  498,  530,  498,  527,
+
+      532,  535,  537,  533,  536,  538,  539,  541,  542,  547,
+      535,  539,  544,  541,  538,  545,  546,  542,  547,  537,
+      550,  551,  845,  549,  534,  552,  536,  554,  560,  544,
+      545,  546,  549,  551,  555,  557,  558,  550,  561,  555,
+      552,  562,  554,  565,  557,  558,  564,  567,  566,  568,
+      560,  561,  575,  565,  564,  566,  569,  571,  562,  574,
+      572,  568,  569,  620,  619,  575,  571,  601,  601,  567,
+      572,  619,  620,  844,  843,  622,  574,  594,  594,  594,
+      594,  594,  594,  595,  595,  595,  595,  595,  595,  597,
+      601,  597,  622,  621,  597,  597,  597,  597,  597,  597,
+
+      600,  600,  600,  600,  600,  600,  621,  602,  626,  842,
+      594,  596,  596,  596,  596,  596,  596,  603,  618,  603,
+      623,  624,  603,  618,  628,  626,  625,  596,  624,  596,
+      602,  596,  596,  600,  625,  627,  618,  628,  627,  603,
+      629,  603,  630,  623,  596,  631,  603,  632,  633,  596,
+      634,  596,  635,  634,  596,  636,  596,  630,  637,  638,
+      640,  644,  629,  639,  632,  641,  642,  631,  645,  635,
+      633,  646,  639,  637,  650,  642,  651,  656,  640,  638,
+      646,  653,  657,  636,  644,  665,  656,  641,  664,  657,
+      645,  667,  668,  841,  650,  665,  700,  664,  653,  699,
+
+      667,  702,  705,  651,  714,  837,  700,  668,  686,  686,
+      686,  686,  686,  686,  690,  690,  690,  690,  690,  690,
+      699,  708,  705,  703,  686,  714,  686,  702,  686,  686,
+      703,  704,  706,  715,  707,  706,  704,  707,  710,  708,
+      712,  686,  711,  717,  710,  718,  686,  690,  686,  712,
+      720,  686,  717,  686,  713,  711,  716,  713,  719,  716,
+      721,  719,  715,  720,  722,  723,  724,  725,  721,  728,
+      731,  718,  732,  735,  722,  733,  725,  736,  723,  756,
+      757,  735,  836,  754,  756,  759,  736,  724,  755,  760,
+      731,  761,  728,  764,  732,  757,  733,  743,  743,  743,
+
+      743,  743,  743,  754,  758,  755,  760,  762,  759,  763,
+      762,  769,  766,  768,  758,  766,  768,  761,  769,  772,
+      770,  764,  763,  770,  771,  773,  778,  771,  793,  795,
+      743,  798,  797,  796,  772,  797,  799,  800,  802,  799,
+      800,  803,  804,  806,  807,  804,  810,  807,  773,  778,
+      795,  796,  809,  798,  808,  793,  802,  808,  811,  826,
+      830,  809,  810,  827,  829,  806,  828,  803,  831,  828,
+      827,  831,  832,  829,  811,  834,  835,  839,  830,  835,
+      826,  840,  838,  849,  830,  838,  839,  853,  850,  832,
+      840,  852,  849,  850,  852,  854,  856,  853,  857,  856,
+
+      854,  857,  858,  863,  864,  858,  865,  866,  867,  865,
+      868,  867,  871,  868,  874,  875,  878,  866,  879,  864,
+      880,  882,  881,  863,  883,  878,  884,  833,  825,  824,
+      875,  879,  823,  822,  871,  874,  884,  821,  820,  882,
+      819,  818,  880,  881,  817,  816,  883,  888,  888,  888,
       888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-
-      888,  888
+      889,  889,  889,  889,  889,  889,  889,  889,  889,  889,
+      889,  889,  889,  890,  890,  890,  890,  890,  890,  890,
+      890,  890,  890,  890,  890,  890,  891,  815,  814,  891,
+      813,  891,  891,  891,  891,  891,  892,  812,  805,  801,
+
+      892,  892,  892,  892,  892,  892,  893,  893,  893,  893,
+      893,  893,  893,  893,  893,  893,  893,  893,  893,  894,
+      794,  792,  894,  791,  894,  894,  894,  894,  894,  895,
+      790,  895,  895,  789,  895,  895,  895,  895,  895,  895,
+      788,  895,  896,  787,  786,  896,  896,  896,  896,  896,
+      896,  896,  896,  785,  896,  897,  897,  897,  897,  897,
+      897,  897,  897,  897,  897,  897,  897,  897,  898,  898,
+      784,  898,  783,  782,  781,  898,  899,  780,  779,  899,
+      777,  899,  899,  899,  899,  899,  900,  776,  900,  775,
+      774,  767,  900,  901,  765,  901,  753,  752,  751,  901,
+
+      902,  750,  902,  749,  748,  747,  902,  903,  746,  903,
+      745,  742,  741,  903,  904,  740,  904,  734,  730,  729,
+      904,  905,  727,  905,  726,  709,  701,  905,  906,  698,
+      906,  693,  691,  687,  906,  907,  677,  907,  673,  671,
+      669,  907,  908,  666,  908,  663,  662,  661,  908,  909,
+      909,  909,  909,  909,  909,  909,  909,  909,  909,  909,
+      909,  909,  910,  660,  910,  911,  911,  659,  911,  911,
+      911,  658,  911,  912,  912,  655,  912,  913,  654,  913,
+      652,  649,  648,  913,  914,  647,  914,  643,  616,  612,
+      914,  915,  610,  915,  608,  606,  604,  915,  916,  598,
+
+      916,  917,  592,  917,  590,  588,  586,  917,  918,  584,
+      918,  919,  582,  580,  919,  578,  919,  919,  919,  919,
+      919,  920,  920,  920,  920,  920,  920,  920,  920,  920,
+      920,  920,  920,  920,  921,  921,  921,  921,  921,  921,
+      921,  921,  921,  921,  921,  921,  921,  922,  577,  922,
+      576,  573,  570,  922,  923,  563,  923,  559,  556,  553,
+      923,  924,  548,  924,  543,  540,  517,  924,  925,  513,
+      925,  926,  511,  926,  509,  507,  505,  926,  927,  503,
+      927,  928,  502,  928,  501,  500,  489,  928,  929,  486,
+      929,  930,  484,  930,  483,  482,  480,  930,  931,  478,
+
+      931,  932,  475,  932,  473,  471,  469,  932,  933,  465,
+      933,  934,  448,  934,  446,  438,  436,  934,  935,  428,
+      935,  936,  426,  936,  424,  398,  396,  936,  937,  394,
+      937,  938,  392,  938,  391,  938,  390,  938,  939,  377,
+      939,  367,  939,  365,  939,  940,  940,  364,  940,  940,
+      940,  360,  940,  941,  358,  941,  356,  354,  350,  941,
+      942,  348,  942,  347,  346,  336,  942,  943,  321,  943,
+      298,  277,  275,  943,  944,  273,  944,  945,  272,  945,
+      271,  269,  268,  945,  946,  263,  946,  947,  259,  947,
+      258,  254,  251,  947,  948,  250,  948,  949,  239,  949,
+
+      238,  231,  230,  949,  950,  227,  950,  951,  217,  215,
+      951,  214,  951,  951,  951,  951,  951,  952,  952,  952,
+      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
+      953,  213,  953,  207,  206,  204,  953,  954,  199,  954,
+      955,  178,  955,  149,  147,  146,  955,  956,  140,  956,
+      957,  138,  957,  136,  128,  125,  957,  958,  124,  958,
+      959,  120,  959,  101,   98,   95,  959,  960,   93,  960,
+      961,   86,  961,   72,   70,   66,  961,  962,   36,  962,
+      963,   33,  963,   18,   11,    4,  963,  964,    3,  964,
+      965,    0,  965,    0,    0,    0,  965,  966,    0,  966,
+
+        0,    0,    0,  966,  967,    0,  967,  968,    0,  968,
+        0,    0,    0,  968,  969,    0,  969,  970,    0,  970,
+        0,  970,    0,  970,  971,    0,  971,    0,    0,    0,
+      971,  972,    0,  972,    0,    0,    0,  972,  973,    0,
+      973,  974,    0,  974,    0,    0,    0,  974,  975,    0,
+      975,  976,    0,  976,    0,    0,    0,  976,  977,    0,
+      977,  978,    0,  978,    0,    0,    0,  978,  979,    0,
+      979,  980,    0,  980,    0,    0,    0,  980,  981,    0,
+      981,  982,    0,  982,    0,    0,    0,  982,  983,    0,
+      983,  984,    0,    0,  984,    0,  984,  984,  984,  984,
+
+      984,  985,  985,  985,  985,  985,  985,  985,  985,  985,
+      985,  985,  985,  985,  986,    0,  986,    0,    0,    0,
+      986,  987,    0,  987,  988,    0,  988,    0,    0,    0,
+      988,  989,    0,  989,  990,    0,  990,    0,    0,    0,
+      990,  991,    0,  991,  992,    0,  992,    0,    0,    0,
+      992,  993,    0,  993,  994,    0,  994,    0,    0,    0,
+      994,  995,    0,  995,  996,    0,  996,    0,    0,    0,
+      996,  997,    0,  997,  998,    0,  998,    0,    0,    0,
+      998,  999,    0,  999, 1000,    0, 1000,    0,    0,    0,
+     1000, 1001,    0, 1001, 1002,    0, 1002,    0,    0,    0,
+
+     1002, 1003,    0, 1003,    0,    0,    0, 1003, 1004,    0,
+     1004, 1005,    0, 1005,    0,    0,    0, 1005, 1006,    0,
+     1006, 1007,    0, 1007,    0,    0,    0, 1007, 1008,    0,
+     1008, 1009,    0, 1009,    0,    0,    0, 1009, 1010,    0,
+     1010, 1011,    0, 1011, 1012,    0, 1012, 1013,    0,    0,
+     1013,    0, 1013, 1013, 1013, 1013, 1013, 1014,    0, 1014,
+     1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+     1015, 1015, 1015, 1016,    0, 1016,    0,    0,    0, 1016,
+     1017,    0, 1017, 1018,    0, 1018,    0,    0,    0, 1018,
+     1019,    0, 1019, 1020,    0, 1020, 1021,    0, 1021, 1022,
+
+        0,    0, 1022,    0, 1022, 1022, 1022, 1022, 1022, 1023,
+        0, 1023, 1024,    0, 1024, 1025,    0, 1025, 1026,    0,
+     1026, 1027,    0, 1027, 1028,    0, 1028, 1029,    0, 1029,
+     1030,    0, 1030,    0,    0,    0, 1030, 1031,    0, 1031,
+     1032,    0, 1032,    0,    0,    0, 1032, 1033,    0, 1033,
+     1034,    0, 1034, 1035,    0, 1035, 1036,    0, 1036, 1037,
+        0, 1037,    0,    0,    0, 1037, 1038,    0,    0, 1038,
+        0, 1038, 1038, 1038, 1038, 1038, 1039,    0, 1039, 1040,
+        0, 1040, 1041,    0, 1041, 1042,    0, 1042,    0,    0,
+        0, 1042, 1043,    0, 1043,    0,    0,    0, 1043, 1044,
+
+        0, 1044,    0,    0,    0, 1044, 1045,    0, 1045, 1046,
+        0, 1046,    0,    0,    0, 1046, 1047,    0, 1047,    0,
+        0,    0, 1047, 1048,    0, 1048,    0,    0,    0, 1048,
+     1049,    0, 1049,    0,    0,    0, 1049, 1050,    0, 1050,
+        0,    0,    0, 1050, 1051,    0, 1051,    0,    0,    0,
+     1051, 1052,    0, 1052,    0,    0,    0, 1052, 1053,    0,
+     1053,    0,    0,    0, 1053, 1054,    0, 1054,    0,    0,
+        0, 1054, 1055,    0, 1055,    0,    0,    0, 1055, 1056,
+        0, 1056,    0,    0,    0, 1056, 1057,    0, 1057,    0,
+        0,    0, 1057, 1058,    0, 1058,    0,    0,    0, 1058,
+
+     1059,    0, 1059,    0,    0,    0, 1059, 1060,    0, 1060,
+        0,    0,    0, 1060, 1061,    0, 1061,    0,    0,    0,
+     1061,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[182] =
+static yyconst flex_int32_t yy_rule_can_match_eol[181] =
     {   0,
 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1439,5 +1439,5 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0, 0,     };
+    0,     };
 
 static yy_state_type yy_last_accepting_state;
@@ -1467,6 +1467,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Mon Jun  6 18:08:27 2016
- * Update Count     : 451
+ * Last Modified On : Wed Jun 22 21:20:18 2016
+ * Update Count     : 456
  */
 #line 20 "lex.ll"
@@ -1502,13 +1502,12 @@
 
 void rm_underscore() {
-	// remove underscores in numeric constant
-	int j = 0;
+	// Remove underscores in numeric constant by copying the non-underscore characters to the front of the string.
+	yyleng = 0;
 	for ( int i = 0; yytext[i] != '\0'; i += 1 ) {
 		if ( yytext[i] != '_' ) {
-			yytext[j] = yytext[i];
-			j += 1;
+			yytext[yyleng] = yytext[i];
+			yyleng += 1;
 		} // if
 	} // for
-	yyleng = j;
 	yytext[yyleng] = '\0';
 }
@@ -1523,10 +1522,12 @@
 // ' stop highlighting
 // display/white-space characters
-// operators
-
-
-
-
-#line 1531 "Parser/lex.cc"
+// overloadable operators
+// op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
+// operator {op_unary_pre_post}|{op_binary_over}|{op_binary_not_over}
+
+
+
+
+#line 1532 "Parser/lex.cc"
 
 #define INITIAL 0
@@ -1720,8 +1721,8 @@
 	register int yy_act;
     
-#line 139 "lex.ll"
+#line 138 "lex.ll"
 
 				   /* line directives */
-#line 1726 "Parser/lex.cc"
+#line 1727 "Parser/lex.cc"
 
 	if ( !(yy_init) )
@@ -1777,5 +1778,5 @@
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 889 )
+				if ( yy_current_state >= 888 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
@@ -1783,5 +1784,5 @@
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 2817 );
+		while ( yy_base[yy_current_state] != 2822 );
 
 yy_find_action:
@@ -1820,5 +1821,5 @@
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 141 "lex.ll"
+#line 140 "lex.ll"
 {
 	/* " stop highlighting */
@@ -1847,5 +1848,5 @@
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 164 "lex.ll"
+#line 163 "lex.ll"
 ;
 	YY_BREAK
@@ -1853,5 +1854,5 @@
 case 3:
 YY_RULE_SETUP
-#line 167 "lex.ll"
+#line 166 "lex.ll"
 { BEGIN COMMENT; }
 	YY_BREAK
@@ -1859,10 +1860,10 @@
 /* rule 4 can match eol */
 YY_RULE_SETUP
+#line 167 "lex.ll"
+;
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
 #line 168 "lex.ll"
-;
-	YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 169 "lex.ll"
 { BEGIN 0; }
 	YY_BREAK
@@ -1871,5 +1872,5 @@
 /* rule 6 can match eol */
 YY_RULE_SETUP
-#line 172 "lex.ll"
+#line 171 "lex.ll"
 ;
 	YY_BREAK
@@ -1877,16 +1878,16 @@
 case 7:
 YY_RULE_SETUP
+#line 174 "lex.ll"
+{ WHITE_RETURN(' '); }
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
 #line 175 "lex.ll"
 { WHITE_RETURN(' '); }
 	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 176 "lex.ll"
-{ WHITE_RETURN(' '); }
-	YY_BREAK
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 177 "lex.ll"
+#line 176 "lex.ll"
 { NEWLINE_RETURN(); }
 	YY_BREAK
@@ -1894,460 +1895,460 @@
 case 10:
 YY_RULE_SETUP
+#line 179 "lex.ll"
+{ KEYWORD_RETURN(ALIGNAS); }			// C11
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
 #line 180 "lex.ll"
-{ KEYWORD_RETURN(ALIGNAS); }			// C11
-	YY_BREAK
-case 11:
+{ KEYWORD_RETURN(ALIGNOF); }			// C11
+	YY_BREAK
+case 12:
 YY_RULE_SETUP
 #line 181 "lex.ll"
-{ KEYWORD_RETURN(ALIGNOF); }			// C11
-	YY_BREAK
-case 12:
+{ KEYWORD_RETURN(ALIGNOF); }			// GCC
+	YY_BREAK
+case 13:
 YY_RULE_SETUP
 #line 182 "lex.ll"
 { KEYWORD_RETURN(ALIGNOF); }			// GCC
 	YY_BREAK
-case 13:
+case 14:
 YY_RULE_SETUP
 #line 183 "lex.ll"
-{ KEYWORD_RETURN(ALIGNOF); }			// GCC
-	YY_BREAK
-case 14:
+{ KEYWORD_RETURN(ASM); }
+	YY_BREAK
+case 15:
 YY_RULE_SETUP
 #line 184 "lex.ll"
-{ KEYWORD_RETURN(ASM); }
-	YY_BREAK
-case 15:
+{ KEYWORD_RETURN(ASM); }				// GCC
+	YY_BREAK
+case 16:
 YY_RULE_SETUP
 #line 185 "lex.ll"
 { KEYWORD_RETURN(ASM); }				// GCC
 	YY_BREAK
-case 16:
+case 17:
 YY_RULE_SETUP
 #line 186 "lex.ll"
-{ KEYWORD_RETURN(ASM); }				// GCC
-	YY_BREAK
-case 17:
+{ KEYWORD_RETURN(AT); }					// CFA
+	YY_BREAK
+case 18:
 YY_RULE_SETUP
 #line 187 "lex.ll"
-{ KEYWORD_RETURN(AT); }					// CFA
-	YY_BREAK
-case 18:
+{ KEYWORD_RETURN(ATOMIC); }				// C11
+	YY_BREAK
+case 19:
 YY_RULE_SETUP
 #line 188 "lex.ll"
-{ KEYWORD_RETURN(ATOMIC); }				// C11
-	YY_BREAK
-case 19:
+{ KEYWORD_RETURN(ATTRIBUTE); }			// GCC
+	YY_BREAK
+case 20:
 YY_RULE_SETUP
 #line 189 "lex.ll"
 { KEYWORD_RETURN(ATTRIBUTE); }			// GCC
 	YY_BREAK
-case 20:
+case 21:
 YY_RULE_SETUP
 #line 190 "lex.ll"
-{ KEYWORD_RETURN(ATTRIBUTE); }			// GCC
-	YY_BREAK
-case 21:
+{ KEYWORD_RETURN(AUTO); }
+	YY_BREAK
+case 22:
 YY_RULE_SETUP
 #line 191 "lex.ll"
-{ KEYWORD_RETURN(AUTO); }
-	YY_BREAK
-case 22:
+{ KEYWORD_RETURN(BOOL); }				// C99
+	YY_BREAK
+case 23:
 YY_RULE_SETUP
 #line 192 "lex.ll"
-{ KEYWORD_RETURN(BOOL); }				// C99
-	YY_BREAK
-case 23:
+{ KEYWORD_RETURN(BREAK); }
+	YY_BREAK
+case 24:
 YY_RULE_SETUP
 #line 193 "lex.ll"
-{ KEYWORD_RETURN(BREAK); }
-	YY_BREAK
-case 24:
+{ KEYWORD_RETURN(CASE); }
+	YY_BREAK
+case 25:
 YY_RULE_SETUP
 #line 194 "lex.ll"
-{ KEYWORD_RETURN(CASE); }
-	YY_BREAK
-case 25:
+{ KEYWORD_RETURN(CATCH); }				// CFA
+	YY_BREAK
+case 26:
 YY_RULE_SETUP
 #line 195 "lex.ll"
-{ KEYWORD_RETURN(CATCH); }				// CFA
-	YY_BREAK
-case 26:
+{ KEYWORD_RETURN(CATCHRESUME); }		// CFA
+	YY_BREAK
+case 27:
 YY_RULE_SETUP
 #line 196 "lex.ll"
-{ KEYWORD_RETURN(CATCHRESUME); }		// CFA
-	YY_BREAK
-case 27:
+{ KEYWORD_RETURN(CHAR); }
+	YY_BREAK
+case 28:
 YY_RULE_SETUP
 #line 197 "lex.ll"
-{ KEYWORD_RETURN(CHAR); }
-	YY_BREAK
-case 28:
+{ KEYWORD_RETURN(CHOOSE); }				// CFA
+	YY_BREAK
+case 29:
 YY_RULE_SETUP
 #line 198 "lex.ll"
-{ KEYWORD_RETURN(CHOOSE); }				// CFA
-	YY_BREAK
-case 29:
+{ KEYWORD_RETURN(COMPLEX); }			// C99
+	YY_BREAK
+case 30:
 YY_RULE_SETUP
 #line 199 "lex.ll"
-{ KEYWORD_RETURN(COMPLEX); }			// C99
-	YY_BREAK
-case 30:
+{ KEYWORD_RETURN(COMPLEX); }			// GCC
+	YY_BREAK
+case 31:
 YY_RULE_SETUP
 #line 200 "lex.ll"
 { KEYWORD_RETURN(COMPLEX); }			// GCC
 	YY_BREAK
-case 31:
+case 32:
 YY_RULE_SETUP
 #line 201 "lex.ll"
-{ KEYWORD_RETURN(COMPLEX); }			// GCC
-	YY_BREAK
-case 32:
+{ KEYWORD_RETURN(CONST); }
+	YY_BREAK
+case 33:
 YY_RULE_SETUP
 #line 202 "lex.ll"
-{ KEYWORD_RETURN(CONST); }
-	YY_BREAK
-case 33:
+{ KEYWORD_RETURN(CONST); }				// GCC
+	YY_BREAK
+case 34:
 YY_RULE_SETUP
 #line 203 "lex.ll"
 { KEYWORD_RETURN(CONST); }				// GCC
 	YY_BREAK
-case 34:
+case 35:
 YY_RULE_SETUP
 #line 204 "lex.ll"
-{ KEYWORD_RETURN(CONST); }				// GCC
-	YY_BREAK
-case 35:
+{ KEYWORD_RETURN(CONTINUE); }
+	YY_BREAK
+case 36:
 YY_RULE_SETUP
 #line 205 "lex.ll"
-{ KEYWORD_RETURN(CONTINUE); }
-	YY_BREAK
-case 36:
+{ KEYWORD_RETURN(DEFAULT); }
+	YY_BREAK
+case 37:
 YY_RULE_SETUP
 #line 206 "lex.ll"
-{ KEYWORD_RETURN(DEFAULT); }
-	YY_BREAK
-case 37:
+{ KEYWORD_RETURN(DISABLE); }			// CFA
+	YY_BREAK
+case 38:
 YY_RULE_SETUP
 #line 207 "lex.ll"
-{ KEYWORD_RETURN(DISABLE); }			// CFA
-	YY_BREAK
-case 38:
+{ KEYWORD_RETURN(DO); }
+	YY_BREAK
+case 39:
 YY_RULE_SETUP
 #line 208 "lex.ll"
-{ KEYWORD_RETURN(DO); }
-	YY_BREAK
-case 39:
+{ KEYWORD_RETURN(DOUBLE); }
+	YY_BREAK
+case 40:
 YY_RULE_SETUP
 #line 209 "lex.ll"
-{ KEYWORD_RETURN(DOUBLE); }
-	YY_BREAK
-case 40:
+{ KEYWORD_RETURN(DTYPE); }				// CFA
+	YY_BREAK
+case 41:
 YY_RULE_SETUP
 #line 210 "lex.ll"
-{ KEYWORD_RETURN(DTYPE); }				// CFA
-	YY_BREAK
-case 41:
+{ KEYWORD_RETURN(ELSE); }
+	YY_BREAK
+case 42:
 YY_RULE_SETUP
 #line 211 "lex.ll"
-{ KEYWORD_RETURN(ELSE); }
-	YY_BREAK
-case 42:
+{ KEYWORD_RETURN(ENABLE); }				// CFA
+	YY_BREAK
+case 43:
 YY_RULE_SETUP
 #line 212 "lex.ll"
-{ KEYWORD_RETURN(ENABLE); }				// CFA
-	YY_BREAK
-case 43:
+{ KEYWORD_RETURN(ENUM); }
+	YY_BREAK
+case 44:
 YY_RULE_SETUP
 #line 213 "lex.ll"
-{ KEYWORD_RETURN(ENUM); }
-	YY_BREAK
-case 44:
+{ KEYWORD_RETURN(EXTENSION); }			// GCC
+	YY_BREAK
+case 45:
 YY_RULE_SETUP
 #line 214 "lex.ll"
-{ KEYWORD_RETURN(EXTENSION); }			// GCC
-	YY_BREAK
-case 45:
+{ KEYWORD_RETURN(EXTERN); }
+	YY_BREAK
+case 46:
 YY_RULE_SETUP
 #line 215 "lex.ll"
-{ KEYWORD_RETURN(EXTERN); }
-	YY_BREAK
-case 46:
+{ KEYWORD_RETURN(FALLTHRU); }			// CFA
+	YY_BREAK
+case 47:
 YY_RULE_SETUP
 #line 216 "lex.ll"
-{ KEYWORD_RETURN(FALLTHRU); }			// CFA
-	YY_BREAK
-case 47:
+{ KEYWORD_RETURN(FINALLY); }			// CFA
+	YY_BREAK
+case 48:
 YY_RULE_SETUP
 #line 217 "lex.ll"
-{ KEYWORD_RETURN(FINALLY); }			// CFA
-	YY_BREAK
-case 48:
+{ KEYWORD_RETURN(FLOAT); }
+	YY_BREAK
+case 49:
 YY_RULE_SETUP
 #line 218 "lex.ll"
-{ KEYWORD_RETURN(FLOAT); }
-	YY_BREAK
-case 49:
+{ KEYWORD_RETURN(FLOAT); }				// GCC
+	YY_BREAK
+case 50:
 YY_RULE_SETUP
 #line 219 "lex.ll"
-{ KEYWORD_RETURN(FLOAT); }				// GCC
-	YY_BREAK
-case 50:
+{ KEYWORD_RETURN(FOR); }
+	YY_BREAK
+case 51:
 YY_RULE_SETUP
 #line 220 "lex.ll"
-{ KEYWORD_RETURN(FOR); }
-	YY_BREAK
-case 51:
+{ KEYWORD_RETURN(FORALL); }				// CFA
+	YY_BREAK
+case 52:
 YY_RULE_SETUP
 #line 221 "lex.ll"
-{ KEYWORD_RETURN(FORALL); }				// CFA
-	YY_BREAK
-case 52:
+{ KEYWORD_RETURN(FORTRAN); }
+	YY_BREAK
+case 53:
 YY_RULE_SETUP
 #line 222 "lex.ll"
-{ KEYWORD_RETURN(FORTRAN); }
-	YY_BREAK
-case 53:
+{ KEYWORD_RETURN(FTYPE); }				// CFA
+	YY_BREAK
+case 54:
 YY_RULE_SETUP
 #line 223 "lex.ll"
-{ KEYWORD_RETURN(FTYPE); }				// CFA
-	YY_BREAK
-case 54:
+{ KEYWORD_RETURN(GENERIC); }			// C11
+	YY_BREAK
+case 55:
 YY_RULE_SETUP
 #line 224 "lex.ll"
-{ KEYWORD_RETURN(GENERIC); }			// C11
-	YY_BREAK
-case 55:
+{ KEYWORD_RETURN(GOTO); }
+	YY_BREAK
+case 56:
 YY_RULE_SETUP
 #line 225 "lex.ll"
-{ KEYWORD_RETURN(GOTO); }
-	YY_BREAK
-case 56:
+{ KEYWORD_RETURN(IF); }
+	YY_BREAK
+case 57:
 YY_RULE_SETUP
 #line 226 "lex.ll"
-{ KEYWORD_RETURN(IF); }
-	YY_BREAK
-case 57:
+{ KEYWORD_RETURN(IMAGINARY); }			// C99
+	YY_BREAK
+case 58:
 YY_RULE_SETUP
 #line 227 "lex.ll"
-{ KEYWORD_RETURN(IMAGINARY); }			// C99
-	YY_BREAK
-case 58:
+{ KEYWORD_RETURN(IMAGINARY); }			// GCC
+	YY_BREAK
+case 59:
 YY_RULE_SETUP
 #line 228 "lex.ll"
 { KEYWORD_RETURN(IMAGINARY); }			// GCC
 	YY_BREAK
-case 59:
+case 60:
 YY_RULE_SETUP
 #line 229 "lex.ll"
-{ KEYWORD_RETURN(IMAGINARY); }			// GCC
-	YY_BREAK
-case 60:
+{ KEYWORD_RETURN(INLINE); }				// C99
+	YY_BREAK
+case 61:
 YY_RULE_SETUP
 #line 230 "lex.ll"
-{ KEYWORD_RETURN(INLINE); }				// C99
-	YY_BREAK
-case 61:
+{ KEYWORD_RETURN(INLINE); }				// GCC
+	YY_BREAK
+case 62:
 YY_RULE_SETUP
 #line 231 "lex.ll"
 { KEYWORD_RETURN(INLINE); }				// GCC
 	YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
 #line 232 "lex.ll"
-{ KEYWORD_RETURN(INLINE); }				// GCC
-	YY_BREAK
-case 63:
+{ KEYWORD_RETURN(INT); }
+	YY_BREAK
+case 64:
 YY_RULE_SETUP
 #line 233 "lex.ll"
-{ KEYWORD_RETURN(INT); }
-	YY_BREAK
-case 64:
+{ KEYWORD_RETURN(INT); }				// GCC
+	YY_BREAK
+case 65:
 YY_RULE_SETUP
 #line 234 "lex.ll"
-{ KEYWORD_RETURN(INT); }				// GCC
-	YY_BREAK
-case 65:
+{ KEYWORD_RETURN(LABEL); }				// GCC
+	YY_BREAK
+case 66:
 YY_RULE_SETUP
 #line 235 "lex.ll"
-{ KEYWORD_RETURN(LABEL); }				// GCC
-	YY_BREAK
-case 66:
+{ KEYWORD_RETURN(LONG); }
+	YY_BREAK
+case 67:
 YY_RULE_SETUP
 #line 236 "lex.ll"
-{ KEYWORD_RETURN(LONG); }
-	YY_BREAK
-case 67:
+{ KEYWORD_RETURN(LVALUE); }				// CFA
+	YY_BREAK
+case 68:
 YY_RULE_SETUP
 #line 237 "lex.ll"
-{ KEYWORD_RETURN(LVALUE); }				// CFA
-	YY_BREAK
-case 68:
+{ KEYWORD_RETURN(NORETURN); }			// C11
+	YY_BREAK
+case 69:
 YY_RULE_SETUP
 #line 238 "lex.ll"
-{ KEYWORD_RETURN(NORETURN); }			// C11
-	YY_BREAK
-case 69:
+{ KEYWORD_RETURN(OFFSETOF); }		// GCC
+	YY_BREAK
+case 70:
 YY_RULE_SETUP
 #line 239 "lex.ll"
-{ KEYWORD_RETURN(OFFSETOF); }		// GCC
-	YY_BREAK
-case 70:
+{ KEYWORD_RETURN(OTYPE); }				// CFA
+	YY_BREAK
+case 71:
 YY_RULE_SETUP
 #line 240 "lex.ll"
-{ KEYWORD_RETURN(OTYPE); }				// CFA
-	YY_BREAK
-case 71:
+{ KEYWORD_RETURN(REGISTER); }
+	YY_BREAK
+case 72:
 YY_RULE_SETUP
 #line 241 "lex.ll"
-{ KEYWORD_RETURN(REGISTER); }
-	YY_BREAK
-case 72:
+{ KEYWORD_RETURN(RESTRICT); }			// C99
+	YY_BREAK
+case 73:
 YY_RULE_SETUP
 #line 242 "lex.ll"
-{ KEYWORD_RETURN(RESTRICT); }			// C99
-	YY_BREAK
-case 73:
+{ KEYWORD_RETURN(RESTRICT); }			// GCC
+	YY_BREAK
+case 74:
 YY_RULE_SETUP
 #line 243 "lex.ll"
 { KEYWORD_RETURN(RESTRICT); }			// GCC
 	YY_BREAK
-case 74:
+case 75:
 YY_RULE_SETUP
 #line 244 "lex.ll"
-{ KEYWORD_RETURN(RESTRICT); }			// GCC
-	YY_BREAK
-case 75:
+{ KEYWORD_RETURN(RETURN); }
+	YY_BREAK
+case 76:
 YY_RULE_SETUP
 #line 245 "lex.ll"
-{ KEYWORD_RETURN(RETURN); }
-	YY_BREAK
-case 76:
+{ KEYWORD_RETURN(SHORT); }
+	YY_BREAK
+case 77:
 YY_RULE_SETUP
 #line 246 "lex.ll"
-{ KEYWORD_RETURN(SHORT); }
-	YY_BREAK
-case 77:
+{ KEYWORD_RETURN(SIGNED); }
+	YY_BREAK
+case 78:
 YY_RULE_SETUP
 #line 247 "lex.ll"
-{ KEYWORD_RETURN(SIGNED); }
-	YY_BREAK
-case 78:
+{ KEYWORD_RETURN(SIGNED); }				// GCC
+	YY_BREAK
+case 79:
 YY_RULE_SETUP
 #line 248 "lex.ll"
 { KEYWORD_RETURN(SIGNED); }				// GCC
 	YY_BREAK
-case 79:
+case 80:
 YY_RULE_SETUP
 #line 249 "lex.ll"
-{ KEYWORD_RETURN(SIGNED); }				// GCC
-	YY_BREAK
-case 80:
+{ KEYWORD_RETURN(SIZEOF); }
+	YY_BREAK
+case 81:
 YY_RULE_SETUP
 #line 250 "lex.ll"
-{ KEYWORD_RETURN(SIZEOF); }
-	YY_BREAK
-case 81:
+{ KEYWORD_RETURN(STATIC); }
+	YY_BREAK
+case 82:
 YY_RULE_SETUP
 #line 251 "lex.ll"
-{ KEYWORD_RETURN(STATIC); }
-	YY_BREAK
-case 82:
+{ KEYWORD_RETURN(STATICASSERT); }		// C11
+	YY_BREAK
+case 83:
 YY_RULE_SETUP
 #line 252 "lex.ll"
-{ KEYWORD_RETURN(STATICASSERT); }		// C11
-	YY_BREAK
-case 83:
+{ KEYWORD_RETURN(STRUCT); }
+	YY_BREAK
+case 84:
 YY_RULE_SETUP
 #line 253 "lex.ll"
-{ KEYWORD_RETURN(STRUCT); }
-	YY_BREAK
-case 84:
+{ KEYWORD_RETURN(SWITCH); }
+	YY_BREAK
+case 85:
 YY_RULE_SETUP
 #line 254 "lex.ll"
-{ KEYWORD_RETURN(SWITCH); }
-	YY_BREAK
-case 85:
+{ KEYWORD_RETURN(THREADLOCAL); }		// C11
+	YY_BREAK
+case 86:
 YY_RULE_SETUP
 #line 255 "lex.ll"
-{ KEYWORD_RETURN(THREADLOCAL); }		// C11
-	YY_BREAK
-case 86:
+{ KEYWORD_RETURN(THROW); }				// CFA
+	YY_BREAK
+case 87:
 YY_RULE_SETUP
 #line 256 "lex.ll"
-{ KEYWORD_RETURN(THROW); }				// CFA
-	YY_BREAK
-case 87:
+{ KEYWORD_RETURN(THROWRESUME); }		// CFA
+	YY_BREAK
+case 88:
 YY_RULE_SETUP
 #line 257 "lex.ll"
-{ KEYWORD_RETURN(THROWRESUME); }		// CFA
-	YY_BREAK
-case 88:
+{ KEYWORD_RETURN(TRAIT); }				// CFA
+	YY_BREAK
+case 89:
 YY_RULE_SETUP
 #line 258 "lex.ll"
-{ KEYWORD_RETURN(TRAIT); }				// CFA
-	YY_BREAK
-case 89:
+{ KEYWORD_RETURN(TRY); }				// CFA
+	YY_BREAK
+case 90:
 YY_RULE_SETUP
 #line 259 "lex.ll"
-{ KEYWORD_RETURN(TRY); }				// CFA
-	YY_BREAK
-case 90:
+{ KEYWORD_RETURN(TYPEDEF); }
+	YY_BREAK
+case 91:
 YY_RULE_SETUP
 #line 260 "lex.ll"
-{ KEYWORD_RETURN(TYPEDEF); }
-	YY_BREAK
-case 91:
+{ KEYWORD_RETURN(TYPEOF); }				// GCC
+	YY_BREAK
+case 92:
 YY_RULE_SETUP
 #line 261 "lex.ll"
 { KEYWORD_RETURN(TYPEOF); }				// GCC
 	YY_BREAK
-case 92:
+case 93:
 YY_RULE_SETUP
 #line 262 "lex.ll"
 { KEYWORD_RETURN(TYPEOF); }				// GCC
 	YY_BREAK
-case 93:
+case 94:
 YY_RULE_SETUP
 #line 263 "lex.ll"
-{ KEYWORD_RETURN(TYPEOF); }				// GCC
-	YY_BREAK
-case 94:
+{ KEYWORD_RETURN(UNION); }
+	YY_BREAK
+case 95:
 YY_RULE_SETUP
 #line 264 "lex.ll"
-{ KEYWORD_RETURN(UNION); }
-	YY_BREAK
-case 95:
+{ KEYWORD_RETURN(UNSIGNED); }
+	YY_BREAK
+case 96:
 YY_RULE_SETUP
 #line 265 "lex.ll"
-{ KEYWORD_RETURN(UNSIGNED); }
-	YY_BREAK
-case 96:
+{ KEYWORD_RETURN(VALIST); }			// GCC
+	YY_BREAK
+case 97:
 YY_RULE_SETUP
 #line 266 "lex.ll"
-{ KEYWORD_RETURN(VALIST); }			// GCC
-	YY_BREAK
-case 97:
+{ KEYWORD_RETURN(VOID); }
+	YY_BREAK
+case 98:
 YY_RULE_SETUP
 #line 267 "lex.ll"
-{ KEYWORD_RETURN(VOID); }
-	YY_BREAK
-case 98:
+{ KEYWORD_RETURN(VOLATILE); }
+	YY_BREAK
+case 99:
 YY_RULE_SETUP
 #line 268 "lex.ll"
-{ KEYWORD_RETURN(VOLATILE); }
-	YY_BREAK
-case 99:
+{ KEYWORD_RETURN(VOLATILE); }			// GCC
+	YY_BREAK
+case 100:
 YY_RULE_SETUP
 #line 269 "lex.ll"
 { KEYWORD_RETURN(VOLATILE); }			// GCC
 	YY_BREAK
-case 100:
+case 101:
 YY_RULE_SETUP
 #line 270 "lex.ll"
-{ KEYWORD_RETURN(VOLATILE); }			// GCC
-	YY_BREAK
-case 101:
-YY_RULE_SETUP
-#line 271 "lex.ll"
 { KEYWORD_RETURN(WHILE); }
 	YY_BREAK
@@ -2355,25 +2356,25 @@
 case 102:
 YY_RULE_SETUP
+#line 273 "lex.ll"
+{ IDENTIFIER_RETURN(); }
+	YY_BREAK
+case 103:
+YY_RULE_SETUP
 #line 274 "lex.ll"
+{ ATTRIBUTE_RETURN(); }
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 275 "lex.ll"
+{ BEGIN BKQUOTE; }
+	YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 276 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
-case 103:
-YY_RULE_SETUP
-#line 275 "lex.ll"
-{ ATTRIBUTE_RETURN(); }
-	YY_BREAK
-case 104:
-YY_RULE_SETUP
-#line 276 "lex.ll"
-{ BEGIN BKQUOTE; }
-	YY_BREAK
-case 105:
+case 106:
 YY_RULE_SETUP
 #line 277 "lex.ll"
-{ IDENTIFIER_RETURN(); }
-	YY_BREAK
-case 106:
-YY_RULE_SETUP
-#line 278 "lex.ll"
 { BEGIN 0; }
 	YY_BREAK
@@ -2381,46 +2382,46 @@
 case 107:
 YY_RULE_SETUP
+#line 280 "lex.ll"
+{ NUMERIC_RETURN(ZERO); }				// CFA
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
 #line 281 "lex.ll"
-{ NUMERIC_RETURN(ZERO); }				// CFA
-	YY_BREAK
-case 108:
+{ NUMERIC_RETURN(ONE); }				// CFA
+	YY_BREAK
+case 109:
 YY_RULE_SETUP
 #line 282 "lex.ll"
-{ NUMERIC_RETURN(ONE); }				// CFA
-	YY_BREAK
-case 109:
+{ NUMERIC_RETURN(INTEGERconstant); }
+	YY_BREAK
+case 110:
 YY_RULE_SETUP
 #line 283 "lex.ll"
 { NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
-case 110:
+case 111:
 YY_RULE_SETUP
 #line 284 "lex.ll"
 { NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
-case 111:
+case 112:
 YY_RULE_SETUP
 #line 285 "lex.ll"
-{ NUMERIC_RETURN(INTEGERconstant); }
-	YY_BREAK
-case 112:
+{ NUMERIC_RETURN(FLOATINGconstant); }
+	YY_BREAK
+case 113:
 YY_RULE_SETUP
 #line 286 "lex.ll"
 { NUMERIC_RETURN(FLOATINGconstant); }
 	YY_BREAK
-case 113:
-YY_RULE_SETUP
-#line 287 "lex.ll"
-{ NUMERIC_RETURN(FLOATINGconstant); }
-	YY_BREAK
 /* character constant, allows empty value */
 case 114:
 YY_RULE_SETUP
+#line 289 "lex.ll"
+{ BEGIN QUOTE; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
 #line 290 "lex.ll"
-{ BEGIN QUOTE; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
-	YY_BREAK
-case 115:
-YY_RULE_SETUP
-#line 291 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
@@ -2428,5 +2429,5 @@
 /* rule 116 can match eol */
 YY_RULE_SETUP
-#line 292 "lex.ll"
+#line 291 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext); RETURN_STR(CHARACTERconstant); }
 	YY_BREAK
@@ -2435,10 +2436,10 @@
 case 117:
 YY_RULE_SETUP
+#line 295 "lex.ll"
+{ BEGIN STRING; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
 #line 296 "lex.ll"
-{ BEGIN STRING; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
-	YY_BREAK
-case 118:
-YY_RULE_SETUP
-#line 297 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
@@ -2446,5 +2447,5 @@
 /* rule 119 can match eol */
 YY_RULE_SETUP
-#line 298 "lex.ll"
+#line 297 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext ); RETURN_STR(STRINGliteral); }
 	YY_BREAK
@@ -2453,5 +2454,5 @@
 case 120:
 YY_RULE_SETUP
-#line 302 "lex.ll"
+#line 301 "lex.ll"
 { rm_underscore(); *strtext += std::string( yytext ); }
 	YY_BREAK
@@ -2459,10 +2460,10 @@
 /* rule 121 can match eol */
 YY_RULE_SETUP
+#line 302 "lex.ll"
+{}						// continuation (ALSO HANDLED BY CPP)
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
 #line 303 "lex.ll"
-{}						// continuation (ALSO HANDLED BY CPP)
-	YY_BREAK
-case 122:
-YY_RULE_SETUP
-#line 304 "lex.ll"
 { *strtext += std::string( yytext ); } // unknown escape character
 	YY_BREAK
@@ -2470,55 +2471,55 @@
 case 123:
 YY_RULE_SETUP
+#line 306 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
 #line 307 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 124:
+case 125:
 YY_RULE_SETUP
 #line 308 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 125:
+case 126:
 YY_RULE_SETUP
 #line 309 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 126:
+case 127:
 YY_RULE_SETUP
 #line 310 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 127:
+case 128:
 YY_RULE_SETUP
 #line 311 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 128:
+case 129:
 YY_RULE_SETUP
 #line 312 "lex.ll"
+{ ASCIIOP_RETURN(); }					// also operator
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 313 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 129:
-YY_RULE_SETUP
-#line 313 "lex.ll"
-{ ASCIIOP_RETURN(); }					// also operator
-	YY_BREAK
-case 130:
+case 131:
 YY_RULE_SETUP
 #line 314 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 131:
+case 132:
 YY_RULE_SETUP
 #line 315 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
-case 132:
+{ ASCIIOP_RETURN(); }					// also operator
+	YY_BREAK
+case 133:
 YY_RULE_SETUP
 #line 316 "lex.ll"
-{ ASCIIOP_RETURN(); }					// also operator
-	YY_BREAK
-case 133:
-YY_RULE_SETUP
-#line 317 "lex.ll"
 { NAMEDOP_RETURN(ELLIPSIS); }
 	YY_BREAK
@@ -2526,20 +2527,20 @@
 case 134:
 YY_RULE_SETUP
+#line 319 "lex.ll"
+{ RETURN_VAL('['); }
+	YY_BREAK
+case 135:
+YY_RULE_SETUP
 #line 320 "lex.ll"
-{ RETURN_VAL('['); }
-	YY_BREAK
-case 135:
+{ RETURN_VAL(']'); }
+	YY_BREAK
+case 136:
 YY_RULE_SETUP
 #line 321 "lex.ll"
-{ RETURN_VAL(']'); }
-	YY_BREAK
-case 136:
+{ RETURN_VAL('{'); }
+	YY_BREAK
+case 137:
 YY_RULE_SETUP
 #line 322 "lex.ll"
-{ RETURN_VAL('{'); }
-	YY_BREAK
-case 137:
-YY_RULE_SETUP
-#line 323 "lex.ll"
 { RETURN_VAL('}'); }
 	YY_BREAK
@@ -2547,206 +2548,201 @@
 case 138:
 YY_RULE_SETUP
+#line 325 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
 #line 326 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 139:
+case 140:
 YY_RULE_SETUP
 #line 327 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 140:
+case 141:
 YY_RULE_SETUP
 #line 328 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 141:
+case 142:
 YY_RULE_SETUP
 #line 329 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 142:
+case 143:
 YY_RULE_SETUP
 #line 330 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 143:
+case 144:
 YY_RULE_SETUP
 #line 331 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 144:
+case 145:
 YY_RULE_SETUP
 #line 332 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 145:
+case 146:
 YY_RULE_SETUP
 #line 333 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 146:
+case 147:
 YY_RULE_SETUP
 #line 334 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 147:
+case 148:
 YY_RULE_SETUP
 #line 335 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 148:
+case 149:
 YY_RULE_SETUP
 #line 336 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 149:
+case 150:
 YY_RULE_SETUP
 #line 337 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 150:
+case 151:
 YY_RULE_SETUP
 #line 338 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 151:
-YY_RULE_SETUP
-#line 339 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
 case 152:
 YY_RULE_SETUP
+#line 340 "lex.ll"
+{ NAMEDOP_RETURN(ICR); }
+	YY_BREAK
+case 153:
+YY_RULE_SETUP
 #line 341 "lex.ll"
-{ NAMEDOP_RETURN(ICR); }
-	YY_BREAK
-case 153:
+{ NAMEDOP_RETURN(DECR); }
+	YY_BREAK
+case 154:
 YY_RULE_SETUP
 #line 342 "lex.ll"
-{ NAMEDOP_RETURN(DECR); }
-	YY_BREAK
-case 154:
+{ NAMEDOP_RETURN(EQ); }
+	YY_BREAK
+case 155:
 YY_RULE_SETUP
 #line 343 "lex.ll"
-{ NAMEDOP_RETURN(EQ); }
-	YY_BREAK
-case 155:
+{ NAMEDOP_RETURN(NE); }
+	YY_BREAK
+case 156:
 YY_RULE_SETUP
 #line 344 "lex.ll"
-{ NAMEDOP_RETURN(NE); }
-	YY_BREAK
-case 156:
+{ NAMEDOP_RETURN(LS); }
+	YY_BREAK
+case 157:
 YY_RULE_SETUP
 #line 345 "lex.ll"
-{ NAMEDOP_RETURN(LS); }
-	YY_BREAK
-case 157:
+{ NAMEDOP_RETURN(RS); }
+	YY_BREAK
+case 158:
 YY_RULE_SETUP
 #line 346 "lex.ll"
-{ NAMEDOP_RETURN(RS); }
-	YY_BREAK
-case 158:
+{ NAMEDOP_RETURN(LE); }
+	YY_BREAK
+case 159:
 YY_RULE_SETUP
 #line 347 "lex.ll"
-{ NAMEDOP_RETURN(LE); }
-	YY_BREAK
-case 159:
+{ NAMEDOP_RETURN(GE); }
+	YY_BREAK
+case 160:
 YY_RULE_SETUP
 #line 348 "lex.ll"
-{ NAMEDOP_RETURN(GE); }
-	YY_BREAK
-case 160:
+{ NAMEDOP_RETURN(ANDAND); }
+	YY_BREAK
+case 161:
 YY_RULE_SETUP
 #line 349 "lex.ll"
-{ NAMEDOP_RETURN(ANDAND); }
-	YY_BREAK
-case 161:
+{ NAMEDOP_RETURN(OROR); }
+	YY_BREAK
+case 162:
 YY_RULE_SETUP
 #line 350 "lex.ll"
-{ NAMEDOP_RETURN(OROR); }
-	YY_BREAK
-case 162:
+{ NAMEDOP_RETURN(ARROW); }
+	YY_BREAK
+case 163:
 YY_RULE_SETUP
 #line 351 "lex.ll"
-{ NAMEDOP_RETURN(ARROW); }
-	YY_BREAK
-case 163:
+{ NAMEDOP_RETURN(PLUSassign); }
+	YY_BREAK
+case 164:
 YY_RULE_SETUP
 #line 352 "lex.ll"
-{ NAMEDOP_RETURN(PLUSassign); }
-	YY_BREAK
-case 164:
+{ NAMEDOP_RETURN(MINUSassign); }
+	YY_BREAK
+case 165:
 YY_RULE_SETUP
 #line 353 "lex.ll"
-{ NAMEDOP_RETURN(MINUSassign); }
-	YY_BREAK
-case 165:
+{ NAMEDOP_RETURN(MULTassign); }
+	YY_BREAK
+case 166:
 YY_RULE_SETUP
 #line 354 "lex.ll"
-{ NAMEDOP_RETURN(MULTassign); }
-	YY_BREAK
-case 166:
+{ NAMEDOP_RETURN(DIVassign); }
+	YY_BREAK
+case 167:
 YY_RULE_SETUP
 #line 355 "lex.ll"
-{ NAMEDOP_RETURN(DIVassign); }
-	YY_BREAK
-case 167:
+{ NAMEDOP_RETURN(MODassign); }
+	YY_BREAK
+case 168:
 YY_RULE_SETUP
 #line 356 "lex.ll"
-{ NAMEDOP_RETURN(MODassign); }
-	YY_BREAK
-case 168:
+{ NAMEDOP_RETURN(ANDassign); }
+	YY_BREAK
+case 169:
 YY_RULE_SETUP
 #line 357 "lex.ll"
-{ NAMEDOP_RETURN(ANDassign); }
-	YY_BREAK
-case 169:
+{ NAMEDOP_RETURN(ORassign); }
+	YY_BREAK
+case 170:
 YY_RULE_SETUP
 #line 358 "lex.ll"
-{ NAMEDOP_RETURN(ORassign); }
-	YY_BREAK
-case 170:
+{ NAMEDOP_RETURN(ERassign); }
+	YY_BREAK
+case 171:
 YY_RULE_SETUP
 #line 359 "lex.ll"
-{ NAMEDOP_RETURN(ERassign); }
-	YY_BREAK
-case 171:
+{ NAMEDOP_RETURN(LSassign); }
+	YY_BREAK
+case 172:
 YY_RULE_SETUP
 #line 360 "lex.ll"
-{ NAMEDOP_RETURN(LSassign); }
-	YY_BREAK
-case 172:
-YY_RULE_SETUP
-#line 361 "lex.ll"
 { NAMEDOP_RETURN(RSassign); }
 	YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 363 "lex.ll"
+#line 362 "lex.ll"
 { NAMEDOP_RETURN(ATassign); }
 	YY_BREAK
+/* CFA, operator identifier */
 case 174:
 YY_RULE_SETUP
-#line 364 "lex.ll"
-{ NAMEDOP_RETURN(REFassign); }
-	YY_BREAK
-/* CFA, operator identifier */
+#line 365 "lex.ll"
+{ IDENTIFIER_RETURN(); }				// unary
+	YY_BREAK
 case 175:
 YY_RULE_SETUP
+#line 366 "lex.ll"
+{ IDENTIFIER_RETURN(); }
+	YY_BREAK
+case 176:
+YY_RULE_SETUP
 #line 367 "lex.ll"
-{ IDENTIFIER_RETURN(); }				// unary
-	YY_BREAK
-case 176:
+{ IDENTIFIER_RETURN(); }
+	YY_BREAK
+case 177:
 YY_RULE_SETUP
 #line 368 "lex.ll"
-{ IDENTIFIER_RETURN(); }
-	YY_BREAK
-case 177:
-YY_RULE_SETUP
-#line 369 "lex.ll"
-{ IDENTIFIER_RETURN(); }
-	YY_BREAK
-case 178:
-YY_RULE_SETUP
-#line 370 "lex.ll"
 { IDENTIFIER_RETURN(); }		// binary
 	YY_BREAK
@@ -2777,7 +2773,7 @@
 	  an argument list.
 	*/
-case 179:
-YY_RULE_SETUP
-#line 397 "lex.ll"
+case 178:
+YY_RULE_SETUP
+#line 395 "lex.ll"
 {
 	// 1 or 2 character unary operator ?
@@ -2792,15 +2788,15 @@
 	YY_BREAK
 /* unknown characters */
+case 179:
+YY_RULE_SETUP
+#line 407 "lex.ll"
+{ printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
+	YY_BREAK
 case 180:
 YY_RULE_SETUP
 #line 409 "lex.ll"
-{ printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
-	YY_BREAK
-case 181:
-YY_RULE_SETUP
-#line 411 "lex.ll"
 ECHO;
 	YY_BREAK
-#line 2805 "Parser/lex.cc"
+#line 2801 "Parser/lex.cc"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
@@ -3099,5 +3095,5 @@
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 889 )
+			if ( yy_current_state >= 888 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
@@ -3127,9 +3123,9 @@
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 889 )
+		if ( yy_current_state >= 888 )
 			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 == 888);
+	yy_is_jam = (yy_current_state == 887);
 
 	return yy_is_jam ? 0 : yy_current_state;
@@ -3777,5 +3773,5 @@
 #define YYTABLES_NAME "yytables"
 
-#line 411 "lex.ll"
+#line 409 "lex.ll"
 
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/Parser/lex.ll	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Mon Jun  6 18:08:27 2016
- * Update Count     : 451
+ * Last Modified On : Wed Jun 22 21:20:18 2016
+ * Update Count     : 456
  */
 
@@ -49,13 +49,12 @@
 
 void rm_underscore() {
-	// remove underscores in numeric constant
-	int j = 0;
+	// Remove underscores in numeric constant by copying the non-underscore characters to the front of the string.
+	yyleng = 0;
 	for ( int i = 0; yytext[i] != '\0'; i += 1 ) {
 		if ( yytext[i] != '_' ) {
-			yytext[j] = yytext[i];
-			j += 1;
+			yytext[yyleng] = yytext[i];
+			yyleng += 1;
 		} // if
 	} // for
-	yyleng = j;
 	yytext[yyleng] = '\0';
 }
@@ -121,5 +120,5 @@
 h_white [ ]|{h_tab}
 
-				// operators
+				// overloadable operators
 op_unary_only "~"|"!"
 op_unary_binary "+"|"-"|"*"
@@ -129,6 +128,6 @@
 op_binary_only "/"|"%"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="
 op_binary_over {op_unary_binary}|{op_binary_only}
-op_binary_not_over "?"|"->"|"&&"|"||"
-operator {op_unary_pre_post}|{op_binary_over}|{op_binary_not_over}
+				// op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
+				// operator {op_unary_pre_post}|{op_binary_over}|{op_binary_not_over}
 
 %x COMMENT
@@ -362,5 +361,4 @@
 
 "@="			{ NAMEDOP_RETURN(ATassign); }
-":="			{ NAMEDOP_RETURN(REFassign); }
 
 				/* CFA, operator identifier */
Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/Parser/parser.cc	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -67,5 +67,5 @@
 
 /* Line 268 of yacc.c  */
-#line 44 "parser.yy"
+#line 42 "parser.yy"
 
 #define YYDEBUG_LEXER_TEXT (yylval)						// lexer loads this up each time
@@ -223,6 +223,5 @@
      ORassign = 361,
      ATassign = 362,
-     REFassign = 363,
-     THEN = 364
+     THEN = 363
    };
 #endif
@@ -333,6 +332,5 @@
 #define ORassign 361
 #define ATassign 362
-#define REFassign 363
-#define THEN 364
+#define THEN 363
 
 
@@ -344,5 +342,5 @@
 
 /* Line 293 of yacc.c  */
-#line 112 "parser.yy"
+#line 110 "parser.yy"
 
 	Token tok;
@@ -361,5 +359,5 @@
 
 /* Line 293 of yacc.c  */
-#line 364 "Parser/parser.cc"
+#line 362 "Parser/parser.cc"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
@@ -373,5 +371,5 @@
 
 /* Line 343 of yacc.c  */
-#line 376 "Parser/parser.cc"
+#line 374 "Parser/parser.cc"
 
 #ifdef short
@@ -592,18 +590,18 @@
 #define YYFINAL  251
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   11311
+#define YYLAST   11428
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  134
+#define YYNTOKENS  133
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  241
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  756
+#define YYNRULES  755
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  1583
+#define YYNSTATES  1581
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   364
+#define YYMAXUTOK   363
 
 #define YYTRANSLATE(YYX)						\
@@ -616,14 +614,14 @@
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   123,     2,     2,     2,   126,   120,     2,
-     110,   111,   119,   121,   117,   122,   114,   125,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   118,   133,
-     127,   132,   128,   131,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   122,     2,     2,     2,   125,   119,     2,
+     109,   110,   118,   120,   116,   121,   113,   124,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   117,   132,
+     126,   131,   127,   130,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   112,     2,   113,   129,     2,     2,     2,     2,     2,
+       2,   111,     2,   112,   128,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   115,   130,   116,   124,     2,     2,     2,
+       2,     2,     2,   114,   129,   115,   123,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -649,5 +647,5 @@
       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109
+     105,   106,   107,   108
 };
 
@@ -668,69 +666,69 @@
      307,   311,   313,   317,   319,   323,   325,   329,   331,   335,
      337,   341,   343,   349,   354,   360,   362,   364,   368,   372,
-     376,   379,   380,   382,   385,   391,   398,   406,   408,   412,
-     414,   416,   418,   420,   422,   424,   426,   428,   430,   432,
-     434,   438,   439,   441,   443,   445,   447,   449,   451,   453,
-     455,   457,   464,   469,   472,   480,   482,   486,   488,   491,
-     493,   496,   498,   501,   504,   510,   518,   524,   534,   540,
-     550,   552,   556,   558,   560,   564,   568,   571,   573,   576,
-     579,   580,   582,   585,   589,   590,   592,   595,   599,   603,
-     608,   609,   611,   613,   616,   622,   630,   637,   644,   649,
-     653,   658,   661,   665,   668,   672,   676,   680,   684,   690,
-     694,   698,   703,   705,   711,   718,   724,   731,   741,   752,
-     762,   773,   776,   778,   781,   784,   787,   789,   796,   805,
-     816,   829,   844,   845,   847,   848,   850,   852,   856,   861,
-     869,   870,   872,   876,   878,   882,   884,   886,   888,   892,
-     894,   896,   898,   902,   903,   905,   909,   914,   916,   920,
-     922,   924,   928,   932,   936,   940,   944,   947,   951,   958,
-     962,   966,   971,   973,   976,   979,   983,   989,   998,  1006,
-    1014,  1020,  1030,  1033,  1036,  1042,  1046,  1052,  1057,  1061,
-    1066,  1071,  1079,  1083,  1087,  1091,  1095,  1100,  1107,  1109,
-    1111,  1113,  1115,  1117,  1119,  1121,  1123,  1124,  1126,  1128,
-    1131,  1133,  1135,  1137,  1139,  1141,  1143,  1145,  1146,  1152,
-    1154,  1157,  1161,  1163,  1166,  1168,  1170,  1172,  1174,  1176,
-    1178,  1180,  1182,  1184,  1186,  1188,  1190,  1192,  1194,  1196,
-    1198,  1200,  1202,  1204,  1206,  1208,  1210,  1212,  1215,  1218,
-    1222,  1226,  1228,  1232,  1234,  1237,  1240,  1243,  1248,  1253,
-    1258,  1263,  1265,  1268,  1271,  1275,  1277,  1280,  1283,  1285,
-    1288,  1291,  1295,  1297,  1300,  1303,  1305,  1307,  1312,  1315,
-    1316,  1323,  1331,  1334,  1337,  1340,  1342,  1345,  1348,  1352,
-    1355,  1359,  1361,  1364,  1368,  1371,  1374,  1379,  1380,  1382,
-    1385,  1388,  1390,  1391,  1393,  1396,  1399,  1405,  1408,  1409,
-    1417,  1420,  1425,  1426,  1429,  1430,  1432,  1434,  1436,  1442,
-    1448,  1454,  1456,  1462,  1468,  1478,  1480,  1486,  1487,  1489,
-    1491,  1497,  1499,  1501,  1507,  1513,  1515,  1519,  1523,  1528,
-    1530,  1532,  1534,  1536,  1539,  1541,  1545,  1549,  1551,  1554,
-    1556,  1560,  1562,  1564,  1566,  1568,  1570,  1572,  1574,  1576,
-    1578,  1580,  1582,  1585,  1587,  1589,  1591,  1594,  1595,  1598,
-    1601,  1603,  1608,  1609,  1611,  1614,  1618,  1623,  1626,  1629,
-    1631,  1634,  1636,  1639,  1645,  1651,  1659,  1666,  1668,  1671,
-    1674,  1678,  1680,  1683,  1686,  1691,  1694,  1699,  1700,  1705,
-    1708,  1710,  1712,  1714,  1715,  1718,  1724,  1730,  1744,  1746,
-    1748,  1752,  1756,  1759,  1763,  1767,  1770,  1775,  1777,  1784,
-    1794,  1795,  1807,  1809,  1813,  1817,  1821,  1823,  1825,  1831,
-    1834,  1840,  1841,  1843,  1845,  1849,  1850,  1852,  1854,  1856,
-    1858,  1859,  1866,  1869,  1871,  1874,  1879,  1882,  1886,  1890,
-    1894,  1899,  1905,  1911,  1917,  1924,  1926,  1928,  1930,  1934,
-    1935,  1941,  1942,  1944,  1946,  1949,  1956,  1958,  1962,  1963,
-    1965,  1970,  1972,  1974,  1976,  1978,  1981,  1983,  1986,  1989,
-    1991,  1995,  1998,  2002,  2006,  2009,  2014,  2019,  2023,  2032,
-    2036,  2039,  2041,  2044,  2051,  2060,  2064,  2067,  2071,  2075,
-    2080,  2085,  2089,  2091,  2093,  2095,  2100,  2107,  2111,  2114,
-    2118,  2122,  2127,  2132,  2136,  2139,  2141,  2144,  2147,  2149,
-    2153,  2156,  2160,  2164,  2167,  2172,  2177,  2181,  2188,  2197,
-    2201,  2204,  2206,  2209,  2212,  2215,  2219,  2223,  2226,  2231,
-    2236,  2240,  2247,  2256,  2260,  2263,  2265,  2268,  2271,  2273,
-    2275,  2278,  2282,  2286,  2289,  2294,  2301,  2310,  2312,  2315,
-    2318,  2320,  2323,  2326,  2330,  2334,  2336,  2341,  2346,  2350,
-    2356,  2365,  2369,  2372,  2376,  2378,  2384,  2390,  2397,  2404,
-    2406,  2409,  2412,  2414,  2417,  2420,  2424,  2428,  2430,  2435,
-    2440,  2444,  2450,  2459,  2463,  2465,  2468,  2470,  2473,  2480,
-    2486,  2493,  2501,  2509,  2511,  2514,  2517,  2519,  2522,  2525,
-    2529,  2533,  2535,  2540,  2545,  2549,  2558,  2562,  2564,  2566,
-    2569,  2571,  2573,  2576,  2580,  2583,  2587,  2590,  2594,  2598,
-    2601,  2606,  2610,  2613,  2617,  2620,  2625,  2629,  2632,  2639,
-    2646,  2653,  2661,  2663,  2666,  2668,  2670,  2672,  2675,  2679,
-    2682,  2686,  2689,  2693,  2697,  2702,  2705,  2709,  2714,  2717,
-    2723,  2729,  2736,  2743,  2744,  2746,  2747
+     375,   376,   378,   381,   387,   394,   402,   404,   408,   410,
+     412,   414,   416,   418,   420,   422,   424,   426,   428,   430,
+     434,   435,   437,   439,   441,   443,   445,   447,   449,   451,
+     453,   460,   465,   468,   476,   478,   482,   484,   487,   489,
+     492,   494,   497,   500,   506,   514,   520,   530,   536,   546,
+     548,   552,   554,   556,   560,   564,   567,   569,   572,   575,
+     576,   578,   581,   585,   586,   588,   591,   595,   599,   604,
+     605,   607,   609,   612,   618,   626,   633,   640,   645,   649,
+     654,   657,   661,   664,   668,   672,   676,   680,   686,   690,
+     694,   699,   701,   707,   714,   720,   727,   737,   748,   758,
+     769,   772,   774,   777,   780,   783,   785,   792,   801,   812,
+     825,   840,   841,   843,   844,   846,   848,   852,   857,   865,
+     866,   868,   872,   874,   878,   880,   882,   884,   888,   890,
+     892,   894,   898,   899,   901,   905,   910,   912,   916,   918,
+     920,   924,   928,   932,   936,   940,   943,   947,   954,   958,
+     962,   967,   969,   972,   975,   979,   985,   994,  1002,  1010,
+    1016,  1026,  1029,  1032,  1038,  1042,  1048,  1053,  1057,  1062,
+    1067,  1075,  1079,  1083,  1087,  1091,  1096,  1103,  1105,  1107,
+    1109,  1111,  1113,  1115,  1117,  1119,  1120,  1122,  1124,  1127,
+    1129,  1131,  1133,  1135,  1137,  1139,  1141,  1142,  1148,  1150,
+    1153,  1157,  1159,  1162,  1164,  1166,  1168,  1170,  1172,  1174,
+    1176,  1178,  1180,  1182,  1184,  1186,  1188,  1190,  1192,  1194,
+    1196,  1198,  1200,  1202,  1204,  1206,  1208,  1211,  1214,  1218,
+    1222,  1224,  1228,  1230,  1233,  1236,  1239,  1244,  1249,  1254,
+    1259,  1261,  1264,  1267,  1271,  1273,  1276,  1279,  1281,  1284,
+    1287,  1291,  1293,  1296,  1299,  1301,  1303,  1308,  1311,  1312,
+    1319,  1327,  1330,  1333,  1336,  1338,  1341,  1344,  1348,  1351,
+    1355,  1357,  1360,  1364,  1367,  1370,  1375,  1376,  1378,  1381,
+    1384,  1386,  1387,  1389,  1392,  1395,  1401,  1404,  1405,  1413,
+    1416,  1421,  1422,  1425,  1426,  1428,  1430,  1432,  1438,  1444,
+    1450,  1452,  1458,  1464,  1474,  1476,  1482,  1483,  1485,  1487,
+    1493,  1495,  1497,  1503,  1509,  1511,  1515,  1519,  1524,  1526,
+    1528,  1530,  1532,  1535,  1537,  1541,  1545,  1547,  1550,  1552,
+    1556,  1558,  1560,  1562,  1564,  1566,  1568,  1570,  1572,  1574,
+    1576,  1578,  1581,  1583,  1585,  1587,  1590,  1591,  1594,  1597,
+    1599,  1604,  1605,  1607,  1610,  1614,  1619,  1622,  1625,  1627,
+    1630,  1632,  1635,  1641,  1647,  1655,  1662,  1664,  1667,  1670,
+    1674,  1676,  1679,  1682,  1687,  1690,  1695,  1696,  1701,  1704,
+    1706,  1708,  1710,  1711,  1714,  1720,  1726,  1740,  1742,  1744,
+    1748,  1752,  1755,  1759,  1763,  1766,  1771,  1773,  1780,  1790,
+    1791,  1803,  1805,  1809,  1813,  1817,  1819,  1821,  1827,  1830,
+    1836,  1837,  1839,  1841,  1845,  1846,  1848,  1850,  1852,  1854,
+    1855,  1862,  1865,  1867,  1870,  1875,  1878,  1882,  1886,  1890,
+    1895,  1901,  1907,  1913,  1920,  1922,  1924,  1926,  1930,  1931,
+    1937,  1938,  1940,  1942,  1945,  1952,  1954,  1958,  1959,  1961,
+    1966,  1968,  1970,  1972,  1974,  1977,  1979,  1982,  1985,  1987,
+    1991,  1994,  1998,  2002,  2005,  2010,  2015,  2019,  2028,  2032,
+    2035,  2037,  2040,  2047,  2056,  2060,  2063,  2067,  2071,  2076,
+    2081,  2085,  2087,  2089,  2091,  2096,  2103,  2107,  2110,  2114,
+    2118,  2123,  2128,  2132,  2135,  2137,  2140,  2143,  2145,  2149,
+    2152,  2156,  2160,  2163,  2168,  2173,  2177,  2184,  2193,  2197,
+    2200,  2202,  2205,  2208,  2211,  2215,  2219,  2222,  2227,  2232,
+    2236,  2243,  2252,  2256,  2259,  2261,  2264,  2267,  2269,  2271,
+    2274,  2278,  2282,  2285,  2290,  2297,  2306,  2308,  2311,  2314,
+    2316,  2319,  2322,  2326,  2330,  2332,  2337,  2342,  2346,  2352,
+    2361,  2365,  2368,  2372,  2374,  2380,  2386,  2393,  2400,  2402,
+    2405,  2408,  2410,  2413,  2416,  2420,  2424,  2426,  2431,  2436,
+    2440,  2446,  2455,  2459,  2461,  2464,  2466,  2469,  2476,  2482,
+    2489,  2497,  2505,  2507,  2510,  2513,  2515,  2518,  2521,  2525,
+    2529,  2531,  2536,  2541,  2545,  2554,  2558,  2560,  2562,  2565,
+    2567,  2569,  2572,  2576,  2579,  2583,  2586,  2590,  2594,  2597,
+    2602,  2606,  2609,  2613,  2616,  2621,  2625,  2628,  2635,  2642,
+    2649,  2657,  2659,  2662,  2664,  2666,  2668,  2671,  2675,  2678,
+    2682,  2685,  2689,  2693,  2698,  2701,  2705,  2710,  2713,  2719,
+    2725,  2732,  2739,  2740,  2742,  2743
 };
 
@@ -738,279 +736,279 @@
 static const yytype_int16 yyrhs[] =
 {
-     303,     0,    -1,    -1,    -1,    79,    -1,    80,    -1,    81,
-      -1,    72,    -1,    76,    -1,   141,    -1,    72,    -1,    76,
-      -1,    72,    -1,   141,    -1,    83,    -1,    84,    -1,    82,
-      -1,   142,    82,    -1,    72,    -1,   141,    -1,   110,   170,
-     111,    -1,   110,   174,   111,    -1,   143,    -1,   144,   112,
-     135,   165,   136,   113,    -1,   144,   110,   145,   111,    -1,
-     144,   114,   140,    -1,   144,   114,   112,   135,   147,   136,
-     113,    -1,   144,    85,   140,    -1,   144,    85,   112,   135,
-     147,   136,   113,    -1,   144,    86,    -1,   144,    87,    -1,
-     110,   276,   111,   115,   280,   373,   116,    -1,   144,   115,
-     145,   116,    -1,   146,    -1,   145,   117,   146,    -1,    -1,
-     165,    -1,   140,   118,   165,    -1,   112,   135,   165,   136,
-     113,   118,   165,    -1,   112,   135,   165,   117,   168,   136,
-     113,   118,   165,    -1,   148,    -1,   147,   117,   148,    -1,
-     140,    -1,   140,   114,   148,    -1,   140,   114,   112,   135,
-     147,   136,   113,    -1,   140,    85,   148,    -1,   140,    85,
-     112,   135,   147,   136,   113,    -1,   144,    -1,   137,    -1,
-     142,    -1,    40,   152,    -1,   150,   152,    -1,   151,   152,
-      -1,    86,   149,    -1,    87,   149,    -1,    37,   149,    -1,
-      37,   110,   276,   111,    -1,    38,   110,   276,   117,   140,
-     111,    -1,    76,    -1,    76,   110,   277,   111,    -1,    76,
-     110,   146,   111,    -1,    66,   149,    -1,    66,   110,   276,
-     111,    -1,    94,   140,    -1,   119,    -1,   120,    -1,   121,
-      -1,   122,    -1,   123,    -1,   124,    -1,   149,    -1,   110,
-     276,   111,   152,    -1,   110,   276,   111,   167,    -1,   152,
-      -1,   153,   119,   152,    -1,   153,   125,   152,    -1,   153,
-     126,   152,    -1,   153,    -1,   154,   121,   153,    -1,   154,
-     122,   153,    -1,   154,    -1,   155,    88,   154,    -1,   155,
-      89,   154,    -1,   155,    -1,   156,   127,   155,    -1,   156,
-     128,   155,    -1,   156,    90,   155,    -1,   156,    91,   155,
-      -1,   156,    -1,   157,    92,   156,    -1,   157,    93,   156,
-      -1,   157,    -1,   158,   120,   157,    -1,   158,    -1,   159,
-     129,   158,    -1,   159,    -1,   160,   130,   159,    -1,   160,
-      -1,   161,    94,   160,    -1,   161,    -1,   162,    95,   161,
-      -1,   162,    -1,   162,   131,   170,   118,   163,    -1,   162,
-     131,   118,   163,    -1,   162,   131,   170,   118,   167,    -1,
-     163,    -1,   163,    -1,   149,   132,   165,    -1,   149,   108,
-     165,    -1,   149,   169,   165,    -1,   167,   374,    -1,    -1,
-     165,    -1,   112,   113,    -1,   112,   135,   165,   136,   113,
-      -1,   112,   135,   117,   168,   136,   113,    -1,   112,   135,
-     165,   117,   168,   136,   113,    -1,   166,    -1,   168,   117,
-     166,    -1,    97,    -1,    98,    -1,    99,    -1,   100,    -1,
-     101,    -1,   102,    -1,   103,    -1,   104,    -1,   105,    -1,
-     106,    -1,   165,    -1,   170,   117,   165,    -1,    -1,   170,
-      -1,   173,    -1,   174,    -1,   178,    -1,   179,    -1,   191,
-      -1,   193,    -1,   194,    -1,   199,    -1,   129,   144,   115,
-     145,   116,   133,    -1,   140,   118,   313,   172,    -1,   115,
-     116,    -1,   115,   135,   135,   210,   175,   136,   116,    -1,
-     176,    -1,   175,   135,   176,    -1,   213,    -1,    40,   213,
-      -1,   309,    -1,   172,   136,    -1,   172,    -1,   177,   172,
-      -1,   171,   133,    -1,    41,   110,   170,   111,   172,    -1,
-      41,   110,   170,   111,   172,    42,   172,    -1,    43,   110,
-     170,   111,   184,    -1,    43,   110,   170,   111,   115,   135,
-     206,   185,   116,    -1,    53,   110,   170,   111,   184,    -1,
-      53,   110,   170,   111,   115,   135,   206,   187,   116,    -1,
-     164,    -1,   164,    96,   164,    -1,   311,    -1,   180,    -1,
-     181,   117,   180,    -1,    44,   181,   118,    -1,    45,   118,
-      -1,   182,    -1,   183,   182,    -1,   183,   172,    -1,    -1,
-     186,    -1,   183,   177,    -1,   186,   183,   177,    -1,    -1,
-     188,    -1,   183,   190,    -1,   183,   177,   189,    -1,   188,
-     183,   190,    -1,   188,   183,   177,   189,    -1,    -1,   190,
-      -1,    56,    -1,    56,   133,    -1,    47,   110,   170,   111,
-     172,    -1,    46,   172,    47,   110,   170,   111,   133,    -1,
-      48,   110,   135,   192,   111,   172,    -1,   171,   136,   133,
-     171,   133,   171,    -1,   213,   171,   133,   171,    -1,    51,
-     140,   133,    -1,    51,   119,   170,   133,    -1,    50,   133,
-      -1,    50,   140,   133,    -1,    49,   133,    -1,    49,   140,
-     133,    -1,    52,   171,   133,    -1,    61,   166,   133,    -1,
-      62,   166,   133,    -1,    62,   166,    63,   165,   133,    -1,
-      57,   174,   195,    -1,    57,   174,   197,    -1,    57,   174,
-     195,   197,    -1,   196,    -1,    58,   110,    96,   111,   174,
-      -1,   196,    58,   110,    96,   111,   174,    -1,    59,   110,
-      96,   111,   174,    -1,   196,    59,   110,    96,   111,   174,
-      -1,    58,   110,   135,   135,   198,   136,   111,   174,   136,
-      -1,   196,    58,   110,   135,   135,   198,   136,   111,   174,
-     136,    -1,    59,   110,   135,   135,   198,   136,   111,   174,
-     136,    -1,   196,    59,   110,   135,   135,   198,   136,   111,
-     174,   136,    -1,    60,   174,    -1,   226,    -1,   226,   310,
-      -1,   226,   358,    -1,   367,   140,    -1,   367,    -1,    64,
-     200,   110,   142,   111,   133,    -1,    64,   200,   110,   142,
-     118,   201,   111,   133,    -1,    64,   200,   110,   142,   118,
-     201,   118,   201,   111,   133,    -1,    64,   200,   110,   142,
-     118,   201,   118,   201,   118,   204,   111,   133,    -1,    64,
-     200,    51,   110,   142,   118,   118,   201,   118,   204,   118,
-     205,   111,   133,    -1,    -1,    11,    -1,    -1,   202,    -1,
-     203,    -1,   202,   117,   203,    -1,   142,   110,   164,   111,
-      -1,   112,   164,   113,   142,   110,   164,   111,    -1,    -1,
-     142,    -1,   204,   117,   142,    -1,   140,    -1,   205,   117,
-     140,    -1,   136,    -1,   207,    -1,   213,    -1,   207,   135,
-     213,    -1,   136,    -1,   209,    -1,   223,    -1,   209,   135,
-     223,    -1,    -1,   211,    -1,    29,   212,   133,    -1,   211,
-      29,   212,   133,    -1,   275,    -1,   212,   117,   275,    -1,
-     214,    -1,   223,    -1,   215,   136,   133,    -1,   220,   136,
-     133,    -1,   217,   136,   133,    -1,   294,   136,   133,    -1,
-     297,   136,   133,    -1,   216,   278,    -1,   232,   216,   278,
-      -1,   215,   136,   117,   135,   273,   278,    -1,   368,   273,
-     312,    -1,   371,   273,   312,    -1,   228,   371,   273,   312,
-      -1,   218,    -1,   228,   218,    -1,   232,   218,    -1,   232,
-     228,   218,    -1,   217,   136,   117,   135,   273,    -1,   112,
-     113,   273,   110,   135,   261,   136,   111,    -1,   371,   273,
-     110,   135,   261,   136,   111,    -1,   219,   273,   110,   135,
-     261,   136,   111,    -1,   112,   135,   263,   136,   113,    -1,
-     112,   135,   263,   136,   117,   135,   264,   136,   113,    -1,
-       3,   216,    -1,     3,   218,    -1,   220,   136,   117,   135,
-     140,    -1,     3,   226,   310,    -1,   221,   136,   117,   135,
-     310,    -1,   228,     3,   226,   310,    -1,   226,     3,   310,
-      -1,   226,     3,   228,   310,    -1,     3,   140,   132,   165,
-      -1,   222,   136,   117,   135,   140,   132,   165,    -1,   224,
-     136,   133,    -1,   221,   136,   133,    -1,   222,   136,   133,
-      -1,   241,   136,   133,    -1,   225,   310,   312,   278,    -1,
-     224,   117,   313,   310,   312,   278,    -1,   237,    -1,   241,
-      -1,   243,    -1,   284,    -1,   238,    -1,   242,    -1,   244,
-      -1,   285,    -1,    -1,   228,    -1,   229,    -1,   228,   229,
-      -1,   230,    -1,   315,    -1,    10,    -1,    12,    -1,    11,
-      -1,    14,    -1,    67,    -1,    -1,    13,   110,   231,   287,
-     111,    -1,   233,    -1,   228,   233,    -1,   232,   228,   233,
-      -1,   234,    -1,   233,   234,    -1,   235,    -1,     5,    -1,
-       7,    -1,     4,    -1,     6,    -1,     8,    -1,     9,    -1,
-      69,    -1,    71,    -1,    16,    -1,    21,    -1,    20,    -1,
-      18,    -1,    19,    -1,    17,    -1,    22,    -1,    23,    -1,
-      15,    -1,    25,    -1,    26,    -1,    27,    -1,    24,    -1,
-     238,    -1,   232,   238,    -1,   237,   234,    -1,   237,   234,
-     228,    -1,   237,   234,   238,    -1,   239,    -1,   227,   240,
-     227,    -1,   236,    -1,   228,   236,    -1,   239,   229,    -1,
-     239,   236,    -1,    28,   110,   277,   111,    -1,    28,   110,
-     170,   111,    -1,    78,   110,   277,   111,    -1,    78,   110,
-     170,   111,    -1,   242,    -1,   232,   242,    -1,   241,   234,
-      -1,   241,   234,   228,    -1,   245,    -1,   228,   245,    -1,
-     242,   229,    -1,   244,    -1,   232,   244,    -1,   243,   234,
-      -1,   243,   234,   228,    -1,    74,    -1,   228,    74,    -1,
-     244,   229,    -1,   246,    -1,   257,    -1,   248,   115,   249,
-     116,    -1,   248,   275,    -1,    -1,   248,   275,   247,   115,
-     249,   116,    -1,   248,   110,   293,   111,   115,   249,   116,
-      -1,   248,   286,    -1,    31,   313,    -1,    32,   313,    -1,
-     250,    -1,   249,   250,    -1,   251,   133,    -1,    40,   251,
-     133,    -1,   252,   133,    -1,    40,   252,   133,    -1,   367,
-      -1,   367,   275,    -1,   251,   117,   275,    -1,   251,   117,
-      -1,   226,   253,    -1,   252,   117,   313,   253,    -1,    -1,
-     255,    -1,   319,   254,    -1,   332,   254,    -1,   358,    -1,
-      -1,   255,    -1,   118,   164,    -1,    30,   313,    -1,   256,
-     115,   259,   373,   116,    -1,   256,   275,    -1,    -1,   256,
-     275,   258,   115,   259,   373,   116,    -1,   275,   260,    -1,
-     259,   117,   275,   260,    -1,    -1,   132,   164,    -1,    -1,
-     262,    -1,   264,    -1,   263,    -1,   263,   136,   117,   135,
-     264,    -1,   264,   136,   117,   135,    96,    -1,   263,   136,
-     117,   135,    96,    -1,   268,    -1,   264,   136,   117,   135,
-     268,    -1,   263,   136,   117,   135,   268,    -1,   263,   136,
-     117,   135,   264,   136,   117,   135,   268,    -1,   269,    -1,
-     264,   136,   117,   135,   269,    -1,    -1,   266,    -1,   267,
-      -1,   267,   136,   117,   135,    96,    -1,   271,    -1,   270,
-      -1,   267,   136,   117,   135,   271,    -1,   267,   136,   117,
-     135,   270,    -1,   270,    -1,   363,   273,   374,    -1,   371,
-     273,   374,    -1,   228,   371,   273,   374,    -1,   218,    -1,
-     271,    -1,   363,    -1,   371,    -1,   228,   371,    -1,   372,
-      -1,   225,   337,   374,    -1,   225,   341,   374,    -1,   225,
-      -1,   225,   352,    -1,   140,    -1,   272,   117,   140,    -1,
-     138,    -1,    74,    -1,    75,    -1,   139,    -1,    74,    -1,
-      75,    -1,   140,    -1,    74,    -1,    75,    -1,   367,    -1,
-     226,    -1,   226,   358,    -1,   367,    -1,   372,    -1,   226,
-      -1,   226,   346,    -1,    -1,   132,   279,    -1,   107,   279,
-      -1,   165,    -1,   115,   280,   373,   116,    -1,    -1,   279,
-      -1,   281,   279,    -1,   280,   117,   279,    -1,   280,   117,
-     281,   279,    -1,   282,   118,    -1,   275,   118,    -1,   283,
-      -1,   282,   283,    -1,    80,    -1,   114,   275,    -1,   112,
-     135,   165,   136,   113,    -1,   112,   135,   311,   136,   113,
-      -1,   112,   135,   164,    96,   164,   136,   113,    -1,   114,
-     112,   135,   147,   136,   113,    -1,   285,    -1,   232,   285,
-      -1,   284,   234,    -1,   284,   234,   228,    -1,   286,    -1,
-     228,   286,    -1,   285,   229,    -1,    75,   110,   293,   111,
-      -1,   288,   374,    -1,   287,   117,   288,   374,    -1,    -1,
-     290,   275,   289,   291,    -1,   226,   337,    -1,    33,    -1,
-      35,    -1,    34,    -1,    -1,   291,   292,    -1,   130,   275,
-     110,   293,   111,    -1,   130,   115,   135,   299,   116,    -1,
-     130,   110,   135,   287,   136,   111,   115,   135,   299,   116,
-     110,   293,   111,    -1,   277,    -1,   165,    -1,   293,   117,
-     277,    -1,   293,   117,   165,    -1,    33,   295,    -1,   233,
-      33,   295,    -1,   294,   117,   295,    -1,   296,   291,    -1,
-     296,   291,   132,   277,    -1,   275,    -1,   274,   110,   135,
-     287,   136,   111,    -1,    36,   275,   110,   135,   287,   136,
-     111,   115,   116,    -1,    -1,    36,   275,   110,   135,   287,
-     136,   111,   115,   298,   299,   116,    -1,   300,    -1,   299,
-     135,   300,    -1,   301,   136,   133,    -1,   302,   136,   133,
-      -1,   216,    -1,   218,    -1,   301,   136,   117,   135,   273,
-      -1,   226,   310,    -1,   302,   136,   117,   135,   310,    -1,
-      -1,   304,    -1,   306,    -1,   304,   135,   306,    -1,    -1,
-     304,    -1,   213,    -1,   308,    -1,   199,    -1,    -1,     5,
-      82,   307,   115,   305,   116,    -1,    40,   306,    -1,   309,
-      -1,   324,   174,    -1,   328,   135,   208,   174,    -1,   217,
-     174,    -1,   225,   324,   174,    -1,   228,   324,   174,    -1,
-     232,   324,   174,    -1,   232,   228,   324,   174,    -1,   225,
-     328,   135,   208,   174,    -1,   228,   328,   135,   208,   174,
-      -1,   232,   328,   135,   208,   174,    -1,   232,   228,   328,
-     135,   208,   174,    -1,   319,    -1,   324,    -1,   332,    -1,
-     164,   124,   164,    -1,    -1,    64,   110,   142,   111,   313,
-      -1,    -1,   314,    -1,   315,    -1,   314,   315,    -1,    39,
-     110,   110,   316,   111,   111,    -1,   317,    -1,   316,   117,
-     317,    -1,    -1,   318,    -1,   318,   110,   171,   111,    -1,
-     273,    -1,   235,    -1,   236,    -1,   229,    -1,   320,   313,
-      -1,   321,    -1,   322,   313,    -1,   323,   313,    -1,   138,
-      -1,   110,   320,   111,    -1,   150,   319,    -1,   150,   228,
-     319,    -1,   110,   321,   111,    -1,   320,   350,    -1,   110,
-     321,   111,   350,    -1,   110,   322,   111,   351,    -1,   110,
-     322,   111,    -1,   110,   321,   111,   110,   135,   265,   136,
-     111,    -1,   110,   323,   111,    -1,   325,   313,    -1,   326,
-      -1,   327,   313,    -1,   320,   110,   135,   265,   136,   111,
-      -1,   110,   326,   111,   110,   135,   265,   136,   111,    -1,
-     110,   325,   111,    -1,   150,   324,    -1,   150,   228,   324,
-      -1,   110,   326,   111,    -1,   110,   326,   111,   350,    -1,
-     110,   327,   111,   351,    -1,   110,   327,   111,    -1,   329,
-      -1,   330,    -1,   331,    -1,   320,   110,   272,   111,    -1,
-     110,   330,   111,   110,   272,   111,    -1,   110,   329,   111,
-      -1,   150,   328,    -1,   150,   228,   328,    -1,   110,   330,
-     111,    -1,   110,   330,   111,   350,    -1,   110,   331,   111,
-     351,    -1,   110,   331,   111,    -1,   333,   313,    -1,   334,
-      -1,   335,   313,    -1,   336,   313,    -1,   342,    -1,   110,
-     333,   111,    -1,   150,   332,    -1,   150,   228,   332,    -1,
-     110,   334,   111,    -1,   333,   350,    -1,   110,   334,   111,
-     350,    -1,   110,   335,   111,   351,    -1,   110,   335,   111,
-      -1,   333,   110,   135,   265,   136,   111,    -1,   110,   334,
-     111,   110,   135,   265,   136,   111,    -1,   110,   336,   111,
-      -1,   320,   313,    -1,   338,    -1,   339,   313,    -1,   340,
-     313,    -1,   150,   337,    -1,   150,   228,   337,    -1,   110,
-     338,   111,    -1,   320,   356,    -1,   110,   338,   111,   350,
-      -1,   110,   339,   111,   351,    -1,   110,   339,   111,    -1,
-     320,   110,   135,   265,   136,   111,    -1,   110,   338,   111,
-     110,   135,   265,   136,   111,    -1,   110,   340,   111,    -1,
-     342,   313,    -1,   343,    -1,   344,   313,    -1,   345,   313,
-      -1,    74,    -1,    75,    -1,   150,   341,    -1,   150,   228,
-     341,    -1,   110,   343,   111,    -1,   342,   356,    -1,   110,
-     343,   111,   356,    -1,   342,   110,   135,   265,   136,   111,
-      -1,   110,   343,   111,   110,   135,   265,   136,   111,    -1,
-     347,    -1,   348,   313,    -1,   349,   313,    -1,   150,    -1,
-     150,   228,    -1,   150,   346,    -1,   150,   228,   346,    -1,
-     110,   347,   111,    -1,   350,    -1,   110,   347,   111,   350,
-      -1,   110,   348,   111,   351,    -1,   110,   348,   111,    -1,
-     110,   135,   265,   136,   111,    -1,   110,   347,   111,   110,
-     135,   265,   136,   111,    -1,   110,   349,   111,    -1,   112,
-     113,    -1,   112,   113,   351,    -1,   351,    -1,   112,   135,
-     165,   136,   113,    -1,   112,   135,   119,   136,   113,    -1,
-     351,   112,   135,   165,   136,   113,    -1,   351,   112,   135,
-     119,   136,   113,    -1,   353,    -1,   354,   313,    -1,   355,
-     313,    -1,   150,    -1,   150,   228,    -1,   150,   352,    -1,
-     150,   228,   352,    -1,   110,   353,   111,    -1,   356,    -1,
-     110,   353,   111,   356,    -1,   110,   354,   111,   351,    -1,
-     110,   354,   111,    -1,   110,   135,   265,   136,   111,    -1,
-     110,   353,   111,   110,   135,   265,   136,   111,    -1,   110,
-     355,   111,    -1,   357,    -1,   357,   351,    -1,   351,    -1,
-     112,   113,    -1,   112,   135,   228,   119,   136,   113,    -1,
-     112,   135,   228,   136,   113,    -1,   112,   135,   228,   165,
-     136,   113,    -1,   112,   135,     7,   227,   165,   136,   113,
-      -1,   112,   135,   228,     7,   165,   136,   113,    -1,   359,
-      -1,   360,   313,    -1,   361,   313,    -1,   150,    -1,   150,
-     228,    -1,   150,   358,    -1,   150,   228,   358,    -1,   110,
-     359,   111,    -1,   350,    -1,   110,   359,   111,   350,    -1,
-     110,   360,   111,   351,    -1,   110,   360,   111,    -1,   110,
-     359,   111,   110,   135,   265,   136,   111,    -1,   110,   361,
-     111,    -1,   363,    -1,   371,    -1,   228,   371,    -1,   364,
-      -1,   365,    -1,   150,   226,    -1,   228,   150,   226,    -1,
-     150,   372,    -1,   228,   150,   372,    -1,   150,   362,    -1,
-     228,   150,   362,    -1,   112,   113,   226,    -1,   366,   226,
-      -1,   112,   113,   351,   226,    -1,   366,   351,   226,    -1,
-     351,   226,    -1,   112,   113,   364,    -1,   366,   364,    -1,
-     112,   113,   351,   364,    -1,   366,   351,   364,    -1,   351,
-     364,    -1,   112,   135,   228,   119,   136,   113,    -1,   112,
-     135,   228,   165,   136,   113,    -1,   112,   135,   232,   165,
-     136,   113,    -1,   112,   135,   232,   228,   165,   136,   113,
-      -1,   371,    -1,   228,   371,    -1,   368,    -1,   369,    -1,
-     370,    -1,   150,   226,    -1,   228,   150,   226,    -1,   150,
-     372,    -1,   228,   150,   372,    -1,   150,   367,    -1,   228,
-     150,   367,    -1,   112,   113,   226,    -1,   112,   113,   351,
-     226,    -1,   351,   226,    -1,   112,   113,   369,    -1,   112,
-     113,   351,   369,    -1,   351,   369,    -1,   112,   135,   264,
-     136,   113,    -1,   112,   113,   110,   261,   111,    -1,   371,
-     110,   135,   261,   136,   111,    -1,   219,   110,   135,   261,
-     136,   111,    -1,    -1,   117,    -1,    -1,   132,   165,    -1
+     302,     0,    -1,    -1,    -1,    79,    -1,    80,    -1,    81,
+      -1,    72,    -1,    76,    -1,   140,    -1,    72,    -1,    76,
+      -1,    72,    -1,   140,    -1,    83,    -1,    84,    -1,    82,
+      -1,   141,    82,    -1,    72,    -1,   140,    -1,   109,   169,
+     110,    -1,   109,   173,   110,    -1,   142,    -1,   143,   111,
+     134,   164,   135,   112,    -1,   143,   109,   144,   110,    -1,
+     143,   113,   139,    -1,   143,   113,   111,   134,   146,   135,
+     112,    -1,   143,    85,   139,    -1,   143,    85,   111,   134,
+     146,   135,   112,    -1,   143,    86,    -1,   143,    87,    -1,
+     109,   275,   110,   114,   279,   372,   115,    -1,   143,   114,
+     144,   115,    -1,   145,    -1,   144,   116,   145,    -1,    -1,
+     164,    -1,   139,   117,   164,    -1,   111,   134,   164,   135,
+     112,   117,   164,    -1,   111,   134,   164,   116,   167,   135,
+     112,   117,   164,    -1,   147,    -1,   146,   116,   147,    -1,
+     139,    -1,   139,   113,   147,    -1,   139,   113,   111,   134,
+     146,   135,   112,    -1,   139,    85,   147,    -1,   139,    85,
+     111,   134,   146,   135,   112,    -1,   143,    -1,   136,    -1,
+     141,    -1,    40,   151,    -1,   149,   151,    -1,   150,   151,
+      -1,    86,   148,    -1,    87,   148,    -1,    37,   148,    -1,
+      37,   109,   275,   110,    -1,    38,   109,   275,   116,   139,
+     110,    -1,    76,    -1,    76,   109,   276,   110,    -1,    76,
+     109,   145,   110,    -1,    66,   148,    -1,    66,   109,   275,
+     110,    -1,    94,   139,    -1,   118,    -1,   119,    -1,   120,
+      -1,   121,    -1,   122,    -1,   123,    -1,   148,    -1,   109,
+     275,   110,   151,    -1,   109,   275,   110,   166,    -1,   151,
+      -1,   152,   118,   151,    -1,   152,   124,   151,    -1,   152,
+     125,   151,    -1,   152,    -1,   153,   120,   152,    -1,   153,
+     121,   152,    -1,   153,    -1,   154,    88,   153,    -1,   154,
+      89,   153,    -1,   154,    -1,   155,   126,   154,    -1,   155,
+     127,   154,    -1,   155,    90,   154,    -1,   155,    91,   154,
+      -1,   155,    -1,   156,    92,   155,    -1,   156,    93,   155,
+      -1,   156,    -1,   157,   119,   156,    -1,   157,    -1,   158,
+     128,   157,    -1,   158,    -1,   159,   129,   158,    -1,   159,
+      -1,   160,    94,   159,    -1,   160,    -1,   161,    95,   160,
+      -1,   161,    -1,   161,   130,   169,   117,   162,    -1,   161,
+     130,   117,   162,    -1,   161,   130,   169,   117,   166,    -1,
+     162,    -1,   162,    -1,   148,   131,   164,    -1,   148,   168,
+     164,    -1,   166,   373,    -1,    -1,   164,    -1,   111,   112,
+      -1,   111,   134,   164,   135,   112,    -1,   111,   134,   116,
+     167,   135,   112,    -1,   111,   134,   164,   116,   167,   135,
+     112,    -1,   165,    -1,   167,   116,   165,    -1,    97,    -1,
+      98,    -1,    99,    -1,   100,    -1,   101,    -1,   102,    -1,
+     103,    -1,   104,    -1,   105,    -1,   106,    -1,   164,    -1,
+     169,   116,   164,    -1,    -1,   169,    -1,   172,    -1,   173,
+      -1,   177,    -1,   178,    -1,   190,    -1,   192,    -1,   193,
+      -1,   198,    -1,   128,   143,   114,   144,   115,   132,    -1,
+     139,   117,   312,   171,    -1,   114,   115,    -1,   114,   134,
+     134,   209,   174,   135,   115,    -1,   175,    -1,   174,   134,
+     175,    -1,   212,    -1,    40,   212,    -1,   308,    -1,   171,
+     135,    -1,   171,    -1,   176,   171,    -1,   170,   132,    -1,
+      41,   109,   169,   110,   171,    -1,    41,   109,   169,   110,
+     171,    42,   171,    -1,    43,   109,   169,   110,   183,    -1,
+      43,   109,   169,   110,   114,   134,   205,   184,   115,    -1,
+      53,   109,   169,   110,   183,    -1,    53,   109,   169,   110,
+     114,   134,   205,   186,   115,    -1,   163,    -1,   163,    96,
+     163,    -1,   310,    -1,   179,    -1,   180,   116,   179,    -1,
+      44,   180,   117,    -1,    45,   117,    -1,   181,    -1,   182,
+     181,    -1,   182,   171,    -1,    -1,   185,    -1,   182,   176,
+      -1,   185,   182,   176,    -1,    -1,   187,    -1,   182,   189,
+      -1,   182,   176,   188,    -1,   187,   182,   189,    -1,   187,
+     182,   176,   188,    -1,    -1,   189,    -1,    56,    -1,    56,
+     132,    -1,    47,   109,   169,   110,   171,    -1,    46,   171,
+      47,   109,   169,   110,   132,    -1,    48,   109,   134,   191,
+     110,   171,    -1,   170,   135,   132,   170,   132,   170,    -1,
+     212,   170,   132,   170,    -1,    51,   139,   132,    -1,    51,
+     118,   169,   132,    -1,    50,   132,    -1,    50,   139,   132,
+      -1,    49,   132,    -1,    49,   139,   132,    -1,    52,   170,
+     132,    -1,    61,   165,   132,    -1,    62,   165,   132,    -1,
+      62,   165,    63,   164,   132,    -1,    57,   173,   194,    -1,
+      57,   173,   196,    -1,    57,   173,   194,   196,    -1,   195,
+      -1,    58,   109,    96,   110,   173,    -1,   195,    58,   109,
+      96,   110,   173,    -1,    59,   109,    96,   110,   173,    -1,
+     195,    59,   109,    96,   110,   173,    -1,    58,   109,   134,
+     134,   197,   135,   110,   173,   135,    -1,   195,    58,   109,
+     134,   134,   197,   135,   110,   173,   135,    -1,    59,   109,
+     134,   134,   197,   135,   110,   173,   135,    -1,   195,    59,
+     109,   134,   134,   197,   135,   110,   173,   135,    -1,    60,
+     173,    -1,   225,    -1,   225,   309,    -1,   225,   357,    -1,
+     366,   139,    -1,   366,    -1,    64,   199,   109,   141,   110,
+     132,    -1,    64,   199,   109,   141,   117,   200,   110,   132,
+      -1,    64,   199,   109,   141,   117,   200,   117,   200,   110,
+     132,    -1,    64,   199,   109,   141,   117,   200,   117,   200,
+     117,   203,   110,   132,    -1,    64,   199,    51,   109,   141,
+     117,   117,   200,   117,   203,   117,   204,   110,   132,    -1,
+      -1,    11,    -1,    -1,   201,    -1,   202,    -1,   201,   116,
+     202,    -1,   141,   109,   163,   110,    -1,   111,   163,   112,
+     141,   109,   163,   110,    -1,    -1,   141,    -1,   203,   116,
+     141,    -1,   139,    -1,   204,   116,   139,    -1,   135,    -1,
+     206,    -1,   212,    -1,   206,   134,   212,    -1,   135,    -1,
+     208,    -1,   222,    -1,   208,   134,   222,    -1,    -1,   210,
+      -1,    29,   211,   132,    -1,   210,    29,   211,   132,    -1,
+     274,    -1,   211,   116,   274,    -1,   213,    -1,   222,    -1,
+     214,   135,   132,    -1,   219,   135,   132,    -1,   216,   135,
+     132,    -1,   293,   135,   132,    -1,   296,   135,   132,    -1,
+     215,   277,    -1,   231,   215,   277,    -1,   214,   135,   116,
+     134,   272,   277,    -1,   367,   272,   311,    -1,   370,   272,
+     311,    -1,   227,   370,   272,   311,    -1,   217,    -1,   227,
+     217,    -1,   231,   217,    -1,   231,   227,   217,    -1,   216,
+     135,   116,   134,   272,    -1,   111,   112,   272,   109,   134,
+     260,   135,   110,    -1,   370,   272,   109,   134,   260,   135,
+     110,    -1,   218,   272,   109,   134,   260,   135,   110,    -1,
+     111,   134,   262,   135,   112,    -1,   111,   134,   262,   135,
+     116,   134,   263,   135,   112,    -1,     3,   215,    -1,     3,
+     217,    -1,   219,   135,   116,   134,   139,    -1,     3,   225,
+     309,    -1,   220,   135,   116,   134,   309,    -1,   227,     3,
+     225,   309,    -1,   225,     3,   309,    -1,   225,     3,   227,
+     309,    -1,     3,   139,   131,   164,    -1,   221,   135,   116,
+     134,   139,   131,   164,    -1,   223,   135,   132,    -1,   220,
+     135,   132,    -1,   221,   135,   132,    -1,   240,   135,   132,
+      -1,   224,   309,   311,   277,    -1,   223,   116,   312,   309,
+     311,   277,    -1,   236,    -1,   240,    -1,   242,    -1,   283,
+      -1,   237,    -1,   241,    -1,   243,    -1,   284,    -1,    -1,
+     227,    -1,   228,    -1,   227,   228,    -1,   229,    -1,   314,
+      -1,    10,    -1,    12,    -1,    11,    -1,    14,    -1,    67,
+      -1,    -1,    13,   109,   230,   286,   110,    -1,   232,    -1,
+     227,   232,    -1,   231,   227,   232,    -1,   233,    -1,   232,
+     233,    -1,   234,    -1,     5,    -1,     7,    -1,     4,    -1,
+       6,    -1,     8,    -1,     9,    -1,    69,    -1,    71,    -1,
+      16,    -1,    21,    -1,    20,    -1,    18,    -1,    19,    -1,
+      17,    -1,    22,    -1,    23,    -1,    15,    -1,    25,    -1,
+      26,    -1,    27,    -1,    24,    -1,   237,    -1,   231,   237,
+      -1,   236,   233,    -1,   236,   233,   227,    -1,   236,   233,
+     237,    -1,   238,    -1,   226,   239,   226,    -1,   235,    -1,
+     227,   235,    -1,   238,   228,    -1,   238,   235,    -1,    28,
+     109,   276,   110,    -1,    28,   109,   169,   110,    -1,    78,
+     109,   276,   110,    -1,    78,   109,   169,   110,    -1,   241,
+      -1,   231,   241,    -1,   240,   233,    -1,   240,   233,   227,
+      -1,   244,    -1,   227,   244,    -1,   241,   228,    -1,   243,
+      -1,   231,   243,    -1,   242,   233,    -1,   242,   233,   227,
+      -1,    74,    -1,   227,    74,    -1,   243,   228,    -1,   245,
+      -1,   256,    -1,   247,   114,   248,   115,    -1,   247,   274,
+      -1,    -1,   247,   274,   246,   114,   248,   115,    -1,   247,
+     109,   292,   110,   114,   248,   115,    -1,   247,   285,    -1,
+      31,   312,    -1,    32,   312,    -1,   249,    -1,   248,   249,
+      -1,   250,   132,    -1,    40,   250,   132,    -1,   251,   132,
+      -1,    40,   251,   132,    -1,   366,    -1,   366,   274,    -1,
+     250,   116,   274,    -1,   250,   116,    -1,   225,   252,    -1,
+     251,   116,   312,   252,    -1,    -1,   254,    -1,   318,   253,
+      -1,   331,   253,    -1,   357,    -1,    -1,   254,    -1,   117,
+     163,    -1,    30,   312,    -1,   255,   114,   258,   372,   115,
+      -1,   255,   274,    -1,    -1,   255,   274,   257,   114,   258,
+     372,   115,    -1,   274,   259,    -1,   258,   116,   274,   259,
+      -1,    -1,   131,   163,    -1,    -1,   261,    -1,   263,    -1,
+     262,    -1,   262,   135,   116,   134,   263,    -1,   263,   135,
+     116,   134,    96,    -1,   262,   135,   116,   134,    96,    -1,
+     267,    -1,   263,   135,   116,   134,   267,    -1,   262,   135,
+     116,   134,   267,    -1,   262,   135,   116,   134,   263,   135,
+     116,   134,   267,    -1,   268,    -1,   263,   135,   116,   134,
+     268,    -1,    -1,   265,    -1,   266,    -1,   266,   135,   116,
+     134,    96,    -1,   270,    -1,   269,    -1,   266,   135,   116,
+     134,   270,    -1,   266,   135,   116,   134,   269,    -1,   269,
+      -1,   362,   272,   373,    -1,   370,   272,   373,    -1,   227,
+     370,   272,   373,    -1,   217,    -1,   270,    -1,   362,    -1,
+     370,    -1,   227,   370,    -1,   371,    -1,   224,   336,   373,
+      -1,   224,   340,   373,    -1,   224,    -1,   224,   351,    -1,
+     139,    -1,   271,   116,   139,    -1,   137,    -1,    74,    -1,
+      75,    -1,   138,    -1,    74,    -1,    75,    -1,   139,    -1,
+      74,    -1,    75,    -1,   366,    -1,   225,    -1,   225,   357,
+      -1,   366,    -1,   371,    -1,   225,    -1,   225,   345,    -1,
+      -1,   131,   278,    -1,   107,   278,    -1,   164,    -1,   114,
+     279,   372,   115,    -1,    -1,   278,    -1,   280,   278,    -1,
+     279,   116,   278,    -1,   279,   116,   280,   278,    -1,   281,
+     117,    -1,   274,   117,    -1,   282,    -1,   281,   282,    -1,
+      80,    -1,   113,   274,    -1,   111,   134,   164,   135,   112,
+      -1,   111,   134,   310,   135,   112,    -1,   111,   134,   163,
+      96,   163,   135,   112,    -1,   113,   111,   134,   146,   135,
+     112,    -1,   284,    -1,   231,   284,    -1,   283,   233,    -1,
+     283,   233,   227,    -1,   285,    -1,   227,   285,    -1,   284,
+     228,    -1,    75,   109,   292,   110,    -1,   287,   373,    -1,
+     286,   116,   287,   373,    -1,    -1,   289,   274,   288,   290,
+      -1,   225,   336,    -1,    33,    -1,    35,    -1,    34,    -1,
+      -1,   290,   291,    -1,   129,   274,   109,   292,   110,    -1,
+     129,   114,   134,   298,   115,    -1,   129,   109,   134,   286,
+     135,   110,   114,   134,   298,   115,   109,   292,   110,    -1,
+     276,    -1,   164,    -1,   292,   116,   276,    -1,   292,   116,
+     164,    -1,    33,   294,    -1,   232,    33,   294,    -1,   293,
+     116,   294,    -1,   295,   290,    -1,   295,   290,   131,   276,
+      -1,   274,    -1,   273,   109,   134,   286,   135,   110,    -1,
+      36,   274,   109,   134,   286,   135,   110,   114,   115,    -1,
+      -1,    36,   274,   109,   134,   286,   135,   110,   114,   297,
+     298,   115,    -1,   299,    -1,   298,   134,   299,    -1,   300,
+     135,   132,    -1,   301,   135,   132,    -1,   215,    -1,   217,
+      -1,   300,   135,   116,   134,   272,    -1,   225,   309,    -1,
+     301,   135,   116,   134,   309,    -1,    -1,   303,    -1,   305,
+      -1,   303,   134,   305,    -1,    -1,   303,    -1,   212,    -1,
+     307,    -1,   198,    -1,    -1,     5,    82,   306,   114,   304,
+     115,    -1,    40,   305,    -1,   308,    -1,   323,   173,    -1,
+     327,   134,   207,   173,    -1,   216,   173,    -1,   224,   323,
+     173,    -1,   227,   323,   173,    -1,   231,   323,   173,    -1,
+     231,   227,   323,   173,    -1,   224,   327,   134,   207,   173,
+      -1,   227,   327,   134,   207,   173,    -1,   231,   327,   134,
+     207,   173,    -1,   231,   227,   327,   134,   207,   173,    -1,
+     318,    -1,   323,    -1,   331,    -1,   163,   123,   163,    -1,
+      -1,    64,   109,   141,   110,   312,    -1,    -1,   313,    -1,
+     314,    -1,   313,   314,    -1,    39,   109,   109,   315,   110,
+     110,    -1,   316,    -1,   315,   116,   316,    -1,    -1,   317,
+      -1,   317,   109,   170,   110,    -1,   272,    -1,   234,    -1,
+     235,    -1,   228,    -1,   319,   312,    -1,   320,    -1,   321,
+     312,    -1,   322,   312,    -1,   137,    -1,   109,   319,   110,
+      -1,   149,   318,    -1,   149,   227,   318,    -1,   109,   320,
+     110,    -1,   319,   349,    -1,   109,   320,   110,   349,    -1,
+     109,   321,   110,   350,    -1,   109,   321,   110,    -1,   109,
+     320,   110,   109,   134,   264,   135,   110,    -1,   109,   322,
+     110,    -1,   324,   312,    -1,   325,    -1,   326,   312,    -1,
+     319,   109,   134,   264,   135,   110,    -1,   109,   325,   110,
+     109,   134,   264,   135,   110,    -1,   109,   324,   110,    -1,
+     149,   323,    -1,   149,   227,   323,    -1,   109,   325,   110,
+      -1,   109,   325,   110,   349,    -1,   109,   326,   110,   350,
+      -1,   109,   326,   110,    -1,   328,    -1,   329,    -1,   330,
+      -1,   319,   109,   271,   110,    -1,   109,   329,   110,   109,
+     271,   110,    -1,   109,   328,   110,    -1,   149,   327,    -1,
+     149,   227,   327,    -1,   109,   329,   110,    -1,   109,   329,
+     110,   349,    -1,   109,   330,   110,   350,    -1,   109,   330,
+     110,    -1,   332,   312,    -1,   333,    -1,   334,   312,    -1,
+     335,   312,    -1,   341,    -1,   109,   332,   110,    -1,   149,
+     331,    -1,   149,   227,   331,    -1,   109,   333,   110,    -1,
+     332,   349,    -1,   109,   333,   110,   349,    -1,   109,   334,
+     110,   350,    -1,   109,   334,   110,    -1,   332,   109,   134,
+     264,   135,   110,    -1,   109,   333,   110,   109,   134,   264,
+     135,   110,    -1,   109,   335,   110,    -1,   319,   312,    -1,
+     337,    -1,   338,   312,    -1,   339,   312,    -1,   149,   336,
+      -1,   149,   227,   336,    -1,   109,   337,   110,    -1,   319,
+     355,    -1,   109,   337,   110,   349,    -1,   109,   338,   110,
+     350,    -1,   109,   338,   110,    -1,   319,   109,   134,   264,
+     135,   110,    -1,   109,   337,   110,   109,   134,   264,   135,
+     110,    -1,   109,   339,   110,    -1,   341,   312,    -1,   342,
+      -1,   343,   312,    -1,   344,   312,    -1,    74,    -1,    75,
+      -1,   149,   340,    -1,   149,   227,   340,    -1,   109,   342,
+     110,    -1,   341,   355,    -1,   109,   342,   110,   355,    -1,
+     341,   109,   134,   264,   135,   110,    -1,   109,   342,   110,
+     109,   134,   264,   135,   110,    -1,   346,    -1,   347,   312,
+      -1,   348,   312,    -1,   149,    -1,   149,   227,    -1,   149,
+     345,    -1,   149,   227,   345,    -1,   109,   346,   110,    -1,
+     349,    -1,   109,   346,   110,   349,    -1,   109,   347,   110,
+     350,    -1,   109,   347,   110,    -1,   109,   134,   264,   135,
+     110,    -1,   109,   346,   110,   109,   134,   264,   135,   110,
+      -1,   109,   348,   110,    -1,   111,   112,    -1,   111,   112,
+     350,    -1,   350,    -1,   111,   134,   164,   135,   112,    -1,
+     111,   134,   118,   135,   112,    -1,   350,   111,   134,   164,
+     135,   112,    -1,   350,   111,   134,   118,   135,   112,    -1,
+     352,    -1,   353,   312,    -1,   354,   312,    -1,   149,    -1,
+     149,   227,    -1,   149,   351,    -1,   149,   227,   351,    -1,
+     109,   352,   110,    -1,   355,    -1,   109,   352,   110,   355,
+      -1,   109,   353,   110,   350,    -1,   109,   353,   110,    -1,
+     109,   134,   264,   135,   110,    -1,   109,   352,   110,   109,
+     134,   264,   135,   110,    -1,   109,   354,   110,    -1,   356,
+      -1,   356,   350,    -1,   350,    -1,   111,   112,    -1,   111,
+     134,   227,   118,   135,   112,    -1,   111,   134,   227,   135,
+     112,    -1,   111,   134,   227,   164,   135,   112,    -1,   111,
+     134,     7,   226,   164,   135,   112,    -1,   111,   134,   227,
+       7,   164,   135,   112,    -1,   358,    -1,   359,   312,    -1,
+     360,   312,    -1,   149,    -1,   149,   227,    -1,   149,   357,
+      -1,   149,   227,   357,    -1,   109,   358,   110,    -1,   349,
+      -1,   109,   358,   110,   349,    -1,   109,   359,   110,   350,
+      -1,   109,   359,   110,    -1,   109,   358,   110,   109,   134,
+     264,   135,   110,    -1,   109,   360,   110,    -1,   362,    -1,
+     370,    -1,   227,   370,    -1,   363,    -1,   364,    -1,   149,
+     225,    -1,   227,   149,   225,    -1,   149,   371,    -1,   227,
+     149,   371,    -1,   149,   361,    -1,   227,   149,   361,    -1,
+     111,   112,   225,    -1,   365,   225,    -1,   111,   112,   350,
+     225,    -1,   365,   350,   225,    -1,   350,   225,    -1,   111,
+     112,   363,    -1,   365,   363,    -1,   111,   112,   350,   363,
+      -1,   365,   350,   363,    -1,   350,   363,    -1,   111,   134,
+     227,   118,   135,   112,    -1,   111,   134,   227,   164,   135,
+     112,    -1,   111,   134,   231,   164,   135,   112,    -1,   111,
+     134,   231,   227,   164,   135,   112,    -1,   370,    -1,   227,
+     370,    -1,   367,    -1,   368,    -1,   369,    -1,   149,   225,
+      -1,   227,   149,   225,    -1,   149,   371,    -1,   227,   149,
+     371,    -1,   149,   366,    -1,   227,   149,   366,    -1,   111,
+     112,   225,    -1,   111,   112,   350,   225,    -1,   350,   225,
+      -1,   111,   112,   368,    -1,   111,   112,   350,   368,    -1,
+     350,   368,    -1,   111,   134,   263,   135,   112,    -1,   111,
+     112,   109,   260,   110,    -1,   370,   109,   134,   260,   135,
+     110,    -1,   218,   109,   134,   260,   135,   110,    -1,    -1,
+     116,    -1,    -1,   131,   164,    -1
 };
 
@@ -1018,80 +1016,80 @@
 static const yytype_uint16 yyrline[] =
 {
-       0,   292,   292,   298,   307,   308,   309,   313,   314,   315,
-     319,   320,   324,   325,   329,   330,   334,   335,   341,   343,
-     345,   347,   352,   353,   359,   363,   365,   366,   368,   369,
-     371,   373,   375,   383,   384,   390,   391,   392,   397,   399,
-     404,   405,   409,   413,   415,   417,   419,   424,   427,   429,
-     431,   433,   438,   440,   442,   444,   446,   448,   450,   452,
-     454,   456,   458,   460,   465,   466,   470,   471,   472,   473,
-     477,   478,   480,   485,   486,   488,   490,   495,   496,   498,
-     503,   504,   506,   511,   512,   514,   516,   518,   523,   524,
-     526,   531,   532,   537,   538,   543,   544,   549,   550,   555,
-     556,   561,   562,   564,   566,   571,   576,   577,   579,   581,
-     583,   589,   590,   596,   598,   600,   602,   607,   608,   613,
-     614,   615,   616,   617,   618,   619,   620,   621,   622,   626,
-     627,   633,   634,   640,   641,   642,   643,   644,   645,   646,
-     647,   648,   657,   664,   666,   676,   677,   682,   684,   686,
-     688,   692,   693,   698,   703,   706,   708,   710,   715,   717,
-     725,   726,   728,   732,   733,   738,   739,   744,   745,   749,
-     754,   755,   759,   761,   767,   768,   772,   774,   776,   778,
-     784,   785,   789,   790,   794,   796,   798,   803,   805,   810,
-     812,   816,   819,   823,   826,   830,   832,   836,   838,   845,
-     847,   849,   858,   860,   862,   864,   866,   871,   873,   875,
-     877,   882,   895,   896,   901,   903,   908,   912,   914,   916,
-     918,   920,   926,   927,   933,   934,   938,   939,   944,   946,
-     952,   953,   955,   960,   962,   969,   971,   975,   976,   981,
-     983,   987,   988,   992,   994,   998,   999,  1003,  1004,  1008,
-    1009,  1024,  1025,  1026,  1027,  1028,  1032,  1037,  1044,  1054,
-    1059,  1064,  1072,  1077,  1082,  1087,  1092,  1100,  1122,  1127,
-    1134,  1136,  1143,  1148,  1153,  1164,  1169,  1174,  1179,  1184,
-    1193,  1198,  1206,  1207,  1208,  1209,  1215,  1220,  1228,  1229,
-    1230,  1231,  1235,  1236,  1237,  1238,  1243,  1244,  1253,  1254,
-    1259,  1260,  1265,  1267,  1269,  1271,  1273,  1276,  1275,  1287,
-    1288,  1290,  1300,  1301,  1306,  1310,  1312,  1314,  1316,  1318,
-    1320,  1322,  1324,  1329,  1331,  1333,  1335,  1337,  1339,  1341,
-    1343,  1345,  1347,  1349,  1351,  1353,  1359,  1360,  1362,  1364,
-    1366,  1371,  1372,  1378,  1379,  1381,  1383,  1388,  1390,  1392,
-    1394,  1399,  1400,  1402,  1404,  1409,  1410,  1412,  1417,  1418,
-    1420,  1422,  1427,  1429,  1431,  1436,  1437,  1441,  1443,  1449,
-    1448,  1452,  1454,  1459,  1461,  1466,  1468,  1473,  1474,  1476,
-    1477,  1482,  1483,  1485,  1487,  1492,  1494,  1500,  1501,  1503,
-    1506,  1509,  1514,  1515,  1520,  1525,  1529,  1531,  1537,  1536,
-    1543,  1545,  1551,  1552,  1560,  1561,  1565,  1566,  1567,  1569,
-    1571,  1578,  1579,  1581,  1583,  1588,  1589,  1595,  1596,  1600,
-    1601,  1606,  1607,  1608,  1610,  1618,  1619,  1621,  1624,  1626,
-    1630,  1631,  1632,  1634,  1636,  1640,  1645,  1653,  1654,  1663,
-    1665,  1670,  1671,  1672,  1676,  1677,  1678,  1682,  1683,  1684,
-    1688,  1689,  1690,  1695,  1696,  1697,  1698,  1704,  1705,  1707,
-    1712,  1713,  1718,  1719,  1720,  1721,  1722,  1737,  1738,  1743,
-    1744,  1752,  1754,  1756,  1759,  1761,  1763,  1786,  1787,  1789,
-    1791,  1796,  1797,  1799,  1804,  1809,  1810,  1816,  1815,  1819,
-    1823,  1825,  1827,  1833,  1834,  1839,  1844,  1846,  1851,  1853,
-    1854,  1856,  1861,  1863,  1865,  1870,  1872,  1877,  1882,  1890,
-    1896,  1895,  1909,  1910,  1915,  1916,  1920,  1925,  1930,  1938,
-    1943,  1954,  1955,  1966,  1967,  1973,  1974,  1978,  1979,  1980,
-    1983,  1982,  1993,  1998,  2003,  2009,  2018,  2024,  2030,  2036,
-    2042,  2050,  2056,  2064,  2070,  2079,  2080,  2081,  2085,  2089,
-    2091,  2096,  2097,  2101,  2102,  2107,  2113,  2114,  2117,  2119,
-    2120,  2124,  2125,  2126,  2127,  2161,  2163,  2164,  2166,  2171,
-    2176,  2181,  2183,  2185,  2190,  2192,  2194,  2196,  2201,  2203,
-    2213,  2215,  2216,  2221,  2223,  2225,  2230,  2232,  2234,  2239,
-    2241,  2243,  2252,  2253,  2254,  2258,  2260,  2262,  2267,  2269,
-    2271,  2276,  2278,  2280,  2295,  2297,  2298,  2300,  2305,  2306,
-    2311,  2313,  2315,  2320,  2322,  2324,  2326,  2331,  2333,  2335,
-    2345,  2347,  2348,  2350,  2355,  2357,  2359,  2364,  2366,  2368,
-    2370,  2375,  2377,  2379,  2410,  2412,  2413,  2415,  2420,  2425,
-    2433,  2435,  2437,  2442,  2444,  2449,  2451,  2465,  2466,  2468,
-    2473,  2475,  2477,  2479,  2481,  2486,  2487,  2489,  2491,  2496,
-    2498,  2500,  2506,  2508,  2510,  2514,  2516,  2518,  2520,  2534,
-    2535,  2537,  2542,  2544,  2546,  2548,  2550,  2555,  2556,  2558,
-    2560,  2565,  2567,  2569,  2575,  2576,  2578,  2587,  2590,  2592,
-    2595,  2597,  2599,  2612,  2613,  2615,  2620,  2622,  2624,  2626,
-    2628,  2633,  2634,  2636,  2638,  2643,  2645,  2653,  2654,  2655,
-    2660,  2661,  2665,  2667,  2669,  2671,  2673,  2675,  2682,  2684,
-    2686,  2688,  2690,  2692,  2694,  2696,  2698,  2700,  2705,  2707,
-    2709,  2714,  2740,  2741,  2743,  2747,  2748,  2752,  2754,  2756,
-    2758,  2760,  2762,  2769,  2771,  2773,  2775,  2777,  2779,  2784,
-    2789,  2791,  2793,  2811,  2813,  2818,  2819
+       0,   290,   290,   296,   305,   306,   307,   311,   312,   313,
+     317,   318,   322,   323,   327,   328,   332,   333,   339,   341,
+     343,   345,   350,   351,   357,   361,   363,   364,   366,   367,
+     369,   371,   373,   381,   382,   388,   389,   390,   395,   397,
+     402,   403,   407,   411,   413,   415,   417,   422,   425,   427,
+     429,   431,   436,   438,   440,   442,   444,   446,   448,   450,
+     452,   454,   456,   458,   463,   464,   468,   469,   470,   471,
+     475,   476,   478,   483,   484,   486,   488,   493,   494,   496,
+     501,   502,   504,   509,   510,   512,   514,   516,   521,   522,
+     524,   529,   530,   535,   536,   541,   542,   547,   548,   553,
+     554,   559,   560,   562,   564,   569,   574,   575,   577,   579,
+     585,   586,   592,   594,   596,   598,   603,   604,   609,   610,
+     611,   612,   613,   614,   615,   616,   617,   618,   622,   623,
+     629,   630,   636,   637,   638,   639,   640,   641,   642,   643,
+     644,   653,   660,   662,   672,   673,   678,   680,   682,   684,
+     688,   689,   694,   699,   702,   704,   706,   711,   713,   721,
+     722,   724,   728,   729,   734,   735,   740,   741,   745,   750,
+     751,   755,   757,   763,   764,   768,   770,   772,   774,   780,
+     781,   785,   786,   790,   792,   794,   799,   801,   806,   808,
+     812,   815,   819,   822,   826,   828,   832,   834,   841,   843,
+     845,   854,   856,   858,   860,   862,   867,   869,   871,   873,
+     878,   891,   892,   897,   899,   904,   908,   910,   912,   914,
+     916,   922,   923,   929,   930,   934,   935,   940,   942,   948,
+     949,   951,   956,   958,   965,   967,   971,   972,   977,   979,
+     983,   984,   988,   990,   994,   995,   999,  1000,  1004,  1005,
+    1020,  1021,  1022,  1023,  1024,  1028,  1033,  1040,  1050,  1055,
+    1060,  1068,  1073,  1078,  1083,  1088,  1096,  1118,  1123,  1130,
+    1132,  1139,  1144,  1149,  1160,  1165,  1170,  1175,  1180,  1189,
+    1194,  1202,  1203,  1204,  1205,  1211,  1216,  1224,  1225,  1226,
+    1227,  1231,  1232,  1233,  1234,  1239,  1240,  1249,  1250,  1255,
+    1256,  1261,  1263,  1265,  1267,  1269,  1272,  1271,  1283,  1284,
+    1286,  1296,  1297,  1302,  1306,  1308,  1310,  1312,  1314,  1316,
+    1318,  1320,  1325,  1327,  1329,  1331,  1333,  1335,  1337,  1339,
+    1341,  1343,  1345,  1347,  1349,  1355,  1356,  1358,  1360,  1362,
+    1367,  1368,  1374,  1375,  1377,  1379,  1384,  1386,  1388,  1390,
+    1395,  1396,  1398,  1400,  1405,  1406,  1408,  1413,  1414,  1416,
+    1418,  1423,  1425,  1427,  1432,  1433,  1437,  1439,  1445,  1444,
+    1448,  1450,  1455,  1457,  1462,  1464,  1469,  1470,  1472,  1473,
+    1478,  1479,  1481,  1483,  1488,  1490,  1496,  1497,  1499,  1502,
+    1505,  1510,  1511,  1516,  1521,  1525,  1527,  1533,  1532,  1539,
+    1541,  1547,  1548,  1556,  1557,  1561,  1562,  1563,  1565,  1567,
+    1574,  1575,  1577,  1579,  1584,  1585,  1591,  1592,  1596,  1597,
+    1602,  1603,  1604,  1606,  1614,  1615,  1617,  1620,  1622,  1626,
+    1627,  1628,  1630,  1632,  1636,  1641,  1649,  1650,  1659,  1661,
+    1666,  1667,  1668,  1672,  1673,  1674,  1678,  1679,  1680,  1684,
+    1685,  1686,  1691,  1692,  1693,  1694,  1700,  1701,  1703,  1708,
+    1709,  1714,  1715,  1716,  1717,  1718,  1733,  1734,  1739,  1740,
+    1748,  1750,  1752,  1755,  1757,  1759,  1782,  1783,  1785,  1787,
+    1792,  1793,  1795,  1800,  1805,  1806,  1812,  1811,  1815,  1819,
+    1821,  1823,  1829,  1830,  1835,  1840,  1842,  1847,  1849,  1850,
+    1852,  1857,  1859,  1861,  1866,  1868,  1873,  1878,  1886,  1892,
+    1891,  1905,  1906,  1911,  1912,  1916,  1921,  1926,  1934,  1939,
+    1950,  1951,  1962,  1963,  1969,  1970,  1974,  1975,  1976,  1979,
+    1978,  1989,  1994,  1999,  2005,  2014,  2020,  2026,  2032,  2038,
+    2046,  2052,  2060,  2066,  2075,  2076,  2077,  2081,  2085,  2087,
+    2092,  2093,  2097,  2098,  2103,  2109,  2110,  2113,  2115,  2116,
+    2120,  2121,  2122,  2123,  2157,  2159,  2160,  2162,  2167,  2172,
+    2177,  2179,  2181,  2186,  2188,  2190,  2192,  2197,  2199,  2209,
+    2211,  2212,  2217,  2219,  2221,  2226,  2228,  2230,  2235,  2237,
+    2239,  2248,  2249,  2250,  2254,  2256,  2258,  2263,  2265,  2267,
+    2272,  2274,  2276,  2291,  2293,  2294,  2296,  2301,  2302,  2307,
+    2309,  2311,  2316,  2318,  2320,  2322,  2327,  2329,  2331,  2341,
+    2343,  2344,  2346,  2351,  2353,  2355,  2360,  2362,  2364,  2366,
+    2371,  2373,  2375,  2406,  2408,  2409,  2411,  2416,  2421,  2429,
+    2431,  2433,  2438,  2440,  2445,  2447,  2461,  2462,  2464,  2469,
+    2471,  2473,  2475,  2477,  2482,  2483,  2485,  2487,  2492,  2494,
+    2496,  2502,  2504,  2506,  2510,  2512,  2514,  2516,  2530,  2531,
+    2533,  2538,  2540,  2542,  2544,  2546,  2551,  2552,  2554,  2556,
+    2561,  2563,  2565,  2571,  2572,  2574,  2583,  2586,  2588,  2591,
+    2593,  2595,  2608,  2609,  2611,  2616,  2618,  2620,  2622,  2624,
+    2629,  2630,  2632,  2634,  2639,  2641,  2649,  2650,  2651,  2656,
+    2657,  2661,  2663,  2665,  2667,  2669,  2671,  2678,  2680,  2682,
+    2684,  2686,  2688,  2690,  2692,  2694,  2696,  2701,  2703,  2705,
+    2710,  2736,  2737,  2739,  2743,  2744,  2748,  2750,  2752,  2754,
+    2756,  2758,  2765,  2767,  2769,  2771,  2773,  2775,  2780,  2785,
+    2787,  2789,  2807,  2809,  2814,  2815
 };
 #endif
@@ -1118,8 +1116,8 @@
   "GE", "EQ", "NE", "ANDAND", "OROR", "ELLIPSIS", "MULTassign",
   "DIVassign", "MODassign", "PLUSassign", "MINUSassign", "LSassign",
-  "RSassign", "ANDassign", "ERassign", "ORassign", "ATassign", "REFassign",
-  "THEN", "'('", "')'", "'['", "']'", "'.'", "'{'", "'}'", "','", "':'",
-  "'*'", "'&'", "'+'", "'-'", "'!'", "'~'", "'/'", "'%'", "'<'", "'>'",
-  "'^'", "'|'", "'?'", "'='", "';'", "$accept", "push", "pop", "constant",
+  "RSassign", "ANDassign", "ERassign", "ORassign", "ATassign", "THEN",
+  "'('", "')'", "'['", "']'", "'.'", "'{'", "'}'", "','", "':'", "'*'",
+  "'&'", "'+'", "'-'", "'!'", "'~'", "'/'", "'%'", "'<'", "'>'", "'^'",
+  "'|'", "'?'", "'='", "';'", "$accept", "push", "pop", "constant",
   "identifier", "no_01_identifier", "no_attr_identifier", "zero_one",
   "string_literal_list", "primary_expression", "postfix_expression",
@@ -1225,8 +1223,8 @@
      335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-      40,    41,    91,    93,    46,   123,   125,    44,    58,    42,
-      38,    43,    45,    33,   126,    47,    37,    60,    62,    94,
-     124,    63,    61,    59
+     355,   356,   357,   358,   359,   360,   361,   362,   363,    40,
+      41,    91,    93,    46,   123,   125,    44,    58,    42,    38,
+      43,    45,    33,   126,    47,    37,    60,    62,    94,   124,
+      63,    61,    59
 };
 # endif
@@ -1235,80 +1233,80 @@
 static const yytype_uint16 yyr1[] =
 {
-       0,   134,   135,   136,   137,   137,   137,   138,   138,   138,
-     139,   139,   140,   140,   141,   141,   142,   142,   143,   143,
-     143,   143,   144,   144,   144,   144,   144,   144,   144,   144,
-     144,   144,   144,   145,   145,   146,   146,   146,   146,   146,
-     147,   147,   148,   148,   148,   148,   148,   149,   149,   149,
-     149,   149,   149,   149,   149,   149,   149,   149,   149,   149,
-     149,   149,   149,   149,   150,   150,   151,   151,   151,   151,
-     152,   152,   152,   153,   153,   153,   153,   154,   154,   154,
-     155,   155,   155,   156,   156,   156,   156,   156,   157,   157,
-     157,   158,   158,   159,   159,   160,   160,   161,   161,   162,
-     162,   163,   163,   163,   163,   164,   165,   165,   165,   165,
-     165,   166,   166,   167,   167,   167,   167,   168,   168,   169,
-     169,   169,   169,   169,   169,   169,   169,   169,   169,   170,
-     170,   171,   171,   172,   172,   172,   172,   172,   172,   172,
-     172,   172,   173,   174,   174,   175,   175,   176,   176,   176,
-     176,   177,   177,   178,   179,   179,   179,   179,   179,   179,
-     180,   180,   180,   181,   181,   182,   182,   183,   183,   184,
-     185,   185,   186,   186,   187,   187,   188,   188,   188,   188,
-     189,   189,   190,   190,   191,   191,   191,   192,   192,   193,
-     193,   193,   193,   193,   193,   193,   193,   193,   193,   194,
-     194,   194,   195,   195,   195,   195,   195,   196,   196,   196,
-     196,   197,   198,   198,   198,   198,   198,   199,   199,   199,
-     199,   199,   200,   200,   201,   201,   202,   202,   203,   203,
-     204,   204,   204,   205,   205,   206,   206,   207,   207,   208,
-     208,   209,   209,   210,   210,   211,   211,   212,   212,   213,
-     213,   214,   214,   214,   214,   214,   215,   215,   215,   216,
-     216,   216,   217,   217,   217,   217,   217,   218,   218,   218,
-     219,   219,   220,   220,   220,   221,   221,   221,   221,   221,
-     222,   222,   223,   223,   223,   223,   224,   224,   225,   225,
-     225,   225,   226,   226,   226,   226,   227,   227,   228,   228,
-     229,   229,   230,   230,   230,   230,   230,   231,   230,   232,
-     232,   232,   233,   233,   234,   235,   235,   235,   235,   235,
-     235,   235,   235,   236,   236,   236,   236,   236,   236,   236,
-     236,   236,   236,   236,   236,   236,   237,   237,   237,   237,
-     237,   238,   238,   239,   239,   239,   239,   240,   240,   240,
-     240,   241,   241,   241,   241,   242,   242,   242,   243,   243,
-     243,   243,   244,   244,   244,   245,   245,   246,   246,   247,
-     246,   246,   246,   248,   248,   249,   249,   250,   250,   250,
-     250,   251,   251,   251,   251,   252,   252,   253,   253,   253,
-     253,   253,   254,   254,   255,   256,   257,   257,   258,   257,
-     259,   259,   260,   260,   261,   261,   262,   262,   262,   262,
-     262,   263,   263,   263,   263,   264,   264,   265,   265,   266,
-     266,   267,   267,   267,   267,   268,   268,   268,   268,   268,
-     269,   269,   269,   269,   269,   270,   270,   271,   271,   272,
-     272,   273,   273,   273,   274,   274,   274,   275,   275,   275,
-     276,   276,   276,   277,   277,   277,   277,   278,   278,   278,
-     279,   279,   280,   280,   280,   280,   280,   281,   281,   282,
-     282,   283,   283,   283,   283,   283,   283,   284,   284,   284,
-     284,   285,   285,   285,   286,   287,   287,   289,   288,   288,
-     290,   290,   290,   291,   291,   292,   292,   292,   293,   293,
-     293,   293,   294,   294,   294,   295,   295,   296,   296,   297,
-     298,   297,   299,   299,   300,   300,   301,   301,   301,   302,
-     302,   303,   303,   304,   304,   305,   305,   306,   306,   306,
-     307,   306,   306,   308,   308,   308,   309,   309,   309,   309,
-     309,   309,   309,   309,   309,   310,   310,   310,   311,   312,
-     312,   313,   313,   314,   314,   315,   316,   316,   317,   317,
-     317,   318,   318,   318,   318,   319,   319,   319,   319,   320,
-     320,   321,   321,   321,   322,   322,   322,   322,   323,   323,
-     324,   324,   324,   325,   325,   325,   326,   326,   326,   327,
-     327,   327,   328,   328,   328,   329,   329,   329,   330,   330,
-     330,   331,   331,   331,   332,   332,   332,   332,   333,   333,
-     334,   334,   334,   335,   335,   335,   335,   336,   336,   336,
-     337,   337,   337,   337,   338,   338,   338,   339,   339,   339,
-     339,   340,   340,   340,   341,   341,   341,   341,   342,   342,
-     343,   343,   343,   344,   344,   345,   345,   346,   346,   346,
-     347,   347,   347,   347,   347,   348,   348,   348,   348,   349,
-     349,   349,   350,   350,   350,   351,   351,   351,   351,   352,
-     352,   352,   353,   353,   353,   353,   353,   354,   354,   354,
-     354,   355,   355,   355,   356,   356,   356,   357,   357,   357,
-     357,   357,   357,   358,   358,   358,   359,   359,   359,   359,
-     359,   360,   360,   360,   360,   361,   361,   362,   362,   362,
-     363,   363,   364,   364,   364,   364,   364,   364,   365,   365,
-     365,   365,   365,   365,   365,   365,   365,   365,   366,   366,
-     366,   366,   367,   367,   367,   368,   368,   369,   369,   369,
-     369,   369,   369,   370,   370,   370,   370,   370,   370,   371,
-     372,   372,   372,   373,   373,   374,   374
+       0,   133,   134,   135,   136,   136,   136,   137,   137,   137,
+     138,   138,   139,   139,   140,   140,   141,   141,   142,   142,
+     142,   142,   143,   143,   143,   143,   143,   143,   143,   143,
+     143,   143,   143,   144,   144,   145,   145,   145,   145,   145,
+     146,   146,   147,   147,   147,   147,   147,   148,   148,   148,
+     148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
+     148,   148,   148,   148,   149,   149,   150,   150,   150,   150,
+     151,   151,   151,   152,   152,   152,   152,   153,   153,   153,
+     154,   154,   154,   155,   155,   155,   155,   155,   156,   156,
+     156,   157,   157,   158,   158,   159,   159,   160,   160,   161,
+     161,   162,   162,   162,   162,   163,   164,   164,   164,   164,
+     165,   165,   166,   166,   166,   166,   167,   167,   168,   168,
+     168,   168,   168,   168,   168,   168,   168,   168,   169,   169,
+     170,   170,   171,   171,   171,   171,   171,   171,   171,   171,
+     171,   172,   173,   173,   174,   174,   175,   175,   175,   175,
+     176,   176,   177,   178,   178,   178,   178,   178,   178,   179,
+     179,   179,   180,   180,   181,   181,   182,   182,   183,   184,
+     184,   185,   185,   186,   186,   187,   187,   187,   187,   188,
+     188,   189,   189,   190,   190,   190,   191,   191,   192,   192,
+     192,   192,   192,   192,   192,   192,   192,   192,   193,   193,
+     193,   194,   194,   194,   194,   194,   195,   195,   195,   195,
+     196,   197,   197,   197,   197,   197,   198,   198,   198,   198,
+     198,   199,   199,   200,   200,   201,   201,   202,   202,   203,
+     203,   203,   204,   204,   205,   205,   206,   206,   207,   207,
+     208,   208,   209,   209,   210,   210,   211,   211,   212,   212,
+     213,   213,   213,   213,   213,   214,   214,   214,   215,   215,
+     215,   216,   216,   216,   216,   216,   217,   217,   217,   218,
+     218,   219,   219,   219,   220,   220,   220,   220,   220,   221,
+     221,   222,   222,   222,   222,   223,   223,   224,   224,   224,
+     224,   225,   225,   225,   225,   226,   226,   227,   227,   228,
+     228,   229,   229,   229,   229,   229,   230,   229,   231,   231,
+     231,   232,   232,   233,   234,   234,   234,   234,   234,   234,
+     234,   234,   235,   235,   235,   235,   235,   235,   235,   235,
+     235,   235,   235,   235,   235,   236,   236,   236,   236,   236,
+     237,   237,   238,   238,   238,   238,   239,   239,   239,   239,
+     240,   240,   240,   240,   241,   241,   241,   242,   242,   242,
+     242,   243,   243,   243,   244,   244,   245,   245,   246,   245,
+     245,   245,   247,   247,   248,   248,   249,   249,   249,   249,
+     250,   250,   250,   250,   251,   251,   252,   252,   252,   252,
+     252,   253,   253,   254,   255,   256,   256,   257,   256,   258,
+     258,   259,   259,   260,   260,   261,   261,   261,   261,   261,
+     262,   262,   262,   262,   263,   263,   264,   264,   265,   265,
+     266,   266,   266,   266,   267,   267,   267,   267,   267,   268,
+     268,   268,   268,   268,   269,   269,   270,   270,   271,   271,
+     272,   272,   272,   273,   273,   273,   274,   274,   274,   275,
+     275,   275,   276,   276,   276,   276,   277,   277,   277,   278,
+     278,   279,   279,   279,   279,   279,   280,   280,   281,   281,
+     282,   282,   282,   282,   282,   282,   283,   283,   283,   283,
+     284,   284,   284,   285,   286,   286,   288,   287,   287,   289,
+     289,   289,   290,   290,   291,   291,   291,   292,   292,   292,
+     292,   293,   293,   293,   294,   294,   295,   295,   296,   297,
+     296,   298,   298,   299,   299,   300,   300,   300,   301,   301,
+     302,   302,   303,   303,   304,   304,   305,   305,   305,   306,
+     305,   305,   307,   307,   307,   308,   308,   308,   308,   308,
+     308,   308,   308,   308,   309,   309,   309,   310,   311,   311,
+     312,   312,   313,   313,   314,   315,   315,   316,   316,   316,
+     317,   317,   317,   317,   318,   318,   318,   318,   319,   319,
+     320,   320,   320,   321,   321,   321,   321,   322,   322,   323,
+     323,   323,   324,   324,   324,   325,   325,   325,   326,   326,
+     326,   327,   327,   327,   328,   328,   328,   329,   329,   329,
+     330,   330,   330,   331,   331,   331,   331,   332,   332,   333,
+     333,   333,   334,   334,   334,   334,   335,   335,   335,   336,
+     336,   336,   336,   337,   337,   337,   338,   338,   338,   338,
+     339,   339,   339,   340,   340,   340,   340,   341,   341,   342,
+     342,   342,   343,   343,   344,   344,   345,   345,   345,   346,
+     346,   346,   346,   346,   347,   347,   347,   347,   348,   348,
+     348,   349,   349,   349,   350,   350,   350,   350,   351,   351,
+     351,   352,   352,   352,   352,   352,   353,   353,   353,   353,
+     354,   354,   354,   355,   355,   355,   356,   356,   356,   356,
+     356,   356,   357,   357,   357,   358,   358,   358,   358,   358,
+     359,   359,   359,   359,   360,   360,   361,   361,   361,   362,
+     362,   363,   363,   363,   363,   363,   363,   364,   364,   364,
+     364,   364,   364,   364,   364,   364,   364,   365,   365,   365,
+     365,   366,   366,   366,   367,   367,   368,   368,   368,   368,
+     368,   368,   369,   369,   369,   369,   369,   369,   370,   371,
+     371,   371,   372,   372,   373,   373
 };
 
@@ -1326,70 +1324,70 @@
        1,     3,     3,     1,     3,     3,     3,     3,     1,     3,
        3,     1,     3,     1,     3,     1,     3,     1,     3,     1,
-       3,     1,     5,     4,     5,     1,     1,     3,     3,     3,
-       2,     0,     1,     2,     5,     6,     7,     1,     3,     1,
+       3,     1,     5,     4,     5,     1,     1,     3,     3,     2,
+       0,     1,     2,     5,     6,     7,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
+       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       6,     4,     2,     7,     1,     3,     1,     2,     1,     2,
+       1,     2,     2,     5,     7,     5,     9,     5,     9,     1,
+       3,     1,     1,     3,     3,     2,     1,     2,     2,     0,
+       1,     2,     3,     0,     1,     2,     3,     3,     4,     0,
+       1,     1,     2,     5,     7,     6,     6,     4,     3,     4,
+       2,     3,     2,     3,     3,     3,     3,     5,     3,     3,
+       4,     1,     5,     6,     5,     6,     9,    10,     9,    10,
+       2,     1,     2,     2,     2,     1,     6,     8,    10,    12,
+      14,     0,     1,     0,     1,     1,     3,     4,     7,     0,
+       1,     3,     1,     3,     1,     1,     1,     3,     1,     1,
+       1,     3,     0,     1,     3,     4,     1,     3,     1,     1,
+       3,     3,     3,     3,     3,     2,     3,     6,     3,     3,
+       4,     1,     2,     2,     3,     5,     8,     7,     7,     5,
+       9,     2,     2,     5,     3,     5,     4,     3,     4,     4,
+       7,     3,     3,     3,     3,     4,     6,     1,     1,     1,
+       1,     1,     1,     1,     1,     0,     1,     1,     2,     1,
+       1,     1,     1,     1,     1,     1,     0,     5,     1,     2,
+       3,     1,     2,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       3,     0,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     6,     4,     2,     7,     1,     3,     1,     2,     1,
-       2,     1,     2,     2,     5,     7,     5,     9,     5,     9,
-       1,     3,     1,     1,     3,     3,     2,     1,     2,     2,
-       0,     1,     2,     3,     0,     1,     2,     3,     3,     4,
-       0,     1,     1,     2,     5,     7,     6,     6,     4,     3,
-       4,     2,     3,     2,     3,     3,     3,     3,     5,     3,
-       3,     4,     1,     5,     6,     5,     6,     9,    10,     9,
-      10,     2,     1,     2,     2,     2,     1,     6,     8,    10,
-      12,    14,     0,     1,     0,     1,     1,     3,     4,     7,
-       0,     1,     3,     1,     3,     1,     1,     1,     3,     1,
-       1,     1,     3,     0,     1,     3,     4,     1,     3,     1,
-       1,     3,     3,     3,     3,     3,     2,     3,     6,     3,
-       3,     4,     1,     2,     2,     3,     5,     8,     7,     7,
-       5,     9,     2,     2,     5,     3,     5,     4,     3,     4,
-       4,     7,     3,     3,     3,     3,     4,     6,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     1,     1,     2,
-       1,     1,     1,     1,     1,     1,     1,     0,     5,     1,
-       2,     3,     1,     2,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     2,     2,     3,     3,
+       1,     3,     1,     2,     2,     2,     4,     4,     4,     4,
+       1,     2,     2,     3,     1,     2,     2,     1,     2,     2,
+       3,     1,     2,     2,     1,     1,     4,     2,     0,     6,
+       7,     2,     2,     2,     1,     2,     2,     3,     2,     3,
+       1,     2,     3,     2,     2,     4,     0,     1,     2,     2,
+       1,     0,     1,     2,     2,     5,     2,     0,     7,     2,
+       4,     0,     2,     0,     1,     1,     1,     5,     5,     5,
+       1,     5,     5,     9,     1,     5,     0,     1,     1,     5,
+       1,     1,     5,     5,     1,     3,     3,     4,     1,     1,
+       1,     1,     2,     1,     3,     3,     1,     2,     1,     3,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     2,     2,     3,
-       3,     1,     3,     1,     2,     2,     2,     4,     4,     4,
-       4,     1,     2,     2,     3,     1,     2,     2,     1,     2,
-       2,     3,     1,     2,     2,     1,     1,     4,     2,     0,
-       6,     7,     2,     2,     2,     1,     2,     2,     3,     2,
-       3,     1,     2,     3,     2,     2,     4,     0,     1,     2,
-       2,     1,     0,     1,     2,     2,     5,     2,     0,     7,
-       2,     4,     0,     2,     0,     1,     1,     1,     5,     5,
-       5,     1,     5,     5,     9,     1,     5,     0,     1,     1,
-       5,     1,     1,     5,     5,     1,     3,     3,     4,     1,
-       1,     1,     1,     2,     1,     3,     3,     1,     2,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     2,     1,     1,     1,     2,     0,     2,     2,
-       1,     4,     0,     1,     2,     3,     4,     2,     2,     1,
-       2,     1,     2,     5,     5,     7,     6,     1,     2,     2,
-       3,     1,     2,     2,     4,     2,     4,     0,     4,     2,
-       1,     1,     1,     0,     2,     5,     5,    13,     1,     1,
-       3,     3,     2,     3,     3,     2,     4,     1,     6,     9,
-       0,    11,     1,     3,     3,     3,     1,     1,     5,     2,
-       5,     0,     1,     1,     3,     0,     1,     1,     1,     1,
-       0,     6,     2,     1,     2,     4,     2,     3,     3,     3,
-       4,     5,     5,     5,     6,     1,     1,     1,     3,     0,
-       5,     0,     1,     1,     2,     6,     1,     3,     0,     1,
-       4,     1,     1,     1,     1,     2,     1,     2,     2,     1,
-       3,     2,     3,     3,     2,     4,     4,     3,     8,     3,
-       2,     1,     2,     6,     8,     3,     2,     3,     3,     4,
-       4,     3,     1,     1,     1,     4,     6,     3,     2,     3,
-       3,     4,     4,     3,     2,     1,     2,     2,     1,     3,
-       2,     3,     3,     2,     4,     4,     3,     6,     8,     3,
-       2,     1,     2,     2,     2,     3,     3,     2,     4,     4,
-       3,     6,     8,     3,     2,     1,     2,     2,     1,     1,
-       2,     3,     3,     2,     4,     6,     8,     1,     2,     2,
-       1,     2,     2,     3,     3,     1,     4,     4,     3,     5,
-       8,     3,     2,     3,     1,     5,     5,     6,     6,     1,
-       2,     2,     1,     2,     2,     3,     3,     1,     4,     4,
-       3,     5,     8,     3,     1,     2,     1,     2,     6,     5,
-       6,     7,     7,     1,     2,     2,     1,     2,     2,     3,
-       3,     1,     4,     4,     3,     8,     3,     1,     1,     2,
-       1,     1,     2,     3,     2,     3,     2,     3,     3,     2,
-       4,     3,     2,     3,     2,     4,     3,     2,     6,     6,
-       6,     7,     1,     2,     1,     1,     1,     2,     3,     2,
-       3,     2,     3,     3,     4,     2,     3,     4,     2,     5,
-       5,     6,     6,     0,     1,     0,     2
+       1,     2,     1,     1,     1,     2,     0,     2,     2,     1,
+       4,     0,     1,     2,     3,     4,     2,     2,     1,     2,
+       1,     2,     5,     5,     7,     6,     1,     2,     2,     3,
+       1,     2,     2,     4,     2,     4,     0,     4,     2,     1,
+       1,     1,     0,     2,     5,     5,    13,     1,     1,     3,
+       3,     2,     3,     3,     2,     4,     1,     6,     9,     0,
+      11,     1,     3,     3,     3,     1,     1,     5,     2,     5,
+       0,     1,     1,     3,     0,     1,     1,     1,     1,     0,
+       6,     2,     1,     2,     4,     2,     3,     3,     3,     4,
+       5,     5,     5,     6,     1,     1,     1,     3,     0,     5,
+       0,     1,     1,     2,     6,     1,     3,     0,     1,     4,
+       1,     1,     1,     1,     2,     1,     2,     2,     1,     3,
+       2,     3,     3,     2,     4,     4,     3,     8,     3,     2,
+       1,     2,     6,     8,     3,     2,     3,     3,     4,     4,
+       3,     1,     1,     1,     4,     6,     3,     2,     3,     3,
+       4,     4,     3,     2,     1,     2,     2,     1,     3,     2,
+       3,     3,     2,     4,     4,     3,     6,     8,     3,     2,
+       1,     2,     2,     2,     3,     3,     2,     4,     4,     3,
+       6,     8,     3,     2,     1,     2,     2,     1,     1,     2,
+       3,     3,     2,     4,     6,     8,     1,     2,     2,     1,
+       2,     2,     3,     3,     1,     4,     4,     3,     5,     8,
+       3,     2,     3,     1,     5,     5,     6,     6,     1,     2,
+       2,     1,     2,     2,     3,     3,     1,     4,     4,     3,
+       5,     8,     3,     1,     2,     1,     2,     6,     5,     6,
+       7,     7,     1,     2,     2,     1,     2,     2,     3,     3,
+       1,     4,     4,     3,     8,     3,     1,     1,     2,     1,
+       1,     2,     3,     2,     3,     2,     3,     3,     2,     4,
+       3,     2,     3,     2,     4,     3,     2,     6,     6,     6,
+       7,     1,     2,     1,     1,     1,     2,     3,     2,     3,
+       2,     3,     3,     4,     2,     3,     4,     2,     5,     5,
+       6,     6,     0,     1,     0,     2
 };
 
@@ -1399,163 +1397,163 @@
 static const yytype_uint16 yydefact[] =
 {
-     296,   296,   317,   315,   318,   316,   319,   320,   302,   304,
-     303,     0,   305,   331,   323,   328,   326,   327,   325,   324,
-     329,   330,   335,   332,   333,   334,   551,   551,   551,     0,
-       0,     0,   296,   222,   306,   321,   322,     7,   362,     0,
-       8,    14,    15,     0,     2,    64,    65,   569,     9,   296,
-     529,   527,   249,     3,   457,     3,   262,     0,     3,     3,
-       3,   250,     3,     0,     0,     0,   297,   298,   300,   296,
-     309,   312,   314,   343,   288,   336,   341,   289,   351,   290,
-     358,   355,   365,     0,     0,   366,   291,   477,   481,     3,
-       3,     0,     2,   523,   528,   533,   301,     0,     0,   551,
-     581,   551,     2,   592,   593,   594,   296,     0,   735,   736,
-       0,    12,     0,    13,   296,   272,   273,     0,   297,   292,
-     293,   294,   295,   530,   307,   395,   552,   553,   373,   374,
-      12,   448,   449,    11,   444,   447,     0,   507,   502,   493,
-     448,   449,     0,     0,   532,   223,     0,   296,     0,     0,
-       0,     0,     0,     0,     0,     0,   296,   296,     2,     0,
-     737,   297,   586,   598,   741,   734,   732,   739,     0,     0,
-       0,   256,     2,     0,   536,   442,   443,   441,     0,     0,
-       0,     0,   551,     0,   638,   639,     0,     0,   549,   545,
-     551,   566,   551,   551,   546,     2,   547,   551,   605,   551,
-     551,   608,     0,     0,     0,   296,   296,   315,   363,     2,
-     296,   263,   299,   310,   344,   356,   482,     0,     2,     0,
-     457,   264,   297,   337,   352,   359,   478,     0,     2,     0,
-     313,   338,   345,   346,     0,   353,   357,   360,   364,   449,
-     296,   296,   368,   372,     0,   397,   479,   483,     0,     0,
-       0,     1,   296,     2,   534,   580,   582,   296,     2,   745,
-     297,   748,   549,   549,     0,   297,     0,     0,   275,   551,
-     546,     2,   296,     0,     0,   296,   554,     2,   505,     2,
-     558,     0,     0,     0,     0,     0,     0,    18,    58,     4,
-       5,     6,    16,     0,     0,     0,   296,     2,    66,    67,
-      68,    69,    48,    19,    49,    22,    47,    70,   296,     0,
+     295,   295,   316,   314,   317,   315,   318,   319,   301,   303,
+     302,     0,   304,   330,   322,   327,   325,   326,   324,   323,
+     328,   329,   334,   331,   332,   333,   550,   550,   550,     0,
+       0,     0,   295,   221,   305,   320,   321,     7,   361,     0,
+       8,    14,    15,     0,     2,    64,    65,   568,     9,   295,
+     528,   526,   248,     3,   456,     3,   261,     0,     3,     3,
+       3,   249,     3,     0,     0,     0,   296,   297,   299,   295,
+     308,   311,   313,   342,   287,   335,   340,   288,   350,   289,
+     357,   354,   364,     0,     0,   365,   290,   476,   480,     3,
+       3,     0,     2,   522,   527,   532,   300,     0,     0,   550,
+     580,   550,     2,   591,   592,   593,   295,     0,   734,   735,
+       0,    12,     0,    13,   295,   271,   272,     0,   296,   291,
+     292,   293,   294,   529,   306,   394,   551,   552,   372,   373,
+      12,   447,   448,    11,   443,   446,     0,   506,   501,   492,
+     447,   448,     0,     0,   531,   222,     0,   295,     0,     0,
+       0,     0,     0,     0,     0,     0,   295,   295,     2,     0,
+     736,   296,   585,   597,   740,   733,   731,   738,     0,     0,
+       0,   255,     2,     0,   535,   441,   442,   440,     0,     0,
+       0,     0,   550,     0,   637,   638,     0,     0,   548,   544,
+     550,   565,   550,   550,   545,     2,   546,   550,   604,   550,
+     550,   607,     0,     0,     0,   295,   295,   314,   362,     2,
+     295,   262,   298,   309,   343,   355,   481,     0,     2,     0,
+     456,   263,   296,   336,   351,   358,   477,     0,     2,     0,
+     312,   337,   344,   345,     0,   352,   356,   359,   363,   448,
+     295,   295,   367,   371,     0,   396,   478,   482,     0,     0,
+       0,     1,   295,     2,   533,   579,   581,   295,     2,   744,
+     296,   747,   548,   548,     0,   296,     0,     0,   274,   550,
+     545,     2,   295,     0,     0,   295,   553,     2,   504,     2,
+     557,     0,     0,     0,     0,     0,     0,    18,    58,     4,
+       5,     6,    16,     0,     0,     0,   295,     2,    66,    67,
+      68,    69,    48,    19,    49,    22,    47,    70,   295,     0,
       73,    77,    80,    83,    88,    91,    93,    95,    97,    99,
-     101,   106,   499,   755,   455,   498,     0,   453,   454,     0,
-     570,   585,   588,   591,   597,   600,   603,   362,     0,     2,
-     743,     0,   296,   746,     2,    64,   296,     3,   429,     0,
-     437,   297,   296,   309,   336,   289,   351,   358,     3,     3,
-     411,   415,   425,   430,   477,   296,   431,   710,   711,   296,
-     432,   434,   296,     2,   587,   599,   733,     2,     2,   251,
-       2,   462,     0,   460,   459,   458,   143,     2,     2,   253,
-       2,     2,   252,     2,   283,     2,   284,     0,   282,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   571,   610,
-       0,   457,     2,   565,   574,   664,   567,   568,   537,   296,
-       2,   604,   613,   606,   607,     0,   278,   296,   296,   342,
-     297,     0,   297,     0,   296,   738,   742,   740,   538,   296,
-     549,   257,   265,   311,     0,     2,   539,   296,   503,   339,
-     340,   285,   354,   361,     0,   296,     2,   387,   296,   375,
-       0,     0,   381,   732,     0,   753,   402,     0,   480,   504,
-     254,   255,   524,   296,   439,     0,   296,   239,     0,     2,
-     241,     0,   297,     0,   259,     2,   260,   280,     0,     0,
-       2,   296,   549,   296,   490,   492,   491,     0,     0,   755,
-       0,   296,     0,   296,   494,   296,   564,   562,   563,   561,
-       0,   556,   559,     0,     0,   296,    55,   296,    70,    50,
-     296,    61,   296,   296,    53,    54,    63,     2,   129,     0,
-       0,   451,     0,   450,   113,   296,    17,     0,    29,    30,
-      35,     2,     0,    35,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,     0,     0,     0,    51,    52,     0,
+     101,   106,   498,   754,   454,   497,     0,   452,   453,     0,
+     569,   584,   587,   590,   596,   599,   602,   361,     0,     2,
+     742,     0,   295,   745,     2,    64,   295,     3,   428,     0,
+     436,   296,   295,   308,   335,   288,   350,   357,     3,     3,
+     410,   414,   424,   429,   476,   295,   430,   709,   710,   295,
+     431,   433,   295,     2,   586,   598,   732,     2,     2,   250,
+       2,   461,     0,   459,   458,   457,   142,     2,     2,   252,
+       2,     2,   251,     2,   282,     2,   283,     0,   281,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   570,   609,
+       0,   456,     2,   564,   573,   663,   566,   567,   536,   295,
+       2,   603,   612,   605,   606,     0,   277,   295,   295,   341,
+     296,     0,   296,     0,   295,   737,   741,   739,   537,   295,
+     548,   256,   264,   310,     0,     2,   538,   295,   502,   338,
+     339,   284,   353,   360,     0,   295,     2,   386,   295,   374,
+       0,     0,   380,   731,     0,   752,   401,     0,   479,   503,
+     253,   254,   523,   295,   438,     0,   295,   238,     0,     2,
+     240,     0,   296,     0,   258,     2,   259,   279,     0,     0,
+       2,   295,   548,   295,   489,   491,   490,     0,     0,   754,
+       0,   295,     0,   295,   493,   295,   563,   561,   562,   560,
+       0,   555,   558,     0,     0,   295,    55,   295,    70,    50,
+     295,    61,   295,   295,    53,    54,    63,     2,   128,     0,
+       0,   450,     0,   449,   112,   295,    17,     0,    29,    30,
+      35,     2,     0,    35,   118,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,     0,     0,    51,    52,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   110,
-       2,   650,   456,   647,   551,   551,   655,   484,   296,     2,
-     589,   590,     0,   601,   602,     0,     2,   744,   747,   113,
-     296,     0,     2,   712,   297,   716,   707,   708,   714,     0,
-       2,     2,   672,   551,   755,   621,   551,   551,   755,   551,
-     635,   551,   551,   686,   438,   669,   551,   551,   677,   684,
-     296,   433,   297,     0,     0,   296,   722,   297,   727,   755,
-     719,   296,   724,   755,   296,   296,   296,     0,   113,     0,
-      18,     5,     2,     0,    19,     0,   463,   753,     0,     0,
-     469,   243,     0,   296,     0,     0,     0,   549,   573,   577,
-     579,   609,   612,   616,   619,   572,   611,     0,   286,   662,
-       0,   296,   279,     0,     0,     0,     0,   277,     2,     0,
-     261,   540,   296,     0,     0,     0,     0,   296,   296,     0,
-       0,   696,   385,   388,   392,   551,   392,   701,   391,   693,
-     551,   551,   367,   376,   384,   377,   551,   379,   382,   296,
-     754,     0,     0,   400,     0,   297,     3,   418,     3,   422,
-     421,   595,     0,   535,   296,    64,     3,   296,   437,   297,
-       3,   431,   432,     2,     0,     0,     0,   489,   308,   296,
-     485,   487,     3,     2,     2,     0,   506,     3,     0,   558,
-     131,     0,     0,   224,     0,     0,     0,     2,     0,     0,
-      36,     0,     0,   113,   296,    20,     0,    21,     0,   696,
-     452,     0,   111,     3,     2,    27,     2,     0,    33,     0,
-       2,    25,     0,   108,   107,   109,    74,    75,    76,    78,
-      79,    81,    82,    86,    87,    84,    85,    89,    90,    92,
-      94,    96,    98,   100,     0,     0,   756,   296,     0,     0,
-       0,   651,   652,   648,   649,   501,   500,   296,     0,   296,
-     718,   296,   723,   297,   296,   666,   296,   296,   709,   665,
-       2,   296,     0,     0,     0,     0,     0,     0,     0,     0,
-     687,     0,   673,   624,   640,   674,     2,   620,   627,   435,
-     622,   623,   436,     2,   634,   643,   636,   637,   670,   671,
-     685,   713,   717,   715,   755,   270,     2,   749,     2,   426,
-     721,   726,   427,     0,   405,     3,     3,     3,     3,   457,
-       3,     0,     2,   472,   468,   754,     0,   464,   471,     2,
-     467,   470,     0,   296,   244,   266,     3,   274,   276,     0,
-     457,     2,   575,   576,     2,   614,   615,     0,   663,   541,
-       3,   348,   347,   350,   349,   296,   542,     0,   543,   296,
-     378,   380,     2,     0,     0,     0,     0,   105,   394,   697,
-     698,   389,   393,   390,   694,   695,   383,   387,   296,   402,
-     396,   403,   753,     0,     0,   440,   242,     0,     0,     3,
-       2,   672,   433,     0,   531,     0,   755,   493,     0,   296,
-     296,   296,     0,   555,   557,   132,     0,     0,   217,     0,
-       0,     0,   225,   226,    56,     0,    62,   296,     0,    60,
-      59,     0,   130,   697,   462,    71,    72,   112,   117,     3,
-     111,     0,     0,     0,    24,    35,     3,     0,    32,   103,
-       0,     3,   654,   658,   661,   653,     3,   596,     3,   720,
-     725,     2,    64,   296,     3,     3,   297,     0,     3,   626,
-     630,   633,   642,   676,   680,   683,   296,     3,   625,   641,
-     675,   296,   296,   428,   296,   296,   750,     0,     0,     0,
-       0,   258,     0,   105,     0,     3,     3,     0,   465,     0,
-     461,     0,     0,   247,   296,     0,     0,   131,     0,     0,
-       0,     0,     0,   131,     0,     0,   111,   111,     2,     0,
-       0,     0,     3,   133,   134,     2,   145,   135,   136,   137,
-     138,   139,   140,   147,   149,     0,     0,     0,   287,   296,
-     296,   551,     0,   544,   296,   113,   700,   704,   706,   699,
-     386,   370,   401,     0,   583,     2,   668,   667,     0,   673,
-       2,   486,   488,   508,     3,   516,   517,     0,     2,   512,
-       3,     3,     0,     0,   560,   224,     0,     0,     0,   224,
-       0,     0,     3,    37,   753,   111,     0,     3,   665,    42,
-       3,    40,     3,    34,     0,     3,   102,   104,     0,     2,
-     656,   657,     0,     0,   296,     0,     0,     0,     3,   642,
-       0,     2,   628,   629,     2,   644,     2,   678,   679,     0,
-       0,    64,     0,     3,     3,     3,     3,   413,   412,   416,
-       2,     2,   752,   751,   114,     0,     0,     0,     0,     3,
-     466,     3,     0,   245,   148,     3,   297,   296,     0,     0,
-       0,     0,     2,   193,     0,   191,     0,     0,     0,     0,
-       0,     0,     0,     0,   113,     0,   551,   153,   150,   296,
-       0,     0,   269,   281,     3,     3,   550,   617,   371,     2,
-     702,   703,   399,   296,   268,   296,     0,   519,   496,   296,
-       0,     0,   495,   510,     0,     0,     0,   218,     0,   227,
-      57,   111,     0,     0,   118,   115,     0,     0,     0,     0,
-       0,     0,    23,     0,   659,   296,   584,   267,   728,   729,
-     730,     0,   681,   296,   296,   296,     3,     3,     0,   689,
-       0,     0,     0,     0,   296,   296,     3,   548,   473,   474,
-       0,     0,   248,   297,     0,     0,     0,     0,   296,   194,
-     192,     0,   189,   195,     0,     0,     0,     0,   199,   202,
-     200,   196,     0,   197,    35,   131,   146,   144,   246,     0,
-       0,   296,   420,   424,   423,     0,   513,     2,   514,     2,
-     515,   509,   296,   230,     0,   228,     0,   230,     3,   665,
-      31,   116,     2,    45,     2,    43,    41,    28,   114,    26,
-       3,   731,     3,     3,     3,     0,     0,   688,   690,   631,
-     645,   271,     2,   410,     3,   409,     0,   476,   473,   131,
-       0,     0,   131,     3,     0,   131,   190,     0,     2,     2,
-     211,   201,     0,     0,     0,     0,   142,   578,   618,     3,
-       2,     0,     0,     2,   231,     0,     0,   219,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   691,   692,   296,
-       0,   475,   154,     0,     0,     2,   167,   131,   156,     0,
-     184,     0,   131,     0,     2,   158,     0,     2,     0,     2,
-       2,     2,   198,    32,     0,   296,   518,   520,   511,     0,
-       0,     0,     0,   116,    38,     3,     3,   660,   632,   646,
-     682,   414,   131,   160,   163,     0,   162,   166,     3,   169,
-     168,     0,   131,   186,   131,     3,     0,   296,     0,   296,
-       0,     2,     0,     2,   141,   705,     2,   232,   233,     0,
-     229,   220,     0,     0,     0,   155,     0,     0,   165,   235,
-     170,     2,   237,   185,     0,   188,   174,   203,     3,   212,
-     216,   205,     3,     0,   296,     0,   296,     0,     0,     0,
-      39,    46,    44,   161,   164,   131,     0,   171,   296,   131,
-     131,     0,   175,     0,     0,   696,   213,   214,   215,     0,
-     204,     3,   206,     3,   296,   221,   234,   151,   172,   157,
-     131,   238,   187,   182,   180,   176,   159,   131,     0,   697,
-       0,     0,     0,     0,   152,   173,   183,   177,   181,   180,
-     178,     3,     3,     0,     0,   497,   179,   207,   209,     3,
-       3,   208,   210
+       0,     0,     0,     0,     0,     0,     0,     0,   109,     2,
+     649,   455,   646,   550,   550,   654,   483,   295,     2,   588,
+     589,     0,   600,   601,     0,     2,   743,   746,   112,   295,
+       0,     2,   711,   296,   715,   706,   707,   713,     0,     2,
+       2,   671,   550,   754,   620,   550,   550,   754,   550,   634,
+     550,   550,   685,   437,   668,   550,   550,   676,   683,   295,
+     432,   296,     0,     0,   295,   721,   296,   726,   754,   718,
+     295,   723,   754,   295,   295,   295,     0,   112,     0,    18,
+       5,     2,     0,    19,     0,   462,   752,     0,     0,   468,
+     242,     0,   295,     0,     0,     0,   548,   572,   576,   578,
+     608,   611,   615,   618,   571,   610,     0,   285,   661,     0,
+     295,   278,     0,     0,     0,     0,   276,     2,     0,   260,
+     539,   295,     0,     0,     0,     0,   295,   295,     0,     0,
+     695,   384,   387,   391,   550,   391,   700,   390,   692,   550,
+     550,   366,   375,   383,   376,   550,   378,   381,   295,   753,
+       0,     0,   399,     0,   296,     3,   417,     3,   421,   420,
+     594,     0,   534,   295,    64,     3,   295,   436,   296,     3,
+     430,   431,     2,     0,     0,     0,   488,   307,   295,   484,
+     486,     3,     2,     2,     0,   505,     3,     0,   557,   130,
+       0,     0,   223,     0,     0,     0,     2,     0,     0,    36,
+       0,     0,   112,   295,    20,     0,    21,     0,   695,   451,
+       0,   110,     3,     2,    27,     2,     0,    33,     0,     2,
+      25,     0,   107,   108,    74,    75,    76,    78,    79,    81,
+      82,    86,    87,    84,    85,    89,    90,    92,    94,    96,
+      98,   100,     0,     0,   755,   295,     0,     0,     0,   650,
+     651,   647,   648,   500,   499,   295,     0,   295,   717,   295,
+     722,   296,   295,   665,   295,   295,   708,   664,     2,   295,
+       0,     0,     0,     0,     0,     0,     0,     0,   686,     0,
+     672,   623,   639,   673,     2,   619,   626,   434,   621,   622,
+     435,     2,   633,   642,   635,   636,   669,   670,   684,   712,
+     716,   714,   754,   269,     2,   748,     2,   425,   720,   725,
+     426,     0,   404,     3,     3,     3,     3,   456,     3,     0,
+       2,   471,   467,   753,     0,   463,   470,     2,   466,   469,
+       0,   295,   243,   265,     3,   273,   275,     0,   456,     2,
+     574,   575,     2,   613,   614,     0,   662,   540,     3,   347,
+     346,   349,   348,   295,   541,     0,   542,   295,   377,   379,
+       2,     0,     0,     0,     0,   105,   393,   696,   697,   388,
+     392,   389,   693,   694,   382,   386,   295,   401,   395,   402,
+     752,     0,     0,   439,   241,     0,     0,     3,     2,   671,
+     432,     0,   530,     0,   754,   492,     0,   295,   295,   295,
+       0,   554,   556,   131,     0,     0,   216,     0,     0,     0,
+     224,   225,    56,     0,    62,   295,     0,    60,    59,     0,
+     129,   696,   461,    71,    72,   111,   116,     3,   110,     0,
+       0,     0,    24,    35,     3,     0,    32,   103,     0,     3,
+     653,   657,   660,   652,     3,   595,     3,   719,   724,     2,
+      64,   295,     3,     3,   296,     0,     3,   625,   629,   632,
+     641,   675,   679,   682,   295,     3,   624,   640,   674,   295,
+     295,   427,   295,   295,   749,     0,     0,     0,     0,   257,
+       0,   105,     0,     3,     3,     0,   464,     0,   460,     0,
+       0,   246,   295,     0,     0,   130,     0,     0,     0,     0,
+       0,   130,     0,     0,   110,   110,     2,     0,     0,     0,
+       3,   132,   133,     2,   144,   134,   135,   136,   137,   138,
+     139,   146,   148,     0,     0,     0,   286,   295,   295,   550,
+       0,   543,   295,   112,   699,   703,   705,   698,   385,   369,
+     400,     0,   582,     2,   667,   666,     0,   672,     2,   485,
+     487,   507,     3,   515,   516,     0,     2,   511,     3,     3,
+       0,     0,   559,   223,     0,     0,     0,   223,     0,     0,
+       3,    37,   752,   110,     0,     3,   664,    42,     3,    40,
+       3,    34,     0,     3,   102,   104,     0,     2,   655,   656,
+       0,     0,   295,     0,     0,     0,     3,   641,     0,     2,
+     627,   628,     2,   643,     2,   677,   678,     0,     0,    64,
+       0,     3,     3,     3,     3,   412,   411,   415,     2,     2,
+     751,   750,   113,     0,     0,     0,     0,     3,   465,     3,
+       0,   244,   147,     3,   296,   295,     0,     0,     0,     0,
+       2,   192,     0,   190,     0,     0,     0,     0,     0,     0,
+       0,     0,   112,     0,   550,   152,   149,   295,     0,     0,
+     268,   280,     3,     3,   549,   616,   370,     2,   701,   702,
+     398,   295,   267,   295,     0,   518,   495,   295,     0,     0,
+     494,   509,     0,     0,     0,   217,     0,   226,    57,   110,
+       0,     0,   117,   114,     0,     0,     0,     0,     0,     0,
+      23,     0,   658,   295,   583,   266,   727,   728,   729,     0,
+     680,   295,   295,   295,     3,     3,     0,   688,     0,     0,
+       0,     0,   295,   295,     3,   547,   472,   473,     0,     0,
+     247,   296,     0,     0,     0,     0,   295,   193,   191,     0,
+     188,   194,     0,     0,     0,     0,   198,   201,   199,   195,
+       0,   196,    35,   130,   145,   143,   245,     0,     0,   295,
+     419,   423,   422,     0,   512,     2,   513,     2,   514,   508,
+     295,   229,     0,   227,     0,   229,     3,   664,    31,   115,
+       2,    45,     2,    43,    41,    28,   113,    26,     3,   730,
+       3,     3,     3,     0,     0,   687,   689,   630,   644,   270,
+       2,   409,     3,   408,     0,   475,   472,   130,     0,     0,
+     130,     3,     0,   130,   189,     0,     2,     2,   210,   200,
+       0,     0,     0,     0,   141,   577,   617,     3,     2,     0,
+       0,     2,   230,     0,     0,   218,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   690,   691,   295,     0,   474,
+     153,     0,     0,     2,   166,   130,   155,     0,   183,     0,
+     130,     0,     2,   157,     0,     2,     0,     2,     2,     2,
+     197,    32,     0,   295,   517,   519,   510,     0,     0,     0,
+       0,   115,    38,     3,     3,   659,   631,   645,   681,   413,
+     130,   159,   162,     0,   161,   165,     3,   168,   167,     0,
+     130,   185,   130,     3,     0,   295,     0,   295,     0,     2,
+       0,     2,   140,   704,     2,   231,   232,     0,   228,   219,
+       0,     0,     0,   154,     0,     0,   164,   234,   169,     2,
+     236,   184,     0,   187,   173,   202,     3,   211,   215,   204,
+       3,     0,   295,     0,   295,     0,     0,     0,    39,    46,
+      44,   160,   163,   130,     0,   170,   295,   130,   130,     0,
+     174,     0,     0,   695,   212,   213,   214,     0,   203,     3,
+     205,     3,   295,   220,   233,   150,   171,   156,   130,   237,
+     186,   181,   179,   175,   158,   130,     0,   696,     0,     0,
+       0,     0,   151,   172,   182,   176,   180,   179,   177,     3,
+       3,     0,     0,   496,   178,   206,   208,     3,     3,   207,
+     209
 };
 
@@ -1563,195 +1561,195 @@
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   841,   477,   302,    47,   134,   135,   303,   304,   305,
-     306,   787,   788,  1150,  1151,   307,   382,   309,   310,   311,
+      -1,   839,   477,   302,    47,   134,   135,   303,   304,   305,
+     306,   786,   787,  1148,  1149,   307,   382,   309,   310,   311,
      312,   313,   314,   315,   316,   317,   318,   319,   320,   321,
-    1054,   528,   998,   323,   999,   556,   975,  1081,  1547,  1083,
-    1084,  1085,  1086,  1548,  1087,  1088,  1464,  1465,  1426,  1427,
-    1428,  1526,  1527,  1531,  1532,  1567,  1568,  1089,  1384,  1090,
-    1091,  1318,  1319,  1320,  1508,  1092,   146,   981,   982,   983,
-    1405,  1489,  1500,  1501,   478,   479,   903,   904,  1062,    51,
+    1052,   528,   996,   323,   997,   555,   973,  1079,  1545,  1081,
+    1082,  1083,  1084,  1546,  1085,  1086,  1462,  1463,  1424,  1425,
+    1426,  1524,  1525,  1529,  1530,  1565,  1566,  1087,  1382,  1088,
+    1089,  1316,  1317,  1318,  1506,  1090,   146,   979,   980,   981,
+    1403,  1487,  1498,  1499,   478,   479,   901,   902,  1060,    51,
       52,    53,    54,    55,   348,   159,    58,    59,    60,    61,
       62,   350,    64,    65,   265,    67,    68,   275,   352,   353,
       71,    72,    73,    74,   119,    76,   205,   355,   120,    79,
-     121,    81,    82,   464,    83,   458,   459,   460,   461,   702,
-     941,   703,    84,    85,   467,   465,   723,   883,   884,   358,
-     359,   726,   727,   728,   360,   361,   362,   363,   475,   341,
-     136,   137,   532,   325,   171,   656,   657,   658,   659,   660,
-      86,   122,    88,   498,   499,   967,   500,   278,   504,   326,
-      89,   138,   139,    90,  1342,  1128,  1129,  1130,  1131,    91,
-      92,   744,    93,   274,    94,    95,   188,  1056,   690,   413,
+     121,    81,    82,   464,    83,   458,   459,   460,   461,   701,
+     939,   702,    84,    85,   467,   465,   722,   881,   882,   358,
+     359,   725,   726,   727,   360,   361,   362,   363,   475,   341,
+     136,   137,   532,   325,   171,   655,   656,   657,   658,   659,
+      86,   122,    88,   498,   499,   965,   500,   278,   504,   326,
+      89,   138,   139,    90,  1340,  1126,  1127,  1128,  1129,    91,
+      92,   743,    93,   274,    94,    95,   188,  1054,   689,   413,
      126,    96,   510,   511,   512,   189,   269,   191,   192,   193,
      270,    99,   100,   101,   102,   103,   104,   105,   196,   197,
-     198,   199,   200,   853,   615,   616,   617,   618,   201,   620,
-     621,   622,   582,   583,   584,   585,   707,   106,   624,   625,
-     626,   627,   628,   629,   940,   709,   710,   711,   605,   366,
-     367,   368,   369,   327,   165,   108,   109,   110,   371,   721,
-     579
+     198,   199,   200,   851,   614,   615,   616,   617,   201,   619,
+     620,   621,   581,   582,   583,   584,   706,   106,   623,   624,
+     625,   626,   627,   628,   938,   708,   709,   710,   604,   366,
+     367,   368,   369,   327,   165,   108,   109,   110,   371,   720,
+     578
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -1415
+#define YYPACT_NINF -1328
 static const yytype_int16 yypact[] =
 {
-    5982,  2486, -1415,    39, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415,    37, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, -1415, -1415,   150,   150,   150,   883,
-    1004,    94,  7768,   226, -1415, -1415, -1415, -1415, -1415,   190,
-   -1415, -1415, -1415,   566,   197, -1415, -1415, -1415, -1415,  4778,
-   -1415, -1415, -1415, -1415,    71,   218, -1415,  1795, -1415, -1415,
-   -1415, -1415,   159,  1502,   356,    95,  7886, -1415, -1415,  9651,
-    1452, -1415, -1415, -1415,  1148,   382,  7314,   127,  1277,  1148,
-    1282, -1415, -1415,   835,   743, -1415,  1148,  1425, -1415,   224,
-   -1415,   372,   420, -1415, -1415, -1415, -1415,   355,   218,   150,
-   -1415,   150, -1415, -1415, -1415, -1415,  9310,  1795, -1415, -1415,
-    1795, -1415,   381, -1415,  9425, -1415, -1415,  1673,  9936, -1415,
-     857,   857,   857, -1415, -1415, -1415,   150, -1415, -1415, -1415,
-     415,   434,   442, -1415, -1415, -1415,   445, -1415, -1415, -1415,
-   -1415, -1415,   469,   472, -1415, -1415,    60,  9164,  1776,   548,
-     459,   483,   513,   516,   523,   558,  3516,  7283,   478,   562,
-   -1415,  9681, -1415, -1415, -1415, -1415,   571, -1415,   166,  5118,
-    5118, -1415,   568,   235, -1415, -1415, -1415, -1415,   582,   294,
-     296,   337,   150,   593, -1415, -1415,  1502,  3173,   651, -1415,
-      85, -1415,   150,   150,   218, -1415, -1415,   129, -1415,   150,
-     150, -1415,  3441,   621,   639,   857,  7072, -1415, -1415,   658,
-    4778, -1415, -1415,  1148, -1415, -1415, -1415,   218, -1415,  1795,
-      71, -1415,  8227, -1415,   857,   857,   857,   218, -1415,   883,
-   -1415,  6824, -1415, -1415,   643,   857, -1415,   857, -1415,   190,
-    9164,  9195,   664, -1415,  1004,   669,   857, -1415,   883,   656,
-     665, -1415,  7768,   626, -1415, -1415, -1415,  3929, -1415, -1415,
-    7677, -1415,   651,    75, 10735,  9936,  1673,  3441, -1415,   133,
-   -1415, -1415,  9425,  1795,   704,  7917, -1415, -1415,   104, -1415,
-    6175,   719,   768,  3584,   749, 10891, 10910, -1415,   754, -1415,
-   -1415, -1415, -1415, 10969, 10969,   626,  8934,   759, -1415, -1415,
-   -1415, -1415, -1415, -1415,   804, -1415,  1188,  2145,  9279, 10891,
-   -1415,   608,   362,   902,   264,   848,   769,   765,   771,   811,
-      86, -1415, -1415,   791,   655, -1415,   265, -1415, -1415,  1776,
-   -1415, -1415,   646,   816, -1415,   733,   816,   827,   190, -1415,
-   -1415,   843,  9310, -1415,   863,   867,  9394, -1415, -1415,  1543,
-    1631,  8652,  7072,  1148, -1415,  1148,   857,   857, -1415, -1415,
-   -1415, -1415, -1415, -1415,   857,  9310,  1795, -1415, -1415,  9975,
-    1690, -1415,  5551, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-     871,  4213, 10891, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, -1415, -1415, -1415,  1673, -1415,   858,
-     876,   889,   910,   923,   913,   926,   930,  3173, -1415, -1415,
-     935,    71,   934, -1415, -1415,   943, -1415, -1415, -1415,  3929,
-   -1415, -1415, -1415, -1415, -1415,  3441, -1415,  9164,  9164, -1415,
-     857,  1673,  7193,  1795,  8724, -1415, -1415, -1415, -1415,  3929,
-      75, -1415, -1415,  1148,   218, -1415, -1415,  3929, -1415,  6951,
-   -1415, -1415,   857,   857,   307, 10047,   953,  1611,  5340, -1415,
-     373,   433,  1004, -1415,   969,   990,   978,   999,   857, -1415,
-   -1415, -1415, -1415, 10233, -1415,   344,  3302, -1415,   218,  1003,
-   -1415,  1673, 11091, 10754, -1415, -1415, -1415, -1415,   940,  3441,
-   -1415,  8796,   651,  6477, -1415, -1415, -1415,   671,   369,   791,
-    1004,  7917,  1090,  9425, -1415,  7917, -1415, -1415, -1415, -1415,
-     371, -1415,  1010,   768,   164,  8934, -1415, 10047, -1415, -1415,
-    8934, -1415,  9049,  8934, -1415, -1415, -1415,  1015, -1415,   578,
-    1019,   823,  1029, -1415,  4588,  6920, -1415,   492, -1415, -1415,
-   10813, -1415,   517, 10813, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, 10735, 10735, 10735, -1415, -1415, 10891,
-   10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891,
-   10891, 10891, 10891, 10891, 10891, 10891, 10891,  5748, 10735, -1415,
-     655,  1111, -1415, -1415,   150,   150, -1415, -1415,  9164, -1415,
-   -1415,   943,   626, -1415,   943, 10832, -1415, -1415, -1415,  9540,
-    6920,  1035,  1047, -1415,  9936, -1415, -1415,   571, -1415,  1050,
-    1305,  1059,  1931,   251,   791, -1415,   150,   150,   791,   292,
-   -1415,   150,   150,   943, -1415, -1415,   150,   150, -1415,   816,
-   10086,  1795, 11236,   599,   625, 10086, -1415,  7677, -1415,   791,
-   -1415,  9310, -1415,   313,  8344,  8344,  8344,  1795, -1415,  6348,
-    1064,   505,   871,   956,  1071,  1072, -1415,  1076,  5118,   527,
-   -1415,  1165,  1795,  8344,   626,  1673,   626,   651,   796,   816,
-   -1415, -1415,   839,   816, -1415, -1415, -1415,   768, -1415,   816,
-     218, 10233, -1415,   600,  1092,   612,  1093, -1415,  1088,   218,
-   -1415, -1415,  3929,   218,  1091,   460,   480,  9975,  7404,  1925,
-   10891,  2323, -1415, -1415,  1089,    48,  1089, -1415, -1415, -1415,
-     150,   150, -1415, -1415,  1004, -1415,   150, -1415, -1415,  9195,
-    1004,  1094, 10891, -1415,  1004, 11236, -1415, -1415,  1098, -1415,
-   -1415, -1415,   626, -1415, 11164,   867, -1415,  8344,   869,  8652,
-   -1415, -1415,   571,  1096,  1097,   671,  1911, -1415, -1415,  7917,
-   -1415, -1415,  1099, -1415, -1415,  1105, -1415,  1099,  1107,  6175,
-   10735,   180,  1106,    43,  1115,  1110,  1127,   759,  1104,  1130,
-   -1415,  1134,  1135,  9080,  7041, -1415, 10735, -1415,   823,  1132,
-   -1415,  6491, 10735,  1131, -1415, -1415,   871,   652, -1415, 10735,
-   -1415, -1415,   893, -1415, -1415, -1415, -1415, -1415, -1415,   608,
-     608,   362,   362,   902,   902,   902,   902,   264,   264,   848,
-     769,   765,   771,   811, 10891,   942, -1415, 10233,  1142,  1143,
-    1144,  1111, -1415, -1415, -1415, -1415, -1415, 10233,   677,  8344,
-   -1415,  9310, -1415,  7525,  9509, -1415,  5551,  7283, -1415, -1415,
-    1305, 10233,   963,  1150,  1152,  1153,  1155,  1160,  1167,  1170,
-   -1415,  2993,  1931, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-     943, -1415, -1415, -1415,   791, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415,  1172, -1415,  1173,  1190, -1415, -1415,    71,
-    1131,  6348, -1415, -1415, -1415,  4213,  1183, -1415, -1415, -1415,
-   -1415, -1415,  1004,  6659,  1230, -1415, -1415, -1415, -1415,  1174,
-      71, -1415, -1415,   943, -1415, -1415,   943,    58,   943, -1415,
-   -1415, -1415, -1415, -1415, -1415,  9792, -1415,   218, -1415,  9195,
-   -1415, -1415,  1163,   951,  1193,  1194,  1201, -1415, -1415,  2323,
-   -1415, -1415, -1415, -1415, -1415, -1415, -1415,  1611,  9822,   978,
-   -1415, -1415,   990,  1204,  1200, -1415, -1415,  1205,  1209, -1415,
-     869,  2648, -1415,   707, -1415,  1911,   791, -1415,  1212,  7917,
-   10116,  9164,  1218, -1415, -1415,  1213,  1220,  1214, -1415, 10891,
-     237,   326,  1216, -1415,  1222,   626,  1222,  6920, 10735, -1415,
-   -1415,  1222, -1415,  1132,  4213, -1415, -1415, -1415, -1415,  1221,
-   10735,  1226,   626,  6348, -1415, 10813, -1415,   626, -1415, -1415,
-   10735, -1415,   852,   816, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415,   871,   867,  9394, -1415, -1415,  7646,  1229, -1415,   894,
-     816, -1415,   903,   908,   816, -1415,   857,  5019, -1415, -1415,
-   -1415, 10233, 10233, -1415,  8724,  8724, -1415,  1228,  1231,  1236,
-    1239, -1415,  1240,   725,   279,  1131, -1415,   626, -1415,  5118,
-   -1415, 10735,   497, -1415,  6793,  1242,  1246, 10605,  1250,  1251,
-     375,   388,   366, 10735,  1262,   218, 10735, 10735,  1260,   395,
-    1266,  1245, -1415, -1415, -1415,  1271, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, -1415,  1004,  1280, 10735, -1415, 10233,
-   10233,   150,  1281, -1415,  9905,  4588,   917,   816, -1415, -1415,
-   -1415, -1415, -1415,  1279, -1415, -1415, -1415, -1415,  1286,  2648,
-   -1415, -1415,  1269, -1415,  1099, -1415, -1415,  1673,  1284, -1415,
-   -1415, -1415,   685,  1288, -1415,    43,  1292, 10891,  1276,    43,
-      43,  1299,  1297, -1415,  1076, 10735,  1306,  1221,   699,   135,
-    1301, -1415,  1297, -1415,  1316,  1301, -1415, -1415,  1320, -1415,
-   -1415,   943,  1329,  1336,  7162,  1335,  1338,  1341, -1415, -1415,
-    1352, -1415, -1415,   943, -1415, -1415, -1415, -1415,   943, 10735,
-   10735,   867,  1354, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415, -1415, 10891, 10891,  1356,  1358,  1301,
-   -1415, -1415,  1004, -1415, -1415, -1415,  8155, 10116, 10735, 10735,
-    1402, 10735, -1415, -1415,  1339, -1415,  1343, 10735,  1344,  1346,
-   10735,  1138,  1347,    66,  8568,  1818,   150, -1415, -1415,  6659,
-    1365,   503, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415,
-   -1415,   943, -1415, 10731, -1415,  8796,  1371, -1415, -1415, 10116,
-     534,   544, -1415,  1374,  1378,   768,  1386, -1415,   485, -1415,
-   -1415, 10735,  1387,  1388, -1415, -1415,  1392,   596,   610,   626,
-    1393,  1398, -1415,  1403, -1415, 10233, -1415, -1415, -1415, -1415,
-   -1415,  1404, -1415, 10233, 10233, 10233, -1415, -1415,  1405, -1415,
-    1407,  1413,  1415,   744,  8418,  8535, -1415, -1415,   267, -1415,
-    1414,  1418, -1415,  8868,   688,   717,  1422,   722,  6277, -1415,
-   -1415,   570, -1415, -1415,   730,  1423,  1426,   218,  1455,  1034,
-   -1415, -1415, 10735, -1415, 10813, 10605, -1415, -1415, -1415,  1417,
-    1427, 10233, -1415, -1415, -1415,  1428, -1415, -1415, -1415, -1415,
-   -1415, -1415, 10116,   768,   278, -1415,  1409,   768,  1221,   436,
-   -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415,  1429, -1415,
-   -1415, -1415, -1415, -1415, -1415,  1431,  1432, -1415, -1415, -1415,
-   -1415, -1415, -1415, -1415,  1441, -1415,  1443, -1415, -1415, 10605,
-     146, 10735, 10605, -1415,  1459, 10735, -1415,   163,  1467,  1476,
-   -1415, -1415,  1465,  1472,  1450,   984, -1415, -1415, -1415, -1415,
-   -1415,  1795,  1673,  1468,   804,  1016, 10891, -1415,   770,  1483,
-   10735,   626,   626,  1489,  1491,  1496,  1497, -1415, -1415,  8724,
-    1492, -1415,  1574, 10891,  1506, -1415, -1415, 10515, -1415,   773,
-   -1415,  1487, 10605,  1498, -1415, -1415,  1518, -1415,  1523, -1415,
-    1540,  1541, -1415,  1509,  1532, 10116, -1415, -1415, -1415,   768,
-     626,  1533,  1513,  1529, -1415,  1301,  1301, -1415, -1415, -1415,
-   -1415, -1415, 10605,   282, -1415,  1020, -1415, -1415,  8004, -1415,
-   -1415,  1515, 10735, -1415, 10735,  8004,   218, 10047,   218, 10047,
-    1538, -1415,  1546, -1415, -1415, -1415,  1536,   804, -1415,   780,
-   -1415, -1415, 10735,  1545,  1547, -1415, 10891, 10891, -1415, -1415,
-    1123,    97, -1415, -1415,  1521, -1415,  1123, -1415, -1415,  2006,
-     626, -1415, -1415,   218, 10047,   218, 10047,  1549,  1528,   626,
-   -1415, -1415, -1415, -1415, -1415, 10515,  1548,  1123,  8081, 10735,
-   10425,  1550,  1123,  1552,  2006,  2821, -1415, -1415, -1415,  1554,
-   -1415, -1415, -1415, -1415,  9164, -1415, -1415, -1415, 10331, -1415,
-   10515, -1415, -1415,  1534, 10237, -1415, -1415, 10425,   218,  2821,
-     218,  1557,  1559,   837, -1415, 10331, -1415, -1415, -1415, 10237,
-   -1415, -1415, -1415,   218,   218, -1415, -1415, -1415, -1415, -1415,
-   -1415, -1415, -1415
+    7162,  9347, -1328,    62, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328,    38, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328, -1328, -1328, -1328,   207,   207,   207,  1203,
+    1016,    43,  8157,   275, -1328, -1328, -1328, -1328, -1328,   222,
+   -1328, -1328, -1328,   557,   264, -1328, -1328, -1328, -1328,  3410,
+   -1328, -1328, -1328, -1328,     6,   284, -1328,  1270, -1328, -1328,
+   -1328, -1328,   295,  1095,   444,   105,  5843, -1328, -1328,  9886,
+    1150, -1328, -1328, -1328,  1157,   453,  3851,  1007,   683,  1157,
+     795, -1328, -1328,   654,   738, -1328,  1157,  1633, -1328,   323,
+   -1328,   507,   534, -1328, -1328, -1328, -1328,   477,   284,   207,
+   -1328,   207, -1328, -1328, -1328, -1328,  9575,  1270, -1328, -1328,
+    1270, -1328,   485, -1328,  9689, -1328, -1328,  2141, 10207, -1328,
+     954,   954,   954, -1328, -1328, -1328,   207, -1328, -1328, -1328,
+     515,   550,   565, -1328, -1328, -1328,   568, -1328, -1328, -1328,
+   -1328, -1328,   578,   624, -1328, -1328,   103,  9430,  2160,   312,
+     511,   638,   641,   646,   657,   661,  8834,  7559,   662,   709,
+   -1328,  9916, -1328, -1328, -1328, -1328,   722, -1328,    13,  3378,
+    3378, -1328,   721,   108, -1328, -1328, -1328, -1328,   731,   161,
+     310,   313,   207,   724, -1328, -1328,  1095,  1965,   797, -1328,
+      79, -1328,   207,   207,   284, -1328, -1328,    80, -1328,   207,
+     207, -1328,  2460,   764,   779,   954,  7590, -1328, -1328,   794,
+    3410, -1328, -1328,  1157, -1328, -1328, -1328,   284, -1328,  1270,
+       6, -1328,  8496, -1328,   954,   954,   954,   284, -1328,  1203,
+   -1328,  3975, -1328, -1328,   760,   954, -1328,   954, -1328,   222,
+    9430,  9461,   756, -1328,  1016,   796,   954, -1328,  1203,   781,
+     808, -1328,  8157,   907, -1328, -1328, -1328,  4258, -1328, -1328,
+    6530, -1328,   797,   109,  4971, 10207,  2141,  2460, -1328,   140,
+   -1328, -1328,  9689,  1270,   846, 11353, -1328, -1328,   570, -1328,
+   11095,   861,   898,  6606,   875,  6875,  7175, -1328,   885, -1328,
+   -1328, -1328, -1328, 10975, 10975,   907,  9202,   892, -1328, -1328,
+   -1328, -1328, -1328, -1328,   924, -1328,   845,  2420,  9544,  6875,
+   -1328,   469,   445,   777,   634,   925,   901,   902,   909,   956,
+      32, -1328, -1328,   922,   940, -1328,   107, -1328, -1328,  2160,
+   -1328, -1328,   525,   945, -1328,   601,   945,   952,   222, -1328,
+   -1328,   980,  9575, -1328,   982,   995,  9658, -1328, -1328,  1834,
+     953,  8917,  7590,  1157, -1328,  1157,   954,   954, -1328, -1328,
+   -1328, -1328, -1328, -1328,   954,  9575,  1270, -1328, -1328, 10280,
+    2053, -1328,  8646, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+    1002,  3599,  6875, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328, -1328, -1328, -1328, -1328,  2141, -1328,   993,
+    1014,  1018,  1020,  1011,  1040,  1050,  1075,  1965, -1328, -1328,
+    1017,     6,  1082, -1328, -1328,  1078, -1328, -1328, -1328,  4258,
+   -1328, -1328, -1328, -1328, -1328,  2460, -1328,  9430,  9430, -1328,
+     954,  2141,  7710,  1270,  8990, -1328, -1328, -1328, -1328,  4258,
+     109, -1328, -1328,  1157,   284, -1328, -1328,  4258, -1328,  5377,
+   -1328, -1328,   954,   954,   193, 10318,  1091,   803,  5956, -1328,
+     316,   338,  1016, -1328,  1094,  1108,  1109,  1128,   954, -1328,
+   -1328, -1328, -1328, 10468, -1328,   229,  7332, -1328,   284,  1130,
+   -1328,  2141, 11177,  5632, -1328, -1328, -1328, -1328,  1033,  2460,
+   -1328,  9063,   797,  8040, -1328, -1328, -1328,   867,   238,   922,
+    1016, 11353,  1127,  9689, -1328, 11353, -1328, -1328, -1328, -1328,
+     355, -1328,  1155,   898,   274,  9202, -1328, 10318, -1328, -1328,
+    9202, -1328,  9316,  9202, -1328, -1328, -1328,  1158, -1328,   464,
+    1159,  1077,  1172, -1328,  5577,  4344, -1328,   377, -1328, -1328,
+    6047, -1328,   394,  6047, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328, -1328,  4971,  4971, -1328, -1328,  6875,  6875,
+    6875,  6875,  6875,  6875,  6875,  6875,  6875,  6875,  6875,  6875,
+    6875,  6875,  6875,  6875,  6875,  6875,  4543,  4971, -1328,   940,
+    1073, -1328, -1328,   207,   207, -1328, -1328,  9430, -1328, -1328,
+    1078,   907, -1328,  1078,  6220, -1328, -1328, -1328,  2379,  4344,
+    1173,  1178, -1328, 10207, -1328, -1328,   722, -1328,  1180,   771,
+    1181,  2349,   160,   922, -1328,   207,   207,   922,   206, -1328,
+     207,   207,  1078, -1328, -1328,   207,   207, -1328,   945, 10348,
+    1270, 11322,    23,   374, 10348, -1328,  6530, -1328,   922, -1328,
+    9575, -1328,    89,  8612,  8612,  8612,  1270, -1328,  4738,  1179,
+     282,  1002,   344,  1184,  1188, -1328,  1182,  3378,   493, -1328,
+    1266,  1270,  8612,   907,  2141,   907,   797,   670,   945, -1328,
+   -1328,   706,   945, -1328, -1328, -1328,   898, -1328,   945,   284,
+   10468, -1328,   491,  1206,   529,  1207, -1328,  1201,   284, -1328,
+   -1328,  4258,   284,  1218,   435,   476, 10280,  7679,  1689,  6875,
+    2634, -1328, -1328,  1204,    84,  1204, -1328, -1328, -1328,   207,
+     207, -1328, -1328,  1016, -1328,   207, -1328, -1328,  9461,  1016,
+    1205,  6875, -1328,  1016, 11322, -1328, -1328,  1225, -1328, -1328,
+   -1328,   907, -1328, 11250,   995, -1328,  8612,  1114,  8917, -1328,
+   -1328,   722,  1221,  1223,   867,  2656, -1328, -1328, 11353, -1328,
+   -1328,  1224, -1328, -1328,  1234, -1328,  1224,  1237, 11095,  4971,
+      83,  1217,    93,  1240,  1243,  1246,   892,  1252,  1262, -1328,
+    1265,  1271, 10056,  4468, -1328,  4971, -1328,  1077,  1872, -1328,
+    4836,  4971,  1255, -1328, -1328,  1002,   562, -1328,  4971, -1328,
+   -1328,   951, -1328, -1328, -1328, -1328, -1328,   469,   469,   445,
+     445,   777,   777,   777,   777,   634,   634,   925,   901,   902,
+     909,   956,  6875,   906, -1328, 10468,  1272,  1274,  1276,  1073,
+   -1328, -1328, -1328, -1328, -1328, 10468,   636,  8612, -1328,  9575,
+   -1328,  7799,  9772, -1328,  8646,  7559, -1328, -1328,   771, 10468,
+    1063,  1277,  1279,  1283,  1286,  1287,  1292,  1293, -1328,  3021,
+    2349, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328,  1078, -1328,
+   -1328, -1328,   922, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328,  1294, -1328,  1295,  1296, -1328, -1328,     6,  1255,  4738,
+   -1328, -1328, -1328,  3599,  1300, -1328, -1328, -1328, -1328, -1328,
+    1016,  7010,  1347, -1328, -1328, -1328, -1328,  1288,     6, -1328,
+   -1328,  1078, -1328, -1328,  1078,    50,  1078, -1328, -1328, -1328,
+   -1328, -1328, -1328, 10026, -1328,   284, -1328,  9461, -1328, -1328,
+    1305,   963,  1297,  1298,  1310, -1328, -1328,  2634, -1328, -1328,
+   -1328, -1328, -1328, -1328, -1328,   803, 10138,  1109, -1328, -1328,
+    1108,  1316,  1312, -1328, -1328,  1317,  1320, -1328,  1114,  1935,
+   -1328,   436, -1328,  2656,   922, -1328,  1324, 11353, 10430,  9430,
+    1326, -1328, -1328,  1319,  1327,  1321, -1328,  6875,   112,   182,
+    1330, -1328,  1331,   907,  1331,  4344,  4971, -1328, -1328,  1331,
+   -1328,  1872,  3599, -1328, -1328, -1328, -1328,  1336,  4971,  1335,
+     907,  4738, -1328,  6047, -1328,   907, -1328, -1328,  4971, -1328,
+     740,   945, -1328, -1328, -1328, -1328, -1328, -1328, -1328,  1002,
+     995,  9658, -1328, -1328,  7919,  1344, -1328,   772,   945, -1328,
+     788,   818,   945, -1328,   954,  5460, -1328, -1328, -1328, 10468,
+   10468, -1328,  8990,  8990, -1328,  1339,  1340,  1348,  1349, -1328,
+    1350,   503,   115,  1255, -1328,   907, -1328,  3378, -1328,  4971,
+     506, -1328,  7436,  1332,  1355, 10917,  1358,  1365,   260,   584,
+     505,  4971,  1366,   284,  4971,  4971,  1367,   608,  1361,  1353,
+   -1328, -1328, -1328,  1373, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328,  1016,  1370,  4971, -1328, 10468, 10468,   207,
+    1383, -1328, 10169,  5577,   866,   945, -1328, -1328, -1328, -1328,
+   -1328,  1379, -1328, -1328, -1328, -1328,  1385,  1935, -1328, -1328,
+    1369, -1328,  1224, -1328, -1328,  2141,  1387, -1328, -1328, -1328,
+     659,  1386, -1328,    93,  1391,  6875,  1377,    93,    93,  1395,
+    1394, -1328,  1182,  4971,  1402,  1336,  1003,   123,  1399, -1328,
+    1394, -1328,  1407,  1399, -1328, -1328,  1410, -1328, -1328,  1078,
+    1414,  1420,  6815,  1419,  1422,  1425, -1328, -1328,  1430, -1328,
+   -1328,  1078, -1328, -1328, -1328, -1328,  1078,  4971,  4971,   995,
+    1431, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328, -1328,  6875,  6875,  1433,  1438,  1399, -1328, -1328,
+    1016, -1328, -1328, -1328,  8423, 10430,  4971,  4971,  1506,  4971,
+   -1328, -1328,  1428, -1328,  1436,  4971,  1439,  1441,  4971,  1214,
+    1442,    52,  9804,  1144,   207, -1328, -1328,  7010,  1455,   510,
+   -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328, -1328,  1078,
+   -1328, 10735, -1328,  9063,  1444, -1328, -1328, 10430,   512,   604,
+   -1328,  1460,  1459,   898,  1471, -1328,   592, -1328, -1328,  4971,
+    1468,  1469, -1328, -1328,  1474,   693,   716,   907,  1482,  1483,
+   -1328,  1487, -1328, 10468, -1328, -1328, -1328, -1328, -1328,  1489,
+   -1328, 10468, 10468, 10468, -1328, -1328,  1490, -1328,  1491,  1473,
+    1495,   618,  8685,  8801, -1328, -1328,   293, -1328,  1494,  1498,
+   -1328,  9136,   674,   725,  1504,   758,  7301, -1328, -1328,   611,
+   -1328, -1328,   792,  1505,  1508,   284,  1558,  1023, -1328, -1328,
+    4971, -1328,  6047, 10917, -1328, -1328, -1328,  1509,  1510, 10468,
+   -1328, -1328, -1328,  1511, -1328, -1328, -1328, -1328, -1328, -1328,
+   10430,   898,   150, -1328,  1492,   898,  1336,   370, -1328, -1328,
+   -1328, -1328, -1328, -1328, -1328, -1328,  1512, -1328, -1328, -1328,
+   -1328, -1328, -1328,  1514,  1515, -1328, -1328, -1328, -1328, -1328,
+   -1328, -1328,  1513, -1328,  1516, -1328, -1328, 10917,   125,  4971,
+   10917, -1328,  1524,  4971, -1328,   136,  1526,  1539, -1328, -1328,
+    1528,  1529,  1507,  1001, -1328, -1328, -1328, -1328, -1328,  1270,
+    2141,  1525,   924,  1036,  6875, -1328,   837,  1530,  4971,   907,
+     907,  1531,  1538,  1540,  1541, -1328, -1328,  8990,  1537, -1328,
+    1613,  6875,  1542, -1328, -1328, 10828, -1328,   879, -1328,  1532,
+   10917,  1533, -1328, -1328,  1546, -1328,  1551, -1328,  1566,  1572,
+   -1328,  1545,  1559, 10430, -1328, -1328, -1328,   898,   907,  1563,
+    1547,  1557, -1328,  1399,  1399, -1328, -1328, -1328, -1328, -1328,
+   10917,   237, -1328,  1060, -1328, -1328,  8274, -1328, -1328,  1548,
+    4971, -1328,  4971,  8274,   284, 10318,   284, 10318,  1568, -1328,
+    1573, -1328, -1328, -1328,  1567,   924, -1328,   923, -1328, -1328,
+    4971,  1575,  1576, -1328,  6875,  6875, -1328, -1328,  1088,   113,
+   -1328, -1328,  1553, -1328,  1088, -1328, -1328,  2465,   907, -1328,
+   -1328,   284, 10318,   284, 10318,  1580,  1564,   907, -1328, -1328,
+   -1328, -1328, -1328, 10828,  1583,  1088,  8350,  4971, 10739,  1584,
+    1088,  1585,  2465,  2931, -1328, -1328, -1328,  1591, -1328, -1328,
+   -1328, -1328,  9430, -1328, -1328, -1328, 10606, -1328, 10828, -1328,
+   -1328,  1570, 10513, -1328, -1328, 10739,   284,  2931,   284,  1593,
+    1595,   938, -1328, 10606, -1328, -1328, -1328, 10513, -1328, -1328,
+   -1328,   284,   284, -1328, -1328, -1328, -1328, -1328, -1328, -1328,
+   -1328
 };
 
@@ -1759,29 +1757,29 @@
 static const yytype_int16 yypgoto[] =
 {
-   -1415,  4737,  3351, -1415,   455, -1415,    41,     0,  -262, -1415,
-     592,  -524,  -481,  -976,   -32,  3487,  1327, -1415,  -108,   613,
-     615,   537,   614,  1100,  1103,  1108,  1109,  1112, -1415,   543,
-    -570,  5379,  -852,  -699,  -945, -1415,  -234,  -722,  -516, -1415,
-     705, -1415,   452, -1136, -1415, -1415,   192, -1415, -1082,  -770,
-     303, -1415, -1415, -1415, -1415,   128, -1414, -1415, -1415, -1415,
-   -1415, -1415, -1415,   383, -1192,    80, -1415,  -222, -1415,   551,
-     357, -1415,   227, -1415,  -321, -1415, -1415, -1415,   617,  -831,
-   -1415, -1415,     1,  -880,   113,  2816, -1415, -1415, -1415,   -46,
-   -1415,    27,   263,  -201,  1947,  3745, -1415, -1415,    18,   105,
-     806,  -244,  1537, -1415,  1920, -1415, -1415,   122,  2445, -1415,
-    2562,  1653, -1415, -1415, -1415,  -611,  -434,  1254,  1255,   775,
-    1011,   338, -1415, -1415, -1415,   992,   776,  -483, -1415,  -487,
-    -342,  1046, -1415, -1415,  -956,  -989,   784,  1368,  1126,   161,
-   -1415,   412,   137,  -263,  -206,  -125,   726,   831, -1415,  1069,
-   -1415,  2921,   140,  -453,   983, -1415, -1415,   766, -1415,  -231,
-   -1415,   -13, -1415, -1415, -1415, -1257,   486, -1415, -1415, -1415,
-    1243, -1415,    44, -1415, -1415,  -843,  -105, -1314,  -135,  1612,
-   -1415,  3802, -1415,   985, -1415,  -152,   929,  -180,  -176,  -171,
-       5,   -40,   -36,   -35,   948,    35,    56,    77,   -93,  -170,
-    -165,  -163,  -160,  -322,  -533,  -531,  -517,  -561,  -304,  -510,
-   -1415, -1415,  -506,  1157,  1166,  1180,  1503,  5100,  -539,  -571,
-    -552,  -543,  -475, -1415,  -440,  -686,  -674,  -659,  -583,  -282,
-     -25, -1415, -1415,   541,    33,   -95, -1415,  4237,   118,  -635,
-      57
+   -1328,  5033,  3981, -1328,   462, -1328,    41,     0,  -266, -1328,
+     629,  -530,  -491,  -946,    44,  6093,  1325, -1328,  -145,   685,
+     687,   763,   628,  1136,  1140,  1135,  1139,  1142, -1328,   121,
+    -486,  5463,  -869,  -668,  -953, -1328,    82,  -669,   286, -1328,
+     761, -1328,   487, -1173, -1328, -1328,   220, -1328, -1056,  -711,
+     333, -1328, -1328, -1328, -1328,   153, -1149, -1328, -1328, -1328,
+   -1328, -1328, -1328,   407, -1194,    53, -1328,  -367, -1328,   586,
+     380, -1328,   254, -1328,  -311, -1328, -1328, -1328,   635,  -853,
+   -1328, -1328,     1, -1043,    33,   825, -1328, -1328, -1328,  -137,
+   -1328,    56,  1849,  -201,  2484,  4445, -1328, -1328,    18,   403,
+     583,  -228,  1261, -1328,  2554, -1328, -1328,   106,  2921, -1328,
+    3406,  1470, -1328, -1328, -1328,  -638,  -431,  1278,  1282,   784,
+    1026,   294, -1328, -1328, -1328,  1019,   787,  -503, -1328,  -383,
+    -257,   -66, -1328, -1328,  -966,  -965,  -357,  -136,  1148,    24,
+   -1328,  1219,   429,  -306,  -197,  -129,   749,   851, -1328,  1087,
+   -1328,  3476,   780,  -426,   999, -1328, -1328,   783, -1328,  -230,
+   -1328,    87, -1328, -1328, -1328, -1267,   502, -1328, -1328, -1328,
+    1258, -1328,    59, -1328, -1328,  -855,  -106, -1327,   -91,  2314,
+   -1328,  1987, -1328,   996, -1328,  -143,   298,  -180,  -177,  -174,
+       5,   -40,   -36,   -35,  1329,    39,    55,    68,  -100,  -171,
+    -166,  -165,  -162,  -312,  -570,  -551,  -548,  -549,  -290,  -542,
+   -1328, -1328,  -477,  1176,  1183,  1187,   244,  5746,  -594,  -573,
+    -562,  -554,  -469, -1328,  -406,  -684,  -672,  -663,  -604,  -191,
+    -239, -1328, -1328,   263,   351,   -84, -1328,  4721,   128,  -628,
+    -435
 };
 
@@ -1789,715 +1787,741 @@
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -527
+#define YYTABLE_NINF -526
 static const yytype_int16 yytable[] =
 {
-      48,   113,   115,   150,   429,    98,   400,   151,   152,   454,
-     401,   261,   268,   934,   441,   402,   403,   708,    69,   792,
-     514,   404,   896,   405,   713,   935,   406,    63,   614,   113,
-     113,  1155,    48,   107,   107,   408,   507,    98,   976,   847,
-     936,   769,   112,    48,   384,   385,   619,   872,   752,    48,
-      69,   854,   757,   411,   162,  1147,  1189,    48,   848,    63,
-    1094,   343,   529,    48,   606,   107,    48,   849,   194,    48,
-     220,   217,  1093,   855,   227,   822,   144,   843,   153,   844,
-      50,  1199,   996,   113,   113,  1403,   400,    31,  1187,  1188,
-     401,   780,   934,   845,   409,   402,   403,   426,   680,   154,
-     846,   404,   107,   405,   935,    70,   406,    48,   948,  1466,
-      48,   281,    50,    56,   116,   408,  1555,    48,   689,   936,
-     155,   123,    77,   203,    31,   292,   693,   484,   486,  1322,
-     938,     2,   207,     4,     5,     6,     7,    70,   858,   410,
-     536,  -236,  -236,  1570,   865,    56,   150,   124,    48,   740,
-     151,   152,   951,   162,    77,   979,    48,   885,   885,   885,
-     412,    48,   887,   888,   684,   686,   374,   167,    31,  1101,
-     282,   213,    31,   204,   409,   747,   885,   519,   169,   211,
-     906,   576,   221,  1466,  1205,   485,    48,    48,  1486,    31,
-    1423,  1424,   162,   683,   685,   253,    35,   412,    36,  1323,
-     557,   558,    48,   170,   143,   678,   216,  1423,  1424,   741,
-      48,   480,   843,  -236,   844,   162,   448,   577,   178,    48,
-    1267,   153,    48,   243,  1222,  1223,   150,   444,   845,   113,
-     151,   152,   167,  1204,   502,   469,   503,   145,   557,   420,
-     756,   412,   154,   490,   113,   412,   536,   598,   113,  1268,
-     885,   761,    48,   113,   959,   675,  1189,    98,   216,   771,
-      -3,  1425,   536,   155,   117,   328,    48,    48,   262,   847,
-      69,   263,   162,    48,   557,   762,   182,   343,  1434,    63,
-      48,   529,   763,   378,   481,   107,   529,  1512,   848,   529,
-      31,  1039,   667,  1264,   474,   113,   472,   849,   977,   379,
-     147,   216,   886,   886,   886,   704,  1189,   843,   619,   844,
-     156,  1157,   160,  1040,   676,  1015,  1348,  1113,  1104,   536,
-     682,   886,  1541,   845,  1543,   826,   687,   443,   437,    48,
-    1027,    31,    50,   172,   374,   442,   526,   675,  1187,  1188,
-     638,   248,   885,   815,   642,  1470,  1018,  1137,   606,    48,
-      48,  1219,   388,   606,   566,   567,   740,    70,   328,   202,
-     536,   856,   216,   611,   706,    56,    48,   858,   389,   259,
-      48,   927,   251,   480,    77,  1195,   587,   160,  1496,    77,
-     440,   654,   588,  -114,  -114,  -292,  1094,  1082,  1406,   847,
-     437,   568,   569,   480,  1554,   886,   676,    48,  1093,  -114,
-     216,   480,   863,  1196,   611,   216,  1196,    48,   848,  1136,
-     324,   391,   374,   393,  1565,   917,   741,   849,   694,   340,
-    -522,  1569,   855,   485,   588,    48,   167,   392,  1205,   394,
-    1189,    48,   740,    48,   492,  1455,  1456,  1138,   111,   343,
-     872,   509,   142,  1470,  1139,   578,   481,   111,  1470,    41,
-      42,   796,   797,   798,   395,   731,   213,    48,    41,    42,
-     111,   732,   113,  1461,   608,   253,   481,   287,  1470,   431,
-     396,    41,    42,   435,   481,  1470,   113,  1385,    41,    42,
-     748,    48,   758,   562,   563,  1217,   749,   886,   759,    48,
-     714,   216,   741,    48,   374,   242,   245,    48,    98,  1109,
-     113,   980,   113,   324,   457,   523,   715,   708,  1213,  1263,
-     178,    69,   177,   264,   713,   507,  1124,   112,   738,   400,
-      63,  1215,   654,   401,  1153,   -10,   107,   639,   402,   403,
-    1038,   643,   910,   897,   404,   435,   405,   113,   497,   406,
-     654,    77,   113,   654,  -445,   328,   328,  -114,   619,   408,
-     716,  1210,  -446,  1109,  1410,   277,   750,  1175,  1177,   531,
-     908,    77,   177,   768,   111,   177,   717,  1256,  -114,    77,
-     331,   160,   216,    50,   832,    41,    42,   714,   785,   279,
-    1040,   768,   280,   791,   768,  -471,  1383,   213,  1205,   111,
-     164,   372,   113,   930,   332,  1205,  1346,   716,    70,    48,
-      41,    42,   343,  1347,   784,   597,    56,   898,   409,   603,
-      48,   177,    48,   931,  1202,    77,   881,  -471,   834,  -471,
-    1202,   328,   216,  -471,   333,  1296,  1297,   334,   636,   790,
-    1203,    48,   640,   474,   335,   340,  1328,  1502,    37,   899,
-     328,   653,    40,  1038,  1502,   900,   480,    48,  1205,    41,
-      42,  1337,   764,   113,   765,   164,   466,   766,   253,   330,
-     772,  1339,    48,  1433,   113,    48,   113,  1338,   111,   336,
-     713,   859,   373,   995,   177,   862,    43,  1340,   343,    41,
-      42,   377,   111,  1051,   386,    45,    46,   776,   956,   775,
-     324,   324,   390,    41,    42,   776,   879,  1551,   111,    48,
-     882,    48,  1186,  1386,  1098,   907,   328,   909,  1352,    41,
-      42,   921,   875,  1082,   113,   410,   876,   776,   457,   481,
-     113,   457,  1354,   923,   113,   738,   398,   559,   177,   776,
-    1525,   427,   113,   560,   561,   177,  1530,   443,   877,   117,
-    1132,   606,   878,    37,   216,    48,    48,    40,   873,   428,
-    1504,   436,  1505,   608,    41,    42,   589,  1550,   412,    48,
-     174,   481,  1557,  1004,   497,   580,   324,   412,   497,  1005,
-    1058,   433,   216,   955,    45,    46,   451,   216,   531,  -369,
-     531,   745,   462,   531,  -398,   324,   531,   675,  1017,   470,
-      45,    46,   874,   655,   732,   704,  1252,   340,   471,  1379,
-    1395,   738,   588,   254,   177,   776,  1020,  1552,   889,  1396,
-    -114,   832,  -114,   436,    77,   111,  -114,   140,   141,   493,
-     877,   177,   740,   905,  1120,   177,    41,    42,  1380,   513,
-     213,  -114,  -114,  1382,   776,  1179,  1451,   533,  -106,   776,
-      48,  1387,  -106,   592,   213,   412,   676,   776,   934,   164,
-     292,   324,    48,  1463,   706,   834,    77,  1371,   244,   517,
-     935,  1372,   830,  1422,   522,   216,  1430,     8,     9,    10,
-      11,    12,   534,   980,   718,   936,   230,   980,   980,   216,
-     231,  1452,   741,   235,  1471,   237,   536,  1449,   177,   572,
-     776,  1518,   246,   871,   573,   654,    31,  1519,   603,   418,
-     832,   574,   113,   654,   880,   575,   911,   111,   412,   140,
-     239,  1469,   751,  1254,   755,   557,  1473,  1258,    41,    42,
-     509,    69,   438,   578,    34,    48,  1523,  1463,   339,    97,
-      63,  1043,   446,   778,  1200,   412,   107,  -442,   213,    48,
-     570,   571,    45,    46,  1080,   240,  1495,    48,  1575,   914,
-     241,   412,  1374,   596,   588,   130,   519,   131,   132,   133,
-     340,    97,  1159,   741,   412,    48,    41,    42,   253,   330,
-     412,  1125,   149,   216,  1304,  1305,   599,  1307,    97,   960,
-      -3,   611,   457,  1311,   648,   113,  1314,   668,    45,    46,
-     564,   565,   190,  1344,   654,    97,   462,   163,    97,   462,
-     669,   530,   113,   107,  1171,   654,   412,   113,    70,  1008,
-    1005,   195,   497,  1174,   218,   611,    56,   228,  1176,   230,
-     611,   670,  1247,  1121,   672,    77,  1141,  1239,   111,   412,
-     140,   141,  1564,   420,   671,   412,   340,   673,  1564,    41,
-      42,   674,   942,  1149,   942,   677,   768,   679,  1149,  1564,
-     490,   330,   412,  1564,   177,   258,   533,   113,   533,   776,
-    1010,   533,   330,   412,   533,   893,   697,   654,   892,  1537,
-     113,   113,   113,   856,   330,   611,   111,    97,   140,   141,
-     832,  1404,  1207,  1126,   719,  1404,   177,    41,    42,   328,
-      97,   481,  1392,  1393,  1019,   113,   163,   107,  1149,   830,
-    1443,  1005,   177,   803,   804,   805,   806,   720,  1080,   375,
-     722,  1214,  1216,  1218,   724,   399,   190,   177,  -240,  1109,
-     760,     8,     9,    10,    11,    12,   946,    48,   773,   343,
-     777,   443,   949,  1449,  1450,   163,   466,  1497,  1498,    97,
-     781,   873,     8,     9,    10,    11,    12,  1429,   835,   691,
-      31,    97,     2,   207,     4,     5,     6,     7,   163,   230,
-     836,   235,   111,   839,   140,   141,   216,  1423,  1424,    70,
-     445,    31,   850,    41,    42,   799,   800,    56,    34,   801,
-     802,    97,   -12,   733,   807,   808,    77,  1487,   830,   -13,
-     894,   738,   457,   895,   902,   488,  1315,  1316,  1317,    34,
-     753,   925,   113,   922,   924,   754,   929,   700,   220,  -419,
-     950,   457,  -526,   964,   177,   971,   749,    35,   973,    36,
-     530,   580,   988,   412,    48,   530,   984,   985,   530,   654,
-      45,    46,   497,  1127,   324,  1353,  1355,  1356,   986,   978,
-     107,   989,   778,   937,   412,   990,   991,    69,  1000,   230,
-    1125,    45,    46,  1012,  1013,  1014,    63,   729,    97,  1095,
-     462,  1029,   107,  1030,  1031,   937,  1032,   113,   113,   113,
-    1080,  1033,   738,   537,   538,   539,  1105,   375,  1034,   613,
-    -293,  1035,   107,  1046,  -407,  -294,   871,     8,     9,    10,
-      11,    12,     8,     9,    10,    11,    12,  1447,   540,  1060,
-     541,  -406,   542,   543,  1106,  1107,  1097,   655,  1149,  1149,
-    1149,   213,  1108,  1563,  1063,  1114,    31,  1115,  1116,   211,
-     221,    31,  1117,  1123,   654,   654,  1207,    49,   114,  1133,
-     776,  1134,  1135,  1140,    70,   481,   190,   994,  1145,  1148,
-    1169,   107,    56,  1125,    34,  1190,   216,  1192,  1191,    34,
-    1193,    77,  1208,  1194,   400,   375,  1209,  1009,   401,    49,
-    1211,  1212,  1126,   402,   403,   768,  1080,   457,   830,   404,
-     148,   405,  1220,  1224,   406,   107,    49,    37,  1227,   654,
-     177,    40,   654,   408,  1226,   919,   705,    -3,    41,    42,
-     187,  1232,  1237,   210,   926,  1242,    49,  1244,   928,   502,
-    1248,    48,    48,  1253,  1536,  1255,   655,   675,   443,  1257,
-    1260,   113,   113,    70,  1261,   840,   442,   611,  1269,  1265,
-    1080,    56,    97,  1080,    45,    46,   613,   654,  -295,  1272,
-      77,  1274,   654,   114,  1053,     8,     9,    10,    11,    12,
-    1276,   114,   409,   216,   267,   272,  1125,  1277,  1278,  1306,
-     113,  1279,  1149,  1149,  1280,  1126,     2,   207,     4,     5,
-       6,     7,   654,  1282,    31,   729,   676,  1289,  1080,  1298,
-     462,  1299,  1309,  1080,   308,   148,  1310,  1312,   107,  1313,
-    1321,  1327,  1335,   114,   346,   229,  1207,   340,   210,   462,
-    1341,  1488,    34,  1207,   150,   481,  1343,  1345,   151,   152,
-    1349,   107,   481,  1080,  1350,  1351,  1357,  1063,   107,    48,
-     113,  1358,  1127,   187,   187,  1317,  1359,  1361,  1367,   113,
-    1368,    35,   937,    36,  1369,   654,  1370,  1377,  1397,   267,
-     654,  1378,  1381,  1388,    48,    48,  1389,    49,  1398,   842,
-     162,   613,  1407,  1400,  1417,  1418,  1207,  1410,   654,   210,
-     654,  1538,  -408,  1156,   654,   481,  1421,   654,  1126,    48,
-    1546,   107,  1446,  1436,   374,   654,  1080,   308,   114,   654,
-    1432,  1080,  1438,    70,    37,  1440,   184,   185,    40,    49,
-      70,    56,  1441,  1442,  1448,    41,    42,   272,    56,  1080,
-      77,  1080,   272,   267,   267,  1080,  1453,    77,  1080,   114,
-    1457,   729,  1458,   214,  1053,  1127,  1080,  1459,  1460,  1372,
-    1080,   729,   186,   233,  1302,    37,  1462,   175,   176,    40,
-    1472,    45,    46,   308,  1467,   729,    41,    42,   933,  1476,
-     705,  1474,  1103,    70,  1478,   308,  1480,  1482,   125,   128,
-     129,    56,  1484,  1485,  1490,   462,  1491,  1492,  1503,  1513,
-      77,   581,  1517,   373,  1529,   214,   148,  1515,  1521,  1544,
-    1522,  1545,   328,  1558,  1549,  1560,  1556,  1566,  1573,   114,
-    1574,  1225,   809,   346,   842,   613,   810,   612,   630,   177,
-     937,  1326,   811,    37,   812,   184,   185,    40,   813,  1524,
-    1435,  1259,   635,   414,    41,    42,   635,  1576,   214,   114,
-     422,  1391,  1506,    37,  1408,   184,   185,    40,  1127,   695,
-     696,   255,  1231,   256,    41,    42,   952,   943,   828,   215,
-    1144,   699,  1110,   412,   267,  1112,  1059,   920,   901,   700,
-      45,    46,   966,  1122,   187,  1336,   743,   818,   937,   937,
-    1509,   610,  1509,   611,   974,    37,   819,   184,   185,    40,
-      45,    46,   267,     0,   308,   308,    41,    42,   267,   214,
-     820,   635,    37,     0,   175,   176,    40,     0,     0,   842,
-       0,   215,   414,    41,    42,     0,     0,  1509,     0,  1509,
-    1221,   613,   114,   266,   701,   114,     8,     9,    10,    11,
-      12,     0,    45,    46,   397,     0,     0,   214,     0,     0,
-     377,     0,   214,     0,   416,   417,     0,   324,   267,   421,
-       0,   423,   424,     0,   215,    31,   267,   508,   635,     0,
-      49,     0,     0,     0,   746,   729,   729,   586,     0,     0,
-     114,     0,     0,     0,     0,   590,     0,     0,   593,     0,
-       0,   730,   308,    34,   114,     0,     0,   308,    37,   308,
-     308,     0,    40,     0,     0,     0,   177,     0,   779,    41,
-      42,   114,   346,  1011,     0,     0,     0,    37,   705,   175,
-     176,    40,     0,  1016,     0,   215,   705,     0,    41,    42,
-       0,     0,     0,   729,   729,     0,    43,  1028,   214,     0,
-       0,     0,     0,     0,   613,    45,    46,     0,     0,     0,
-       0,     0,   414,   537,   538,   539,   422,   581,   581,     0,
-       0,     0,     0,   215,     0,   308,     0,     0,   215,     0,
-      75,     8,     9,    10,    11,    12,   635,   346,   540,     0,
-     541,   630,   542,  1324,     0,     0,     0,   612,     0,   612,
-       0,     8,     9,    10,    11,    12,     0,    66,   118,   937,
-      31,     0,    75,     0,     0,     0,     0,   635,     0,     0,
-       0,     0,   635,     0,   630,     0,   937,     0,   635,   214,
-      31,   635,   635,   635,     0,     0,     0,     0,    34,    66,
-       0,     0,     0,    37,     0,     0,   214,    40,     0,   223,
-     635,   414,   267,     0,    41,    42,   161,    37,    34,   184,
-     185,    40,     0,    37,   215,   184,   185,    40,    41,    42,
-       0,     0,     0,     0,    41,    42,   222,     0,  1510,   214,
-    1510,   745,  1390,     0,   114,   346,   701,  1333,   701,     0,
-      45,    46,     0,     0,     0,   699,     0,   412,     0,   937,
-     937,   610,     0,   611,    45,    46,   114,     0,     0,   730,
-      45,    46,     0,   260,     0,  1510,     0,  1510,     0,   729,
-       0,     0,     0,     0,   635,   961,   630,   729,   729,   729,
-       0,     0,   746,   746,     0,     0,     0,   354,    37,     0,
-     184,   185,    40,   586,   586,   215,     0,  1184,  1185,    41,
-      42,     0,     0,     0,     0,   329,     0,     0,     0,     0,
-     114,   346,     0,   260,   351,   779,   779,     0,     0,     0,
-       0,     0,     0,     0,     0,   729,  1534,     0,   412,     0,
-       0,     0,     0,     0,     0,    45,    46,     0,     0,     0,
-       0,     0,     0,     0,   407,   215,     0,     0,     0,     0,
-       0,   214,     0,     0,     0,  1234,  1235,     0,   581,   425,
-       0,   450,   430,   432,     0,     0,   635,   161,   635,     0,
-    1023,     0,     0,   635,   346,     0,     0,   612,     0,   214,
-       0,   912,    75,     0,   214,   915,     0,    75,   449,   612,
-       0,  1507,   452,  1511,   453,   730,     0,     0,     0,     0,
-       0,     0,     0,   468,     0,   730,   823,   824,     0,    66,
-       0,     0,     0,     0,   482,     0,     0,     0,   414,   730,
-       0,     0,     0,     0,   489,     0,     0,     0,  1540,     0,
-    1542,     0,   432,     0,     0,   857,     0,     0,   860,   861,
-     308,   864,     0,   866,   867,     0,     0,     0,   868,   869,
-       0,     0,   544,   545,   546,   547,   548,   549,   550,   551,
-     552,   553,   635,   554,     0,     0,   114,   215,     0,     0,
-       0,     0,   214,  1571,     0,  1572,   701,     0,     0,     0,
-       0,     0,   223,     0,   701,   114,   214,   555,  1579,  1580,
-       0,     0,     0,     0,     0,   215,     0,   961,   961,   260,
-     215,     0,   746,   604,     0,     0,   508,   114,   308,   632,
+      48,   113,   115,   150,   429,    98,   400,   151,   152,   401,
+     454,   268,   402,   791,   932,   403,   514,   853,    69,  1203,
+     404,   405,   261,   441,   406,   870,   933,   712,   894,   113,
+     113,   768,    48,    56,   116,   934,   845,    98,   613,   841,
+     384,   385,   112,    48,   408,  1145,  1092,   846,  1091,    48,
+      69,   707,   507,    50,   162,   847,    63,    48,   842,  1153,
+     618,   843,   852,    48,   749,    56,    48,   844,   194,    48,
+     220,   217,   343,  1401,   227,   751,  1185,  1186,  1187,   756,
+     946,   178,   153,   113,   113,    50,   400,   409,    63,   401,
+     974,   144,   402,   932,  1464,   403,   426,   411,   154,   211,
+     404,   405,   221,   820,   406,   933,    77,    48,   679,  1197,
+      48,   155,   994,   169,   934,  1320,   728,    48,    31,    31,
+     480,   683,   685,    31,   408,   779,   637,   575,   688,   378,
+     641,   262,   536,   203,   263,   873,   692,   170,    77,   874,
+     519,   885,   886,   856,   123,   379,   150,   124,    48,   863,
+     151,   152,   143,   162,   281,   605,    48,  -235,  -235,   904,
+    1099,    48,   576,   556,   557,   536,   374,   409,  1464,  1421,
+    1422,   484,   486,   410,   841,   292,  1484,   167,   857,    31,
+    1421,  1422,   860,   204,  1321,   746,    48,    48,   253,   420,
+     412,   412,   162,   842,   536,   412,   843,   755,   485,    31,
+     975,   556,    48,   877,   977,  1220,  1221,   880,  1265,  1202,
+      48,  1193,   282,   936,   677,   162,   770,   586,   485,    48,
+     577,  1135,    48,   587,   388,   153,   150,   444,  -235,   113,
+     151,   152,   536,   957,   739,   949,  1266,   556,  1194,  1423,
+     389,   154,   167,   440,   113,    31,    31,   760,   113,   490,
+    1432,   412,    48,   113,   155,   442,  1038,    98,   597,  1404,
+     883,   883,   883,  1203,   674,   845,    48,    48,   841,   854,
+      69,   610,   162,    48,  1262,   328,   846,   391,  1187,   883,
+      48,   824,   480,  1510,   847,    56,   145,   842,   343,  1102,
+     843,   666,  1136,   392,   474,   113,  1025,   492,    97,  1137,
+     740,  1037,   480,   693,   509,    50,  1346,   675,    63,   587,
+     480,   472,   164,   481,   703,   861,   448,   610,  1539,   681,
+    1541,   618,  1111,   728,  1016,   686,  1185,  1186,  1187,    48,
+      97,   147,   111,  1494,   374,   469,   526,   729,   437,   730,
+    1155,   149,  1013,    41,    42,   731,   674,    97,   747,    48,
+      48,   107,   107,   883,   748,  1552,   536,   705,    77,   830,
+    1194,   190,  -470,    77,    97,   853,    48,    97,   328,  1468,
+      48,   856,  1092,   178,  1091,  1563,   156,   164,   529,  1553,
+     925,   653,  1567,   107,   761,   845,   884,   884,   884,   675,
+     638,   762,  1211,  -470,   642,  -470,   846,    48,   172,  -470,
+     437,   879,  1217,    70,   847,   884,  1568,    48,  -113,  -113,
+     915,   182,   374,   794,   795,   796,   111,   870,   140,   141,
+     107,   253,   330,  1203,  -113,    48,   393,    41,    42,   395,
+    1203,    48,   713,    48,   414,    70,   167,  1041,   605,   248,
+     739,   422,   394,   605,   883,   396,    97,   202,   714,   111,
+     343,  1459,  1187,  1383,   715,   890,  -291,    48,   728,    97,
+      41,    42,   113,  1453,  1454,   757,   111,  1468,   728,   213,
+     716,   758,  1468,   436,   607,   481,   113,    41,    42,   884,
+    -113,    48,   728,  1203,   399,   190,   875,  1408,   783,    48,
+     876,  1134,  1468,    48,   374,   481,   978,    48,    98,  1468,
+     113,  -113,   113,   481,   462,   789,   740,   251,    97,   682,
+     684,    69,  1151,   414,  1261,   712,   739,   112,   400,   177,
+      97,   401,   653,  1038,   402,    77,    56,   403,   895,  1119,
+     507,  1107,   404,   405,  -521,   436,   406,   113,  1036,   707,
+     653,  1122,   113,   653,   729,    77,    50,   737,   875,    63,
+      97,   713,  1118,    77,   480,   328,   328,   408,   906,   533,
+     618,  1173,  1175,   767,   488,   561,   562,   928,   585,   177,
+     884,   164,   177,   896,   774,   908,   589,   111,   784,   592,
+     775,   767,   740,   790,   767,  1107,   253,   558,    41,    42,
+    1018,   113,   715,   559,   560,   830,   954,   529,    48,    77,
+     409,   919,   529,   107,   897,   529,   652,   775,   929,    48,
+     898,    48,   343,  1500,   918,  -106,   264,   832,   177,  -106,
+    1500,   331,  1200,  1215,   -10,   443,  1200,    97,  1335,    37,
+      48,   328,   474,    40,   588,   993,   412,  1381,  1201,   921,
+      41,    42,  1326,   414,  1336,   775,    48,   422,   612,  1254,
+     328,  1036,   113,   230,   872,    70,   111,   231,   813,  -444,
+     235,    48,   237,   113,    48,   113,    43,    41,    42,   246,
+     887,   712,  1002,  1549,  -445,    45,    46,   277,  1003,   729,
+     287,   177,   728,   728,   830,   903,  -292,   279,   343,   729,
+    1049,    41,    42,     8,     9,    10,    11,    12,    48,   502,
+      48,   503,  1344,   729,   905,   190,   907,  1294,  1295,  1345,
+     591,  1096,   412,   113,  1431,   328,  1213,   523,   462,   113,
+    1337,   462,    31,   113,   565,   566,   111,   775,   140,   239,
+    1369,   113,   414,   280,  1370,   177,  1338,    41,    42,  1130,
+     728,   728,   177,  1384,    48,    48,  1015,   481,   332,  1009,
+      34,   333,   731,   737,   213,   704,   334,   871,    48,  1014,
+     567,   568,   607,   240,  1056,   111,  1252,   335,   241,  1250,
+    1256,   336,   953,  1026,   372,   587,    41,    42,   533,   909,
+     533,   412,   509,   533,  1377,  1184,   533,  1523,   111,   481,
+     775,    97,  1393,  1528,   674,   612,   230,    77,  -293,    41,
+      42,  1502,   703,  1503,  1350,     8,     9,    10,    11,    12,
+     111,   177,   140,   141,  1548,   912,   174,   412,   373,  1555,
+     935,    41,    42,   585,   585,    57,    57,  1352,   177,   737,
+     605,   377,   177,  1177,    31,  1378,   386,   675,    48,    77,
+     390,   775,   935,    37,   107,   705,   216,    40,   932,  1157,
+      48,   412,   244,   832,    41,    42,   398,    57,  1550,   254,
+     933,   410,    34,   243,   830,   563,   564,   978,  1380,   934,
+    -368,   978,   978,   427,   775,    37,   556,   184,   185,    40,
+     838,  1169,   610,   412,  1331,   213,    41,    42,   428,    45,
+      46,    57,   451,   653,    57,   177,    70,  1172,   216,   610,
+     113,   653,  1385,   729,   729,   739,   433,   840,   775,   612,
+    -397,   910,   698,   470,   412,   913,   728,   519,  1449,    69,
+     699,    45,    46,    48,   728,   728,   728,  1174,  1198,   610,
+     537,   538,   539,  1007,    56,  1461,   230,    48,   235,    37,
+     471,   216,  1078,    40,   763,    48,   764,  1450,   414,   765,
+      41,    42,   771,  1447,   540,   418,   541,    63,   542,   543,
+     493,   729,   729,    48,     8,     9,    10,    11,    12,  1123,
+     513,   740,   728,  1182,  1183,  1237,   744,   412,   438,   111,
+     292,   462,   349,   113,   517,    45,    46,  1342,   446,  1469,
+      41,    42,   653,    31,   522,   775,   931,   940,   704,   940,
+     113,  1124,   216,   653,   534,   113,   536,    77,  1521,  1461,
+    1051,     2,   207,     4,     5,     6,     7,   569,   570,  1245,
+     571,    34,   775,  1008,  1139,    37,   230,   184,   185,    40,
+     572,  1232,  1233,  1516,   443,  1372,    41,    42,   573,  1517,
+     216,  1147,   840,   612,   767,   216,  1147,    57,  1573,   579,
+     574,   412,   740,   577,   587,   113,   339,   530,    45,    46,
+     177,  -441,   609,   585,   610,   653,  1006,  1003,   113,   113,
+     113,    45,    46,   330,   412,  1402,    35,    57,    36,  1402,
+    1205,  1390,  1391,     8,     9,    10,    11,    12,   111,   595,
+     140,   141,   177,   113,   598,    56,  1147,   328,   935,    41,
+      42,  1535,   253,   330,   412,  1332,  1078,    -3,   177,  1212,
+    1214,  1216,    31,  -113,   647,  -113,  1441,  1003,   481,  -113,
+     420,   670,   412,   177,   667,    48,   676,   213,   668,  1154,
+     669,   216,  1421,  1422,  -113,  -113,   840,   729,   343,    -3,
+      34,   213,   490,   330,   412,   729,   729,   729,   612,   871,
+     671,  1107,  1447,  1448,     2,   207,     4,     5,     6,     7,
+     672,     2,   207,     4,     5,     6,     7,    37,    77,   184,
+     185,    40,   854,   330,   610,   414,  1495,  1496,    41,    42,
+    1051,  1485,   579,   229,   412,   673,   777,  1080,   412,   258,
+     462,    45,    46,   729,   678,    45,    46,   805,   806,   111,
+     113,   140,   141,   696,   186,   690,   220,  1358,   718,   462,
+      41,    42,   216,    45,    46,  1360,  1361,  1362,   737,    35,
+     177,    36,    48,   958,   719,   610,    35,   653,    36,   537,
+     538,   539,    45,    46,   213,   704,   752,   211,   221,   732,
+     721,   753,   723,   704,  -239,    69,   797,   798,  1123,   142,
+     799,   800,   107,   540,  1158,   541,   935,   542,  1322,   349,
+      56,   612,   216,  1397,   759,   113,   113,   113,  1078,   776,
+     772,  1170,  1313,  1314,  1315,   130,   530,   131,   132,   133,
+    1124,   530,   780,    63,   530,   833,    41,    42,  1302,  1303,
+     834,  1305,   837,   848,  1445,   900,   -12,  1309,   893,   737,
+    1312,   -13,   242,   245,    70,   892,  1147,  1147,  1147,  1351,
+    1353,  1354,  1561,   923,   935,   935,   920,   922,    57,   107,
+     948,   699,   653,   653,  1205,    49,   114,   214,   801,   802,
+     803,   804,   927,    77,   442,  -418,  -525,   233,   962,    56,
+     748,  1123,    37,   969,   175,   176,    40,   971,  1238,   976,
+     982,  1208,   400,    41,    42,   401,   984,    49,   402,   983,
+     349,   403,   481,   767,  1078,   462,   404,   405,   148,   986,
+     406,   998,   987,  1124,    49,   988,  1093,   653,   163,   214,
+     653,   989,  1010,   216,  1011,   177,  1012,  1027,   187,  1028,
+     408,   210,   195,  1029,    49,   218,  1030,  1031,   228,    48,
+      48,  1534,  1032,  1033,  1044,  -406,  -405,  1104,  1105,   113,
+     113,   216,    77,   107,   674,  1058,   216,  1103,  1078,  1095,
+    1106,  1078,   214,  1444,   349,   653,  1112,   443,  1113,  1114,
+     653,   114,  1115,   409,  1121,   775,  1131,  1132,  1133,   114,
+     917,  1206,   267,   272,  1123,   992,  1138,  1146,   113,   924,
+    1147,  1147,  1143,   926,  1167,  1188,  1189,   675,  1190,  1191,
+     653,  1427,  1192,   466,  1207,    70,  1078,  1209,   349,   349,
+     349,  1078,   308,   148,  1210,  1218,  1124,   163,  1224,  1222,
+    1230,   114,   346,   214,  1205,  1225,   210,   349,    -3,  1486,
+     375,  1205,   150,  1235,  1240,  1242,   151,   152,   502,    56,
+    1251,  1078,  1246,  1253,   216,  1258,    56,    48,   113,  1255,
+    1259,   187,   187,  1080,  1263,  1267,   163,   113,   216,  1270,
+    1272,   214,   481,   653,  1274,   935,   214,   267,   653,   481,
+    1275,  1276,    48,    48,  1277,    49,   215,  1278,   162,   163,
+    1280,   508,   935,  1287,  1205,  1296,   653,   210,   653,  1536,
+    1297,   445,   653,  1304,  1333,   653,   107,    48,  1544,    56,
+    1307,   349,   374,   653,  1078,   308,   114,   653,  1308,  1078,
+    1325,  1310,    77,  1311,  1319,  1339,  1341,    49,   107,    77,
+    1347,  1343,   481,  1367,  1348,   272,  1349,  1078,   215,  1078,
+     272,   267,   267,  1078,  1355,  1356,  1078,   114,   107,  1357,
+     654,  1359,  1365,  1366,  1078,  1368,  1375,   213,  1078,  1394,
+    1376,   216,   214,  1379,  1386,   935,   935,  1387,  1315,  1395,
+    1396,   308,  1434,  -407,  1405,  1398,  1415,  1416,  1419,  1408,
+      70,   215,    77,   308,  1430,  1436,  -294,  1438,  1439,  1440,
+    1446,  1455,  1451,     8,     9,    10,    11,    12,  1456,   580,
+    1457,  1458,   349,  1370,   148,  1460,  1474,   107,   375,  1465,
+     349,  1476,  1478,  1420,  1470,  1472,  1428,   114,  1480,  1483,
+     328,   346,    31,  1488,  1490,   611,   629,  1482,  1511,  1489,
+    1501,   717,  1515,  1513,   177,  1527,  1101,  1519,  1520,  1542,
+     634,   107,   215,   214,   634,  1556,  1543,   114,  1547,  1554,
+      34,  1558,  1564,  1571,   443,  1572,  1223,   807,   809,    70,
+     214,  1467,   808,   810,  1324,  1522,  1471,   811,  1433,   750,
+    1574,   754,   267,  1389,  1257,  1406,    57,  1504,  1229,  1108,
+     215,   941,   187,   694,  1110,   215,   375,   695,  1508,   826,
+    1508,  1142,   950,   214,  1057,   899,  1493,   964,  1120,  1334,
+     267,   742,   308,   308,   972,   816,   267,     0,     0,   634,
+       0,    37,   817,   184,   185,    40,   818,     0,     0,     0,
+       0,     0,    41,    42,     0,  1508,     0,  1508,     0,     0,
+     114,     0,   700,   114,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    57,   107,     0,     0,     0,   698,     0,
+     412,     0,     0,     0,   216,     0,   267,    45,    46,     0,
+     349,     0,     0,     0,   267,     0,   634,   107,    49,     0,
+       0,   215,   745,     0,   107,     0,     0,     0,   114,     0,
+     488,     0,  1562,     0,  1219,     0,     0,     0,  1562,     0,
+     308,     0,   114,     0,     0,   308,     0,   308,   308,  1562,
+     117,     0,     0,  1562,     0,     0,   778,     0,     0,   114,
+     346,   177,     0,     0,   214,     0,     0,   349,   349,    70,
+       0,   891,     0,     0,     0,     0,    70,   107,     0,     0,
+       0,     0,     8,     9,    10,    11,    12,    57,     0,     0,
+       0,     0,   214,     0,     0,     0,     0,   214,   160,     0,
+       0,     0,   215,     0,   580,   580,    37,     0,   175,   176,
+      40,    31,   308,     0,     0,     0,     0,    41,    42,     0,
+       0,     0,     0,   634,   346,     0,     0,     0,   629,    70,
+       0,     0,   944,     0,   611,     0,   611,     0,   947,    34,
+       0,     0,   466,   373,     0,     8,     9,    10,    11,    12,
+       0,     0,   215,     0,   634,   259,     0,     0,     0,   634,
+       0,   629,     0,   160,     0,   634,     0,     0,   634,   634,
+     634,     0,     0,     0,    31,     8,     9,    10,    11,    12,
+       0,   777,     0,   412,   216,   214,     0,   634,     0,   267,
+      45,    46,     0,     0,     0,     0,   324,     0,     0,   214,
+       0,     0,    34,     0,    31,   340,     0,     0,     0,     0,
+       0,     0,     0,   127,   127,   127,     0,     0,     0,   508,
+       0,   114,   346,   700,     0,   700,     0,     0,     0,    57,
+      57,     0,    34,     0,     0,     0,     0,    37,     0,   184,
+     185,    40,     0,   114,   958,     0,   610,     0,    41,    42,
+       0,     0,    57,    45,    46,   431,     0,     0,     0,   435,
+       0,   634,   959,   629,     0,     0,     0,     0,     0,   745,
+     745,     0,    57,   215,   186,     0,  1388,     0,     0,     0,
+       0,   216,     0,    45,    46,     0,   127,     0,   127,   324,
+     457,     0,   214,     0,     0,     0,     0,   114,   346,     0,
+       0,   215,   778,   778,     0,     0,   215,     0,     0,     0,
+       0,     0,   654,   276,     0,     0,     0,   349,   349,  1061,
+       0,   435,     0,     0,   497,    37,    57,   175,   176,    40,
+       0,    57,     0,     0,     0,     0,    41,    42,     0,     0,
+       0,     0,     0,     0,   580,   531,     0,     0,     0,     0,
+       0,     0,   634,     0,   634,     0,  1021,   160,     0,   634,
+     346,     0,   377,   611,     0,    57,     0,     0,     0,   127,
+       8,     9,    10,    11,    12,   611,     0,   127,     0,   127,
+     127,     0,     0,     0,   127,     0,   127,   127,     0,     0,
+       0,   596,     0,     0,   215,   602,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,     0,     0,   215,     0,
+       0,   654,     0,    37,   635,   184,   185,    40,   639,     0,
+       0,   340,     0,     0,    41,    42,   308,    34,     0,     0,
+       0,     0,    37,     0,     0,  1505,    40,  1509,     0,     0,
+       0,     0,   349,    41,    42,     0,     0,     0,   634,     0,
+     266,     0,   114,     0,     0,     0,   127,     0,     0,    45,
+      46,     0,   700,     0,     0,     0,     0,     0,    57,    43,
+     700,   114,  1538,     0,  1540,     0,   324,   324,    45,    46,
+       0,     0,     0,   959,   959,   214,     0,     0,   745,     0,
+       0,    57,     0,   114,   308,     0,     0,     0,    57,     0,
+       0,   215,     0,     0,   457,     0,     0,   457,     0,     0,
+     346,     0,  1061,     0,     0,     0,   778,  1569,     0,  1570,
+       0,     0,     0,     0,     0,   117,     0,     0,     0,     0,
+       0,     0,  1577,  1578,     0,     0,     0,     0,     0,     0,
+     125,   128,   129,     0,     0,     0,   346,     0,     0,     0,
+     497,    57,   324,     0,   497,     0,     0,     0,     0,     8,
+       9,    10,    11,    12,   531,     0,   531,   634,   634,   531,
+       0,   324,   531,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   340,     0,     0,     0,   308,    31,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,  -295,     0,    26,
+      27,    28,     0,   255,     0,   256,    34,     0,    31,  1300,
+       0,    37,     0,   184,   185,    40,     0,   114,   634,     0,
+       0,     0,    41,    42,     0,     0,   324,     0,     0,     0,
+       0,     0,   959,     0,     0,     0,    34,   828,     0,     0,
+     267,    37,     0,   337,   338,    40,     0,  -295,   609,     0,
+     610,     0,    41,    42,     0,   214,     0,    45,    46,     0,
+       8,     9,    10,    11,    12,     0,     0,     0,   869,     0,
+       0,     0,     0,   602,    66,   118,     0,   346,   643,   878,
+     339,     0,     0,     0,   215,     0,   397,    45,    46,    31,
+       0,     0,     0,     0,     0,     0,   416,   417,     0,     0,
+       0,   421,     0,   423,   424,     0,    66,   544,   545,   546,
+     547,   548,   549,   550,   551,   552,   553,    34,     0,   272,
+     114,     0,    37,   161,   184,   185,    40,    37,     0,   184,
+     185,    40,     0,    41,    42,   340,     0,   114,    41,    42,
+       0,   554,   308,   222,    75,     0,     0,     0,     0,     0,
+       0,     0,   214,     0,     0,     0,     0,   457,   634,   266,
+     127,   127,   114,     0,  1532,     0,   412,     0,    45,    46,
+       0,     0,     0,    45,    46,     0,    75,     0,     0,     0,
+     260,     0,     0,     0,     0,     0,     0,   497,     0,   127,
+       0,     0,   127,   127,     0,   127,     0,   127,   127,     0,
+       0,     0,   127,   127,     0,     0,     0,   634,   634,     0,
+       0,   340,     0,   223,     0,     0,   272,     0,     0,     0,
+       0,   308,   329,     0,     0,     0,     0,     0,     0,     0,
+     260,   351,     0,     0,     8,     9,    10,    11,    12,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   637,     0,   346,     0,   637,     0,     0,   260,
-     779,  1360,   944,   945,   586,     0,     0,     0,   947,  1362,
-    1363,  1364,     0,     8,     9,    10,    11,    12,     0,    75,
+       0,     0,     0,     0,     0,   114,     8,     9,    10,    11,
+      12,   407,     0,    31,   215,     0,     0,     0,  1017,     0,
+       0,     0,     0,   828,     0,     0,   425,     0,     0,   430,
+     432,   127,     0,     0,   161,    31,   127,   127,     0,     0,
+       0,    34,   127,     0,     0,     0,    37,     0,   184,   185,
+      40,   354,     0,     0,     0,   449,     0,    41,    42,   452,
+       0,   453,     0,    34,     0,   267,     0,     0,    37,     0,
+     468,     0,    40,     0,     0,     0,    66,     0,     0,    41,
+      42,   482,   634,   698,     0,   412,     0,     0,     0,     0,
+       0,   489,    45,    46,     0,     0,     0,     0,     0,   432,
+       0,     0,     0,     0,     0,   744,     0,     0,   114,     0,
+       0,   215,   828,     0,    45,    46,   457,     0,     0,     0,
+       0,     0,     0,     0,     0,   450,     0,     0,     0,     0,
+       0,   114,     0,     0,     0,   457,     0,     0,   114,     0,
+     114,     0,   114,     0,     0,     0,    75,     0,     0,     0,
+       0,    75,     0,     0,     0,     0,   497,  1125,   324,     0,
+       0,     0,     0,     0,     0,     0,   260,     0,     0,     0,
+     603,     0,  1533,     0,     0,     0,   631,   114,     0,   114,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   636,
+       0,   114,     0,   636,     0,     0,   260,  1533,  1533,     0,
+       0,     0,     0,     0,     0,     0,     0,   308,     0,     0,
+     869,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1533,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   821,   822,     0,
+       0,     0,     0,   482,     0,     0,   223,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   351,     0,
+       0,    78,     0,   482,     0,     0,   855,     0,     0,   858,
+     859,   482,   862,     0,   864,   865,     0,     0,     0,   866,
+     867,     8,     9,    10,    11,    12,     0,     0,     0,     0,
+       0,   457,   828,    78,     0,     0,     0,   724,     0,     0,
+     432,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      31,     0,     0,    75,     0,   738,     0,    66,     0,     0,
+       0,     0,     0,     0,     0,   432,     0,     0,   354,   432,
+     224,     0,     0,    75,     0,     0,     0,     0,    34,     0,
+       0,    75,     0,    37,     0,   184,   185,    40,     0,     0,
+       0,     0,     0,     0,    41,    42,     0,     0,   260,   351,
+       0,     0,     0,   942,   943,     0,     0,   354,  1034,   945,
+       0,     8,     9,    10,    11,    12,     0,     0,     0,     0,
+    1532,     0,   412,     0,     0,   354,     0,    75,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,   283,   284,
+      31,   285,     0,     0,   819,     0,     0,     0,     0,     0,
+       0,   340,     0,     0,     0,     0,     0,     0,   356,     0,
+       0,     0,   636,   831,     0,     0,   127,   286,    34,   354,
+       0,     0,     0,   287,     0,   850,  1125,   288,     0,     0,
+     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
+       0,     0,     0,   603,     0,   295,     0,     0,   603,     0,
+       0,     0,     0,     0,   636,     0,     0,   351,   351,   351,
+     296,     0,   380,     0,     0,     0,     0,     0,     0,   345,
+      46,   298,   299,   300,   301,     0,   351,     0,     0,     0,
+       0,     0,     0,   354,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   724,     0,     0,     0,     0,     0,
+       0,     0,     0,    78,     0,   482,     0,     0,    78,     0,
+     260,   738,     0,     0,   937,     0,     0,     0,     0,  1125,
+       0,     0,     0,     0,     0,     0,     0,   354,   354,   354,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     346,     0,     0,     0,   354,     0,     0,     0,     0,    75,
-       0,     0,    31,     0,     0,     0,   482,    75,     0,     0,
-     214,   635,   635,     0,     0,     0,     0,  1399,   215,     0,
-       0,   351,     0,     0,     0,     0,   482,     0,     0,     0,
-      34,   308,   215,   354,   482,    37,     0,   184,   185,    40,
-       0,     0,     0,     0,     0,     0,    41,    42,     0,   730,
-     730,   354,     0,    75,     0,     0,     0,     0,     0,     0,
-     725,     0,     0,   432,     0,     0,     0,     0,     0,     0,
-       0,   114,   635,   699,     0,   412,   414,     0,   739,     0,
-      66,     0,    45,    46,     0,    78,   961,     0,   432,     0,
-       0,     0,   432,     0,   267,   354,     0,     0,     0,     0,
-       0,     0,     0,   488,     0,     0,     0,   730,   730,     0,
-       0,     0,     0,     0,     0,     0,     0,    78,     0,     0,
-       0,   260,   351,     0,     0,     0,   215,     0,     0,     0,
-       0,   346,     0,     0,     0,     0,     8,     9,    10,    11,
+       0,   127,     0,     0,     0,     0,   354,   482,     0,     0,
+     351,     0,     0,     0,     0,     0,     0,     0,     0,   963,
+       0,     0,   432,     0,   354,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    75,     0,     0,     0,     0,
+       0,   354,     0,     0,     0,     0,   260,   738,     0,     0,
+       0,     0,   991,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   224,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    75,     0,     0,
+     354,     0,  1125,     0,     0,     0,     0,     0,     0,   724,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   724,
+       0,   351,     0,   636,     0,     0,  1024,     0,   636,   831,
+       0,     0,     0,   724,  1507,     0,  1507,   354,     0,     0,
+       0,     0,     0,  1035,     0,     0,     0,     0,     0,     0,
+      78,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   356,     0,     0,     0,     0,
+      78,  1507,     0,  1507,     0,     0,     0,     0,    78,   354,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   354,
+       0,   354,     0,     0,     0,    66,   223,     0,     0,   354,
+       0,   324,     0,   354,   356,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    80,   636,     0,     0,
+       0,     0,   356,  1234,    78,   283,   284,     0,   285,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    80,     0,
+      26,    27,    28,  1117,   286,     0,     0,     0,     0,    31,
+     287,   432,   118,     0,   288,    75,   356,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,   351,
+       0,     0,   295,     0,     0,   225,    87,    34,     0,     0,
+       0,     0,    37,     0,    38,    39,    40,   296,     0,   380,
+       0,     0,   381,    41,    42,     0,    45,    46,   298,   299,
+     300,   301,     0,     0,     0,   603,     0,     0,    87,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   430,    43,
+     356,   158,     0,   724,   724,     0,   351,   351,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,  1323,   354,
+       0,     0,     0,     0,     0,   226,  1204,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   357,   356,   356,   356,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   724,   724,   356,     0,     0,     0,   636,     0,     0,
+       0,     0,     0,   354,   354,     0,   354,   354,     0,     0,
+       0,   356,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    78,     0,     0,     0,    75,     0,   356,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   364,     0,     0,   283,   284,     0,   285,
+       0,     0,     0,     0,     0,     0,   738,     0,     0,     0,
+       0,   354,   354,     0,    78,     0,     0,   356,    80,     0,
+       0,     0,     0,    80,     0,   286,     0,     0,     0,     0,
+       0,   649,     0,   140,   141,   288,     0,     0,   289,   650,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,  1301,
+       0,     0,     0,   295,   356,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   260,     0,   296,     0,
+     651,    66,   652,   381,     0,     0,   354,    45,    46,   298,
+     299,   300,   301,     0,     0,   724,     0,   738,    87,     0,
+       0,   118,     0,    87,     0,     0,   356,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   356,     0,   356,     0,
+       0,     0,     0,   224,     0,     0,   356,   724,   225,   223,
+     356,     0,     0,     0,     0,   724,   724,   724,     0,     0,
+       0,     0,     0,     0,     0,     0,   351,   351,     0,     0,
+       0,    75,     0,     0,     0,     0,     0,     0,     0,     0,
+    1204,     0,     0,     0,     0,   354,     0,   354,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   724,     0,     0,     0,     0,     0,     0,
+       0,     0,    78,     0,   118,    80,     0,   354,   226,     0,
+       0,     0,     0,     0,     0,   354,   354,   354,     0,     0,
+     357,     0,     0,     0,     0,    80,   354,   354,     0,     0,
+       0,     0,     0,    80,     0,     0,     0,     0,     0,     0,
+      75,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,   357,
+       0,     0,     0,   354,     0,     0,     0,     0,     0,     0,
+      31,     0,     0,     0,     0,    87,     0,   357,     0,    80,
+       0,   351,     0,     0,     0,     0,   356,     0,     0,     0,
+     364,     0,     0,     0,     0,    87,     0,     0,    34,     0,
+       0,     0,     0,    87,     0,     0,     0,   118,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   357,     0,     0,     0,     0,     0,     0,     0,   364,
+    1204,     0,     0,     0,     0,     0,     0,  1204,     0,     0,
+     356,   356,     0,   356,   356,     0,     0,   364,     0,    87,
+       0,   354,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    78,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,  -295,     0,   357,     0,     0,     0,     0,
+    1204,   364,     0,     0,    31,     0,     0,  1557,   356,   356,
+      75,     0,     0,     0,     0,     0,     0,    75,     0,     0,
+       0,     0,     0,     0,   168,     0,   173,     0,     0,   179,
+     180,   181,    34,   183,     0,     0,     0,     0,     0,   357,
+     357,   357,     0,  -295,     0,     0,     0,     0,   234,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   357,     0,
+     249,   250,     0,     0,     0,   364,     0,     0,     0,     0,
+      75,     0,     0,   356,     0,     0,   357,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    80,     0,     0,
+       0,     0,     0,   357,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   364,
+     364,   364,     0,     0,     0,     0,   224,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   364,    80,
+       0,     0,   357,     0,     0,     0,     0,     0,    78,     0,
+       0,     0,     0,     0,     0,     0,   364,     0,     0,     0,
+       0,     0,   356,     0,   356,     0,     0,    87,     0,     0,
+       0,     0,     0,   364,     0,     0,     0,     0,     0,   357,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   356,     0,     0,     0,     0,     0,
+       0,     0,   356,   356,   356,     0,     0,     0,     0,    87,
+       0,     0,   364,   356,   356,     0,     0,     0,     0,     0,
+       0,   357,     0,     0,     0,     0,     0,    78,     0,     0,
+       0,   357,     0,   357,     0,     0,     0,     0,   225,     0,
+       0,   357,     0,     0,     0,   357,     0,     0,     0,   364,
+     356,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   476,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,   364,     0,     0,     0,     0,     0,    31,     0,     0,
+       0,   364,     0,   364,     0,     0,     0,    80,   226,     0,
+       0,   364,     0,     0,     0,   364,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,   600,    35,   608,    36,
+       0,     0,    38,    39,     0,     0,     0,     0,   356,   632,
+     633,     0,     0,     0,     0,     0,     0,     0,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    -3,     0,    26,    27,    28,    87,     0,     0,
+       0,   283,   284,    31,   285,     0,     0,    78,     0,     0,
+       0,   357,     0,     0,    78,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     286,    34,     0,    35,     0,    36,   287,     0,    38,    39,
+     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
+     293,   294,     0,     0,     0,     0,     0,     0,   295,     0,
+       0,     0,     0,     0,     0,   357,   357,    78,   357,   357,
+       0,     0,     0,   296,     0,   344,     0,     0,     0,     0,
+     781,   364,   345,    46,   298,   299,   300,   301,    80,     0,
+       0,     0,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,   357,   357,   283,   284,    31,   285,     0,
+       0,   212,     0,     0,     0,   364,   364,     0,   364,   364,
+       0,   232,     0,   236,     0,   238,     0,     0,     0,     0,
+       0,     0,   247,     0,   286,    34,     0,    35,    87,    36,
+     287,     0,    38,    39,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,     0,
+       0,     0,   295,   212,     0,   236,   238,   247,   357,     0,
+       0,     0,     0,   364,   364,     0,     0,   296,     0,   930,
+     283,   284,     0,   285,   781,     0,   345,    46,   298,   299,
+     300,   301,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   212,     0,     0,   286,
+       0,   225,     0,     0,     0,   287,     0,     0,     0,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
+     294,     0,     0,    80,     0,     0,     0,   295,   364,     0,
+       0,     0,     0,     0,     0,     0,     0,   357,     0,   357,
+       0,     0,   296,     0,   380,     0,     0,     0,     0,     0,
+     812,    45,    46,   298,   299,   300,   301,   212,     0,   236,
+     238,   247,     0,     0,     0,     0,     0,     0,     0,   357,
+       0,   226,     0,     0,     0,     0,     0,   357,   357,   357,
+       0,     0,     0,     0,     0,     0,     0,     0,   357,   357,
+       0,     0,     0,    87,     0,   212,   951,     0,   952,     0,
+     212,     0,    80,     0,     0,   955,   956,   364,     0,   364,
+     961,     0,     0,     0,     0,   506,     0,     0,     0,     0,
+       0,     0,   966,     0,     0,   357,     0,   970,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   364,
+       0,     0,     0,     0,     0,     0,     0,   364,   364,   364,
+       0,     0,     0,   999,     0,     0,     0,     0,   364,   364,
+     166,     0,     0,     0,   212,   283,   284,     0,   285,     0,
+       0,     0,    87,     0,     0,     0,     0,   219,     0,     0,
+       0,     0,     0,     0,     0,     0,   212,     0,     0,     0,
+       0,   236,   238,     0,   286,   364,     0,     0,     0,   247,
+     287,     0,     0,     0,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,   357,   293,   294,     0,     0,     0,     0,
+       0,     0,   295,     0,     0,   166,     0,     0,     0,   273,
+       0,     0,     0,     0,     0,     0,     0,   296,     0,   380,
+       0,     0,   212,     0,   781,     0,    45,    46,   298,   299,
+     300,   301,     0,     0,  1045,  1046,  1047,  1048,   166,  1050,
+     212,     0,    80,   283,   284,   212,   285,   212,   370,    80,
+       0,     0,   376,     0,     0,  1094,     0,     0,     0,     0,
+       0,     0,     0,   364,   212,     0,     0,   212,   212,  1100,
+       0,     0,   286,     0,     0,     0,     0,     0,   287,     0,
+       0,     0,   288,   212,     0,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,   212,     0,     0,
+     295,   166,    80,     0,   212,     0,     0,     0,  1116,     0,
+       0,     0,    87,   219,     0,   296,     0,   380,     0,    87,
+     992,     0,     0,     0,    45,    46,   298,   299,   300,   301,
+       0,   166,   463,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1144,     0,
+       0,     0,     0,     0,     0,  1152,   376,     0,     0,     0,
+    1156,     0,     0,   166,     0,  1160,     0,  1161,     0,     0,
+       0,  1163,    87,  1164,  1165,     0,     0,  1168,   283,   284,
+       0,   285,     0,     0,     0,     0,  1180,   463,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   166,
+       0,     0,     0,     0,  1195,  1196,     0,   286,     0,     0,
+       0,     0,     0,   287,     0,     0,     0,   288,   212,     0,
+     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
+       0,  1226,     0,     0,  1228,   295,     0,   606,     0,     0,
+       0,     0,   630,     0,     0,     0,   212,   157,     0,     0,
+     296,   212,   380,     0,     0,     0,     0,     0,     0,    45,
+      46,   298,   299,   300,   301,     0,     0,     0,     0,     0,
+       0,     0,     0,  1244,     0,     0,     0,     0,     0,  1248,
+    1249,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1260,     0,     0,     0,   252,  1264,     0,     0,  1268,
+       0,  1269,     0,     0,  1271,   257,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1279,   166,   166,
+       0,     0,     0,     0,     0,   370,     0,     0,     0,     0,
+    1286,     0,  1288,  1289,  1290,  1291,     0,     0,     0,   212,
+       0,     0,     0,     0,     0,     0,   463,     0,  1298,   463,
+    1299,     0,     0,   212,   173,     0,     0,     0,     0,     0,
+       0,   157,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   506,     0,   387,     0,     0,     0,     0,
+       0,     0,   741,  1327,  1328,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   166,     0,     0,     0,   419,     0,
+       0,     0,     0,     0,     0,     0,   463,     0,   463,     0,
+       0,   463,   434,   166,   463,     0,     0,     0,     0,     0,
+       0,   439,     0,     0,     0,     0,   370,     0,     0,     0,
+       0,   447,     0,     0,   212,  1363,  1364,     0,     0,     0,
+       0,     0,     0,     0,     0,  1374,   212,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   473,     0,     0,     0,
+       0,   483,     0,     0,     0,   212,     0,     0,     0,     0,
+       0,     0,     0,     0,   491,     0,     0,     0,   166,     0,
+     501,     0,   505,     0,     0,     0,     0,     0,     0,     0,
+     370,     0,     0,     0,   836,     0,     0,  1407,     0,     0,
+     535,     0,     0,     0,     0,     0,     0,     0,     0,  1411,
+       0,  1412,  1413,  1414,     0,     0,     0,     0,     0,     0,
+     606,     0,     0,  1418,     0,   606,     0,     0,     0,     0,
+       0,     0,  1429,     0,   370,   370,   370,     0,     0,     0,
+       0,     0,   594,     0,     0,     0,     0,   599,  1442,     0,
+       0,     0,   212,   370,     0,     0,     0,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,  -296,   644,     0,   212,     0,
+     645,   646,     0,   648,     0,     0,    31,     0,   741,     0,
+     660,   661,     0,   662,   663,     0,   664,     0,   665,     0,
+       0,     0,     0,     0,  1491,  1492,   212,     0,     0,   463,
+       0,     0,     0,     0,    34,   594,     0,  1497,     0,     0,
+       0,     0,     0,   680,  1497,  -296,     0,   370,     0,   960,
+       0,     0,     0,     0,     0,     0,     0,  1178,     0,   212,
+       8,     9,    10,    11,    12,     0,     0,     0,   691,     0,
+     212,     0,     0,     0,     0,     0,     0,  1531,     0,   697,
+       0,  1537,     0,     0,   741,     0,     0,   283,   284,    31,
+     285,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   733,     0,     0,     0,     0,     0,   736,     0,
+    1559,     0,  1560,   473,     0,     0,   286,    34,     0,     0,
+       0,     0,   287,     0,     0,     0,   288,     0,     0,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,   370,     0,
+    1575,  1576,   630,     0,   295,     0,   370,     0,  1579,  1580,
+     773,     0,   212,     0,     0,     0,     0,     0,     0,   296,
+       0,   380,     0,     0,   788,     0,     0,     0,  1179,    46,
+     298,   299,   300,   301,     0,     0,     0,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,  -295,     0,    26,    27,    28,
+     322,     0,   815,     0,     0,     0,    31,     0,     0,     0,
+     347,   825,     0,     0,     0,     0,     0,     0,   827,     0,
+       0,     0,   383,   383,   835,     0,     0,     0,     0,     0,
+       0,     0,     0,   849,    34,     0,     0,     0,   463,   212,
+       0,    38,    39,     0,     0,  -295,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   463,     0,   283,
+     284,     0,   285,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   889,     0,   643,     0,   339,     0,
+     166,     0,     0,     0,     0,    45,    46,     0,   286,     0,
+       0,     0,     0,   322,   287,     0,   370,     0,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
+     835,     0,     0,     0,     0,     0,   295,   487,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   296,   606,   380,     0,     0,   212,     0,     0,     0,
+     734,    46,   298,   299,   300,   301,     0,     0,     0,     0,
+       0,     0,     0,   370,   370,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   252,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   967,   968,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   985,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1000,     0,  1001,     0,
+       0,     0,  1005,   463,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   383,     0,   206,     2,   207,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+       0,     0,    31,   741,     0,     0,     0,  1039,     0,     0,
+       0,     0,     0,     0,  1040,     0,     0,     0,     0,     0,
+       0,     0,   342,   365,     0,     0,     0,  1042,     0,  1043,
+      34,     0,    35,     0,    36,    37,     0,   208,    39,    40,
+       0,     0,     0,  1055,     0,   219,    41,    42,     0,     0,
+    1059,     0,     0,     0,     0,     0,   415,     0,     0,     0,
+       0,     0,  1097,   415,     0,  1098,   735,     0,     0,     0,
+       0,     0,    43,     0,   209,     0,     0,     0,     0,     0,
+       0,    45,    46,   599,   741,     0,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,   224,  1160,    26,    27,    28,     0,
-     354,     0,     0,     0,     0,    31,     0,     0,   821,     0,
-       0,     0,  1172,   272,   114,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   637,   833,     0,     0,
-       0,   114,     0,    34,     0,     0,   308,     0,   111,   852,
-      38,    39,    80,   214,   354,   354,   354,     0,     0,    41,
-      42,     0,   635,     0,     0,     0,   114,   604,     0,     0,
-       0,     0,   604,   354,     0,     0,     0,     0,   637,     0,
-       0,   351,   351,   351,    80,     0,     0,     0,    44,     0,
-       0,   354,   356,     0,     0,    45,    46,     0,     0,  1240,
-     351,  1334,    75,     0,     0,     0,     0,     0,   354,     0,
-       0,   635,   635,     0,     0,     0,     0,     0,   725,     0,
-     272,   225,     0,     0,     0,   308,     0,     0,     0,   482,
-       0,     0,     0,   730,   260,   739,     0,     0,   939,     0,
-       0,   730,   730,   730,    75,     0,     0,   354,     8,     9,
-      10,    11,    12,     0,     0,     0,     0,     0,     0,   114,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   215,
-       0,   482,     0,     0,   351,     0,     0,    31,     0,     0,
-       0,     0,     0,   965,   354,     0,   432,    78,     0,   730,
-       0,     0,    78,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1236,     0,    34,     0,     0,     0,   357,
-     260,   739,     0,     0,     0,     0,   993,     0,     0,   267,
-       0,     0,     0,     0,     0,     0,     0,   354,     0,     0,
-       0,     0,     0,   214,     0,     0,   635,   354,     0,   354,
-       0,     0,     0,     0,   223,     0,     0,   354,   960,     0,
-     611,   354,     0,     0,   725,     0,     0,    45,    46,     0,
-       0,     0,   114,     0,   725,     0,   351,     0,   637,     0,
-       0,  1026,     0,   637,   833,     0,     0,     0,   725,     0,
-       0,     0,     0,     0,     0,   114,     0,   224,  1037,     0,
-       0,     0,   114,     0,   114,     0,   114,     0,     0,     0,
-       0,     0,     0,     0,    80,     0,    57,    57,     0,    80,
-       0,     0,     0,    75,     0,     0,     0,     0,     0,     0,
-       0,     8,     9,    10,    11,    12,  1535,     0,  1325,     0,
-     214,   114,     0,   114,     0,     0,     0,     0,    57,     0,
-      66,     0,     0,     0,     0,   114,     0,     0,     0,   215,
-      31,  1535,  1535,     0,    78,     0,     0,     0,     0,     0,
-       0,   308,   637,     0,     0,     0,     0,     0,     0,   356,
-       0,     0,    57,     0,    78,    57,  1535,     0,    34,     0,
-       0,     0,    78,    37,     0,   184,   185,    40,     0,     0,
-       0,     0,     0,     0,    41,    42,     0,   354,  1119,     0,
-       0,     0,     0,     0,   225,     0,   432,   118,   356,     0,
-       0,    87,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1534,     0,   412,   351,     0,   356,     0,    78,     0,
-      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    87,     0,     0,   215,     0,     0,     0,
-       0,   354,   354,     0,   354,   354,     0,     0,     0,     0,
-     604,     0,     0,   349,     0,     0,     0,     0,     0,     0,
-     356,    80,     0,   430,    75,     0,     0,     0,   725,   725,
-     226,   351,   351,     0,     0,     0,   357,     0,     0,     0,
-    1036,    80,     0,     8,     9,    10,    11,    12,     0,    80,
-       0,  1206,     0,     0,     0,     0,     0,     0,     0,   354,
-     354,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     283,   284,    31,   285,     0,   357,     0,     0,    57,     0,
-       0,     0,     0,     0,     0,   356,   725,   725,     0,     0,
-       0,     0,   637,   357,     0,    80,     0,     0,     0,   286,
-      34,     0,     0,     0,     0,   287,     0,     0,    57,   288,
-       0,     0,   289,   290,   291,   292,    41,    42,   364,   293,
-     294,     0,     0,     0,   354,     0,     0,   295,     0,   356,
-     356,   356,     0,     0,     0,     0,     0,   357,     0,     0,
-       0,     0,     0,   296,     0,   380,     0,     0,   356,     0,
-       0,   739,   345,    46,   298,   299,   300,   301,     0,     0,
-       0,     0,     0,     0,     0,     0,   356,   223,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    78,     0,     0,
-       0,     0,     0,   356,     0,     0,     0,     0,     0,    75,
-       0,     0,     0,     0,  1303,     0,     0,     0,     0,     0,
-       0,     0,   357,   354,     0,   354,     0,     0,     0,     0,
-       0,   260,     0,    87,     0,     0,    66,     0,    87,    78,
-       0,     0,   356,     8,     9,    10,    11,    12,     0,     0,
-     725,     0,   739,     0,     0,   354,   118,     0,     0,     0,
-       0,     0,     0,   354,   354,   354,   357,   357,   357,     0,
-       0,     0,    31,     0,   354,   354,     0,     0,     0,   356,
-       0,     0,   725,     0,     0,   357,     0,     0,    75,     0,
-     725,   725,   725,     0,     0,     0,     0,     0,     0,     0,
-      34,   351,   351,   357,     0,    37,     0,   184,   185,    40,
-     349,   354,     0,     0,    80,  1206,    41,    42,     0,     0,
-     357,     0,   356,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   356,   226,   356,     0,     0,     0,   725,   224,
-       0,     0,   356,   186,     0,     0,   356,     0,     0,   118,
-       0,     0,    45,    46,     0,     0,    80,     0,     0,   357,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    57,
-       0,     0,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-       0,     0,    26,    27,    28,     0,   357,     0,     0,   354,
-      87,    31,     0,     0,     0,     0,     0,     0,    78,     0,
-       0,   349,     0,     0,     0,   364,     0,     0,     0,     0,
-      87,     0,     0,     0,     0,     0,   351,     0,    87,    34,
-       0,     0,     0,     0,   111,     0,    38,    39,     0,   357,
-       0,     0,     0,     0,     0,    41,    42,     0,    75,   357,
-       0,   357,   118,     0,   364,    75,   225,     0,     0,   357,
-       0,     0,     0,   357,   168,     0,   173,     0,     0,   179,
-     180,   181,   364,   183,    87,  1206,   349,     0,     0,     0,
-       0,     0,  1206,     0,     0,     0,     0,     0,   234,     0,
-       0,     0,   356,     0,     0,     0,     0,     0,     0,     0,
-     249,   250,     0,     0,     0,     0,     0,     0,    75,     0,
-       0,     8,     9,    10,    11,    12,   364,     0,     0,     0,
-     349,   349,   349,     0,     0,    80,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1206,     0,     0,     0,   349,
-      31,     0,  1559,     0,     0,     0,   356,   356,     0,   356,
-     356,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    34,    78,
-       0,     0,     0,    37,     0,   184,   185,    40,     0,     0,
-       0,   364,     0,     0,    41,    42,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,   356,   356,    26,    27,    28,   357,
-       0,   266,     0,   349,     0,    31,     0,     0,     0,     0,
-      45,    46,     0,     0,     0,   364,   364,   364,     0,     0,
+      22,    23,    24,    25,     0,   769,    26,    27,    28,     0,
+       0,     0,     0,     0,     0,    31,   455,     0,   782,     0,
+       0,     0,   212,   769,     0,     0,   769,     0,     0,     0,
+       0,     0,     0,   370,   370,   415,     0,   792,   793,     0,
+       0,     0,   219,    34,     0,     0,     0,     0,     0,     0,
+      38,    39,     0,     0,     0,     0,     0,     0,     0,     0,
+     814,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     823,     0,  1162,     0,     0,     0,     0,   347,     0,     0,
+       0,     0,   782,     0,     0,     0,     0,   456,     0,     0,
+     415,   711,     0,     0,    45,    46,     0,     0,   415,   590,
+       0,   415,   593,     0,   283,   284,     0,   285,     0,     0,
+       0,     0,   365,     0,     0,     0,   622,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   535,
+       0,   888,     0,   286,     0,   640,  1227,     0,   342,   649,
+     383,     0,     0,   288,     0,     0,   289,   290,   291,   292,
+      41,    42,     0,   293,   294,     0,     0,     0,   370,     0,
+       0,   295,     0,     0,     0,   415,  1241,     0,     0,   415,
+       0,  1243,     0,     0,     0,     0,   296,     0,   785,  1247,
+     347,     0,     0,     0,     0,    45,    46,   298,   299,   300,
+     301,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     365,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1273,     0,     0,     0,     0,     0,   463,     0,   463,     0,
+       0,     0,  1281,   415,     0,  1282,     0,  1283,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    34,   364,     0,     0,     0,    37,     0,
-     337,   338,    40,     0,     0,     0,     0,     0,     0,    41,
-      42,     0,   364,   357,   357,     0,   357,   357,     0,   356,
-       0,     0,     0,    87,     0,     0,     0,     0,     0,   364,
-       0,   283,   284,     0,   285,     0,    80,     0,   339,     0,
-       0,     0,     0,     0,     0,    45,    46,     0,     0,     0,
-       0,     0,     0,     0,     0,   349,     0,     0,     0,     0,
-     286,     0,   224,   349,     0,    87,   287,     0,   364,     0,
-     288,   357,   357,   289,   290,   291,   292,    41,    42,     0,
-     293,   294,     0,     0,    78,     0,     0,     0,   295,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   356,     0,
-     356,     0,     0,     0,   515,   364,   601,     0,   609,     0,
-       0,     0,     0,    45,    46,   298,   299,   300,   301,   633,
-     634,     0,     0,     0,     0,     0,     0,     0,     0,    57,
-     356,     0,     0,     0,     0,     0,   357,     0,   356,   356,
-     356,     0,     0,     0,     0,     0,     0,     0,   364,   356,
-     356,     0,     0,     0,     0,     0,     0,     0,   364,     0,
-     364,     0,     0,    78,     0,   226,     0,     0,   364,     0,
-       0,     0,   364,     0,     0,     0,     0,     0,     0,   225,
-     516,     0,   518,   521,     0,     0,   356,     0,     0,     0,
-     524,   525,     0,     0,     0,     0,    57,     0,     0,     0,
-       0,    80,     0,     0,     0,   518,   518,     0,     0,     0,
-       0,     0,     0,   349,     0,   357,     0,   357,     0,     0,
-       0,   212,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   232,     0,   236,    87,   238,     0,     0,   127,   127,
-     127,     0,   247,   518,     0,     0,     0,   357,     0,     0,
-       0,     0,     0,     0,     0,   357,   357,   357,     0,     0,
-       0,     0,     0,     0,     0,     0,   357,   357,     0,     0,
-     349,   349,     0,   212,   356,   236,   238,   247,     0,   518,
-      80,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      57,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   357,     0,     0,     0,     0,     0,     0,
-       0,   127,     0,   127,     0,     0,   212,     0,   364,     0,
-       0,     0,     0,    78,     0,     0,     0,     0,     0,     0,
-      78,     0,     0,     0,     0,     0,     0,     0,   276,     0,
-       0,     0,   476,     2,   207,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,   364,   364,     0,   364,   364,   212,    31,   236,
-     238,   247,     0,    78,     0,     0,     0,     0,     0,     0,
-       0,   357,     0,     0,   127,    87,     0,     0,     0,     0,
-       0,     0,   127,     0,   127,   127,    34,     0,    35,   127,
-      36,   127,   127,    38,    39,   212,     0,     0,     0,     0,
-     212,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     364,   364,    57,    57,     0,   506,     0,     0,     0,     0,
-      80,     0,     0,     0,     0,     0,     0,    80,     0,     0,
-       0,     0,     0,     0,    -3,    57,   518,   518,   518,   518,
-     518,   518,   518,   518,   518,   518,   518,   518,   518,   518,
-     518,   518,   518,   518,     0,    57,     0,     0,     0,     0,
-       0,   127,     0,     0,   212,     0,     0,   953,     0,   954,
-       0,     0,     0,     0,     0,   364,   957,   958,     0,     0,
-      80,   963,     0,     0,     0,     0,   212,     0,     0,     0,
-       0,   236,   238,   968,     0,     0,     0,     0,   972,   247,
-     349,   349,     0,     0,     0,     0,     0,     0,     0,    57,
-       0,     0,     0,     0,    57,     0,     0,     0,   226,     0,
-       0,     0,     0,     0,  1001,     0,     0,     0,     0,     0,
+       0,  1292,  1293,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   463,   415,   463,   782,   365,   990,     0,
+       0,     0,     0,  1306,   995,     0,     0,     0,     0,     0,
+       0,  1004,     0,     0,     0,     0,     0,   283,   284,     0,
+     285,     0,     0,   166,     0,     0,     0,     0,     0,     0,
+    1329,     0,     0,     0,     0,     0,     0,   415,     0,     0,
+     342,   365,     0,     0,     0,     0,   286,     0,     0,     0,
+       0,     0,   287,     0,  1022,  1023,   288,     0,   347,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
+       0,     0,   347,     0,   295,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   415,   415,     0,     0,   296,
+       0,   380,     0,     0,     0,     0,     0,     0,   345,    46,
+     298,   299,   300,   301,   829,   365,     0,     0,     0,     0,
+       0,     0,  1053,     0,     0,   622,   383,   622,   622,     0,
+       0,     0,     0,     0,   622,     0,     0,     0,  1399,     0,
+    1400,     0,     0,     0,   868,   365,   516,     0,   518,   521,
+     365,     0,     0,  1409,     0,  1410,   524,   525,     0,   365,
+     365,   365,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   518,   518,  1417,     0,     0,     0,     0,   365,     0,
+       0,     0,     0,   415,   911,     0,     0,   415,   914,  1435,
+    1437,     0,     0,     0,   916,     0,     0,     0,     0,     0,
+       0,  1443,   322,     0,  1247,     0,     0,     0,     0,   518,
+       0,     0,   342,   365,   415,     0,   415,     0,  1140,  1141,
+     415,     0,     0,     0,     0,   383,  1466,     0,     0,     0,
+       0,   995,     0,     0,  1150,  1473,   769,     0,  1475,     0,
+    1477,  1479,  1481,     0,     0,   518,     0,     0,     0,     0,
+       0,     0,   365,   622,     0,     0,     0,  1166,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1181,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      87,     0,   212,     0,     0,     0,     0,     0,    57,     0,
-       0,     0,     0,     0,   364,     0,   364,     0,     0,     0,
-     212,     0,     0,     0,     0,   212,     0,   212,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   518,     0,     0,
-       0,     0,     0,     0,   212,     0,   364,   212,   212,     0,
-       0,     0,     0,     0,   364,   364,   364,     0,     0,   518,
-       0,     0,     0,   212,     0,   364,   364,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   212,     0,    87,
-       0,     0,     0,     0,   212,   349,  1047,  1048,  1049,  1050,
-       0,  1052,     0,     0,     0,     0,     0,     0,     0,     0,
-     283,   284,   364,   285,     0,     0,     0,  1096,     0,     0,
-       0,    57,     0,     0,     0,     0,     0,     0,   518,     0,
-       0,  1102,     0,     0,     0,     0,     0,     0,     0,   286,
-       0,     0,     0,     0,    57,   650,   166,   140,   141,   288,
-       0,    57,   289,   651,   291,   292,    41,    42,     0,   293,
-     294,   518,     0,   219,     0,     0,     0,   295,     0,     0,
-    1118,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   296,     0,   652,     0,   653,   381,     0,
-       0,     0,    45,    46,   298,   299,   300,   301,     0,     0,
-     364,     0,     0,     0,    57,     0,     0,     0,     0,   212,
-    1146,   166,     0,     0,     0,   273,     0,  1154,     0,     0,
-       0,     0,  1158,     0,     0,     0,     0,  1162,     0,  1163,
-       0,     0,     0,  1165,     0,  1166,  1167,   212,     0,  1170,
-       0,     0,   212,     0,   166,     0,   127,   127,  1182,    87,
-       0,     0,     0,     0,   370,     0,    87,     0,   376,     0,
-       0,     0,     0,     0,     0,     0,  1197,  1198,     0,     0,
-       0,     0,     0,     0,     0,   127,     0,     0,   127,   127,
-       0,   127,     0,   127,   127,     0,     0,     0,   127,   127,
-       0,     0,     0,  1228,     0,     0,  1230,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   166,     0,    87,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   219,
-       0,     0,     0,     0,     0,     0,   518,     0,     0,     0,
-     212,     0,     0,     0,     0,  1246,     0,   166,   463,     0,
-       0,  1250,  1251,     0,   212,     0,     0,     0,     0,     0,
-       0,     0,     0,  1262,     0,     0,     0,   518,  1266,     0,
-       0,  1270,   376,  1271,   506,     0,  1273,   127,     0,   166,
-     518,     0,   127,   127,     0,     0,     0,     0,   127,  1281,
+       0,     0,  1512,     0,  1514,     0,     0,  1247,   342,   365,
+     383,     0,  1199,   415,   415,     0,     0,     0,     0,     0,
+       0,     0,  1526,     0,     0,     0,     0,   995,   995,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,  1231,     0,
+      26,    27,    28,     0,     0,   415,     0,     0,     0,    31,
+       0,     0,     0,   365,     0,     0,     0,     0,     0,     0,
+     829,   365,     0,     0,   622,     0,   622,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   622,    34,     0,     0,
+       0,     0,     0,     0,   208,    39,   995,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1288,   463,  1290,  1291,  1292,  1293,     0,     0,
-       0,     0,     0,     0,     0,   166,     0,     0,     0,     0,
-    1300,   518,  1301,     0,     0,     0,   173,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   212,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   212,     0,
-       0,     0,     0,   607,     0,  1329,  1330,     0,   631,     0,
-       0,     0,     0,     0,     0,     0,     0,   212,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,  -296,     0,    26,    27,
-      28,     0,     0,     0,   518,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1365,  1366,     0,
-       0,     0,     0,     0,     0,     0,     0,  1376,     0,     0,
-       0,     0,     0,     0,     0,    34,     0,     0,     0,     0,
-       0,     0,    38,    39,   166,   166,  -296,     0,     0,     0,
-       0,   370,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   518,   518,   212,     0,     0,     0,     0,     0,
-       0,     0,   463,     0,     0,   463,     0,     0,   644,  1409,
-     339,     0,     0,     0,     0,     0,     0,    45,    46,     0,
-     212,  1413,     0,  1414,  1415,  1416,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1420,     0,     0,   742,     0,
-       0,     0,     0,     0,  1431,     0,     0,     0,   212,     0,
-     166,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1444,     0,   463,     0,   463,     0,     0,   463,     0,   166,
-     463,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   212,   370,     0,     0,     0,     0,     0,     0,     0,
-       0,   157,   212,     0,     0,     0,     0,     0,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,  1493,  1494,    26,    27,
-      28,     0,     0,     0,     0,     0,     0,    31,     0,  1499,
-       0,     0,     0,     0,     0,   166,  1499,     0,     0,   252,
-       0,     0,     0,     0,     0,     0,     0,   370,     0,   257,
-       0,   838,     0,     0,     0,    34,     0,     0,     0,     0,
-      37,     0,    38,    39,    40,     0,     0,     0,     0,  1533,
-       0,    41,    42,  1539,   212,     0,     0,   607,     0,     0,
-       0,     0,   607,     0,     0,     0,     0,     0,     0,     0,
-       0,   370,   370,   370,     0,     0,     0,     0,    43,     0,
-     158,     0,  1561,   518,  1562,   157,     0,    45,    46,     0,
-     370,     0,     0,   127,     0,     0,     0,     0,     0,   387,
-     518,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1577,  1578,     0,     0,     0,     0,     0,     0,
-    1581,  1582,   419,     0,     0,   742,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   434,     0,     0,     0,
-       0,   212,     0,     0,     0,   439,   463,     0,     0,     0,
-       0,     0,     0,     0,     0,   447,     0,     0,     0,     0,
-       0,     0,     0,     0,   370,     0,   962,     0,     0,     0,
-       0,     0,     0,   518,   518,     0,     0,     0,     0,     0,
-     473,     0,     0,     0,     0,   483,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   491,     0,
-       0,   742,     0,     0,   501,     0,   505,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1180,     0,   127,     8,
-       9,    10,    11,    12,   535,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   212,     0,
-       0,     0,     0,     0,     0,     0,   283,   284,    31,   285,
-       0,     0,     0,     0,     0,     0,   370,     0,     0,     0,
-     631,     0,     0,     0,   370,     0,   595,     0,     0,     0,
-       0,   600,     0,     0,     0,   286,    34,     0,     0,     0,
-       0,   287,     0,     0,     0,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-     645,     0,     0,   295,   646,   647,     0,   649,     0,     0,
-       0,     0,     0,     0,   661,   662,     0,   663,   664,   296,
-     665,   380,   666,     0,     0,     0,     0,     0,  1181,    46,
-     298,   299,   300,   301,     0,     0,     0,     0,     0,   595,
-       0,     0,     0,     0,     0,   283,   284,   681,   285,     0,
-       0,     0,     0,     0,     0,     0,   463,     0,     0,     0,
+       0,     0,     0,     0,     0,   888,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   692,     0,   286,   463,     0,     0,     0,     0,
-     287,     0,     0,   698,   288,     0,     0,   289,   290,   291,
-     292,    41,    42,     0,   293,   294,     0,     0,   166,     0,
-       0,     0,   295,     0,     0,     0,   734,     0,     0,     0,
-       0,     0,   737,     0,   370,     0,     0,   473,   296,     0,
-     380,     0,     0,   381,     0,     0,     0,    45,    46,   298,
-     299,   300,   301,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   342,   365,     0,     0,
-     607,     0,     0,     0,   774,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   789,     0,
-       0,   370,   370,     0,     0,     0,     0,     0,     0,     0,
-     415,     0,     0,     0,     0,     0,     0,   415,     0,     0,
-       0,     0,     0,     0,   212,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   817,     0,     0,
-       0,     0,     0,     0,     0,     0,   827,     0,     0,     0,
-       0,     0,     0,   829,     0,     0,     0,     0,     0,   837,
-       0,   463,     0,     0,     0,     0,     0,     0,   851,     0,
+    1284,  1285,     0,   283,   284,     0,   285,     0,    45,    46,
+       0,   518,   518,   518,   518,   518,   518,   518,   518,   518,
+     518,   518,   518,   518,   518,   518,   518,   518,   518,   829,
+       0,     0,   286,     0,     0,     0,     0,   415,   287,     0,
+       0,     0,   288,   415,     0,   289,   290,   291,   292,    41,
+      42,   415,   293,   294,     0,     0,     0,     0,     0,     0,
+     295,     0,     0,     0,   622,   622,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   515,     0,     0,     0,     0,
+       0,     0,   995,     0,    45,    46,   298,   299,   300,   301,
+       0,   365,     0,     0,     0,     0,     0,   415,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   415,  1159,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   365,     0,     0,
+       0,     0,     0,   415,  1171,     0,   622,   622,  1176,     0,
+       0,     0,     0,  1392,     0,   769,     0,     0,   365,   365,
+       0,     0,   518,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   518,     0,     0,     0,     0,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,     0,   829,
+     415,  1239,   283,   284,    31,   285,     0,     0,     0,     0,
+       0,     0,     0,   622,     0,     0,     0,     0,     0,     0,
+       0,  1452,     0,   518,     0,     0,     0,     0,     0,     0,
+       0,   286,    34,     0,    35,     0,    36,   287,     0,    38,
+      39,   288,     0,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,   518,     0,     0,   365,   295,
+       0,     0,   283,   284,     0,   285,     0,     0,     0,     0,
+       0,     0,     0,     0,   296,     0,   930,     0,     0,     0,
+       0,   781,     0,    45,    46,   298,   299,   300,   301,     0,
+       0,   286,     0,     0,     0,     0,     0,   287,     0,     0,
+       0,   288,     0,  1518,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,   342,   295,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   296,     0,     0,     0,     0,   365,
+       0,     0,     0,    45,    46,   298,   299,   300,   301,     0,
+       0,     0,     0,     0,     0,   322,     0,     0,     0,     0,
+       0,     0,     0,     1,     2,   207,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,     0,   415,
-      26,    27,    28,     0,     0,     0,     0,     0,     0,    31,
-     455,     0,     0,     0,     0,     0,     0,     0,     0,   891,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   742,     0,     0,     0,     0,     0,    34,     0,     0,
-       0,     0,     0,     0,    38,    39,     0,     0,     0,     0,
-       0,     0,     0,     0,   415,   837,     0,     0,     0,     0,
-       0,     0,   415,   591,     0,   415,   594,     0,     0,     0,
-       0,     0,     0,   219,     0,     0,   365,     0,     0,     0,
-     623,     0,   456,     0,     0,     0,   712,     0,     0,    45,
-      46,     0,     0,     0,     0,     0,     0,     0,     0,   641,
-       0,     0,   342,     0,     0,     0,     0,     0,     0,     0,
-     252,     0,   742,     0,     0,     0,     0,     0,     0,     0,
-     969,   970,     0,     0,     0,     0,     0,     0,     0,   415,
-       0,     0,     0,   415,   987,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1002,     0,  1003,     0,     0,   322,  1007,     0,     0,
-       0,   370,   370,     0,   365,     0,   347,     0,     0,     0,
-     219,     0,     0,     0,     0,     0,     0,     0,   383,   383,
-       0,     0,     0,     0,     0,     0,     0,   415,     0,     0,
-       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,   415,     0,
-      31,   365,     0,  1041,     0,     0,     0,     0,     0,     0,
-    1042,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1044,     0,  1045,     0,     0,    34,   322,
-       0,     0,     0,     0,     0,    38,    39,     0,     0,  1057,
-       0,   415,     0,     0,   342,   365,  1061,     0,     0,     0,
-       0,     0,     0,   487,     0,     0,     0,     0,  1099,     0,
-       0,  1100,     0,     0,     0,     0,   370,     0,     0,     0,
-       0,   644,     0,   339,     0,     0,     0,     0,     0,   600,
-      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
-     415,   415,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   831,
-     365,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     623,     0,   623,   623,   463,     0,   463,     0,     0,   623,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   870,
-     365,     0,     0,     0,     0,   365,     0,     0,     0,     0,
-       0,     0,     0,     0,   365,   365,   365,     0,     0,     0,
-       0,   463,     0,   463,     0,     0,     0,     0,  1164,     0,
-     383,     0,     0,   365,     0,     0,     0,     0,   415,   913,
-       0,     0,   415,   916,     0,     0,     0,     0,     0,   918,
-       0,   166,     0,     0,     0,   283,   284,     0,   285,     0,
-       0,     0,     0,     0,     0,     0,     0,   342,   365,   415,
-       0,   415,     0,     0,     0,   415,     0,     0,     0,     0,
-       0,     0,     0,     0,   286,   535,     0,     0,     0,     0,
-     287,     0,  1229,     0,   288,     0,     0,   289,   290,   291,
-     292,    41,    42,     0,   293,   294,     0,   365,   623,     0,
-       0,     0,   295,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1243,     0,     0,     0,     0,  1245,   296,     0,
-     380,     0,   736,     0,     0,  1249,   814,    45,    46,   298,
-     299,   300,   301,   342,   365,     0,     0,     0,   415,   415,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1275,     0,     0,     0,
-       0,   770,     0,     0,     0,     0,     0,     0,  1283,     0,
-       0,  1284,     0,  1285,   783,     0,     0,     0,     0,   770,
-       0,   415,   770,     0,     0,     0,     0,  1294,  1295,   365,
-       0,     0,     0,   793,   794,   795,   831,   365,     0,     0,
-     623,     0,   623,     0,     0,     0,     0,     0,     0,  1308,
-       0,     0,   623,     0,     0,     0,     0,   816,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   825,     0,     0,
-       0,     0,     0,     0,   347,     0,  1331,     0,     0,   783,
-       0,     0,  -521,     0,     0,     1,     2,     3,     4,     5,
+      18,    19,    20,    21,    22,    23,    24,    25,   365,   365,
+      26,    27,    28,    29,     0,     0,    30,   283,   284,    31,
+    1062,  1063,     0,  1064,     0,     0,  1065,  1066,  1067,  1068,
+    1069,  1070,  1071,  1072,     0,     0,     0,  1073,     0,     0,
+     518,  1074,  1075,     0,    33,     0,   286,    34,     0,    35,
+       0,    36,   649,     0,    38,    39,   288,     0,     0,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
+       0,   518,     0,     0,   295,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   518,     0,     0,     0,     0,   296,
+       0,  1076,     0,     0,   172,     0,     0,     0,    45,    46,
+     298,   299,   300,   301,     0,     0,     0,     0,  1077,     0,
+       0,     0,  -130,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   518,     0,     0,     0,     0,
+       0,     0,  -520,   365,     0,     1,     2,     3,     4,     5,
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
        0,     0,    26,    27,    28,    29,     0,     0,    30,     0,
-       0,    31,    32,     0,     0,   831,     0,     0,   890,     0,
-       0,     0,     0,   415,     0,     0,     0,   383,     0,   415,
-       0,     0,     0,     0,     0,     0,    33,   415,     0,    34,
+       0,    31,    32,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   283,   284,     0,   285,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    33,     0,   518,    34,
        0,    35,     0,    36,    37,     0,    38,    39,    40,     0,
-     623,   623,     0,     0,     0,    41,    42,     0,     0,     0,
-       0,     0,     0,     0,  1401,     0,  1402,   347,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   365,     0,  1411,
-       0,  1412,    43,   415,    44,     0,     0,     0,     0,     0,
-       0,    45,    46,     0,     0,     0,     0,     0,     0,  1419,
-       0,     0,   415,  1161,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   365,     0,  1437,  1439,     0,     0,   415,
-    1173,     0,   623,   623,  1178,     0,     0,  1445,     0,     0,
-    1249,     0,     0,     0,   365,   365,     0,     0,     0,     0,
-       0,     0,     0,   783,     0,   992,     0,     0,     0,     0,
-       0,   997,  1468,     0,     0,     0,     0,     0,  1006,     0,
-       0,  1475,     0,     0,  1477,     0,  1479,  1481,  1483,     2,
-     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,   831,   415,  1241,     0,     0,
-       0,     0,  1024,  1025,    31,     0,   347,     0,  1514,   623,
-    1516,     0,     0,  1249,     0,     0,     0,     0,     0,     0,
-     347,     0,     0,     0,     0,     0,     0,     0,  1528,     0,
-       0,     0,    34,     0,    35,     0,    36,    37,     0,   175,
-     176,    40,     0,     0,     0,     0,     0,     0,    41,    42,
-       0,     0,     0,     0,   365,     0,     0,     0,     0,     0,
-    1055,     0,     0,     0,   383,     0,     0,     0,     0,     0,
-       1,     2,   207,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-      29,     0,     0,    30,   283,   284,    31,   285,     0,     0,
-       0,     0,     0,     0,   342,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   286,    34,   365,    35,     0,    36,   287,
-     322,    38,    39,   288,     0,     0,   289,   290,   291,   292,
-      41,    42,     0,   293,   294,     0,  1142,  1143,     0,     0,
-       0,   295,     0,   383,     0,     0,     0,     0,     0,   997,
-       0,     0,  1152,     0,   770,   283,   284,   296,   285,  1078,
-       0,     0,     0,     0,   365,   365,    45,    46,   298,   299,
-     300,   301,     0,     0,     0,  1168,     0,     0,     0,     0,
-    -131,     0,     0,     0,   286,     0,  1183,     0,     0,     0,
-     287,     0,     0,     0,   288,     0,     0,   289,   290,   291,
-     292,    41,    42,     0,   293,   294,     0,     0,   383,     0,
-    1201,     0,   295,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   997,   997,     0,   296,     0,
-     380,     0,     0,     0,     0,   782,     0,    45,    46,   298,
-     299,   300,   301,     0,     0,     0,  1233,     0,     0,     0,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-      29,     0,     0,    30,     0,     0,    31,    32,     0,   365,
-       0,     0,     0,     0,   997,     0,     0,     0,   283,   284,
-       0,   285,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    33,     0,   890,    34,     0,    35,     0,    36,    37,
-       0,    38,    39,    40,     0,     0,     0,   286,  1286,  1287,
-      41,    42,     0,   287,     0,     0,     0,   288,     0,     0,
-     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
-       0,     0,     0,     0,     0,   295,     0,    43,     0,    44,
-       0,     0,     0,  -525,     0,     0,    45,    46,     0,     0,
-       0,   296,     0,   380,     0,     0,   994,     0,     0,   415,
-      45,    46,   298,   299,   300,   301,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   415,   415,     0,     0,     0,     0,
-     997,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   415,
-       0,     0,     1,     2,   207,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,    29,     0,     0,    30,   283,   284,    31,  1064,
-    1065,  1394,  1066,   770,     0,  1067,  1068,  1069,  1070,  1071,
-    1072,  1073,  1074,     0,     0,     0,  1075,     0,     0,     0,
-    1076,  1077,     0,    33,     0,   286,    34,     0,    35,     0,
-      36,   650,     0,    38,    39,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-       0,     0,     0,   295,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   296,
-       0,  1078,     0,     0,   172,     0,     0,     0,    45,    46,
-     298,   299,   300,   301,     0,     0,     0,     0,  1079,  1454,
-       0,     0,  -131,     0,     0,     0,     1,     2,   207,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,    29,     0,     0,    30,
-     283,   284,    31,   285,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,  -296,     0,     0,     0,     0,     0,     0,   286,
-      34,     0,    35,    31,    36,   287,     0,    38,    39,   288,
-       0,  1520,   289,   290,   291,   292,    41,    42,     0,   293,
-     294,     0,     0,     0,     0,     0,     0,   295,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  -296,   296,     0,    44,     0,     0,     0,     0,
-       0,     0,    45,    46,   298,   299,   300,   301,     0,     0,
-       0,     0,     0,   322,     2,   207,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
-      26,    27,    28,     0,     0,     0,     0,   283,   284,    31,
-     285,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,  -297,
-       0,     0,     0,     0,     0,     0,   286,    34,     0,    35,
-      31,    36,   287,     0,    38,    39,   288,     0,     0,   289,
-     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
-       0,     0,     0,     0,   295,     0,     0,     0,    34,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  -297,
-     296,     0,   344,     0,     0,     0,     0,   782,     0,   345,
-      46,   298,   299,   300,   301,     2,   207,     4,     5,     6,
+       0,   286,     0,     0,     0,    41,    42,   287,     0,     0,
+       0,   288,     0,   415,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,     0,   295,
+       0,    43,     0,    44,     0,     0,     0,     0,   415,   415,
+      45,    46,     0,     0,   520,     0,   518,   518,     0,     0,
+       0,     0,     0,    45,    46,   298,   299,   300,   301,     0,
+       0,     0,     0,   415,     1,     2,   207,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,   283,   284,
+       0,    26,    27,    28,    29,     0,     0,    30,   283,   284,
       31,   285,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
@@ -2506,56 +2530,197 @@
      289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
        0,     0,     0,     0,     0,   295,     0,     0,     0,    34,
-       0,     0,     0,     0,     0,     0,    38,    39,     0,     0,
-       0,   296,     0,   932,     0,     0,     0,     0,   782,     0,
-     345,    46,   298,   299,   300,   301,     2,   207,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-       0,     0,    26,    27,    28,     0,     0,     0,     0,   283,
-     284,    31,   285,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,   286,    34,
-       0,    35,    31,    36,   287,     0,    38,    39,   288,     0,
-       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
-       0,     0,     0,     0,     0,     0,   295,     0,     0,     0,
-      34,     0,     0,     0,     0,     0,     0,   208,    39,     0,
-       0,     0,   296,     0,   932,     0,     0,     0,     0,   782,
-       0,    45,    46,   298,   299,   300,   301,     2,   207,     4,
+       0,     0,     0,     0,   111,     0,    38,    39,     0,     0,
+     296,     0,  1076,     0,     0,    41,    42,     0,     0,    45,
+      46,   298,   299,   300,   301,     0,     0,     0,     0,     0,
+       0,     0,     0,  -130,     0,     0,     0,     0,     0,     1,
+       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,    29,
+       0,     0,    30,   283,   284,    31,   285,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   518,     0,     0,
+       0,     0,   286,    34,     0,    35,     0,    36,   287,     0,
+      38,    39,   288,     0,   518,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
+     295,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   296,     0,    44,     0,     0,
+       0,     0,     0,     0,    45,    46,   298,   299,   300,   301,
+       0,     0,     0,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,   518,   518,    26,
+      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,   286,    34,     0,    35,    31,
+      36,   287,     0,    38,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,   295,     0,     0,     0,    34,     0,     0,
+       0,     0,     0,     0,    38,    39,     0,     0,   296,     0,
+     344,     0,     0,     0,     0,     0,     0,   345,    46,   298,
+     299,   300,   301,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,   286,    34,     0,    35,    31,
+      36,   287,     0,    38,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,   295,     0,     0,     0,    34,     0,     0,
+       0,     0,     0,     0,   208,    39,     0,     0,   296,     0,
+     930,     0,     0,     0,     0,     0,     0,   345,    46,   298,
+     299,   300,   301,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
+       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,   286,    34,     0,    35,     0,
+      36,   287,     0,   208,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,   295,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
+    1019,     0,     0,     0,     0,     0,     0,  1020,    46,   298,
+     299,   300,   301,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
+       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,   286,    34,     0,    35,     0,
+      36,   287,     0,   208,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,   295,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
+     380,     0,     0,     0,     0,     0,     0,    45,    46,   298,
+     299,   300,   301,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,    29,     0,     0,    30,     0,     0,    31,
+      32,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    33,     0,     0,    34,     0,    35,
+       0,    36,    37,     0,    38,    39,    40,     0,     0,     0,
+       0,     0,     0,    41,    42,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    43,
+       0,    44,     0,     0,     0,  -524,     0,     0,    45,    46,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+      29,     0,     0,    30,     0,     0,    31,    32,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    33,     0,     0,    34,     0,    35,     0,    36,    37,
+       0,    38,    39,    40,     0,     0,     0,     0,     0,     0,
+      41,    42,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    43,     0,    44,     0,
+       0,     0,     0,     0,     0,    45,    46,     1,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,  -295,     0,    26,    27,    28,    29,     0,     0,
+      30,     0,     0,    31,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
+       0,     0,  -295,     1,     2,   207,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,    29,     0,    44,    30,     0,     0,    31,
+       0,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
+       0,    36,     0,     0,    38,    39,   206,     2,   207,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-     283,   284,    31,   285,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,     0,     0,     0,     0,     0,   286,
-      34,     0,    35,    31,    36,   287,     0,    38,    39,   288,
-       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
-     294,     0,     0,     0,     0,     0,     0,   295,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   296,     0,   344,     0,     0,     0,     0,
-       0,     0,   345,    46,   298,   299,   300,   301,     2,   207,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,   283,   284,    31,   285,     0,     0,     0,     0,     0,
+       0,    44,    31,     0,     0,     0,     0,     0,    45,    46,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     286,    34,     0,    35,     0,    36,   287,     0,    38,    39,
-     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
-     293,   294,     0,     0,     0,     0,     0,     0,   295,     0,
+      34,     0,    35,     0,    36,     0,     0,   208,    39,     0,
+       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,     0,   209,    31,     0,     0,     0,     0,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,   932,     0,     0,     0,
-       0,     0,     0,   345,    46,   298,   299,   300,   301,     2,
+       0,     0,     0,    34,     0,    35,     0,    36,    37,     0,
+     208,    39,    40,     0,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    43,     0,   209,     0,     0,
+       0,     0,     0,     0,    45,    46,     2,   207,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    31,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,    34,
+       0,    35,     0,    36,     0,    31,    38,    39,     0,     2,
      207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   283,   284,    31,   285,     0,     0,     0,     0,
+      23,    24,    25,    34,     0,    26,    27,    28,     0,     0,
+      38,    39,  -403,   687,    31,     0,     0,     0,     0,     0,
+      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,   643,    36,   339,     0,    38,
+      39,     0,     0,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1371,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   687,     0,     0,     0,
+       0,     0,     0,    45,    46,     2,   207,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
+      31,     0,     0,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,     0,    34,     0,
+      35,     0,    36,    31,     0,    38,    39,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1373,     0,     0,
+       0,    34,     0,     0,     0,     0,    37,     0,   337,   338,
+      40,     0,   687,     0,     0,     0,     0,    41,    42,    45,
+      46,     2,   207,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,   339,     0,    26,    27,    28,
+       0,     0,    45,    46,     0,     0,    31,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   286,    34,     0,    35,     0,    36,   287,     0,   208,
-      39,   288,     0,     0,   289,   290,   291,   292,    41,    42,
-       0,   293,   294,     0,     0,     0,     0,     0,     0,   295,
+       0,     0,     0,     0,    34,     0,    35,     0,    36,     0,
+       0,   208,    39,     0,     2,   207,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,     0,   271,    31,
+       0,     0,     0,     0,     0,    45,    46,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   296,     0,  1021,     0,     0,
-       0,     0,     0,     0,  1022,    46,   298,   299,   300,   301,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
+       0,    36,     0,     0,    38,    39,     0,     2,   207,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+       0,   687,    31,     0,     0,     0,     0,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,    35,     0,    36,     0,     0,    38,    39,     0,
        2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,     0,   601,    31,     0,     0,     0,     0,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,    35,     0,    36,     0,     0,
+     208,    39,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   283,
+     284,    31,   285,     0,     0,     0,     0,   209,     0,     0,
+       0,     0,     0,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   286,    34,
+       0,     0,     0,     0,   287,     0,    38,    39,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
+       0,     0,     0,     0,     0,     0,   295,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   296,     0,   527,     0,     0,   172,     0,     0,     0,
+      45,    46,   298,   299,   300,   301,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
@@ -2563,176 +2728,24 @@
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-       0,     0,   286,    34,     0,    35,    31,    36,   287,     0,
-     208,    39,   288,     0,     0,   289,   290,   291,   292,    41,
+       0,     0,   286,    34,     0,     0,    31,     0,   649,     0,
+      38,    39,   288,     0,     0,   289,   290,   291,   292,    41,
       42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
-     295,     0,     0,     0,    34,     0,     0,     0,     0,     0,
-       0,   208,    39,     0,     0,     0,   296,     0,   380,     0,
-       0,     0,     0,     0,     0,    45,    46,   298,   299,   300,
-     301,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    45,    46,    26,    27,
-      28,    29,     0,     0,    30,     0,     0,    31,    32,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    33,     0,     0,    34,     0,    35,     0,    36,
-      37,     0,    38,    39,    40,     0,     0,     0,     0,     0,
-       0,    41,    42,     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,    43,     0,
-      44,     0,     0,     0,     0,     0,     0,    45,    46,   206,
-       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,     0,     0,     0,    31,     0,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-     494,   495,   496,    34,     0,    35,    31,    36,    37,     0,
-     208,    39,    40,     0,     0,     0,     0,     0,     0,    41,
-      42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    34,     0,     0,     0,     0,     0,
-       0,    38,    39,     0,     0,     0,    43,     0,   209,     0,
-       0,     0,     0,     0,     0,    45,    46,     1,     2,   207,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,  -296,     0,    26,    27,    28,    29,     0,     0,
-      30,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
-       0,     0,  -296,     0,     1,     2,   207,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+     295,     0,     0,     0,    34,     0,     0,     0,     0,   111,
+       0,    38,    39,     0,     0,   296,   -35,   766,     0,     0,
+      41,    42,     0,     0,    45,    46,   298,   299,   300,   301,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    44,     0,
+      26,    27,    28,     0,     0,    45,    46,   283,   284,    31,
+     285,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,    29,     0,    44,    30,     0,     0,
-      31,     0,     0,    45,    46,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
-      35,     0,    36,     0,     0,    38,    39,     0,   206,     2,
-     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,     0,    44,    31,     0,     0,     0,     0,     0,
-      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,    35,     0,    36,     0,     0,   208,
-      39,     2,   207,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-       0,     0,     0,     0,     0,     0,    31,   209,     0,     0,
-       0,     0,     0,     0,    45,    46,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    34,     0,    35,     0,    36,    37,
-       0,   208,    39,    40,     0,     0,     0,     0,     0,     0,
-      41,    42,     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,    43,     0,   209,
-       0,     0,     0,     0,     0,     0,    45,    46,     2,   207,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
-       0,     0,     2,   207,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
-      28,     0,     0,     0,     0,  -404,   688,    31,     0,     0,
-       0,     0,     0,    45,    46,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
-       0,     0,    38,    39,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1373,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     688,     0,     0,     0,     0,     0,     0,    45,    46,     2,
-     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,     0,     0,    31,     0,     0,     0,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,  -296,     0,    26,    27,
-      28,     0,    34,     0,    35,     0,    36,    31,     0,    38,
-      39,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1375,     0,     0,     0,    34,     0,     0,     0,     0,
-      37,     0,   337,   338,    40,     0,  -296,   688,     0,     0,
-       0,    41,    42,     0,    45,    46,     2,   207,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-     339,     0,    26,    27,    28,     0,     0,    45,    46,     0,
-       0,    31,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
-       0,    35,     0,    36,     0,     0,   208,    39,     2,   207,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,   271,     0,     0,     0,     0,     0,
-       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
-       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,     0,     0,     0,    31,   688,     0,     0,     0,
-       0,     0,     0,    45,    46,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    34,     0,    35,     0,    36,     0,     0,
-      38,    39,     2,   207,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
-      28,     0,     0,     0,     0,     0,     0,    31,   602,     0,
-       0,     0,     0,     0,     0,    45,    46,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
-       0,     0,   208,    39,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,   283,   284,    31,   285,     0,     0,     0,     0,     0,
-     209,     0,     0,     0,     0,     0,     0,    45,    46,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     286,    34,     0,     0,     0,     0,   287,     0,    38,    39,
-     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
-     293,   294,     0,     0,     0,     0,     0,     0,   295,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,   527,     0,     0,   172,
-       0,     0,     0,    45,    46,   298,   299,   300,   301,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,  -296,     0,
-      26,    27,    28,     0,     0,   286,    34,     0,     0,    31,
-       0,   650,     0,    38,    39,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-       0,     0,     0,   295,     0,     0,     0,    34,     0,     0,
-       0,     0,     0,     0,    38,    39,     0,     0,  -296,   296,
-     -35,   767,     0,     0,     0,     0,     0,     0,    45,    46,
+       0,    26,    27,    28,     0,     0,   286,    34,     0,     0,
+      31,   455,   287,     0,    38,    39,   288,     0,     0,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
+       0,     0,     0,     0,   295,     0,     0,     0,    34,     0,
+       0,     0,     0,     0,     0,    38,    39,     0,     0,   296,
+       0,   297,     0,     0,     0,     0,     0,     0,    45,    46,
      298,   299,   300,   301,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,   339,     0,    26,    27,    28,     0,     0,    45,
-      46,   283,   284,    31,   285,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-     286,    34,     0,     0,    31,   455,   287,     0,    38,    39,
-     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
-     293,   294,     0,     0,     0,     0,     0,     0,   295,     0,
-       0,     0,    34,     0,     0,     0,     0,     0,     0,    38,
-      39,     0,     0,     0,   296,     0,   297,     0,     0,     0,
-       0,     0,     0,    45,    46,   298,   299,   300,   301,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,   456,     0,    26,
-      27,    28,     0,     0,    45,    46,   283,   284,    31,   285,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
-      26,    27,    28,     0,     0,   286,    34,     0,     0,    31,
-       0,   287,     0,    38,    39,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-       0,     0,     0,   295,     0,     0,     0,    34,     0,     0,
-       0,     0,     0,     0,    38,    39,     0,     0,     0,   296,
-       0,   158,     0,     0,     0,     0,     0,     0,    45,    46,
-     298,   299,   300,   301,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,   258,     0,    26,    27,    28,     0,     0,    45,
+      24,    25,   456,     0,    26,    27,    28,     0,     0,    45,
       46,   283,   284,    31,   285,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
@@ -2742,190 +2755,186 @@
      293,   294,     0,     0,     0,     0,     0,     0,   295,     0,
        0,     0,    34,     0,     0,     0,     0,     0,     0,    38,
-      39,     0,     0,     0,   296,     0,   602,     0,     0,     0,
-       0,     0,     0,    45,    46,   298,   299,   300,   301,     8,
+      39,     0,     0,   296,     0,   158,     0,     0,     0,     0,
+       0,     0,    45,    46,   298,   299,   300,   301,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,   258,     0,    26,    27,
+      28,     0,     0,    45,    46,   283,   284,    31,   285,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,   158,     0,    26,
-      27,    28,     0,     0,    45,    46,   283,   284,    31,   285,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,  -296,     0,
-      26,    27,    28,     0,     0,   286,    34,     0,     0,    31,
-       0,   287,     0,    38,    39,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-       0,     0,     0,   295,     0,     0,     0,    34,     0,     0,
-       0,     0,    37,     0,   337,   338,    40,     0,  -296,   296,
-       0,   380,     0,    41,    42,     0,     0,     0,    45,    46,
-     298,   299,   300,   301,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     644,     0,   339,     0,     0,     0,     0,     0,     0,    45,
-      46,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
-      31,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,    34,     0,
-      31,     0,     0,    37,     0,    38,    39,    40,     0,     0,
-       0,     0,     0,     0,    41,    42,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
-       0,     0,     0,    37,     0,   208,    39,    40,     0,     0,
-       0,    43,     0,    44,    41,    42,     0,     0,     0,     0,
-      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    43,     0,   271,     0,     0,     0,     0,     0,     0,
-      45,    46,     8,     9,    10,    11,    12,    13,    14,    15,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,   286,    34,     0,     0,    31,     0,
+     287,     0,    38,    39,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,     0,
+       0,     0,   295,     0,     0,     0,    34,     0,     0,     0,
+       0,     0,     0,    38,    39,     0,     0,   296,     0,   601,
+       0,     0,     0,     0,     0,     0,    45,    46,   298,   299,
+     300,   301,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
-       0,    31,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-       0,     0,    26,    27,    28,     0,     0,     0,     0,    34,
-       0,    31,   455,     0,    37,     0,   337,   338,    40,     0,
-       0,     0,     0,     0,     0,    41,    42,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
-       0,     0,     0,     0,     0,     0,    38,    39,     0,     0,
-       0,     0,   644,     0,   339,     0,     0,     0,     0,     0,
-       0,    45,    46,     0,     0,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,   456,    26,    27,    28,  1111,     0,
-       0,    45,    46,     0,    31,   455,     8,     9,    10,    11,
+     158,     0,    26,    27,    28,     0,     0,    45,    46,   283,
+     284,    31,   285,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,  -295,     0,    26,    27,    28,     0,   286,    34,
+       0,     0,     0,    31,   287,     0,    38,    39,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
+       0,     0,     0,     0,     0,     0,   295,     0,     0,     0,
+       0,    34,     0,     0,     0,     0,    37,     0,   337,   338,
+      40,   296,  -295,   380,     0,     0,     0,    41,    42,     0,
+      45,    46,   298,   299,   300,   301,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,   339,    26,    27,    28,     0,
+       0,     0,    45,    46,     0,    31,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,    34,     0,     0,    31,     0,     0,     0,    38,
-      39,     0,     0,     0,     0,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    34,     0,    26,    27,    28,     0,     0,
-     208,    39,     0,     0,    31,     0,     0,   456,     0,     0,
-       0,  1238,     0,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,    31,     0,     0,    37,     0,
+      38,    39,    40,     0,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,     0,     0,     0,    37,     0,
+     208,    39,    40,     0,     0,    43,     0,    44,     0,    41,
+      42,     0,     0,     0,    45,    46,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,     0,     0,     0,     0,   271,    38,
-      39,     0,     0,     0,     0,    45,    46,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-       0,     0,     0,     0,     0,     0,    31,   339,     0,     0,
+       0,     0,     0,     0,     0,    43,     0,   271,     0,     0,
        0,     0,     0,     0,    45,    46,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    34,     0,    26,    27,    28,     0,
-       0,    38,    39,     0,     0,    31,     8,     9,    10,    11,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,     0,     0,    31,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,     0,    34,     0,    31,     0,     0,     0,   456,
-      38,    39,     0,     0,     0,     0,    45,    46,     0,     0,
+      22,    23,    24,    25,  -295,     0,    26,    27,    28,     0,
+       0,     0,     0,    34,     0,    31,     0,     0,    37,     0,
+     337,   338,    40,     0,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,     0,     0,     0,     0,     0,
+      38,    39,     0,     0,  -295,   643,     0,   339,     0,     0,
+       0,     0,     0,     0,    45,    46,     0,     0,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,   339,    26,    27,
+      28,     0,     0,     0,    45,    46,     0,    31,   455,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,     0,    34,     0,     0,    31,   455,
+       0,     0,    38,    39,     0,     0,     0,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,    34,    26,    27,    28,
+       0,     0,     0,    38,    39,     0,    31,     0,     0,   456,
+       0,     0,     0,  1109,     0,     0,    45,    46,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    34,     0,     0,     0,     0,     0,     0,
-      38,    39,     0,     0,     0,     0,     0,     0,   602,     0,
-       0,     0,     0,     0,     0,    45,    46,     0,     0,     0,
+       0,     0,     0,     0,    34,     0,     0,     0,     0,     0,
+     456,   208,    39,     0,  1236,     0,     0,    45,    46,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,     0,   271,    31,
+       0,     0,     0,     0,     0,    45,    46,     0,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,    34,    26,    27,
+      28,     0,     0,     0,    38,    39,     0,    31,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,     0,     0,    34,     0,    31,     0,     0,
+       0,   339,    38,    39,     0,     0,     0,     0,    45,    46,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    44,     0,
-       0,     0,     0,     0,     0,    45,    46,     2,   207,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     0,   283,   284,     0,   285,  1065,     0,
-    1066,     0,     0,  1067,  1068,  1069,  1070,  1071,  1072,  1073,
-    1074,     0,     0,  1553,  1075,     0,     0,     0,  1076,  1077,
-      34,    33,    35,   286,    36,     0,     0,    38,    39,   650,
+       0,     0,     0,     0,     0,    34,     0,     0,     0,     0,
+       0,     0,    38,    39,     0,     0,     0,     0,     0,   456,
+       0,     0,     0,     0,     0,     0,    45,    46,     0,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,   601,
+      26,    27,    28,     0,     0,     0,    45,    46,     0,    31,
+       0,     0,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,    34,    26,    27,
+      28,     0,     0,     0,    38,    39,     0,    31,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
+       0,    44,    38,    39,     0,     0,     0,     0,    45,    46,
+     283,   284,     0,   285,  1063,     0,  1064,     0,     0,  1065,
+    1066,  1067,  1068,  1069,  1070,  1071,  1072,     0,     0,  1551,
+    1073,     0,     0,     0,  1074,  1075,     0,    33,  -416,   286,
+       0,     0,     0,     0,     0,   649,     0,     0,     0,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
+     294,     0,     0,     0,     0,     0,     0,   295,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   296,     0,   380,     0,     0,   172,     0,     0,
+       0,    45,    46,   298,   299,   300,   301,     0,     0,     0,
+       0,  1077,     0,   283,   284,  -130,   285,  1063,     0,  1064,
+       0,     0,  1065,  1066,  1067,  1068,  1069,  1070,  1071,  1072,
+       0,     0,     0,  1073,     0,     0,     0,  1074,  1075,     0,
+      33,     0,   286,     0,     0,     0,     0,     0,   649,     0,
+       0,     0,   288,     0,     0,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
+     295,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   296,     0,   380,     0,     0,
+     172,     0,     0,     0,    45,    46,   298,   299,   300,   301,
+       0,     0,     0,     0,  1077,     0,     0,     0,  -130,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
+       0,     0,     0,     0,    31,     0,   283,   284,     0,   285,
+    1063,     0,  1064,  1421,  1422,  1065,  1066,  1067,  1068,  1069,
+    1070,  1071,  1072,     0,     0,  1551,  1073,     0,     0,     0,
+    1074,  1075,    34,    33,    35,   286,    36,     0,     0,    38,
+      39,   649,     0,     0,     0,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,  1330,     0,   295,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
+     380,     0,     0,   172,     0,     0,     0,    45,    46,   298,
+     299,   300,   301,     0,     0,   283,   284,  1077,   285,  1063,
+       0,  1064,  1421,  1422,  1065,  1066,  1067,  1068,  1069,  1070,
+    1071,  1072,     0,     0,     0,  1073,     0,     0,     0,  1074,
+    1075,     0,    33,     0,   286,     0,     0,     0,     0,     0,
+     649,     0,     0,     0,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,     0,
+       0,     0,   295,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   296,     0,   380,
+       0,     0,   172,     0,     0,     0,    45,    46,   298,   299,
+     300,   301,     0,     0,   283,   284,  1077,   285,  1063,     0,
+    1064,     0,     0,  1065,  1066,  1067,  1068,  1069,  1070,  1071,
+    1072,     0,     0,     0,  1073,     0,     0,     0,  1074,  1075,
+       0,    33,     0,   286,     0,     0,     0,     0,     0,   649,
        0,     0,     0,   288,     0,     0,   289,   290,   291,   292,
       41,    42,     0,   293,   294,     0,     0,     0,     0,     0,
-       0,   295,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  -417,     0,     0,   296,     0,   380,
-       0,     0,   172,     0,     0,     0,    45,    46,   298,   299,
-     300,   301,     0,     0,     0,     0,  1079,     0,   283,   284,
-    -131,   285,  1065,     0,  1066,     0,     0,  1067,  1068,  1069,
-    1070,  1071,  1072,  1073,  1074,     0,     0,     0,  1075,     0,
-       0,     0,  1076,  1077,     0,    33,     0,   286,     0,     0,
-       0,     0,     0,   650,     0,     0,     0,   288,     0,     0,
-     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
-       0,     0,     0,     0,     0,   295,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   296,     0,   380,     0,     0,   172,     0,     0,     0,
-      45,    46,   298,   299,   300,   301,     0,     0,     0,     0,
-    1079,     0,   283,   284,  -131,   285,  1065,     0,  1066,  1423,
-    1424,  1067,  1068,  1069,  1070,  1071,  1072,  1073,  1074,     0,
-       0,  1553,  1075,     0,     0,     0,  1076,  1077,     0,    33,
-       0,   286,     0,     0,     0,     0,     0,   650,     0,     0,
+       0,   295,   283,   284,     0,   285,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   296,     0,   380,     0,
+       0,   172,     0,     0,     0,    45,    46,   298,   299,   300,
+     301,   286,     0,     0,     0,  1077,     0,   287,     0,     0,
        0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
        0,   293,   294,     0,     0,     0,     0,     0,     0,   295,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   296,     0,   380,     0,     0,
-     172,     0,     0,     0,    45,    46,   298,   299,   300,   301,
-       0,     0,   283,   284,  1079,   285,  1065,     0,  1066,  1423,
-    1424,  1067,  1068,  1069,  1070,  1071,  1072,  1073,  1074,     0,
-       0,     0,  1075,     0,     0,     0,  1076,  1077,     0,    33,
-       0,   286,     0,     0,     0,     0,     0,   650,     0,     0,
-       0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
-       0,   293,   294,     0,     0,     0,     0,     0,     0,   295,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   296,     0,   380,     0,     0,
-     172,     0,     0,     0,    45,    46,   298,   299,   300,   301,
-       0,     0,   283,   284,  1079,   285,  1065,     0,  1066,     0,
-       0,  1067,  1068,  1069,  1070,  1071,  1072,  1073,  1074,     0,
-       0,     0,  1075,     0,     0,     0,  1076,  1077,     0,    33,
-       0,   286,     0,     0,     0,     0,     0,   650,     0,     0,
-       0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
-       0,   293,   294,     0,     0,     0,     0,     0,     0,   295,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   296,     0,   380,     0,     0,
-     172,     0,     0,     0,    45,    46,   298,   299,   300,   301,
-       0,     0,     0,     0,  1079,     2,   207,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
-      31,     0,   283,   284,     0,   285,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   283,   284,     0,   285,     0,     0,     0,    34,     0,
-      35,   286,    36,     0,     0,    38,    39,   287,     0,     0,
-       0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
-     286,   293,   294,     0,     0,     0,   287,  1332,     0,   295,
-     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
-     293,   294,     0,     0,     0,   296,     0,   380,   295,     0,
-     283,   284,     0,   285,    45,    46,   298,   299,   300,   301,
-       0,     0,     0,     0,   296,     0,   380,     0,     0,   283,
-     284,     0,   285,   735,    46,   298,   299,   300,   301,   286,
-       0,     0,     0,     0,     0,   650,     0,     0,     0,   288,
-       0,     0,   289,   290,   291,   292,    41,    42,   286,   293,
-     294,     0,     0,     0,   287,     0,     0,   295,   288,     0,
-       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
-       0,     0,     0,   296,     0,   786,   295,     0,   283,   284,
-       0,   285,    45,    46,   298,   299,   300,   301,     0,     0,
-       0,     0,   296,     0,   380,     0,     0,   283,   284,     0,
-     285,   345,    46,   298,   299,   300,   301,   286,     0,     0,
-       0,     0,     0,   287,     0,     0,     0,   288,     0,     0,
-     289,   290,   291,   292,    41,    42,   286,   293,   294,     0,
-       0,     0,   287,     0,     0,   295,   288,     0,     0,   289,
-     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
-       0,   296,     0,     0,   295,     0,   283,   284,     0,   285,
-      45,    46,   298,   299,   300,   301,     0,     0,     0,     0,
-     520,     0,     0,     0,     0,     0,     0,     0,     0,    45,
-      46,   298,   299,   300,   301,   286,     0,     0,     0,     0,
-       0,   287,     0,     0,     0,   288,     0,     0,   289,   290,
-     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
-       0,     0,     0,   295,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   523,
-       0,     0,     0,     0,     0,     0,     0,     0,    45,    46,
-     298,   299,   300,   301,   206,     2,   207,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
-      31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
-      35,     0,    36,     0,     0,   208,    39,   476,     2,   207,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   523,     0,     0,     0,     0,     0,
+       0,     0,     0,    45,    46,   298,   299,   300,   301,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
-       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,     0,    36,    37,     0,   175,
+     176,    40,     0,     0,     0,     0,     0,     0,    41,    42,
+     206,     2,   207,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    34,     0,    35,     0,    36,     0,     0,
-     208,    39
+       0,     0,     0,     0,    34,     0,    35,     0,    36,     0,
+       0,   208,    39,   476,     2,   207,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
+       0,    36,     0,     0,    38,    39,     2,   207,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    31,     0,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,   494,   495,   496,    34,
+       0,    35,    31,    36,     0,     0,   208,    39,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,    38,    39
 };
 
 #define yypact_value_is_default(yystate) \
-  ((yystate) == (-1415))
+  ((yystate) == (-1328))
 
 #define yytable_value_is_error(yytable_value) \
@@ -2934,712 +2943,738 @@
 static const yytype_int16 yycheck[] =
 {
-       0,     1,     1,    43,   205,     0,   186,    43,    43,   240,
-     186,   106,   117,   699,   220,   186,   186,   457,     0,   543,
-     282,   186,   657,   186,   458,   699,   186,     0,   350,    29,
-      30,  1007,    32,     0,     1,   187,   280,    32,   760,   610,
-     699,   522,     1,    43,   169,   170,   350,   630,   501,    49,
-      32,   612,   505,   188,    49,  1000,  1045,    57,   610,    32,
-     903,   156,   296,    63,   346,    32,    66,   610,    63,    69,
-      69,    66,   903,   612,    69,   581,    32,   610,    43,   610,
-       0,  1057,   781,    83,    84,  1342,   266,    39,  1044,  1045,
-     266,   531,   778,   610,   187,   266,   266,   202,   419,    43,
-     610,   266,    69,   266,   778,     0,   266,   107,   719,  1423,
-     110,    51,    32,     0,     1,   267,  1530,   117,   439,   778,
-      43,    82,     0,    28,    39,    82,   447,   262,   263,    63,
-     700,     4,     5,     6,     7,     8,     9,    32,   613,    64,
-      82,    44,    45,  1557,   619,    32,   186,   110,   148,   491,
-     186,   186,   722,   148,    32,   112,   156,   644,   645,   646,
-     112,   161,   645,   646,   427,   428,   161,    49,    39,   111,
-     110,    66,    39,    78,   267,   497,   663,   285,   107,    66,
-     663,    95,    69,  1497,  1064,   110,   186,   187,  1445,    39,
-      44,    45,   187,   427,   428,   110,    69,   112,    71,   133,
-     308,   309,   202,   132,   110,   411,    66,    44,    45,   491,
-     210,   257,   745,   116,   745,   210,   229,   131,    57,   219,
-      85,   186,   222,    83,  1076,  1077,   266,   222,   745,   229,
-     266,   266,   114,  1064,   130,   248,   132,    11,   346,   110,
-     503,   112,   186,   110,   244,   112,    82,   342,   248,   114,
-     737,   513,   252,   253,   737,   407,  1245,   252,   118,   522,
-     133,   115,    82,   186,     1,   147,   266,   267,   107,   840,
-     252,   110,   267,   273,   382,   111,   117,   372,   115,   252,
-     280,   515,   118,   117,   257,   252,   520,  1479,   840,   523,
-      39,   852,   397,  1145,   253,   295,   252,   840,   118,   133,
-     110,   161,   644,   645,   646,   457,  1295,   840,   612,   840,
-     113,  1010,    49,   852,   407,   821,  1261,   952,   929,    82,
-     425,   663,  1514,   840,  1516,   588,   431,   222,   210,   329,
-     840,    39,   252,   115,   329,   222,   295,   489,  1294,  1295,
-     365,   117,   829,   577,   369,  1427,   829,   110,   630,   349,
-     350,  1073,   117,   635,    90,    91,   698,   252,   240,     3,
-      82,   110,   222,   112,   457,   252,   366,   842,   133,   106,
-     370,   692,     0,   419,   252,    96,   111,   114,    96,   257,
-     219,   381,   117,   116,   117,     3,  1229,   903,   110,   960,
-     272,   127,   128,   439,  1530,   737,   489,   397,  1229,   132,
-     260,   447,   110,   124,   112,   265,   124,   407,   960,   979,
-     147,   117,   407,   117,  1550,   677,   698,   960,   111,   156,
-       0,  1557,   961,   110,   117,   425,   308,   133,  1308,   133,
-    1419,   431,   774,   433,   273,  1411,  1412,   111,    72,   534,
-    1023,   280,    30,  1525,   118,   132,   419,    72,  1530,    83,
-      84,   559,   560,   561,   117,   111,   351,   457,    83,    84,
-      72,   117,   462,  1419,   346,   110,   439,    72,  1550,   206,
-     133,    83,    84,   210,   447,  1557,   476,  1308,    83,    84,
-     111,   481,   111,   121,   122,   119,   117,   829,   117,   489,
-     117,   351,   774,   493,   489,    83,    84,   497,   493,   939,
-     500,   763,   502,   240,   241,   110,   133,   947,   133,  1144,
-     349,   493,    57,   132,   948,   759,   969,   476,   491,   699,
-     493,   133,   522,   699,  1005,   110,   493,   366,   699,   699,
-     852,   370,   667,   658,   699,   272,   699,   537,   275,   699,
-     540,   419,   542,   543,   110,   427,   428,   111,   852,   701,
-     117,  1067,   110,   993,   118,   110,   499,  1032,  1033,   296,
-     665,   439,   107,   522,    72,   110,   133,  1137,   132,   447,
-     111,   308,   432,   493,   599,    83,    84,   117,   537,   110,
-    1119,   540,   110,   542,   543,    80,  1308,   482,  1468,    72,
-      49,   113,   592,   133,   111,  1475,   111,   117,   493,   599,
-      83,    84,   697,   118,   112,   342,   493,    80,   701,   346,
-     610,   156,   612,   133,   117,   493,   641,   112,   600,   114,
-     117,   503,   482,   118,   111,  1195,  1196,   111,   365,   112,
-     133,   631,   369,   592,   111,   372,   133,  1468,    72,   112,
-     522,   114,    76,   965,  1475,   118,   692,   647,  1528,    83,
-      84,   117,   515,   653,   517,   114,   244,   520,   110,   111,
-     523,   117,   662,  1385,   664,   665,   666,   133,    72,   111,
-    1104,   614,   110,   781,   219,   618,   110,   133,   773,    83,
-      84,   110,    72,   889,   116,   119,   120,   117,   734,   111,
-     427,   428,   110,    83,    84,   117,   639,  1528,    72,   699,
-     643,   701,  1044,   133,   910,   664,   588,   666,   112,    83,
-      84,   111,   113,  1229,   714,    64,   117,   117,   455,   692,
-     720,   458,   112,   111,   724,   698,   133,   119,   273,   117,
-    1500,   110,   732,   125,   126,   280,  1506,   632,   113,   476,
-     971,  1023,   117,    72,   604,   745,   746,    76,   630,   110,
-    1472,   210,  1474,   635,    83,    84,   110,  1527,   112,   759,
-      55,   734,  1532,   111,   501,   110,   503,   112,   505,   117,
-     895,   113,   632,   732,   119,   120,   133,   637,   515,   115,
-     517,   110,   241,   520,   115,   522,   523,   939,   111,   133,
-     119,   120,   631,   381,   117,   947,   111,   534,   133,   111,
-    1324,   774,   117,    98,   349,   117,   831,  1529,   647,  1325,
-     111,   836,   113,   272,   692,    72,   117,    74,    75,   115,
-     113,   366,  1164,   662,   117,   370,    83,    84,   111,   110,
-     725,   132,   133,   111,   117,  1036,  1406,   296,   113,   117,
-     840,   111,   117,   110,   739,   112,   939,   117,  1534,   308,
-      82,   588,   852,  1423,   947,   837,   734,   113,   115,   110,
-    1534,   117,   599,  1379,   110,   725,  1382,    10,    11,    12,
-      13,    14,   113,  1135,   462,  1534,    70,  1139,  1140,   739,
-      74,   111,  1164,    77,   111,    79,    82,   117,   433,   120,
-     117,   111,    86,   630,   129,   895,    39,   117,   635,   194,
-     925,   130,   902,   903,   641,    94,   110,    72,   112,    74,
-      75,  1427,   500,  1135,   502,  1023,  1432,  1139,    83,    84,
-     759,   903,   217,   132,    67,   925,  1496,  1497,   112,     0,
-     903,   874,   227,   110,  1059,   112,   903,   110,   833,   939,
-      92,    93,   119,   120,   903,   110,  1462,   947,   111,   110,
-     115,   112,  1294,   110,   117,    72,  1064,    74,    75,    76,
-     697,    32,   110,  1245,   112,   965,    83,    84,   110,   111,
-     112,   970,    43,   833,  1208,  1209,   113,  1211,    49,   110,
-     113,   112,   719,  1217,   113,   985,  1220,   111,   119,   120,
-      88,    89,    63,  1255,   994,    66,   455,    49,    69,   458,
-     111,   296,  1002,   970,   110,  1005,   112,  1007,   903,   116,
-     117,    63,   749,   110,    66,   112,   903,    69,   110,   213,
-     112,   111,  1127,   966,   111,   903,   985,   110,    72,   112,
-      74,    75,  1548,   110,   111,   112,   773,   111,  1554,    83,
-      84,   111,   704,  1002,   706,   110,  1005,   113,  1007,  1565,
-     110,   111,   112,  1569,   599,   112,   515,  1057,   517,   117,
-     118,   520,   111,   112,   523,   653,   113,  1067,   112,  1509,
-    1070,  1071,  1072,   110,   111,   112,    72,   148,    74,    75,
-    1105,  1343,  1064,   970,   115,  1347,   631,    83,    84,   971,
-     161,  1064,    58,    59,   831,  1095,   148,  1064,  1057,   836,
-     116,   117,   647,   566,   567,   568,   569,   117,  1067,   161,
-     132,  1070,  1071,  1072,   115,   186,   187,   662,   115,  1559,
-     110,    10,    11,    12,    13,    14,   714,  1127,   113,  1224,
-     111,  1026,   720,   117,   118,   187,   724,   117,   118,   210,
-     111,  1023,    10,    11,    12,    13,    14,  1381,   113,   444,
-      39,   222,     4,     5,     6,     7,     8,     9,   210,   353,
-     113,   355,    72,   113,    74,    75,  1026,    44,    45,  1064,
-     222,    39,   113,    83,    84,   562,   563,  1064,    67,   564,
-     565,   252,   118,   478,   570,   571,  1064,  1449,   925,   118,
-     118,  1164,   929,   117,    29,   266,    58,    59,    60,    67,
-     110,   113,  1202,   111,   111,   115,   115,   118,  1207,   111,
-     116,   948,   116,   116,   759,   110,   117,    69,   111,    71,
-     515,   110,   118,   112,  1224,   520,   111,   117,   523,  1229,
-     119,   120,   969,   970,   971,  1267,  1268,  1269,   111,   133,
-    1207,   111,   110,   700,   112,   111,   111,  1229,   117,   443,
-    1249,   119,   120,   111,   111,   111,  1229,   473,   329,    29,
-     719,   111,  1229,   111,   111,   722,   111,  1267,  1268,  1269,
-    1229,   111,  1245,    85,    86,    87,   113,   329,   111,   350,
-       3,   111,  1249,   111,   111,     3,  1023,    10,    11,    12,
-      13,    14,    10,    11,    12,    13,    14,  1402,   110,   116,
-     112,   111,   114,   115,   111,   111,   132,   895,  1267,  1268,
-    1269,  1206,   111,  1544,   902,   111,    39,   117,   113,  1206,
-    1207,    39,   113,   111,  1324,  1325,  1308,     0,     1,   111,
-     117,   111,   118,   117,  1229,  1308,   407,   115,   117,   113,
-     111,  1308,  1229,  1342,    67,   117,  1206,   111,   117,    67,
-     111,  1229,   110,   113,  1534,   407,   110,   814,  1534,    32,
-     110,   110,  1249,  1534,  1534,  1324,  1325,  1104,  1105,  1534,
-      43,  1534,   110,   113,  1534,  1342,    49,    72,   133,  1379,
-     925,    76,  1382,  1535,   118,   680,   457,   116,    83,    84,
-      63,   111,   111,    66,   689,   116,    69,   111,   693,   130,
-     116,  1401,  1402,   115,  1509,   113,   994,  1559,  1303,   133,
-     111,  1411,  1412,  1308,   117,   110,  1303,   112,   117,   113,
-    1379,  1308,   493,  1382,   119,   120,   497,  1427,     3,   113,
-    1308,   111,  1432,   106,   891,    10,    11,    12,    13,    14,
-     111,   114,  1535,  1303,   117,   118,  1445,   111,   113,    47,
-    1450,   113,  1411,  1412,   113,  1342,     4,     5,     6,     7,
-       8,     9,  1462,   111,    39,   681,  1559,   113,  1427,   113,
-     929,   113,   133,  1432,   147,   148,   133,   133,  1445,   133,
-     133,   116,   111,   156,   157,    33,  1468,  1224,   161,   948,
-     116,  1450,    67,  1475,  1534,  1468,   118,   111,  1534,  1534,
-     113,  1468,  1475,  1462,   116,   113,   113,  1095,  1475,  1509,
-    1510,   113,  1249,   186,   187,    60,   113,   113,   113,  1519,
-     113,    69,   979,    71,   111,  1525,   111,   113,   111,   202,
-    1530,   113,   110,   110,  1534,  1535,   110,   210,   111,   610,
-    1535,   612,   133,   115,   113,   113,  1528,   118,  1548,   222,
-    1550,  1510,   111,  1010,  1554,  1528,   113,  1557,  1445,  1559,
-    1519,  1528,  1401,    96,  1559,  1565,  1525,   240,   241,  1569,
-     111,  1530,    96,  1468,    72,   110,    74,    75,    76,   252,
-    1475,  1468,   110,   133,   116,    83,    84,   260,  1475,  1548,
-    1468,  1550,   265,   266,   267,  1554,   113,  1475,  1557,   272,
-     111,   817,   111,    66,  1061,  1342,  1565,   111,   111,   117,
-    1569,   827,   110,    76,  1202,    72,    42,    74,    75,    76,
-     133,   119,   120,   296,   118,   841,    83,    84,   699,   111,
-     701,   133,   927,  1528,   111,   308,    96,    96,    26,    27,
-      28,  1528,   133,   111,   111,  1104,   133,   118,   133,   111,
-    1528,   324,   116,   110,   133,   118,   329,   111,   113,   110,
-     113,   133,  1544,   111,   116,   111,   116,   133,   111,   342,
-     111,  1079,   572,   346,   745,   746,   573,   350,   351,  1224,
-    1137,  1229,   574,    72,   575,    74,    75,    76,   576,  1497,
-    1387,  1140,   365,   190,    83,    84,   369,  1569,   161,   372,
-     197,  1318,  1475,    72,  1347,    74,    75,    76,  1445,   455,
-     455,    99,  1095,   101,    83,    84,   724,   706,   592,    66,
-     994,   110,   947,   112,   397,   949,   895,   681,   659,   118,
-     119,   120,   749,   967,   407,  1249,   493,   580,  1195,  1196,
-    1477,   110,  1479,   112,   759,    72,   580,    74,    75,    76,
-     119,   120,   425,    -1,   427,   428,    83,    84,   431,   222,
-     580,   434,    72,    -1,    74,    75,    76,    -1,    -1,   840,
-      -1,   118,   269,    83,    84,    -1,    -1,  1514,    -1,  1516,
-    1075,   852,   455,   110,   457,   458,    10,    11,    12,    13,
-      14,    -1,   119,   120,   182,    -1,    -1,   260,    -1,    -1,
-     110,    -1,   265,    -1,   192,   193,    -1,  1544,   481,   197,
-      -1,   199,   200,    -1,   161,    39,   489,   280,   491,    -1,
-     493,    -1,    -1,    -1,   497,  1041,  1042,   324,    -1,    -1,
-     503,    -1,    -1,    -1,    -1,   332,    -1,    -1,   335,    -1,
-      -1,   473,   515,    67,   517,    -1,    -1,   520,    72,   522,
-     523,    -1,    76,    -1,    -1,    -1,  1401,    -1,   531,    83,
-      84,   534,   535,   817,    -1,    -1,    -1,    72,   939,    74,
-      75,    76,    -1,   827,    -1,   222,   947,    -1,    83,    84,
-      -1,    -1,    -1,  1099,  1100,    -1,   110,   841,   351,    -1,
-      -1,    -1,    -1,    -1,   965,   119,   120,    -1,    -1,    -1,
-      -1,    -1,   399,    85,    86,    87,   403,   580,   581,    -1,
-      -1,    -1,    -1,   260,    -1,   588,    -1,    -1,   265,    -1,
-       0,    10,    11,    12,    13,    14,   599,   600,   110,    -1,
-     112,   604,   114,   115,    -1,    -1,    -1,   610,    -1,   612,
-      -1,    10,    11,    12,    13,    14,    -1,     0,     1,  1406,
-      39,    -1,    32,    -1,    -1,    -1,    -1,   630,    -1,    -1,
-      -1,    -1,   635,    -1,   637,    -1,  1423,    -1,   641,   432,
-      39,   644,   645,   646,    -1,    -1,    -1,    -1,    67,    32,
-      -1,    -1,    -1,    72,    -1,    -1,   449,    76,    -1,    69,
-     663,   488,   665,    -1,    83,    84,    49,    72,    67,    74,
-      75,    76,    -1,    72,   351,    74,    75,    76,    83,    84,
-      -1,    -1,    -1,    -1,    83,    84,    69,    -1,  1477,   482,
-    1479,   110,  1317,    -1,   697,   698,   699,  1243,   701,    -1,
-     119,   120,    -1,    -1,    -1,   110,    -1,   112,    -1,  1496,
-    1497,   110,    -1,   112,   119,   120,   719,    -1,    -1,   681,
-     119,   120,    -1,   106,    -1,  1514,    -1,  1516,    -1,  1275,
-      -1,    -1,    -1,    -1,   737,   738,   739,  1283,  1284,  1285,
-      -1,    -1,   745,   746,    -1,    -1,    -1,   157,    72,    -1,
-      74,    75,    76,   580,   581,   432,    -1,  1041,  1042,    83,
-      84,    -1,    -1,    -1,    -1,   148,    -1,    -1,    -1,    -1,
-     773,   774,    -1,   156,   157,   778,   779,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1331,   110,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   187,   482,    -1,    -1,    -1,    -1,
-      -1,   604,    -1,    -1,    -1,  1099,  1100,    -1,   821,   202,
-      -1,   231,   205,   206,    -1,    -1,   829,   210,   831,    -1,
-     833,    -1,    -1,   836,   837,    -1,    -1,   840,    -1,   632,
-      -1,   668,   252,    -1,   637,   672,    -1,   257,   231,   852,
-      -1,  1476,   235,  1478,   237,   817,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   246,    -1,   827,   584,   585,    -1,   252,
-      -1,    -1,    -1,    -1,   257,    -1,    -1,    -1,   705,   841,
-      -1,    -1,    -1,    -1,   267,    -1,    -1,    -1,  1513,    -1,
-    1515,    -1,   275,    -1,    -1,   613,    -1,    -1,   616,   617,
-     903,   619,    -1,   621,   622,    -1,    -1,    -1,   626,   627,
-      -1,    -1,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   925,   108,    -1,    -1,   929,   604,    -1,    -1,
-      -1,    -1,   725,  1558,    -1,  1560,   939,    -1,    -1,    -1,
-      -1,    -1,   352,    -1,   947,   948,   739,   132,  1573,  1574,
-      -1,    -1,    -1,    -1,    -1,   632,    -1,   960,   961,   342,
-     637,    -1,   965,   346,    -1,    -1,   759,   970,   971,   352,
+       0,     1,     1,    43,   205,     0,   186,    43,    43,   186,
+     240,   117,   186,   543,   698,   186,   282,   611,     0,  1062,
+     186,   186,   106,   220,   186,   629,   698,   458,   656,    29,
+      30,   522,    32,     0,     1,   698,   609,    32,   350,   609,
+     169,   170,     1,    43,   187,   998,   901,   609,   901,    49,
+      32,   457,   280,     0,    49,   609,     0,    57,   609,  1005,
+     350,   609,   611,    63,   499,    32,    66,   609,    63,    69,
+      69,    66,   156,  1340,    69,   501,  1042,  1043,  1043,   505,
+     718,    57,    43,    83,    84,    32,   266,   187,    32,   266,
+     759,    32,   266,   777,  1421,   266,   202,   188,    43,    66,
+     266,   266,    69,   580,   266,   777,     0,   107,   419,  1055,
+     110,    43,   780,   107,   777,    63,   473,   117,    39,    39,
+     257,   427,   428,    39,   267,   531,   365,    95,   439,   116,
+     369,   107,    82,    28,   110,   112,   447,   131,    32,   116,
+     285,   644,   645,   612,    82,   132,   186,   109,   148,   618,
+     186,   186,   109,   148,    51,   346,   156,    44,    45,   662,
+     110,   161,   130,   308,   309,    82,   161,   267,  1495,    44,
+      45,   262,   263,    64,   744,    82,  1443,    49,   613,    39,
+      44,    45,   617,    78,   132,   497,   186,   187,   109,   109,
+     111,   111,   187,   744,    82,   111,   744,   503,   109,    39,
+     117,   346,   202,   638,   111,  1074,  1075,   642,    85,  1062,
+     210,    96,   109,   699,   411,   210,   522,   110,   109,   219,
+     131,   109,   222,   116,   116,   186,   266,   222,   115,   229,
+     266,   266,    82,   736,   491,   721,   113,   382,   123,   114,
+     132,   186,   114,   219,   244,    39,    39,   513,   248,   109,
+     114,   111,   252,   253,   186,   222,   850,   252,   342,   109,
+     643,   644,   645,  1306,   407,   838,   266,   267,   838,   109,
+     252,   111,   267,   273,  1143,   147,   838,   116,  1243,   662,
+     280,   587,   419,  1477,   838,   252,    11,   838,   372,   927,
+     838,   397,   110,   132,   253,   295,   838,   273,     0,   117,
+     491,   850,   439,   110,   280,   252,  1259,   407,   252,   116,
+     447,   252,    49,   257,   457,   109,   229,   111,  1512,   425,
+    1514,   611,   950,   680,   827,   431,  1292,  1293,  1293,   329,
+      32,   109,    72,    96,   329,   248,   295,   473,   210,   110,
+    1008,    43,   819,    83,    84,   116,   489,    49,   110,   349,
+     350,     0,     1,   736,   116,  1528,    82,   457,   252,   598,
+     123,    63,    80,   257,    66,   959,   366,    69,   240,  1425,
+     370,   840,  1227,   349,  1227,  1548,   112,   114,   296,  1528,
+     691,   381,  1555,    32,   110,   958,   643,   644,   645,   489,
+     366,   117,   132,   111,   370,   113,   958,   397,   114,   117,
+     272,   640,  1071,     0,   958,   662,  1555,   407,   115,   116,
+     676,   116,   407,   558,   559,   560,    72,  1021,    74,    75,
+      69,   109,   110,  1466,   131,   425,   116,    83,    84,   116,
+    1473,   431,   116,   433,   190,    32,   308,   872,   629,   116,
+     697,   197,   132,   634,   827,   132,   148,     3,   132,    72,
+     534,  1417,  1417,  1306,   116,   111,     3,   457,   815,   161,
+      83,    84,   462,  1409,  1410,   110,    72,  1523,   825,    66,
+     132,   116,  1528,   210,   346,   419,   476,    83,    84,   736,
+     110,   481,   839,  1526,   186,   187,   112,   117,   111,   489,
+     116,   977,  1548,   493,   489,   439,   762,   497,   493,  1555,
+     500,   131,   502,   447,   241,   111,   697,     0,   210,   427,
+     428,   493,  1003,   269,  1142,   946,   773,   476,   698,    57,
+     222,   698,   522,  1117,   698,   419,   493,   698,   657,   964,
+     758,   937,   698,   698,     0,   272,   698,   537,   850,   945,
+     540,   967,   542,   543,   680,   439,   493,   491,   112,   493,
+     252,   116,   116,   447,   691,   427,   428,   700,   664,   296,
+     850,  1030,  1031,   522,   266,   120,   121,   132,   324,   107,
+     827,   308,   110,    80,   110,   666,   332,    72,   537,   335,
+     116,   540,   773,   542,   543,   991,   109,   118,    83,    84,
+     829,   591,   116,   124,   125,   834,   733,   515,   598,   493,
+     700,   110,   520,   252,   111,   523,   113,   116,   132,   609,
+     117,   611,   696,  1466,   680,   112,   131,   599,   156,   116,
+    1473,   110,   116,   118,   109,   222,   116,   329,   116,    72,
+     630,   503,   591,    76,   109,   780,   111,  1306,   132,   110,
+      83,    84,   132,   399,   132,   116,   646,   403,   350,  1135,
+     522,   963,   652,    70,   630,   252,    72,    74,   576,   109,
+      77,   661,    79,   663,   664,   665,   109,    83,    84,    86,
+     646,  1102,   110,  1526,   109,   118,   119,   109,   116,   815,
+      72,   219,  1039,  1040,   923,   661,     3,   109,   772,   825,
+     887,    83,    84,    10,    11,    12,    13,    14,   698,   129,
+     700,   131,   110,   839,   663,   407,   665,  1193,  1194,   117,
+     109,   908,   111,   713,  1383,   587,   132,   109,   455,   719,
+     116,   458,    39,   723,    90,    91,    72,   116,    74,    75,
+     112,   731,   488,   109,   116,   273,   132,    83,    84,   969,
+    1097,  1098,   280,   132,   744,   745,   110,   691,   110,   815,
+      67,   110,   116,   697,   351,   457,   110,   629,   758,   825,
+     126,   127,   634,   109,   893,    72,  1133,   110,   114,   110,
+    1137,   110,   731,   839,   112,   116,    83,    84,   515,   109,
+     517,   111,   758,   520,   110,  1042,   523,  1498,    72,   733,
+     116,   493,  1322,  1504,   937,   497,   213,   691,     3,    83,
+      84,  1470,   945,  1472,   111,    10,    11,    12,    13,    14,
+      72,   349,    74,    75,  1525,   109,    55,   111,   109,  1530,
+     699,    83,    84,   579,   580,     0,     1,   111,   366,   773,
+    1021,   109,   370,  1034,    39,   110,   115,   937,   838,   733,
+     109,   116,   721,    72,   493,   945,    66,    76,  1532,   109,
+     850,   111,   114,   835,    83,    84,   132,    32,  1527,    98,
+    1532,    64,    67,    83,  1103,    88,    89,  1133,   110,  1532,
+     114,  1137,  1138,   109,   116,    72,  1021,    74,    75,    76,
+     109,   109,   111,   111,  1241,   482,    83,    84,   109,   118,
+     119,    66,   132,   893,    69,   433,   493,   109,   118,   111,
+     900,   901,   110,  1039,  1040,  1162,   112,   609,   116,   611,
+     114,   667,   109,   132,   111,   671,  1273,  1062,  1404,   901,
+     117,   118,   119,   923,  1281,  1282,  1283,   109,  1057,   111,
+      85,    86,    87,   812,   901,  1421,   353,   937,   355,    72,
+     132,   161,   901,    76,   515,   945,   517,   110,   704,   520,
+      83,    84,   523,   116,   109,   194,   111,   901,   113,   114,
+     114,  1097,  1098,   963,    10,    11,    12,    13,    14,   968,
+     109,  1162,  1329,  1039,  1040,   109,   109,   111,   217,    72,
+      82,   718,   157,   983,   109,   118,   119,  1253,   227,   110,
+      83,    84,   992,    39,   109,   116,   698,   703,   700,   705,
+    1000,   968,   222,  1003,   112,  1005,    82,   901,  1494,  1495,
+     889,     4,     5,     6,     7,     8,     9,    92,    93,  1125,
+     119,    67,   116,   117,   983,    72,   443,    74,    75,    76,
+     128,  1097,  1098,   110,   631,  1292,    83,    84,   129,   116,
+     260,  1000,   744,   745,  1003,   265,  1005,   222,   110,   109,
+      94,   111,  1243,   131,   116,  1055,   111,   296,   118,   119,
+     598,   109,   109,   819,   111,  1065,   115,   116,  1068,  1069,
+    1070,   118,   119,   110,   111,  1341,    69,   252,    71,  1345,
+    1062,    58,    59,    10,    11,    12,    13,    14,    72,   109,
+      74,    75,   630,  1093,   112,  1062,  1055,   969,   977,    83,
+      84,  1507,   109,   110,   111,  1241,  1065,   112,   646,  1068,
+    1069,  1070,    39,   110,   112,   112,   115,   116,  1062,   116,
+     109,   110,   111,   661,   110,  1125,   109,   724,   110,  1008,
+     110,   351,    44,    45,   131,   132,   838,  1273,  1222,   132,
+      67,   738,   109,   110,   111,  1281,  1282,  1283,   850,  1021,
+     110,  1557,   116,   117,     4,     5,     6,     7,     8,     9,
+     110,     4,     5,     6,     7,     8,     9,    72,  1062,    74,
+      75,    76,   109,   110,   111,   931,   116,   117,    83,    84,
+    1059,  1447,   109,    33,   111,   110,   109,   901,   111,   111,
+     927,   118,   119,  1329,   112,   118,   119,   569,   570,    72,
+    1200,    74,    75,   112,   109,   444,  1205,  1273,   114,   946,
+      83,    84,   432,   118,   119,  1281,  1282,  1283,  1162,    69,
+     758,    71,  1222,   109,   116,   111,    69,  1227,    71,    85,
+      86,    87,   118,   119,   831,   937,   109,  1204,  1205,   478,
+     131,   114,   114,   945,   114,  1227,   561,   562,  1247,    30,
+     563,   564,   901,   109,  1010,   111,  1135,   113,   114,   434,
+    1227,   963,   482,  1329,   109,  1265,  1266,  1267,  1227,   110,
+     112,  1027,    58,    59,    60,    72,   515,    74,    75,    76,
+    1247,   520,   110,  1227,   523,   112,    83,    84,  1206,  1207,
+     112,  1209,   112,   112,  1400,    29,   117,  1215,   116,  1243,
+    1218,   117,    83,    84,   901,   117,  1265,  1266,  1267,  1265,
+    1266,  1267,  1542,   112,  1193,  1194,   110,   110,   493,   968,
+     115,   117,  1322,  1323,  1306,     0,     1,    66,   565,   566,
+     567,   568,   114,  1227,  1301,   110,   115,    76,   115,  1306,
+     116,  1340,    72,   109,    74,    75,    76,   110,  1104,   132,
+     110,  1065,  1532,    83,    84,  1532,   110,    32,  1532,   116,
+     535,  1532,  1306,  1322,  1323,  1102,  1532,  1532,    43,   117,
+    1532,   116,   110,  1340,    49,   110,    29,  1377,    49,   118,
+    1380,   110,   110,   603,   110,   923,   110,   110,    63,   110,
+    1533,    66,    63,   110,    69,    66,   110,   110,    69,  1399,
+    1400,  1507,   110,   110,   110,   110,   110,   110,   110,  1409,
+    1410,   631,  1306,  1062,  1557,   115,   636,   112,  1377,   131,
+     110,  1380,   161,  1399,   599,  1425,   110,  1024,   116,   112,
+    1430,   106,   112,  1533,   110,   116,   110,   110,   117,   114,
+     679,   109,   117,   118,  1443,   114,   116,   112,  1448,   688,
+    1409,  1410,   116,   692,   110,   116,   116,  1557,   110,   110,
+    1460,  1379,   112,   244,   109,  1062,  1425,   109,   643,   644,
+     645,  1430,   147,   148,   109,   109,  1443,   148,   117,   112,
+     110,   156,   157,   222,  1466,   132,   161,   662,   115,  1448,
+     161,  1473,  1532,   110,   115,   110,  1532,  1532,   129,  1466,
+     114,  1460,   115,   112,   724,   110,  1473,  1507,  1508,   132,
+     116,   186,   187,  1227,   112,   116,   187,  1517,   738,   112,
+     110,   260,  1466,  1523,   110,  1404,   265,   202,  1528,  1473,
+     110,   112,  1532,  1533,   112,   210,    66,   112,  1533,   210,
+     110,   280,  1421,   112,  1526,   112,  1546,   222,  1548,  1508,
+     112,   222,  1552,    47,   110,  1555,  1205,  1557,  1517,  1526,
+     132,   736,  1557,  1563,  1523,   240,   241,  1567,   132,  1528,
+     115,   132,  1466,   132,   132,   115,   117,   252,  1227,  1473,
+     112,   110,  1526,   110,   115,   260,   112,  1546,   118,  1548,
+     265,   266,   267,  1552,   112,   112,  1555,   272,  1247,   112,
+     381,   112,   112,   112,  1563,   110,   112,  1204,  1567,  1323,
+     112,   831,   351,   109,   109,  1494,  1495,   109,    60,   110,
+     110,   296,    96,   110,   132,   114,   112,   112,   112,   117,
+    1227,   161,  1526,   308,   110,    96,     3,   109,   109,   132,
+     115,   110,   112,    10,    11,    12,    13,    14,   110,   324,
+     110,   110,   827,   116,   329,    42,   110,  1306,   329,   117,
+     835,   110,    96,  1377,   132,   132,  1380,   342,    96,   110,
+    1542,   346,    39,   110,   117,   350,   351,   132,   110,   132,
+     132,   462,   115,   110,  1222,   132,   925,   112,   112,   109,
+     365,  1340,   222,   432,   369,   110,   132,   372,   115,   115,
+      67,   110,   132,   110,  1301,   110,  1077,   571,   573,  1306,
+     449,  1425,   572,   574,  1227,  1495,  1430,   575,  1385,   500,
+    1567,   502,   397,  1316,  1138,  1345,   901,  1473,  1093,   945,
+     260,   705,   407,   455,   947,   265,   407,   455,  1475,   591,
+    1477,   992,   723,   482,   893,   658,  1460,   748,   965,  1247,
+     425,   493,   427,   428,   758,   579,   431,    -1,    -1,   434,
+      -1,    72,   579,    74,    75,    76,   579,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,  1512,    -1,  1514,    -1,    -1,
+     455,    -1,   457,   458,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   968,  1443,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,  1024,    -1,   481,   118,   119,    -1,
+     985,    -1,    -1,    -1,   489,    -1,   491,  1466,   493,    -1,
+      -1,   351,   497,    -1,  1473,    -1,    -1,    -1,   503,    -1,
+    1532,    -1,  1546,    -1,  1073,    -1,    -1,    -1,  1552,    -1,
+     515,    -1,   517,    -1,    -1,   520,    -1,   522,   523,  1563,
+       1,    -1,    -1,  1567,    -1,    -1,   531,    -1,    -1,   534,
+     535,  1399,    -1,    -1,   603,    -1,    -1,  1042,  1043,  1466,
+      -1,   652,    -1,    -1,    -1,    -1,  1473,  1526,    -1,    -1,
+      -1,    -1,    10,    11,    12,    13,    14,  1062,    -1,    -1,
+      -1,    -1,   631,    -1,    -1,    -1,    -1,   636,    49,    -1,
+      -1,    -1,   432,    -1,   579,   580,    72,    -1,    74,    75,
+      76,    39,   587,    -1,    -1,    -1,    -1,    83,    84,    -1,
+      -1,    -1,    -1,   598,   599,    -1,    -1,    -1,   603,  1526,
+      -1,    -1,   713,    -1,   609,    -1,   611,    -1,   719,    67,
+      -1,    -1,   723,   109,    -1,    10,    11,    12,    13,    14,
+      -1,    -1,   482,    -1,   629,   106,    -1,    -1,    -1,   634,
+      -1,   636,    -1,   114,    -1,   640,    -1,    -1,   643,   644,
+     645,    -1,    -1,    -1,    39,    10,    11,    12,    13,    14,
+      -1,   109,    -1,   111,  1204,   724,    -1,   662,    -1,   664,
+     118,   119,    -1,    -1,    -1,    -1,   147,    -1,    -1,   738,
+      -1,    -1,    67,    -1,    39,   156,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    26,    27,    28,    -1,    -1,    -1,   758,
+      -1,   696,   697,   698,    -1,   700,    -1,    -1,    -1,  1204,
+    1205,    -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,
+      75,    76,    -1,   718,   109,    -1,   111,    -1,    83,    84,
+      -1,    -1,  1227,   118,   119,   206,    -1,    -1,    -1,   210,
+      -1,   736,   737,   738,    -1,    -1,    -1,    -1,    -1,   744,
+     745,    -1,  1247,   603,   109,    -1,  1315,    -1,    -1,    -1,
+      -1,  1301,    -1,   118,   119,    -1,    99,    -1,   101,   240,
+     241,    -1,   831,    -1,    -1,    -1,    -1,   772,   773,    -1,
+      -1,   631,   777,   778,    -1,    -1,   636,    -1,    -1,    -1,
+      -1,    -1,   893,   126,    -1,    -1,    -1,  1292,  1293,   900,
+      -1,   272,    -1,    -1,   275,    72,  1301,    74,    75,    76,
+      -1,  1306,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,
+      -1,    -1,    -1,    -1,   819,   296,    -1,    -1,    -1,    -1,
+      -1,    -1,   827,    -1,   829,    -1,   831,   308,    -1,   834,
+     835,    -1,   109,   838,    -1,  1340,    -1,    -1,    -1,   182,
+      10,    11,    12,    13,    14,   850,    -1,   190,    -1,   192,
+     193,    -1,    -1,    -1,   197,    -1,   199,   200,    -1,    -1,
+      -1,   342,    -1,    -1,   724,   346,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   738,    -1,
+      -1,   992,    -1,    72,   365,    74,    75,    76,   369,    -1,
+      -1,   372,    -1,    -1,    83,    84,   901,    67,    -1,    -1,
+      -1,    -1,    72,    -1,    -1,  1474,    76,  1476,    -1,    -1,
+      -1,    -1,  1417,    83,    84,    -1,    -1,    -1,   923,    -1,
+     109,    -1,   927,    -1,    -1,    -1,   269,    -1,    -1,   118,
+     119,    -1,   937,    -1,    -1,    -1,    -1,    -1,  1443,   109,
+     945,   946,  1511,    -1,  1513,    -1,   427,   428,   118,   119,
+      -1,    -1,    -1,   958,   959,  1024,    -1,    -1,   963,    -1,
+      -1,  1466,    -1,   968,   969,    -1,    -1,    -1,  1473,    -1,
+      -1,   831,    -1,    -1,   455,    -1,    -1,   458,    -1,    -1,
+     985,    -1,  1093,    -1,    -1,    -1,   991,  1556,    -1,  1558,
+      -1,    -1,    -1,    -1,    -1,   476,    -1,    -1,    -1,    -1,
+      -1,    -1,  1571,  1572,    -1,    -1,    -1,    -1,    -1,    -1,
+      26,    27,    28,    -1,    -1,    -1,  1021,    -1,    -1,    -1,
+     501,  1526,   503,    -1,   505,    -1,    -1,    -1,    -1,    10,
+      11,    12,    13,    14,   515,    -1,   517,  1042,  1043,   520,
+      -1,   522,   523,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   534,    -1,    -1,    -1,  1062,    39,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    -1,    30,
+      31,    32,    -1,    99,    -1,   101,    67,    -1,    39,  1200,
+      -1,    72,    -1,    74,    75,    76,    -1,  1102,  1103,    -1,
+      -1,    -1,    83,    84,    -1,    -1,   587,    -1,    -1,    -1,
+      -1,    -1,  1117,    -1,    -1,    -1,    67,   598,    -1,    -1,
+    1125,    72,    -1,    74,    75,    76,    -1,    78,   109,    -1,
+     111,    -1,    83,    84,    -1,  1204,    -1,   118,   119,    -1,
+      10,    11,    12,    13,    14,    -1,    -1,    -1,   629,    -1,
+      -1,    -1,    -1,   634,     0,     1,    -1,  1162,   109,   640,
+     111,    -1,    -1,    -1,  1024,    -1,   182,   118,   119,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,   192,   193,    -1,    -1,
+      -1,   197,    -1,   199,   200,    -1,    32,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,    67,    -1,  1204,
+    1205,    -1,    72,    49,    74,    75,    76,    72,    -1,    74,
+      75,    76,    -1,    83,    84,   696,    -1,  1222,    83,    84,
+      -1,   131,  1227,    69,     0,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1301,    -1,    -1,    -1,    -1,   718,  1243,   109,
+     583,   584,  1247,    -1,   109,    -1,   111,    -1,   118,   119,
+      -1,    -1,    -1,   118,   119,    -1,    32,    -1,    -1,    -1,
+     106,    -1,    -1,    -1,    -1,    -1,    -1,   748,    -1,   612,
+      -1,    -1,   615,   616,    -1,   618,    -1,   620,   621,    -1,
+      -1,    -1,   625,   626,    -1,    -1,    -1,  1292,  1293,    -1,
+      -1,   772,    -1,    69,    -1,    -1,  1301,    -1,    -1,    -1,
+      -1,  1306,   148,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     156,   157,    -1,    -1,    10,    11,    12,    13,    14,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   365,    -1,   987,    -1,   369,    -1,    -1,   372,
-     993,  1275,   710,   711,   821,    -1,    -1,    -1,   716,  1283,
-    1284,  1285,    -1,    10,    11,    12,    13,    14,    -1,   419,
+      -1,    -1,    -1,    -1,    -1,  1340,    10,    11,    12,    13,
+      14,   187,    -1,    39,  1204,    -1,    -1,    -1,   829,    -1,
+      -1,    -1,    -1,   834,    -1,    -1,   202,    -1,    -1,   205,
+     206,   704,    -1,    -1,   210,    39,   709,   710,    -1,    -1,
+      -1,    67,   715,    -1,    -1,    -1,    72,    -1,    74,    75,
+      76,   157,    -1,    -1,    -1,   231,    -1,    83,    84,   235,
+      -1,   237,    -1,    67,    -1,  1400,    -1,    -1,    72,    -1,
+     246,    -1,    76,    -1,    -1,    -1,   252,    -1,    -1,    83,
+      84,   257,  1417,   109,    -1,   111,    -1,    -1,    -1,    -1,
+      -1,   267,   118,   119,    -1,    -1,    -1,    -1,    -1,   275,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,    -1,  1443,    -1,
+      -1,  1301,   923,    -1,   118,   119,   927,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   231,    -1,    -1,    -1,    -1,
+      -1,  1466,    -1,    -1,    -1,   946,    -1,    -1,  1473,    -1,
+    1475,    -1,  1477,    -1,    -1,    -1,   252,    -1,    -1,    -1,
+      -1,   257,    -1,    -1,    -1,    -1,   967,   968,   969,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   342,    -1,    -1,    -1,
+     346,    -1,  1507,    -1,    -1,    -1,   352,  1512,    -1,  1514,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   365,
+      -1,  1526,    -1,   369,    -1,    -1,   372,  1532,  1533,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1542,    -1,    -1,
+    1021,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1557,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   583,   584,    -1,
+      -1,    -1,    -1,   419,    -1,    -1,   352,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   434,    -1,
+      -1,     0,    -1,   439,    -1,    -1,   612,    -1,    -1,   615,
+     616,   447,   618,    -1,   620,   621,    -1,    -1,    -1,   625,
+     626,    10,    11,    12,    13,    14,    -1,    -1,    -1,    -1,
+      -1,  1102,  1103,    32,    -1,    -1,    -1,   473,    -1,    -1,
+     476,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,   419,    -1,   491,    -1,   493,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   501,    -1,    -1,   434,   505,
+      69,    -1,    -1,   439,    -1,    -1,    -1,    -1,    67,    -1,
+      -1,   447,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
+      -1,    -1,    -1,    -1,    83,    84,    -1,    -1,   534,   535,
+      -1,    -1,    -1,   709,   710,    -1,    -1,   473,     7,   715,
+      -1,    10,    11,    12,    13,    14,    -1,    -1,    -1,    -1,
+     109,    -1,   111,    -1,    -1,   491,    -1,   493,    -1,   118,
+     119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    38,
+      39,    40,    -1,    -1,   580,    -1,    -1,    -1,    -1,    -1,
+      -1,  1222,    -1,    -1,    -1,    -1,    -1,    -1,   157,    -1,
+      -1,    -1,   598,   599,    -1,    -1,  1099,    66,    67,   535,
+      -1,    -1,    -1,    72,    -1,   611,  1247,    76,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,    -1,    -1,   629,    -1,    94,    -1,    -1,   634,    -1,
+      -1,    -1,    -1,    -1,   640,    -1,    -1,   643,   644,   645,
+     109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+     119,   120,   121,   122,   123,    -1,   662,    -1,    -1,    -1,
+      -1,    -1,    -1,   599,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   680,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   252,    -1,   691,    -1,    -1,   257,    -1,
+     696,   697,    -1,    -1,   700,    -1,    -1,    -1,    -1,  1340,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   643,   644,   645,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1023,    -1,    -1,    -1,   434,    -1,    -1,    -1,    -1,   439,
-      -1,    -1,    39,    -1,    -1,    -1,   419,   447,    -1,    -1,
-     833,  1044,  1045,    -1,    -1,    -1,    -1,  1331,   725,    -1,
-      -1,   434,    -1,    -1,    -1,    -1,   439,    -1,    -1,    -1,
-      67,  1064,   739,   473,   447,    72,    -1,    74,    75,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,  1041,
-    1042,   491,    -1,   493,    -1,    -1,    -1,    -1,    -1,    -1,
-     473,    -1,    -1,   476,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1104,  1105,   110,    -1,   112,   933,    -1,   491,    -1,
-     493,    -1,   119,   120,    -1,     0,  1119,    -1,   501,    -1,
-      -1,    -1,   505,    -1,  1127,   535,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1534,    -1,    -1,    -1,  1099,  1100,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    32,    -1,    -1,
-      -1,   534,   535,    -1,    -1,    -1,   833,    -1,    -1,    -1,
-      -1,  1164,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      -1,  1224,    -1,    -1,    -1,    -1,   662,   733,    -1,    -1,
+     736,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   745,
+      -1,    -1,   748,    -1,   680,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   691,    -1,    -1,    -1,    -1,
+      -1,   697,    -1,    -1,    -1,    -1,   772,   773,    -1,    -1,
+      -1,    -1,   778,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   352,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   733,    -1,    -1,
+     736,    -1,  1443,    -1,    -1,    -1,    -1,    -1,    -1,   815,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   825,
+      -1,   827,    -1,   829,    -1,    -1,   832,    -1,   834,   835,
+      -1,    -1,    -1,   839,  1475,    -1,  1477,   773,    -1,    -1,
+      -1,    -1,    -1,   849,    -1,    -1,    -1,    -1,    -1,    -1,
+     419,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   434,    -1,    -1,    -1,    -1,
+     439,  1512,    -1,  1514,    -1,    -1,    -1,    -1,   447,   815,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   825,
+      -1,   827,    -1,    -1,    -1,   901,   832,    -1,    -1,   835,
+      -1,  1542,    -1,   839,   473,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     0,   923,    -1,    -1,
+      -1,    -1,   491,  1099,   493,    37,    38,    -1,    40,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    32,    -1,
+      30,    31,    32,   959,    66,    -1,    -1,    -1,    -1,    39,
+      72,   967,   968,    -1,    76,   901,   535,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,   985,
+      -1,    -1,    94,    -1,    -1,    69,     0,    67,    -1,    -1,
+      -1,    -1,    72,    -1,    74,    75,    76,   109,    -1,   111,
+      -1,    -1,   114,    83,    84,    -1,   118,   119,   120,   121,
+     122,   123,    -1,    -1,    -1,  1021,    -1,    -1,    32,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1034,   109,
+     599,   111,    -1,  1039,  1040,    -1,  1042,  1043,   118,   119,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1224,   985,
+      -1,    -1,    -1,    -1,    -1,    69,  1062,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   157,   643,   644,   645,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1097,  1098,   662,    -1,    -1,    -1,  1103,    -1,    -1,
+      -1,    -1,    -1,  1039,  1040,    -1,  1042,  1043,    -1,    -1,
+      -1,   680,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   691,    -1,    -1,    -1,  1062,    -1,   697,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   157,    -1,    -1,    37,    38,    -1,    40,
+      -1,    -1,    -1,    -1,    -1,    -1,  1162,    -1,    -1,    -1,
+      -1,  1097,  1098,    -1,   733,    -1,    -1,   736,   252,    -1,
+      -1,    -1,    -1,   257,    -1,    66,    -1,    -1,    -1,    -1,
+      -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,  1205,
+      -1,    -1,    -1,    94,   773,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1222,    -1,   109,    -1,
+     111,  1227,   113,   114,    -1,    -1,  1162,   118,   119,   120,
+     121,   122,   123,    -1,    -1,  1241,    -1,  1243,   252,    -1,
+      -1,  1247,    -1,   257,    -1,    -1,   815,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   825,    -1,   827,    -1,
+      -1,    -1,    -1,   832,    -1,    -1,   835,  1273,   352,  1205,
+     839,    -1,    -1,    -1,    -1,  1281,  1282,  1283,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1292,  1293,    -1,    -1,
+      -1,  1227,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1306,    -1,    -1,    -1,    -1,  1241,    -1,  1243,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1329,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   901,    -1,  1340,   419,    -1,  1273,   352,    -1,
+      -1,    -1,    -1,    -1,    -1,  1281,  1282,  1283,    -1,    -1,
+     434,    -1,    -1,    -1,    -1,   439,  1292,  1293,    -1,    -1,
+      -1,    -1,    -1,   447,    -1,    -1,    -1,    -1,    -1,    -1,
+    1306,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,   473,
+      -1,    -1,    -1,  1329,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,   419,    -1,   491,    -1,   493,
+      -1,  1417,    -1,    -1,    -1,    -1,   985,    -1,    -1,    -1,
+     434,    -1,    -1,    -1,    -1,   439,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,   447,    -1,    -1,    -1,  1443,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   535,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   473,
+    1466,    -1,    -1,    -1,    -1,    -1,    -1,  1473,    -1,    -1,
+    1039,  1040,    -1,  1042,  1043,    -1,    -1,   491,    -1,   493,
+      -1,  1417,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1062,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    -1,   599,    -1,    -1,    -1,    -1,
+    1526,   535,    -1,    -1,    39,    -1,    -1,  1533,  1097,  1098,
+    1466,    -1,    -1,    -1,    -1,    -1,    -1,  1473,    -1,    -1,
+      -1,    -1,    -1,    -1,    53,    -1,    55,    -1,    -1,    58,
+      59,    60,    67,    62,    -1,    -1,    -1,    -1,    -1,   643,
+     644,   645,    -1,    78,    -1,    -1,    -1,    -1,    77,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   662,    -1,
+      89,    90,    -1,    -1,    -1,   599,    -1,    -1,    -1,    -1,
+    1526,    -1,    -1,  1162,    -1,    -1,   680,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   691,    -1,    -1,
+      -1,    -1,    -1,   697,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   643,
+     644,   645,    -1,    -1,    -1,    -1,  1205,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   662,   733,
+      -1,    -1,   736,    -1,    -1,    -1,    -1,    -1,  1227,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   680,    -1,    -1,    -1,
+      -1,    -1,  1241,    -1,  1243,    -1,    -1,   691,    -1,    -1,
+      -1,    -1,    -1,   697,    -1,    -1,    -1,    -1,    -1,   773,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1273,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1281,  1282,  1283,    -1,    -1,    -1,    -1,   733,
+      -1,    -1,   736,  1292,  1293,    -1,    -1,    -1,    -1,    -1,
+      -1,   815,    -1,    -1,    -1,    -1,    -1,  1306,    -1,    -1,
+      -1,   825,    -1,   827,    -1,    -1,    -1,    -1,   832,    -1,
+      -1,   835,    -1,    -1,    -1,   839,    -1,    -1,    -1,   773,
+    1329,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,   815,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,
+      -1,   825,    -1,   827,    -1,    -1,    -1,   901,   832,    -1,
+      -1,   835,    -1,    -1,    -1,   839,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,   345,    69,   347,    71,
+      -1,    -1,    74,    75,    -1,    -1,    -1,    -1,  1417,   358,
+     359,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,   114,    -1,    30,    31,    32,   901,    -1,    -1,
+      -1,    37,    38,    39,    40,    -1,    -1,  1466,    -1,    -1,
+      -1,   985,    -1,    -1,  1473,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      66,    67,    -1,    69,    -1,    71,    72,    -1,    74,    75,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
+      -1,    -1,    -1,    -1,    -1,  1039,  1040,  1526,  1042,  1043,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
+     116,   985,   118,   119,   120,   121,   122,   123,  1062,    -1,
+      -1,    -1,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,  1097,  1098,    37,    38,    39,    40,    -1,
+      -1,    66,    -1,    -1,    -1,  1039,  1040,    -1,  1042,  1043,
+      -1,    76,    -1,    78,    -1,    80,    -1,    -1,    -1,    -1,
+      -1,    -1,    87,    -1,    66,    67,    -1,    69,  1062,    71,
+      72,    -1,    74,    75,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,   118,    -1,   120,   121,   122,  1162,    -1,
+      -1,    -1,    -1,  1097,  1098,    -1,    -1,   109,    -1,   111,
+      37,    38,    -1,    40,   116,    -1,   118,   119,   120,   121,
+     122,   123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   161,    -1,    -1,    66,
+      -1,  1205,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,  1227,    -1,    -1,    -1,    94,  1162,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1241,    -1,  1243,
+      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
+     117,   118,   119,   120,   121,   122,   123,   222,    -1,   224,
+     225,   226,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1273,
+      -1,  1205,    -1,    -1,    -1,    -1,    -1,  1281,  1282,  1283,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1292,  1293,
+      -1,    -1,    -1,  1227,    -1,   260,   725,    -1,   727,    -1,
+     265,    -1,  1306,    -1,    -1,   734,   735,  1241,    -1,  1243,
+     739,    -1,    -1,    -1,    -1,   280,    -1,    -1,    -1,    -1,
+      -1,    -1,   751,    -1,    -1,  1329,    -1,   756,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1273,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1281,  1282,  1283,
+      -1,    -1,    -1,   782,    -1,    -1,    -1,    -1,  1292,  1293,
+      49,    -1,    -1,    -1,   329,    37,    38,    -1,    40,    -1,
+      -1,    -1,  1306,    -1,    -1,    -1,    -1,    66,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   351,    -1,    -1,    -1,
+      -1,   356,   357,    -1,    66,  1329,    -1,    -1,    -1,   364,
+      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,  1417,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    -1,    -1,   114,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
+      -1,    -1,   407,    -1,   116,    -1,   118,   119,   120,   121,
+     122,   123,    -1,    -1,   883,   884,   885,   886,   147,   888,
+     425,    -1,  1466,    37,    38,   430,    40,   432,   157,  1473,
+      -1,    -1,   161,    -1,    -1,   904,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1417,   449,    -1,    -1,   452,   453,   918,
+      -1,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    -1,    76,   468,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,   482,    -1,    -1,
+      94,   210,  1526,    -1,   489,    -1,    -1,    -1,   957,    -1,
+      -1,    -1,  1466,   222,    -1,   109,    -1,   111,    -1,  1473,
+     114,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      -1,   240,   241,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   997,    -1,
+      -1,    -1,    -1,    -1,    -1,  1004,   265,    -1,    -1,    -1,
+    1009,    -1,    -1,   272,    -1,  1014,    -1,  1016,    -1,    -1,
+      -1,  1020,  1526,  1022,  1023,    -1,    -1,  1026,    37,    38,
+      -1,    40,    -1,    -1,    -1,    -1,  1035,   296,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   308,
+      -1,    -1,    -1,    -1,  1053,  1054,    -1,    66,    -1,    -1,
+      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,   603,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,  1080,    -1,    -1,  1083,    94,    -1,   346,    -1,    -1,
+      -1,    -1,   351,    -1,    -1,    -1,   631,    44,    -1,    -1,
+     109,   636,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+     119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1122,    -1,    -1,    -1,    -1,    -1,  1128,
+    1129,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1140,    -1,    -1,    -1,    92,  1145,    -1,    -1,  1148,
+      -1,  1150,    -1,    -1,  1153,   102,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1166,   427,   428,
+      -1,    -1,    -1,    -1,    -1,   434,    -1,    -1,    -1,    -1,
+    1179,    -1,  1181,  1182,  1183,  1184,    -1,    -1,    -1,   724,
+      -1,    -1,    -1,    -1,    -1,    -1,   455,    -1,  1197,   458,
+    1199,    -1,    -1,   738,  1203,    -1,    -1,    -1,    -1,    -1,
+      -1,   158,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   758,    -1,   172,    -1,    -1,    -1,    -1,
+      -1,    -1,   491,  1232,  1233,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   503,    -1,    -1,    -1,   195,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   515,    -1,   517,    -1,
+      -1,   520,   209,   522,   523,    -1,    -1,    -1,    -1,    -1,
+      -1,   218,    -1,    -1,    -1,    -1,   535,    -1,    -1,    -1,
+      -1,   228,    -1,    -1,   819,  1284,  1285,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1294,   831,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   253,    -1,    -1,    -1,
+      -1,   258,    -1,    -1,    -1,   850,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   271,    -1,    -1,    -1,   587,    -1,
+     277,    -1,   279,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     599,    -1,    -1,    -1,   603,    -1,    -1,  1346,    -1,    -1,
+     297,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1358,
+      -1,  1360,  1361,  1362,    -1,    -1,    -1,    -1,    -1,    -1,
+     629,    -1,    -1,  1372,    -1,   634,    -1,    -1,    -1,    -1,
+      -1,    -1,  1381,    -1,   643,   644,   645,    -1,    -1,    -1,
+      -1,    -1,   339,    -1,    -1,    -1,    -1,   344,  1397,    -1,
+      -1,    -1,   937,   662,    -1,    -1,    -1,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,   373,    -1,   963,    -1,
+     377,   378,    -1,   380,    -1,    -1,    39,    -1,   697,    -1,
+     387,   388,    -1,   390,   391,    -1,   393,    -1,   395,    -1,
+      -1,    -1,    -1,    -1,  1453,  1454,   991,    -1,    -1,   718,
+      -1,    -1,    -1,    -1,    67,   412,    -1,  1466,    -1,    -1,
+      -1,    -1,    -1,   420,  1473,    78,    -1,   736,    -1,   738,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     7,    -1,  1024,
+      10,    11,    12,    13,    14,    -1,    -1,    -1,   445,    -1,
+    1035,    -1,    -1,    -1,    -1,    -1,    -1,  1506,    -1,   456,
+      -1,  1510,    -1,    -1,   773,    -1,    -1,    37,    38,    39,
+      40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   479,    -1,    -1,    -1,    -1,    -1,   485,    -1,
+    1539,    -1,  1541,   490,    -1,    -1,    66,    67,    -1,    -1,
+      -1,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,   827,    -1,
+    1569,  1570,   831,    -1,    94,    -1,   835,    -1,  1577,  1578,
+     527,    -1,  1117,    -1,    -1,    -1,    -1,    -1,    -1,   109,
+      -1,   111,    -1,    -1,   541,    -1,    -1,    -1,   118,   119,
+     120,   121,   122,   123,    -1,    -1,    -1,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    -1,    30,    31,    32,
+     147,    -1,   579,    -1,    -1,    -1,    39,    -1,    -1,    -1,
+     157,   588,    -1,    -1,    -1,    -1,    -1,    -1,   595,    -1,
+      -1,    -1,   169,   170,   601,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   610,    67,    -1,    -1,    -1,   927,  1204,
+      -1,    74,    75,    -1,    -1,    78,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   946,    -1,    37,
+      38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   651,    -1,   109,    -1,   111,    -1,
+     969,    -1,    -1,    -1,    -1,   118,   119,    -1,    66,    -1,
+      -1,    -1,    -1,   240,    72,    -1,   985,    -1,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+     687,    -1,    -1,    -1,    -1,    -1,    94,   264,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,  1021,   111,    -1,    -1,  1301,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1042,  1043,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   742,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   752,   753,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   766,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   783,    -1,   785,    -1,
+      -1,    -1,   789,  1102,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   381,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    -1,    39,  1162,    -1,    -1,    -1,   854,    -1,    -1,
+      -1,    -1,    -1,    -1,   861,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   156,   157,    -1,    -1,    -1,   874,    -1,   876,
+      67,    -1,    69,    -1,    71,    72,    -1,    74,    75,    76,
+      -1,    -1,    -1,   890,    -1,  1204,    83,    84,    -1,    -1,
+     897,    -1,    -1,    -1,    -1,    -1,   190,    -1,    -1,    -1,
+      -1,    -1,   909,   197,    -1,   912,   483,    -1,    -1,    -1,
+      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
+      -1,   118,   119,   930,  1243,    -1,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    69,  1012,    30,    31,    32,    -1,
-     600,    -1,    -1,    -1,    -1,    39,    -1,    -1,   581,    -1,
-      -1,    -1,  1029,  1206,  1207,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   599,   600,    -1,    -1,
-      -1,  1224,    -1,    67,    -1,    -1,  1229,    -1,    72,   612,
-      74,    75,     0,  1026,   644,   645,   646,    -1,    -1,    83,
-      84,    -1,  1245,    -1,    -1,    -1,  1249,   630,    -1,    -1,
-      -1,    -1,   635,   663,    -1,    -1,    -1,    -1,   641,    -1,
-      -1,   644,   645,   646,    32,    -1,    -1,    -1,   112,    -1,
-      -1,   681,   157,    -1,    -1,   119,   120,    -1,    -1,  1106,
-     663,  1243,   692,    -1,    -1,    -1,    -1,    -1,   698,    -1,
-      -1,  1294,  1295,    -1,    -1,    -1,    -1,    -1,   681,    -1,
-    1303,    69,    -1,    -1,    -1,  1308,    -1,    -1,    -1,   692,
-      -1,    -1,    -1,  1275,   697,   698,    -1,    -1,   701,    -1,
-      -1,  1283,  1284,  1285,   734,    -1,    -1,   737,    10,    11,
-      12,    13,    14,    -1,    -1,    -1,    -1,    -1,    -1,  1342,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1026,
-      -1,   734,    -1,    -1,   737,    -1,    -1,    39,    -1,    -1,
-      -1,    -1,    -1,   746,   774,    -1,   749,   252,    -1,  1331,
-      -1,    -1,   257,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1101,    -1,    67,    -1,    -1,    -1,   157,
-     773,   774,    -1,    -1,    -1,    -1,   779,    -1,    -1,  1402,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   817,    -1,    -1,
-      -1,    -1,    -1,  1206,    -1,    -1,  1419,   827,    -1,   829,
-      -1,    -1,    -1,    -1,   834,    -1,    -1,   837,   110,    -1,
-     112,   841,    -1,    -1,   817,    -1,    -1,   119,   120,    -1,
-      -1,    -1,  1445,    -1,   827,    -1,   829,    -1,   831,    -1,
-      -1,   834,    -1,   836,   837,    -1,    -1,    -1,   841,    -1,
-      -1,    -1,    -1,    -1,    -1,  1468,    -1,   352,   851,    -1,
-      -1,    -1,  1475,    -1,  1477,    -1,  1479,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   252,    -1,     0,     1,    -1,   257,
-      -1,    -1,    -1,   903,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    10,    11,    12,    13,    14,  1509,    -1,  1226,    -1,
-    1303,  1514,    -1,  1516,    -1,    -1,    -1,    -1,    32,    -1,
-     903,    -1,    -1,    -1,    -1,  1528,    -1,    -1,    -1,  1206,
-      39,  1534,  1535,    -1,   419,    -1,    -1,    -1,    -1,    -1,
-      -1,  1544,   925,    -1,    -1,    -1,    -1,    -1,    -1,   434,
-      -1,    -1,    66,    -1,   439,    69,  1559,    -1,    67,    -1,
-      -1,    -1,   447,    72,    -1,    74,    75,    76,    -1,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    -1,   987,   961,    -1,
-      -1,    -1,    -1,    -1,   352,    -1,   969,   970,   473,    -1,
-      -1,     0,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   110,    -1,   112,   987,    -1,   491,    -1,   493,    -1,
-     119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    32,    -1,    -1,  1303,    -1,    -1,    -1,
-      -1,  1041,  1042,    -1,  1044,  1045,    -1,    -1,    -1,    -1,
-    1023,    -1,    -1,   157,    -1,    -1,    -1,    -1,    -1,    -1,
-     535,   419,    -1,  1036,  1064,    -1,    -1,    -1,  1041,  1042,
-      69,  1044,  1045,    -1,    -1,    -1,   434,    -1,    -1,    -1,
-       7,   439,    -1,    10,    11,    12,    13,    14,    -1,   447,
-      -1,  1064,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1099,
-    1100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      37,    38,    39,    40,    -1,   473,    -1,    -1,   222,    -1,
-      -1,    -1,    -1,    -1,    -1,   600,  1099,  1100,    -1,    -1,
-      -1,    -1,  1105,   491,    -1,   493,    -1,    -1,    -1,    66,
-      67,    -1,    -1,    -1,    -1,    72,    -1,    -1,   252,    76,
-      -1,    -1,    79,    80,    81,    82,    83,    84,   157,    86,
-      87,    -1,    -1,    -1,  1164,    -1,    -1,    94,    -1,   644,
-     645,   646,    -1,    -1,    -1,    -1,    -1,   535,    -1,    -1,
-      -1,    -1,    -1,   110,    -1,   112,    -1,    -1,   663,    -1,
-      -1,  1164,   119,   120,   121,   122,   123,   124,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   681,  1207,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   692,    -1,    -1,
-      -1,    -1,    -1,   698,    -1,    -1,    -1,    -1,    -1,  1229,
-      -1,    -1,    -1,    -1,  1207,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   600,  1243,    -1,  1245,    -1,    -1,    -1,    -1,
-      -1,  1224,    -1,   252,    -1,    -1,  1229,    -1,   257,   734,
-      -1,    -1,   737,    10,    11,    12,    13,    14,    -1,    -1,
-    1243,    -1,  1245,    -1,    -1,  1275,  1249,    -1,    -1,    -1,
-      -1,    -1,    -1,  1283,  1284,  1285,   644,   645,   646,    -1,
-      -1,    -1,    39,    -1,  1294,  1295,    -1,    -1,    -1,   774,
-      -1,    -1,  1275,    -1,    -1,   663,    -1,    -1,  1308,    -1,
-    1283,  1284,  1285,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,  1294,  1295,   681,    -1,    72,    -1,    74,    75,    76,
-     434,  1331,    -1,    -1,   692,  1308,    83,    84,    -1,    -1,
-     698,    -1,   817,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   827,   352,   829,    -1,    -1,    -1,  1331,   834,
-      -1,    -1,   837,   110,    -1,    -1,   841,    -1,    -1,  1342,
-      -1,    -1,   119,   120,    -1,    -1,   734,    -1,    -1,   737,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   493,
-      -1,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    -1,    30,    31,    32,    -1,   774,    -1,    -1,  1419,
-     419,    39,    -1,    -1,    -1,    -1,    -1,    -1,   903,    -1,
-      -1,   535,    -1,    -1,    -1,   434,    -1,    -1,    -1,    -1,
-     439,    -1,    -1,    -1,    -1,    -1,  1419,    -1,   447,    67,
-      -1,    -1,    -1,    -1,    72,    -1,    74,    75,    -1,   817,
-      -1,    -1,    -1,    -1,    -1,    83,    84,    -1,  1468,   827,
-      -1,   829,  1445,    -1,   473,  1475,   834,    -1,    -1,   837,
-      -1,    -1,    -1,   841,    53,    -1,    55,    -1,    -1,    58,
-      59,    60,   491,    62,   493,  1468,   600,    -1,    -1,    -1,
-      -1,    -1,  1475,    -1,    -1,    -1,    -1,    -1,    77,    -1,
-      -1,    -1,   987,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      89,    90,    -1,    -1,    -1,    -1,    -1,    -1,  1528,    -1,
-      -1,    10,    11,    12,    13,    14,   535,    -1,    -1,    -1,
-     644,   645,   646,    -1,    -1,   903,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1528,    -1,    -1,    -1,   663,
-      39,    -1,  1535,    -1,    -1,    -1,  1041,  1042,    -1,  1044,
-    1045,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,  1064,
-      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-      -1,   600,    -1,    -1,    83,    84,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,  1099,  1100,    30,    31,    32,   987,
-      -1,   110,    -1,   737,    -1,    39,    -1,    -1,    -1,    -1,
-     119,   120,    -1,    -1,    -1,   644,   645,   646,    -1,    -1,
+      24,    25,    26,    27,    -1,   522,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,    -1,    39,    40,    -1,   535,    -1,
+      -1,    -1,  1557,   540,    -1,    -1,   543,    -1,    -1,    -1,
+      -1,    -1,    -1,  1292,  1293,   269,    -1,   554,   555,    -1,
+      -1,    -1,  1301,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      74,    75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     577,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     587,    -1,  1019,    -1,    -1,    -1,    -1,   594,    -1,    -1,
+      -1,    -1,   599,    -1,    -1,    -1,    -1,   111,    -1,    -1,
+     324,   115,    -1,    -1,   118,   119,    -1,    -1,   332,   333,
+      -1,   335,   336,    -1,    37,    38,    -1,    40,    -1,    -1,
+      -1,    -1,   346,    -1,    -1,    -1,   350,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1076,
+      -1,   648,    -1,    66,    -1,   369,  1083,    -1,   372,    72,
+     657,    -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,
+      83,    84,    -1,    86,    87,    -1,    -1,    -1,  1417,    -1,
+      -1,    94,    -1,    -1,    -1,   399,  1113,    -1,    -1,   403,
+      -1,  1118,    -1,    -1,    -1,    -1,   109,    -1,   111,  1126,
+     697,    -1,    -1,    -1,    -1,   118,   119,   120,   121,   122,
+     123,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     434,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1157,    -1,    -1,    -1,    -1,    -1,  1475,    -1,  1477,    -1,
+      -1,    -1,  1169,   457,    -1,  1172,    -1,  1174,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,   663,    -1,    -1,    -1,    72,    -1,
-      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
-      84,    -1,   681,  1041,  1042,    -1,  1044,  1045,    -1,  1164,
-      -1,    -1,    -1,   692,    -1,    -1,    -1,    -1,    -1,   698,
-      -1,    37,    38,    -1,    40,    -1,  1064,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   829,    -1,    -1,    -1,    -1,
-      66,    -1,  1207,   837,    -1,   734,    72,    -1,   737,    -1,
-      76,  1099,  1100,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,  1229,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1243,    -1,
-    1245,    -1,    -1,    -1,   110,   774,   345,    -1,   347,    -1,
-      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,   358,
-     359,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   903,
-    1275,    -1,    -1,    -1,    -1,    -1,  1164,    -1,  1283,  1284,
-    1285,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   817,  1294,
-    1295,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   827,    -1,
-     829,    -1,    -1,  1308,    -1,   834,    -1,    -1,   837,    -1,
-      -1,    -1,   841,    -1,    -1,    -1,    -1,    -1,    -1,  1207,
-     283,    -1,   285,   286,    -1,    -1,  1331,    -1,    -1,    -1,
-     293,   294,    -1,    -1,    -1,    -1,   970,    -1,    -1,    -1,
-      -1,  1229,    -1,    -1,    -1,   308,   309,    -1,    -1,    -1,
-      -1,    -1,    -1,   987,    -1,  1243,    -1,  1245,    -1,    -1,
-      -1,    66,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    76,    -1,    78,   903,    80,    -1,    -1,    26,    27,
-      28,    -1,    87,   346,    -1,    -1,    -1,  1275,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1283,  1284,  1285,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1294,  1295,    -1,    -1,
-    1044,  1045,    -1,   118,  1419,   120,   121,   122,    -1,   382,
-    1308,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1064,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1331,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    99,    -1,   101,    -1,    -1,   161,    -1,   987,    -1,
-      -1,    -1,    -1,  1468,    -1,    -1,    -1,    -1,    -1,    -1,
-    1475,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   126,    -1,
-      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,  1041,  1042,    -1,  1044,  1045,   222,    39,   224,
-     225,   226,    -1,  1528,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1419,    -1,    -1,   182,  1064,    -1,    -1,    -1,    -1,
-      -1,    -1,   190,    -1,   192,   193,    67,    -1,    69,   197,
-      71,   199,   200,    74,    75,   260,    -1,    -1,    -1,    -1,
-     265,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1099,  1100,  1206,  1207,    -1,   280,    -1,    -1,    -1,    -1,
-    1468,    -1,    -1,    -1,    -1,    -1,    -1,  1475,    -1,    -1,
-      -1,    -1,    -1,    -1,   115,  1229,   559,   560,   561,   562,
-     563,   564,   565,   566,   567,   568,   569,   570,   571,   572,
-     573,   574,   575,   576,    -1,  1249,    -1,    -1,    -1,    -1,
-      -1,   269,    -1,    -1,   329,    -1,    -1,   726,    -1,   728,
-      -1,    -1,    -1,    -1,    -1,  1164,   735,   736,    -1,    -1,
-    1528,   740,    -1,    -1,    -1,    -1,   351,    -1,    -1,    -1,
-      -1,   356,   357,   752,    -1,    -1,    -1,    -1,   757,   364,
-    1294,  1295,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1303,
-      -1,    -1,    -1,    -1,  1308,    -1,    -1,    -1,  1207,    -1,
-      -1,    -1,    -1,    -1,   783,    -1,    -1,    -1,    -1,    -1,
+      -1,  1188,  1189,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1512,   488,  1514,   773,   491,   775,    -1,
+      -1,    -1,    -1,  1210,   781,    -1,    -1,    -1,    -1,    -1,
+      -1,   788,    -1,    -1,    -1,    -1,    -1,    37,    38,    -1,
+      40,    -1,    -1,  1542,    -1,    -1,    -1,    -1,    -1,    -1,
+    1237,    -1,    -1,    -1,    -1,    -1,    -1,   531,    -1,    -1,
+     534,   535,    -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,
+      -1,    -1,    72,    -1,   831,   832,    76,    -1,   835,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,    -1,   849,    -1,    94,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   579,   580,    -1,    -1,   109,
+      -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,
+     120,   121,   122,   123,   598,   599,    -1,    -1,    -1,    -1,
+      -1,    -1,   889,    -1,    -1,   609,   893,   611,   612,    -1,
+      -1,    -1,    -1,    -1,   618,    -1,    -1,    -1,  1335,    -1,
+    1337,    -1,    -1,    -1,   628,   629,   283,    -1,   285,   286,
+     634,    -1,    -1,  1350,    -1,  1352,   293,   294,    -1,   643,
+     644,   645,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   308,   309,  1370,    -1,    -1,    -1,    -1,   662,    -1,
+      -1,    -1,    -1,   667,   668,    -1,    -1,   671,   672,  1386,
+    1387,    -1,    -1,    -1,   678,    -1,    -1,    -1,    -1,    -1,
+      -1,  1398,   969,    -1,  1401,    -1,    -1,    -1,    -1,   346,
+      -1,    -1,   696,   697,   698,    -1,   700,    -1,   985,   986,
+     704,    -1,    -1,    -1,    -1,   992,  1423,    -1,    -1,    -1,
+      -1,   998,    -1,    -1,  1001,  1432,  1003,    -1,  1435,    -1,
+    1437,  1438,  1439,    -1,    -1,   382,    -1,    -1,    -1,    -1,
+      -1,    -1,   736,   737,    -1,    -1,    -1,  1024,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1035,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1229,    -1,   407,    -1,    -1,    -1,    -1,    -1,  1342,    -1,
-      -1,    -1,    -1,    -1,  1243,    -1,  1245,    -1,    -1,    -1,
-     425,    -1,    -1,    -1,    -1,   430,    -1,   432,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   700,    -1,    -1,
-      -1,    -1,    -1,    -1,   449,    -1,  1275,   452,   453,    -1,
-      -1,    -1,    -1,    -1,  1283,  1284,  1285,    -1,    -1,   722,
-      -1,    -1,    -1,   468,    -1,  1294,  1295,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   482,    -1,  1308,
-      -1,    -1,    -1,    -1,   489,  1419,   885,   886,   887,   888,
-      -1,   890,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      37,    38,  1331,    40,    -1,    -1,    -1,   906,    -1,    -1,
-      -1,  1445,    -1,    -1,    -1,    -1,    -1,    -1,   781,    -1,
-      -1,   920,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,    -1,  1468,    72,    49,    74,    75,    76,
-      -1,  1475,    79,    80,    81,    82,    83,    84,    -1,    86,
-      87,   814,    -1,    66,    -1,    -1,    -1,    94,    -1,    -1,
-     959,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   110,    -1,   112,    -1,   114,   115,    -1,
-      -1,    -1,   119,   120,   121,   122,   123,   124,    -1,    -1,
-    1419,    -1,    -1,    -1,  1528,    -1,    -1,    -1,    -1,   604,
-     999,   114,    -1,    -1,    -1,   118,    -1,  1006,    -1,    -1,
-      -1,    -1,  1011,    -1,    -1,    -1,    -1,  1016,    -1,  1018,
-      -1,    -1,    -1,  1022,    -1,  1024,  1025,   632,    -1,  1028,
-      -1,    -1,   637,    -1,   147,    -1,   584,   585,  1037,  1468,
-      -1,    -1,    -1,    -1,   157,    -1,  1475,    -1,   161,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1055,  1056,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   613,    -1,    -1,   616,   617,
-      -1,   619,    -1,   621,   622,    -1,    -1,    -1,   626,   627,
-      -1,    -1,    -1,  1082,    -1,    -1,  1085,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   210,    -1,  1528,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   222,
-      -1,    -1,    -1,    -1,    -1,    -1,   979,    -1,    -1,    -1,
-     725,    -1,    -1,    -1,    -1,  1124,    -1,   240,   241,    -1,
-      -1,  1130,  1131,    -1,   739,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1142,    -1,    -1,    -1,  1010,  1147,    -1,
-      -1,  1150,   265,  1152,   759,    -1,  1155,   705,    -1,   272,
-    1023,    -1,   710,   711,    -1,    -1,    -1,    -1,   716,  1168,
+      -1,    -1,  1479,    -1,  1481,    -1,    -1,  1484,   772,   773,
+    1057,    -1,  1059,   777,   778,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1499,    -1,    -1,    -1,    -1,  1074,  1075,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,  1095,    -1,
+      30,    31,    32,    -1,    -1,   819,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,   827,    -1,    -1,    -1,    -1,    -1,    -1,
+     834,   835,    -1,    -1,   838,    -1,   840,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   850,    67,    -1,    -1,
+      -1,    -1,    -1,    -1,    74,    75,  1143,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1181,   296,  1183,  1184,  1185,  1186,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   308,    -1,    -1,    -1,    -1,
-    1199,  1064,  1201,    -1,    -1,    -1,  1205,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   821,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   833,    -1,
-      -1,    -1,    -1,   346,    -1,  1234,  1235,    -1,   351,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   852,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    -1,    30,    31,
-      32,    -1,    -1,    -1,  1137,    -1,    -1,    39,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1286,  1287,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1296,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
-      -1,    -1,    74,    75,   427,   428,    78,    -1,    -1,    -1,
-      -1,   434,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1195,  1196,   939,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   455,    -1,    -1,   458,    -1,    -1,   110,  1348,
-     112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,    -1,
-     965,  1360,    -1,  1362,  1363,  1364,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1374,    -1,    -1,   491,    -1,
-      -1,    -1,    -1,    -1,  1383,    -1,    -1,    -1,   993,    -1,
-     503,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1399,    -1,   515,    -1,   517,    -1,    -1,   520,    -1,   522,
-     523,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1026,   535,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    44,  1037,    -1,    -1,    -1,    -1,    -1,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,  1455,  1456,    30,    31,
-      32,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,  1468,
-      -1,    -1,    -1,    -1,    -1,   588,  1475,    -1,    -1,    92,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   600,    -1,   102,
-      -1,   604,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
-      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,  1508,
-      -1,    83,    84,  1512,  1119,    -1,    -1,   630,    -1,    -1,
-      -1,    -1,   635,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   644,   645,   646,    -1,    -1,    -1,    -1,   110,    -1,
-     112,    -1,  1541,  1406,  1543,   158,    -1,   119,   120,    -1,
-     663,    -1,    -1,  1101,    -1,    -1,    -1,    -1,    -1,   172,
-    1423,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1571,  1572,    -1,    -1,    -1,    -1,    -1,    -1,
-    1579,  1580,   195,    -1,    -1,   698,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   209,    -1,    -1,    -1,
-      -1,  1206,    -1,    -1,    -1,   218,   719,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   228,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   737,    -1,   739,    -1,    -1,    -1,
-      -1,    -1,    -1,  1496,  1497,    -1,    -1,    -1,    -1,    -1,
-     253,    -1,    -1,    -1,    -1,   258,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   271,    -1,
-      -1,   774,    -1,    -1,   277,    -1,   279,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     7,    -1,  1226,    10,
-      11,    12,    13,    14,   297,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1303,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
-      -1,    -1,    -1,    -1,    -1,    -1,   829,    -1,    -1,    -1,
-     833,    -1,    -1,    -1,   837,    -1,   339,    -1,    -1,    -1,
-      -1,   344,    -1,    -1,    -1,    66,    67,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-     373,    -1,    -1,    94,   377,   378,    -1,   380,    -1,    -1,
-      -1,    -1,    -1,    -1,   387,   388,    -1,   390,   391,   110,
-     393,   112,   395,    -1,    -1,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,    -1,    -1,    -1,    -1,    -1,   412,
-      -1,    -1,    -1,    -1,    -1,    37,    38,   420,    40,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   929,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1162,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   445,    -1,    66,   948,    -1,    -1,    -1,    -1,
-      72,    -1,    -1,   456,    76,    -1,    -1,    79,    80,    81,
-      82,    83,    84,    -1,    86,    87,    -1,    -1,   971,    -1,
-      -1,    -1,    94,    -1,    -1,    -1,   479,    -1,    -1,    -1,
-      -1,    -1,   485,    -1,   987,    -1,    -1,   490,   110,    -1,
-     112,    -1,    -1,   115,    -1,    -1,    -1,   119,   120,   121,
-     122,   123,   124,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   156,   157,    -1,    -1,
-    1023,    -1,    -1,    -1,   527,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   541,    -1,
-      -1,  1044,  1045,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     190,    -1,    -1,    -1,    -1,    -1,    -1,   197,    -1,    -1,
-      -1,    -1,    -1,    -1,  1559,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   580,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   589,    -1,    -1,    -1,
-      -1,    -1,    -1,   596,    -1,    -1,    -1,    -1,    -1,   602,
-      -1,  1104,    -1,    -1,    -1,    -1,    -1,    -1,   611,    -1,
+    1177,  1178,    -1,    37,    38,    -1,    40,    -1,   118,   119,
+      -1,   558,   559,   560,   561,   562,   563,   564,   565,   566,
+     567,   568,   569,   570,   571,   572,   573,   574,   575,   923,
+      -1,    -1,    66,    -1,    -1,    -1,    -1,   931,    72,    -1,
+      -1,    -1,    76,   937,    -1,    79,    80,    81,    82,    83,
+      84,   945,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,   958,   959,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,
+      -1,    -1,  1259,    -1,   118,   119,   120,   121,   122,   123,
+      -1,   985,    -1,    -1,    -1,    -1,    -1,   991,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1010,  1011,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1021,    -1,    -1,
+      -1,    -1,    -1,  1027,  1028,    -1,  1030,  1031,  1032,    -1,
+      -1,    -1,    -1,  1320,    -1,  1322,    -1,    -1,  1042,  1043,
+      -1,    -1,   699,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   721,    -1,    -1,    -1,    -1,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,  1103,
+    1104,  1105,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1117,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1408,    -1,   780,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
+      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,   812,    -1,    -1,  1162,    94,
+      -1,    -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
+      -1,   116,    -1,   118,   119,   120,   121,   122,   123,    -1,
+      -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
+      -1,    76,    -1,  1490,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,  1222,    94,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,  1243,
+      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,    -1,
+      -1,    -1,    -1,    -1,    -1,  1542,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    -1,   269,
-      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,
-      40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   652,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1164,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   324,   688,    -1,    -1,    -1,    -1,
-      -1,    -1,   332,   333,    -1,   335,   336,    -1,    -1,    -1,
-      -1,    -1,    -1,  1206,    -1,    -1,   346,    -1,    -1,    -1,
-     350,    -1,   112,    -1,    -1,    -1,   116,    -1,    -1,   119,
-     120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   369,
-      -1,    -1,   372,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     743,    -1,  1245,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     753,   754,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   399,
-      -1,    -1,    -1,   403,   767,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   784,    -1,   786,    -1,    -1,   147,   790,    -1,    -1,
-      -1,  1294,  1295,    -1,   434,    -1,   157,    -1,    -1,    -1,
-    1303,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   169,   170,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   457,    -1,    -1,
-      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,   488,    -1,
-      39,   491,    -1,   856,    -1,    -1,    -1,    -1,    -1,    -1,
-     863,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   876,    -1,   878,    -1,    -1,    67,   240,
-      -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   892,
-      -1,   531,    -1,    -1,   534,   535,   899,    -1,    -1,    -1,
-      -1,    -1,    -1,   264,    -1,    -1,    -1,    -1,   911,    -1,
-      -1,   914,    -1,    -1,    -1,    -1,  1419,    -1,    -1,    -1,
-      -1,   110,    -1,   112,    -1,    -1,    -1,    -1,    -1,   932,
-     119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     580,   581,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   599,
-     600,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     610,    -1,   612,   613,  1477,    -1,  1479,    -1,    -1,   619,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   629,
-     630,    -1,    -1,    -1,    -1,   635,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   644,   645,   646,    -1,    -1,    -1,
-      -1,  1514,    -1,  1516,    -1,    -1,    -1,    -1,  1021,    -1,
-     381,    -1,    -1,   663,    -1,    -1,    -1,    -1,   668,   669,
-      -1,    -1,   672,   673,    -1,    -1,    -1,    -1,    -1,   679,
-      -1,  1544,    -1,    -1,    -1,    37,    38,    -1,    40,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   697,   698,   699,
-      -1,   701,    -1,    -1,    -1,   705,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    66,  1078,    -1,    -1,    -1,    -1,
-      72,    -1,  1085,    -1,    76,    -1,    -1,    79,    80,    81,
-      82,    83,    84,    -1,    86,    87,    -1,   737,   738,    -1,
-      -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1115,    -1,    -1,    -1,    -1,  1120,   110,    -1,
-     112,    -1,   483,    -1,    -1,  1128,   118,   119,   120,   121,
-     122,   123,   124,   773,   774,    -1,    -1,    -1,   778,   779,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1159,    -1,    -1,    -1,
-      -1,   522,    -1,    -1,    -1,    -1,    -1,    -1,  1171,    -1,
-      -1,  1174,    -1,  1176,   535,    -1,    -1,    -1,    -1,   540,
-      -1,   821,   543,    -1,    -1,    -1,    -1,  1190,  1191,   829,
-      -1,    -1,    -1,   554,   555,   556,   836,   837,    -1,    -1,
-     840,    -1,   842,    -1,    -1,    -1,    -1,    -1,    -1,  1212,
-      -1,    -1,   852,    -1,    -1,    -1,    -1,   578,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   588,    -1,    -1,
-      -1,    -1,    -1,    -1,   595,    -1,  1239,    -1,    -1,   600,
-      -1,    -1,     0,    -1,    -1,     3,     4,     5,     6,     7,
+      20,    21,    22,    23,    24,    25,    26,    27,  1292,  1293,
+      30,    31,    32,    33,    -1,    -1,    36,    37,    38,    39,
+      40,    41,    -1,    43,    -1,    -1,    46,    47,    48,    49,
+      50,    51,    52,    53,    -1,    -1,    -1,    57,    -1,    -1,
+     977,    61,    62,    -1,    64,    -1,    66,    67,    -1,    69,
+      -1,    71,    72,    -1,    74,    75,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,  1008,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1021,    -1,    -1,    -1,    -1,   109,
+      -1,   111,    -1,    -1,   114,    -1,    -1,    -1,   118,   119,
+     120,   121,   122,   123,    -1,    -1,    -1,    -1,   128,    -1,
+      -1,    -1,   132,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1062,    -1,    -1,    -1,    -1,
+      -1,    -1,     0,  1417,    -1,     3,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,    -1,
-      -1,    39,    40,    -1,    -1,   925,    -1,    -1,   649,    -1,
-      -1,    -1,    -1,   933,    -1,    -1,    -1,   658,    -1,   939,
-      -1,    -1,    -1,    -1,    -1,    -1,    64,   947,    -1,    67,
+      -1,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    64,    -1,  1135,    67,
       -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
-     960,   961,    -1,    -1,    -1,    83,    84,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1337,    -1,  1339,   698,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   987,    -1,  1352,
-      -1,  1354,   110,   993,   112,    -1,    -1,    -1,    -1,    -1,
-      -1,   119,   120,    -1,    -1,    -1,    -1,    -1,    -1,  1372,
-      -1,    -1,  1012,  1013,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1023,    -1,  1388,  1389,    -1,    -1,  1029,
-    1030,    -1,  1032,  1033,  1034,    -1,    -1,  1400,    -1,    -1,
-    1403,    -1,    -1,    -1,  1044,  1045,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   774,    -1,   776,    -1,    -1,    -1,    -1,
-      -1,   782,  1425,    -1,    -1,    -1,    -1,    -1,   789,    -1,
-      -1,  1434,    -1,    -1,  1437,    -1,  1439,  1440,  1441,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,  1105,  1106,  1107,    -1,    -1,
-      -1,    -1,   833,   834,    39,    -1,   837,    -1,  1481,  1119,
-    1483,    -1,    -1,  1486,    -1,    -1,    -1,    -1,    -1,    -1,
-     851,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1501,    -1,
-      -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,    84,
-      -1,    -1,    -1,    -1,  1164,    -1,    -1,    -1,    -1,    -1,
-     891,    -1,    -1,    -1,   895,    -1,    -1,    -1,    -1,    -1,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      33,    -1,    -1,    36,    37,    38,    39,    40,    -1,    -1,
-      -1,    -1,    -1,    -1,  1224,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    66,    67,  1245,    69,    -1,    71,    72,
-     971,    74,    75,    76,    -1,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    -1,   987,   988,    -1,    -1,
-      -1,    94,    -1,   994,    -1,    -1,    -1,    -1,    -1,  1000,
-      -1,    -1,  1003,    -1,  1005,    37,    38,   110,    40,   112,
-      -1,    -1,    -1,    -1,  1294,  1295,   119,   120,   121,   122,
-     123,   124,    -1,    -1,    -1,  1026,    -1,    -1,    -1,    -1,
-     133,    -1,    -1,    -1,    66,    -1,  1037,    -1,    -1,    -1,
-      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
-      82,    83,    84,    -1,    86,    87,    -1,    -1,  1059,    -1,
-    1061,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1076,  1077,    -1,   110,    -1,
-     112,    -1,    -1,    -1,    -1,   117,    -1,   119,   120,   121,
-     122,   123,   124,    -1,    -1,    -1,  1097,    -1,    -1,    -1,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      33,    -1,    -1,    36,    -1,    -1,    39,    40,    -1,  1419,
-      -1,    -1,    -1,    -1,  1145,    -1,    -1,    -1,    37,    38,
-      -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    64,    -1,  1164,    67,    -1,    69,    -1,    71,    72,
-      -1,    74,    75,    76,    -1,    -1,    -1,    66,  1179,  1180,
-      83,    84,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    -1,   110,    -1,   112,
-      -1,    -1,    -1,   116,    -1,    -1,   119,   120,    -1,    -1,
-      -1,   110,    -1,   112,    -1,    -1,   115,    -1,    -1,  1509,
-     119,   120,   121,   122,   123,   124,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1534,  1535,    -1,    -1,    -1,    -1,
-    1261,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1559,
-      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    33,    -1,    -1,    36,    37,    38,    39,    40,
-      41,  1322,    43,  1324,    -1,    46,    47,    48,    49,    50,
-      51,    52,    53,    -1,    -1,    -1,    57,    -1,    -1,    -1,
-      61,    62,    -1,    64,    -1,    66,    67,    -1,    69,    -1,
-      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   110,
-      -1,   112,    -1,    -1,   115,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,    -1,    -1,    -1,    -1,   129,  1410,
-      -1,    -1,   133,    -1,    -1,    -1,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,
-      37,    38,    39,    40,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      67,    -1,    69,    39,    71,    72,    -1,    74,    75,    76,
-      -1,  1492,    79,    80,    81,    82,    83,    84,    -1,    86,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    78,   110,    -1,   112,    -1,    -1,    -1,    -1,
-      -1,    -1,   119,   120,   121,   122,   123,   124,    -1,    -1,
-      -1,    -1,    -1,  1544,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
-      30,    31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,
-      40,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    69,
-      39,    71,    72,    -1,    74,    75,    76,    -1,    -1,    79,
-      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
-      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    78,
-     110,    -1,   112,    -1,    -1,    -1,    -1,   117,    -1,   119,
-     120,   121,   122,   123,   124,     4,     5,     6,     7,     8,
+      -1,    66,    -1,    -1,    -1,    83,    84,    72,    -1,    -1,
+      -1,    76,    -1,  1507,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,  1532,  1533,
+     118,   119,    -1,    -1,   109,    -1,  1193,  1194,    -1,    -1,
+      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,    -1,
+      -1,    -1,    -1,  1557,     3,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,    38,
+      -1,    30,    31,    32,    33,    -1,    -1,    36,    37,    38,
       39,    40,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
@@ -3648,91 +3683,92 @@
       79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
       -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    67,
-      -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,
-      -1,   110,    -1,   112,    -1,    -1,    -1,    -1,   117,    -1,
-     119,   120,   121,   122,   123,   124,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
-      38,    39,    40,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    66,    67,
-      -1,    69,    39,    71,    72,    -1,    74,    75,    76,    -1,
-      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
-      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    -1,   110,    -1,   112,    -1,    -1,    -1,    -1,   117,
-      -1,   119,   120,   121,   122,   123,   124,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      37,    38,    39,    40,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      67,    -1,    69,    39,    71,    72,    -1,    74,    75,    76,
-      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   110,    -1,   112,    -1,    -1,    -1,    -1,
-      -1,    -1,   119,   120,   121,   122,   123,   124,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    74,    75,    -1,    -1,
+     109,    -1,   111,    -1,    -1,    83,    84,    -1,    -1,   118,
+     119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   132,    -1,    -1,    -1,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    33,
+      -1,    -1,    36,    37,    38,    39,    40,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1404,    -1,    -1,
+      -1,    -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,
+      74,    75,    76,    -1,  1421,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      -1,    -1,    -1,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,  1494,  1495,    30,
+      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    66,    67,    -1,    69,    39,
+      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,
+      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    66,    67,    -1,    69,    39,
+      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,
+      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      66,    67,    -1,    69,    -1,    71,    72,    -1,    74,    75,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,    -1,
-      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    69,    -1,
+      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
+      -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    69,    -1,
+      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    33,    -1,    -1,    36,    -1,    -1,    39,
+      40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,
-      -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    37,    38,    39,    40,    10,    11,    12,
+      -1,    -1,    -1,    -1,    64,    -1,    -1,    67,    -1,    69,
+      -1,    71,    72,    -1,    74,    75,    76,    -1,    -1,    -1,
+      -1,    -1,    -1,    83,    84,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,
+      -1,   111,    -1,    -1,    -1,   115,    -1,    -1,   118,   119,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      -1,    -1,    66,    67,    -1,    69,    39,    71,    72,    -1,
-      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
-      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
-      94,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
-      -1,    74,    75,    -1,    -1,    -1,   110,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,
-     124,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,   119,   120,    30,    31,
-      32,    33,    -1,    -1,    36,    -1,    -1,    39,    40,    -1,
+      33,    -1,    -1,    36,    -1,    -1,    39,    40,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    64,    -1,    -1,    67,    -1,    69,    -1,    71,
-      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,
-      -1,    83,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    64,    -1,    -1,    67,    -1,    69,    -1,    71,    72,
+      -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,
+      83,    84,    -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,   110,    -1,
-     112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    -1,    -1,    39,    -1,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      33,    34,    35,    67,    -1,    69,    39,    71,    72,    -1,
-      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
-      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
-      -1,    74,    75,    -1,    -1,    -1,   110,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,     3,     4,     5,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
+      -1,    -1,    -1,    -1,    -1,   118,   119,     3,     4,     5,
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
@@ -3742,140 +3778,128 @@
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
-      -1,    -1,    78,    -1,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    33,    -1,   112,    36,    -1,    -1,
-      39,    -1,    -1,   119,   120,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    78,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    33,    -1,   111,    36,    -1,    -1,    39,
+      -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
-      69,    -1,    71,    -1,    -1,    74,    75,    -1,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    -1,   112,    39,    -1,    -1,    -1,    -1,    -1,
-     119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
-      75,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      -1,    -1,    -1,    -1,    -1,    -1,    39,   112,    -1,    -1,
-      -1,    -1,    -1,    -1,   119,   120,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    72,
-      -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      83,    84,    -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,   110,    -1,   112,
-      -1,    -1,    -1,    -1,    -1,    -1,   119,   120,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,
+      -1,    71,    -1,    -1,    74,    75,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,   111,    39,    -1,    -1,    -1,    -1,    -1,   118,   119,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
-      -1,    -1,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
-      32,    -1,    -1,    -1,    -1,   111,   112,    39,    -1,    -1,
-      -1,    -1,    -1,   119,   120,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
-      -1,    -1,    74,    75,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    -1,    30,    31,
-      32,    -1,    67,    -1,    69,    -1,    71,    39,    -1,    74,
-      75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    96,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
-      72,    -1,    74,    75,    76,    -1,    78,   112,    -1,    -1,
-      -1,    83,    84,    -1,   119,   120,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-     112,    -1,    30,    31,    32,    -1,    -1,   119,   120,    -1,
-      -1,    39,    -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,    67,
-      -1,    69,    -1,    71,    -1,    -1,    74,    75,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,   112,    -1,    -1,    -1,    -1,    -1,
-      -1,   119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    -1,    -1,    39,   112,    -1,    -1,    -1,
-      -1,    -1,    -1,   119,   120,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,    -1,
+      -1,   118,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
+      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    67,
+      -1,    69,    -1,    71,    -1,    39,    74,    75,    -1,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    67,    -1,    30,    31,    32,    -1,    -1,
+      74,    75,   110,   111,    39,    -1,    -1,    -1,    -1,    -1,
+     118,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,   109,    71,   111,    -1,    74,
+      75,    -1,    -1,    -1,   118,   119,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
+      -1,    -1,    -1,   118,   119,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    -1,    67,    -1,
+      69,    -1,    71,    39,    -1,    74,    75,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,
+      76,    -1,   111,    -1,    -1,    -1,    -1,    83,    84,   118,
+     119,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,   111,    -1,    30,    31,    32,
+      -1,    -1,   118,   119,    -1,    -1,    39,    -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,    67,    -1,    69,    -1,    71,    -1,
+      -1,    74,    75,    -1,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,   111,    39,
+      -1,    -1,    -1,    -1,    -1,   118,   119,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,
+      -1,    71,    -1,    -1,    74,    75,    -1,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,   111,    39,    -1,    -1,    -1,    -1,    -1,   118,   119,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,    -1,
+      -1,   118,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,
-      74,    75,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
-      32,    -1,    -1,    -1,    -1,    -1,    -1,    39,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,    -1,
+      74,    75,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
-      -1,    -1,    74,    75,    10,    11,    12,    13,    14,    15,
+      -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    37,    38,    39,    40,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    66,    67,    -1,    -1,    39,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    72,
+      -1,    74,    75,    -1,    -1,   109,   110,   111,    -1,    -1,
+      83,    84,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,   111,    -1,
+      30,    31,    32,    -1,    -1,   118,   119,    37,    38,    39,
+      40,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,
+      39,    40,    72,    -1,    74,    75,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   109,
+      -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,
+     120,   121,   122,   123,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,
-     112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      66,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,   115,
-      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    -1,
-      30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,    39,
-      -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,    78,   110,
-     111,   112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,   112,    -1,    30,    31,    32,    -1,    -1,   119,
-     120,    37,    38,    39,    40,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      66,    67,    -1,    -1,    39,    40,    72,    -1,    74,    75,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-      75,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,    -1,
-      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,   112,    -1,    30,
-      31,    32,    -1,    -1,   119,   120,    37,    38,    39,    40,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
-      30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,    39,
-      -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,    -1,   110,
-      -1,   112,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,   112,    -1,    30,    31,    32,    -1,    -1,   119,
-     120,    37,    38,    39,    40,    10,    11,    12,    13,    14,
+      26,    27,   111,    -1,    30,    31,    32,    -1,    -1,   118,
+     119,    37,    38,    39,    40,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
@@ -3884,186 +3908,182 @@
       86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
       -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-      75,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,    -1,
-      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,    10,
+      75,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
+      -1,    -1,   118,   119,   120,   121,   122,   123,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,   111,    -1,    30,    31,
+      32,    -1,    -1,   118,   119,    37,    38,    39,    40,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,   112,    -1,    30,
-      31,    32,    -1,    -1,   119,   120,    37,    38,    39,    40,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    -1,
-      30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,    39,
-      -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,
-      -1,    -1,    72,    -1,    74,    75,    76,    -1,    78,   110,
-      -1,   112,    -1,    83,    84,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     110,    -1,   112,    -1,    -1,    -1,    -1,    -1,    -1,   119,
-     120,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
-      39,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    67,    -1,
-      39,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
-      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-      -1,   110,    -1,   112,    83,    84,    -1,    -1,    -1,    -1,
-     119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   110,    -1,   112,    -1,    -1,    -1,    -1,    -1,    -1,
-     119,   120,    10,    11,    12,    13,    14,    15,    16,    17,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    66,    67,    -1,    -1,    39,    -1,
+      72,    -1,    74,    75,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    -1,    -1,    -1,    67,    -1,    -1,    -1,
+      -1,    -1,    -1,    74,    75,    -1,    -1,   109,    -1,   111,
+      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
-      -1,    39,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    67,
-      -1,    39,    40,    -1,    72,    -1,    74,    75,    76,    -1,
-      -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,
-      -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,
-      -1,    -1,   110,    -1,   112,    -1,    -1,    -1,    -1,    -1,
-      -1,   119,   120,    -1,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,   112,    30,    31,    32,   116,    -1,
-      -1,   119,   120,    -1,    39,    40,    10,    11,    12,    13,
+     111,    -1,    30,    31,    32,    -1,    -1,   118,   119,    37,
+      38,    39,    40,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    -1,    30,    31,    32,    -1,    66,    67,
+      -1,    -1,    -1,    39,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,
+      76,   109,    78,   111,    -1,    -1,    -1,    83,    84,    -1,
+     118,   119,   120,   121,   122,   123,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,   111,    30,    31,    32,    -1,
+      -1,    -1,   118,   119,    -1,    39,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    67,    -1,    -1,    39,    -1,    -1,    -1,    74,
-      75,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    67,    -1,    30,    31,    32,    -1,    -1,
-      74,    75,    -1,    -1,    39,    -1,    -1,   112,    -1,    -1,
-      -1,   116,    -1,    -1,   119,   120,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    39,    -1,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
+      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,   109,    -1,   111,    -1,    83,
+      84,    -1,    -1,    -1,   118,   119,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,   112,    74,
-      75,    -1,    -1,    -1,    -1,   119,   120,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      -1,    -1,    -1,    -1,    -1,    -1,    39,   112,    -1,    -1,
-      -1,    -1,    -1,    -1,   119,   120,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    67,    -1,    30,    31,    32,    -1,
-      -1,    74,    75,    -1,    -1,    39,    10,    11,    12,    13,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    67,    -1,    39,    -1,    -1,    -1,   112,
-      74,    75,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    39,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    67,    -1,    39,    -1,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
+      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      74,    75,    -1,    -1,    78,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,    -1,    -1,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,   111,    30,    31,
+      32,    -1,    -1,    -1,   118,   119,    -1,    39,    40,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    -1,    67,    -1,    -1,    39,    40,
+      -1,    -1,    74,    75,    -1,    -1,    -1,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    67,    30,    31,    32,
+      -1,    -1,    -1,    74,    75,    -1,    39,    -1,    -1,   111,
+      -1,    -1,    -1,   115,    -1,    -1,   118,   119,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    -1,    -1,    -1,    -1,    -1,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
+     111,    74,    75,    -1,   115,    -1,    -1,   118,   119,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,   111,    39,
+      -1,    -1,    -1,    -1,    -1,   118,   119,    -1,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    67,    30,    31,
+      32,    -1,    -1,    -1,    74,    75,    -1,    39,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    -1,    -1,    67,    -1,    39,    -1,    -1,
+      -1,   111,    74,    75,    -1,    -1,    -1,    -1,   118,   119,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   112,    -1,
-      -1,    -1,    -1,    -1,    -1,   119,   120,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    -1,    37,    38,    -1,    40,    41,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    -1,    -1,    -1,    -1,    -1,   111,
+      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,    -1,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,   111,
+      30,    31,    32,    -1,    -1,    -1,   118,   119,    -1,    39,
+      -1,    -1,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    67,    30,    31,
+      32,    -1,    -1,    -1,    74,    75,    -1,    39,    -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,    67,    -1,    69,    -1,    71,
+      -1,   111,    74,    75,    -1,    -1,    -1,    -1,   118,   119,
+      37,    38,    -1,    40,    41,    -1,    43,    -1,    -1,    46,
+      47,    48,    49,    50,    51,    52,    53,    -1,    -1,    56,
+      57,    -1,    -1,    -1,    61,    62,    -1,    64,   110,    66,
+      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,
+      -1,   118,   119,   120,   121,   122,   123,    -1,    -1,    -1,
+      -1,   128,    -1,    37,    38,   132,    40,    41,    -1,    43,
+      -1,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
+      -1,    -1,    -1,    57,    -1,    -1,    -1,    61,    62,    -1,
+      64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+     114,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      -1,    -1,    -1,    -1,   128,    -1,    -1,    -1,   132,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
+      -1,    -1,    -1,    -1,    39,    -1,    37,    38,    -1,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    -1,    -1,    56,    57,    -1,    -1,    -1,
+      61,    62,    67,    64,    69,    66,    71,    -1,    -1,    74,
+      75,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    96,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,    -1,    -1,    37,    38,   128,    40,    41,
+      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    -1,    -1,    -1,    57,    -1,    -1,    -1,    61,
+      62,    -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
+      -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    -1,    -1,    37,    38,   128,    40,    41,    -1,
       43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
-      53,    -1,    -1,    56,    57,    -1,    -1,    -1,    61,    62,
-      67,    64,    69,    66,    71,    -1,    -1,    74,    75,    72,
+      53,    -1,    -1,    -1,    57,    -1,    -1,    -1,    61,    62,
+      -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,
       -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,
       83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,   110,    -1,   112,
-      -1,    -1,   115,    -1,    -1,    -1,   119,   120,   121,   122,
-     123,   124,    -1,    -1,    -1,    -1,   129,    -1,    37,    38,
-     133,    40,    41,    -1,    43,    -1,    -1,    46,    47,    48,
-      49,    50,    51,    52,    53,    -1,    -1,    -1,    57,    -1,
-      -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,    -1,
-      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   110,    -1,   112,    -1,    -1,   115,    -1,    -1,    -1,
-     119,   120,   121,   122,   123,   124,    -1,    -1,    -1,    -1,
-     129,    -1,    37,    38,   133,    40,    41,    -1,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
-      -1,    56,    57,    -1,    -1,    -1,    61,    62,    -1,    64,
-      -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
+      -1,    94,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
+      -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,   122,
+     123,    66,    -1,    -1,    -1,   128,    -1,    72,    -1,    -1,
       -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
       -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,
-     115,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
-      -1,    -1,    37,    38,   129,    40,    41,    -1,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
-      -1,    -1,    57,    -1,    -1,    -1,    61,    62,    -1,    64,
-      -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
-      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,
-     115,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
-      -1,    -1,    37,    38,   129,    40,    41,    -1,    43,    -1,
-      -1,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
-      -1,    -1,    57,    -1,    -1,    -1,    61,    62,    -1,    64,
-      -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
-      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,
-     115,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
-      -1,    -1,    -1,    -1,   129,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
-      39,    -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    37,    38,    -1,    40,    -1,    -1,    -1,    67,    -1,
-      69,    66,    71,    -1,    -1,    74,    75,    72,    -1,    -1,
-      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      66,    86,    87,    -1,    -1,    -1,    72,    96,    -1,    94,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,   110,    -1,   112,    94,    -1,
-      37,    38,    -1,    40,   119,   120,   121,   122,   123,   124,
-      -1,    -1,    -1,    -1,   110,    -1,   112,    -1,    -1,    37,
-      38,    -1,    40,   119,   120,   121,   122,   123,   124,    66,
-      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,
-      -1,    -1,    79,    80,    81,    82,    83,    84,    66,    86,
-      87,    -1,    -1,    -1,    72,    -1,    -1,    94,    76,    -1,
-      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
-      -1,    -1,    -1,   110,    -1,   112,    94,    -1,    37,    38,
-      -1,    40,   119,   120,   121,   122,   123,   124,    -1,    -1,
-      -1,    -1,   110,    -1,   112,    -1,    -1,    37,    38,    -1,
-      40,   119,   120,   121,   122,   123,   124,    66,    -1,    -1,
-      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    66,    86,    87,    -1,
-      -1,    -1,    72,    -1,    -1,    94,    76,    -1,    -1,    79,
-      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
-      -1,   110,    -1,    -1,    94,    -1,    37,    38,    -1,    40,
-     119,   120,   121,   122,   123,   124,    -1,    -1,    -1,    -1,
-     110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,
-     120,   121,   122,   123,   124,    66,    -1,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   110,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,
-     121,   122,   123,   124,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
-      39,    -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,    67,    -1,
-      69,    -1,    71,    -1,    -1,    74,    75,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    39,    -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,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,    74,
+      75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,    84,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    -1,    -1,    -1,    -1,    39,    -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,    67,    -1,    69,    -1,    71,    -1,    -1,
-      74,    75
+      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,
+      -1,    74,    75,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,
+      -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,    67,    -1,    69,
+      -1,    71,    -1,    -1,    74,    75,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      -1,    39,    -1,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    33,    34,    35,    67,
+      -1,    69,    39,    71,    -1,    -1,    74,    75,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75
 };
 
@@ -4076,159 +4096,159 @@
       22,    23,    24,    25,    26,    27,    30,    31,    32,    33,
       36,    39,    40,    64,    67,    69,    71,    72,    74,    75,
-      76,    83,    84,   110,   112,   119,   120,   138,   141,   150,
-     199,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   232,
-     233,   234,   235,   236,   237,   238,   239,   241,   242,   243,
-     244,   245,   246,   248,   256,   257,   284,   285,   286,   294,
-     297,   303,   304,   306,   308,   309,   315,   320,   324,   325,
-     326,   327,   328,   329,   330,   331,   351,   368,   369,   370,
-     371,    72,   140,   141,   150,   216,   218,   226,   228,   238,
-     242,   244,   285,    82,   110,   313,   314,   315,   313,   313,
-      72,    74,    75,    76,   139,   140,   274,   275,   295,   296,
-      74,    75,   275,   110,   306,    11,   200,   110,   150,   320,
-     325,   326,   327,   329,   330,   331,   113,   135,   112,   219,
-     226,   228,   324,   328,   367,   368,   371,   372,   136,   107,
-     132,   278,   115,   136,   174,    74,    75,   138,   273,   136,
-     136,   136,   117,   136,    74,    75,   110,   150,   310,   319,
-     320,   321,   322,   323,   324,   328,   332,   333,   334,   335,
-     336,   342,     3,    28,    78,   240,     3,     5,    74,   112,
-     150,   218,   229,   233,   236,   245,   286,   324,   328,   371,
-     216,   218,   228,   238,   242,   244,   285,   324,   328,    33,
-     234,   234,   229,   236,   136,   234,   229,   234,   229,    75,
-     110,   115,   275,   286,   115,   275,   234,   229,   117,   136,
-     136,     0,   135,   110,   174,   313,   313,   135,   112,   226,
-     228,   369,   273,   273,   132,   228,   110,   150,   310,   320,
-     324,   112,   150,   371,   307,   231,   315,   110,   291,   110,
-     110,    51,   110,    37,    38,    40,    66,    72,    76,    79,
-      80,    81,    82,    86,    87,    94,   110,   112,   121,   122,
-     123,   124,   137,   141,   142,   143,   144,   149,   150,   151,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-     162,   163,   165,   167,   226,   277,   293,   367,   372,   228,
-     111,   111,   111,   111,   111,   111,   111,    74,    75,   112,
-     226,   273,   351,   369,   112,   119,   150,   165,   218,   219,
-     225,   228,   232,   233,   238,   241,   242,   244,   263,   264,
-     268,   269,   270,   271,   285,   351,   363,   364,   365,   366,
-     371,   372,   113,   110,   324,   328,   371,   110,   117,   133,
-     112,   115,   150,   165,   279,   279,   116,   135,   117,   133,
-     110,   117,   133,   117,   133,   117,   133,   313,   133,   320,
-     321,   322,   323,   333,   334,   335,   336,   228,   319,   332,
-      64,   312,   112,   313,   350,   351,   313,   313,   174,   135,
-     110,   313,   350,   313,   313,   228,   310,   110,   110,   227,
-     228,   226,   228,   113,   135,   226,   367,   372,   174,   135,
-     273,   278,   218,   233,   324,   328,   174,   135,   295,   228,
-     238,   133,   228,   228,   293,    40,   112,   226,   249,   250,
-     251,   252,   367,   371,   247,   259,   275,   258,   228,   295,
-     133,   133,   306,   135,   140,   272,     3,   136,   208,   209,
-     223,   225,   228,   135,   312,   110,   312,   165,   320,   228,
-     110,   135,   273,   115,    33,    34,    35,   226,   287,   288,
-     290,   135,   130,   132,   292,   135,   229,   235,   236,   273,
-     316,   317,   318,   110,   142,   110,   149,   110,   149,   152,
-     110,   149,   110,   110,   149,   149,   140,   112,   165,   170,
-     174,   226,   276,   367,   113,   135,    82,    85,    86,    87,
-     110,   112,   114,   115,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   108,   132,   169,   152,   152,   119,
-     125,   126,   121,   122,    88,    89,    90,    91,   127,   128,
-      92,    93,   120,   129,   130,    94,    95,   131,   132,   374,
-     110,   150,   346,   347,   348,   349,   350,   111,   117,   110,
-     350,   351,   110,   350,   351,   135,   110,   226,   369,   113,
-     135,   136,   112,   226,   228,   362,   363,   371,   372,   136,
-     110,   112,   150,   320,   337,   338,   339,   340,   341,   342,
-     343,   344,   345,   351,   352,   353,   354,   355,   356,   357,
-     150,   371,   228,   136,   136,   150,   226,   228,   364,   273,
-     226,   351,   364,   273,   110,   135,   135,   135,   113,   135,
-      72,    80,   112,   114,   141,   275,   279,   280,   281,   282,
-     283,   135,   135,   135,   135,   135,   135,   310,   111,   111,
-     111,   111,   111,   111,   111,   319,   332,   110,   278,   113,
-     208,   135,   310,   170,   277,   170,   277,   310,   112,   208,
-     312,   174,   135,   208,   111,   251,   252,   113,   135,   110,
-     118,   150,   253,   255,   319,   320,   332,   350,   358,   359,
-     360,   361,   116,   250,   117,   133,   117,   133,   275,   115,
-     117,   373,   132,   260,   115,   228,   265,   266,   267,   270,
-     271,   111,   117,   174,   135,   119,   165,   135,   225,   228,
-     264,   363,   371,   304,   305,   110,   150,   337,   111,   117,
-     374,   275,   287,   110,   115,   275,   277,   287,   111,   117,
-     110,   142,   111,   118,   276,   276,   276,   112,   140,   146,
-     165,   277,   276,   113,   135,   111,   117,   111,   110,   150,
-     358,   111,   117,   165,   112,   140,   112,   145,   146,   135,
-     112,   140,   145,   165,   165,   165,   152,   152,   152,   153,
-     153,   154,   154,   155,   155,   155,   155,   156,   156,   157,
-     158,   159,   160,   161,   118,   170,   165,   135,   347,   348,
-     349,   228,   346,   313,   313,   165,   277,   135,   272,   135,
-     226,   351,   364,   228,   232,   113,   113,   135,   371,   113,
-     110,   135,   320,   338,   339,   340,   343,   353,   354,   355,
-     113,   135,   228,   337,   341,   352,   110,   313,   356,   374,
-     313,   313,   374,   110,   313,   356,   313,   313,   313,   313,
-     351,   226,   362,   372,   273,   113,   117,   113,   117,   374,
-     226,   364,   374,   261,   262,   263,   264,   261,   261,   273,
-     165,   135,   112,   275,   118,   117,   373,   279,    80,   112,
-     118,   283,    29,   210,   211,   273,   261,   140,   310,   140,
-     312,   110,   350,   351,   110,   350,   351,   142,   351,   174,
-     265,   111,   111,   111,   111,   113,   174,   208,   174,   115,
-     133,   133,   112,   320,   359,   360,   361,   163,   164,   228,
-     358,   254,   255,   254,   313,   313,   275,   313,   249,   275,
-     116,   164,   259,   136,   136,   140,   223,   136,   136,   261,
-     110,   150,   371,   136,   116,   228,   288,   289,   136,   135,
-     135,   110,   136,   111,   317,   170,   171,   118,   133,   112,
-     142,   201,   202,   203,   111,   117,   111,   135,   118,   111,
-     111,   111,   165,   228,   115,   152,   167,   165,   166,   168,
-     117,   136,   135,   135,   111,   117,   165,   135,   116,   163,
-     118,   265,   111,   111,   111,   346,   265,   111,   261,   226,
-     364,   112,   119,   150,   165,   165,   228,   343,   265,   111,
-     111,   111,   111,   111,   111,   111,     7,   228,   337,   341,
-     352,   135,   135,   374,   135,   135,   111,   136,   136,   136,
-     136,   278,   136,   163,   164,   165,   311,   135,   279,   281,
-     116,   135,   212,   275,    40,    41,    43,    46,    47,    48,
-      49,    50,    51,    52,    53,    57,    61,    62,   112,   129,
-     140,   171,   172,   173,   174,   175,   176,   178,   179,   191,
-     193,   194,   199,   213,   309,    29,   136,   132,   278,   135,
-     135,   111,   136,   174,   249,   113,   111,   111,   111,   358,
-     253,   116,   260,   373,   111,   117,   113,   113,   136,   228,
-     117,   374,   291,   111,   287,   216,   218,   226,   299,   300,
-     301,   302,   293,   111,   111,   118,   164,   110,   111,   118,
-     117,   140,   165,   165,   280,   117,   136,   168,   113,   140,
-     147,   148,   165,   146,   136,   147,   163,   167,   136,   110,
-     350,   351,   136,   136,   135,   136,   136,   136,   165,   111,
-     136,   110,   350,   351,   110,   356,   110,   356,   351,   227,
-       7,   119,   136,   165,   265,   265,   264,   268,   268,   269,
-     117,   117,   111,   111,   113,    96,   124,   136,   136,   147,
-     279,   165,   117,   133,   213,   217,   228,   232,   110,   110,
-     172,   110,   110,   133,   140,   133,   140,   119,   140,   171,
-     110,   174,   166,   166,   113,   144,   118,   133,   136,   135,
-     136,   212,   111,   165,   265,   265,   313,   111,   116,   110,
-     350,   351,   116,   135,   111,   135,   136,   310,   116,   135,
-     136,   136,   111,   115,   201,   113,   164,   133,   201,   203,
-     111,   117,   136,   373,   166,   113,   136,    85,   114,   117,
-     136,   136,   113,   136,   111,   135,   111,   111,   113,   113,
-     113,   136,   111,   135,   135,   135,   165,   165,   136,   113,
-     136,   136,   136,   136,   135,   135,   164,   164,   113,   113,
-     136,   136,   275,   228,   170,   170,    47,   170,   135,   133,
-     133,   170,   133,   133,   170,    58,    59,    60,   195,   196,
-     197,   133,    63,   133,   115,   313,   176,   116,   133,   136,
-     136,   135,    96,   270,   271,   111,   300,   117,   133,   117,
-     133,   116,   298,   118,   142,   111,   111,   118,   168,   113,
-     116,   113,   112,   148,   112,   148,   148,   113,   113,   113,
-     265,   113,   265,   265,   265,   136,   136,   113,   113,   111,
-     111,   113,   117,    96,   264,    96,   136,   113,   113,   111,
-     111,   110,   111,   171,   192,   213,   133,   111,   110,   110,
-     174,   197,    58,    59,   165,   145,   172,   111,   111,   265,
-     115,   135,   135,   299,   142,   204,   110,   133,   204,   136,
-     118,   135,   135,   136,   136,   136,   136,   113,   113,   135,
-     136,   113,   172,    44,    45,   115,   182,   183,   184,   170,
-     172,   136,   111,   171,   115,   184,    96,   135,    96,   135,
-     110,   110,   133,   116,   136,   135,   273,   310,   116,   117,
-     118,   164,   111,   113,   165,   147,   147,   111,   111,   111,
-     111,   268,    42,   164,   180,   181,   311,   118,   135,   172,
-     182,   111,   133,   172,   133,   135,   111,   135,   111,   135,
-      96,   135,    96,   135,   133,   111,   299,   142,   140,   205,
-     111,   133,   118,   136,   136,   172,    96,   117,   118,   136,
-     206,   207,   213,   133,   171,   171,   206,   174,   198,   226,
-     367,   174,   198,   111,   135,   111,   135,   116,   111,   117,
-     165,   113,   113,   164,   180,   183,   185,   186,   135,   133,
-     183,   187,   188,   136,   110,   150,   310,   358,   140,   136,
-     174,   198,   174,   198,   110,   133,   140,   172,   177,   116,
-     183,   213,   171,    56,   177,   190,   116,   183,   111,   228,
-     111,   136,   136,   293,   172,   177,   133,   189,   190,   177,
-     190,   174,   174,   111,   111,   111,   189,   136,   136,   174,
-     174,   136,   136
+      76,    83,    84,   109,   111,   118,   119,   137,   140,   149,
+     198,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   231,
+     232,   233,   234,   235,   236,   237,   238,   240,   241,   242,
+     243,   244,   245,   247,   255,   256,   283,   284,   285,   293,
+     296,   302,   303,   305,   307,   308,   314,   319,   323,   324,
+     325,   326,   327,   328,   329,   330,   350,   367,   368,   369,
+     370,    72,   139,   140,   149,   215,   217,   225,   227,   237,
+     241,   243,   284,    82,   109,   312,   313,   314,   312,   312,
+      72,    74,    75,    76,   138,   139,   273,   274,   294,   295,
+      74,    75,   274,   109,   305,    11,   199,   109,   149,   319,
+     324,   325,   326,   328,   329,   330,   112,   134,   111,   218,
+     225,   227,   323,   327,   366,   367,   370,   371,   135,   107,
+     131,   277,   114,   135,   173,    74,    75,   137,   272,   135,
+     135,   135,   116,   135,    74,    75,   109,   149,   309,   318,
+     319,   320,   321,   322,   323,   327,   331,   332,   333,   334,
+     335,   341,     3,    28,    78,   239,     3,     5,    74,   111,
+     149,   217,   228,   232,   235,   244,   285,   323,   327,   370,
+     215,   217,   227,   237,   241,   243,   284,   323,   327,    33,
+     233,   233,   228,   235,   135,   233,   228,   233,   228,    75,
+     109,   114,   274,   285,   114,   274,   233,   228,   116,   135,
+     135,     0,   134,   109,   173,   312,   312,   134,   111,   225,
+     227,   368,   272,   272,   131,   227,   109,   149,   309,   319,
+     323,   111,   149,   370,   306,   230,   314,   109,   290,   109,
+     109,    51,   109,    37,    38,    40,    66,    72,    76,    79,
+      80,    81,    82,    86,    87,    94,   109,   111,   120,   121,
+     122,   123,   136,   140,   141,   142,   143,   148,   149,   150,
+     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   164,   166,   225,   276,   292,   366,   371,   227,
+     110,   110,   110,   110,   110,   110,   110,    74,    75,   111,
+     225,   272,   350,   368,   111,   118,   149,   164,   217,   218,
+     224,   227,   231,   232,   237,   240,   241,   243,   262,   263,
+     267,   268,   269,   270,   284,   350,   362,   363,   364,   365,
+     370,   371,   112,   109,   323,   327,   370,   109,   116,   132,
+     111,   114,   149,   164,   278,   278,   115,   134,   116,   132,
+     109,   116,   132,   116,   132,   116,   132,   312,   132,   319,
+     320,   321,   322,   332,   333,   334,   335,   227,   318,   331,
+      64,   311,   111,   312,   349,   350,   312,   312,   173,   134,
+     109,   312,   349,   312,   312,   227,   309,   109,   109,   226,
+     227,   225,   227,   112,   134,   225,   366,   371,   173,   134,
+     272,   277,   217,   232,   323,   327,   173,   134,   294,   227,
+     237,   132,   227,   227,   292,    40,   111,   225,   248,   249,
+     250,   251,   366,   370,   246,   258,   274,   257,   227,   294,
+     132,   132,   305,   134,   139,   271,     3,   135,   207,   208,
+     222,   224,   227,   134,   311,   109,   311,   164,   319,   227,
+     109,   134,   272,   114,    33,    34,    35,   225,   286,   287,
+     289,   134,   129,   131,   291,   134,   228,   234,   235,   272,
+     315,   316,   317,   109,   141,   109,   148,   109,   148,   151,
+     109,   148,   109,   109,   148,   148,   139,   111,   164,   169,
+     173,   225,   275,   366,   112,   134,    82,    85,    86,    87,
+     109,   111,   113,   114,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   131,   168,   151,   151,   118,   124,
+     125,   120,   121,    88,    89,    90,    91,   126,   127,    92,
+      93,   119,   128,   129,    94,    95,   130,   131,   373,   109,
+     149,   345,   346,   347,   348,   349,   110,   116,   109,   349,
+     350,   109,   349,   350,   134,   109,   225,   368,   112,   134,
+     135,   111,   225,   227,   361,   362,   370,   371,   135,   109,
+     111,   149,   319,   336,   337,   338,   339,   340,   341,   342,
+     343,   344,   350,   351,   352,   353,   354,   355,   356,   149,
+     370,   227,   135,   135,   149,   225,   227,   363,   272,   225,
+     350,   363,   272,   109,   134,   134,   134,   112,   134,    72,
+      80,   111,   113,   140,   274,   278,   279,   280,   281,   282,
+     134,   134,   134,   134,   134,   134,   309,   110,   110,   110,
+     110,   110,   110,   110,   318,   331,   109,   277,   112,   207,
+     134,   309,   169,   276,   169,   276,   309,   111,   207,   311,
+     173,   134,   207,   110,   250,   251,   112,   134,   109,   117,
+     149,   252,   254,   318,   319,   331,   349,   357,   358,   359,
+     360,   115,   249,   116,   132,   116,   132,   274,   114,   116,
+     372,   131,   259,   114,   227,   264,   265,   266,   269,   270,
+     110,   116,   173,   134,   118,   164,   134,   224,   227,   263,
+     362,   370,   303,   304,   109,   149,   336,   110,   116,   373,
+     274,   286,   109,   114,   274,   276,   286,   110,   116,   109,
+     141,   110,   117,   275,   275,   275,   111,   139,   145,   164,
+     276,   275,   112,   134,   110,   116,   110,   109,   149,   357,
+     110,   116,   164,   111,   139,   111,   144,   145,   134,   111,
+     139,   144,   164,   164,   151,   151,   151,   152,   152,   153,
+     153,   154,   154,   154,   154,   155,   155,   156,   157,   158,
+     159,   160,   117,   169,   164,   134,   346,   347,   348,   227,
+     345,   312,   312,   164,   276,   134,   271,   134,   225,   350,
+     363,   227,   231,   112,   112,   134,   370,   112,   109,   134,
+     319,   337,   338,   339,   342,   352,   353,   354,   112,   134,
+     227,   336,   340,   351,   109,   312,   355,   373,   312,   312,
+     373,   109,   312,   355,   312,   312,   312,   312,   350,   225,
+     361,   371,   272,   112,   116,   112,   116,   373,   225,   363,
+     373,   260,   261,   262,   263,   260,   260,   272,   164,   134,
+     111,   274,   117,   116,   372,   278,    80,   111,   117,   282,
+      29,   209,   210,   272,   260,   139,   309,   139,   311,   109,
+     349,   350,   109,   349,   350,   141,   350,   173,   264,   110,
+     110,   110,   110,   112,   173,   207,   173,   114,   132,   132,
+     111,   319,   358,   359,   360,   162,   163,   227,   357,   253,
+     254,   253,   312,   312,   274,   312,   248,   274,   115,   163,
+     258,   135,   135,   139,   222,   135,   135,   260,   109,   149,
+     370,   135,   115,   227,   287,   288,   135,   134,   134,   109,
+     135,   110,   316,   169,   170,   117,   132,   111,   141,   200,
+     201,   202,   110,   116,   110,   134,   117,   110,   110,   110,
+     164,   227,   114,   151,   166,   164,   165,   167,   116,   135,
+     134,   134,   110,   116,   164,   134,   115,   162,   117,   264,
+     110,   110,   110,   345,   264,   110,   260,   225,   363,   111,
+     118,   149,   164,   164,   227,   342,   264,   110,   110,   110,
+     110,   110,   110,   110,     7,   227,   336,   340,   351,   134,
+     134,   373,   134,   134,   110,   135,   135,   135,   135,   277,
+     135,   162,   163,   164,   310,   134,   278,   280,   115,   134,
+     211,   274,    40,    41,    43,    46,    47,    48,    49,    50,
+      51,    52,    53,    57,    61,    62,   111,   128,   139,   170,
+     171,   172,   173,   174,   175,   177,   178,   190,   192,   193,
+     198,   212,   308,    29,   135,   131,   277,   134,   134,   110,
+     135,   173,   248,   112,   110,   110,   110,   357,   252,   115,
+     259,   372,   110,   116,   112,   112,   135,   227,   116,   373,
+     290,   110,   286,   215,   217,   225,   298,   299,   300,   301,
+     292,   110,   110,   117,   163,   109,   110,   117,   116,   139,
+     164,   164,   279,   116,   135,   167,   112,   139,   146,   147,
+     164,   145,   135,   146,   162,   166,   135,   109,   349,   350,
+     135,   135,   134,   135,   135,   135,   164,   110,   135,   109,
+     349,   350,   109,   355,   109,   355,   350,   226,     7,   118,
+     135,   164,   264,   264,   263,   267,   267,   268,   116,   116,
+     110,   110,   112,    96,   123,   135,   135,   146,   278,   164,
+     116,   132,   212,   216,   227,   231,   109,   109,   171,   109,
+     109,   132,   139,   132,   139,   118,   139,   170,   109,   173,
+     165,   165,   112,   143,   117,   132,   135,   134,   135,   211,
+     110,   164,   264,   264,   312,   110,   115,   109,   349,   350,
+     115,   134,   110,   134,   135,   309,   115,   134,   135,   135,
+     110,   114,   200,   112,   163,   132,   200,   202,   110,   116,
+     135,   372,   165,   112,   135,    85,   113,   116,   135,   135,
+     112,   135,   110,   134,   110,   110,   112,   112,   112,   135,
+     110,   134,   134,   134,   164,   164,   135,   112,   135,   135,
+     135,   135,   134,   134,   163,   163,   112,   112,   135,   135,
+     274,   227,   169,   169,    47,   169,   134,   132,   132,   169,
+     132,   132,   169,    58,    59,    60,   194,   195,   196,   132,
+      63,   132,   114,   312,   175,   115,   132,   135,   135,   134,
+      96,   269,   270,   110,   299,   116,   132,   116,   132,   115,
+     297,   117,   141,   110,   110,   117,   167,   112,   115,   112,
+     111,   147,   111,   147,   147,   112,   112,   112,   264,   112,
+     264,   264,   264,   135,   135,   112,   112,   110,   110,   112,
+     116,    96,   263,    96,   135,   112,   112,   110,   110,   109,
+     110,   170,   191,   212,   132,   110,   109,   109,   173,   196,
+      58,    59,   164,   144,   171,   110,   110,   264,   114,   134,
+     134,   298,   141,   203,   109,   132,   203,   135,   117,   134,
+     134,   135,   135,   135,   135,   112,   112,   134,   135,   112,
+     171,    44,    45,   114,   181,   182,   183,   169,   171,   135,
+     110,   170,   114,   183,    96,   134,    96,   134,   109,   109,
+     132,   115,   135,   134,   272,   309,   115,   116,   117,   163,
+     110,   112,   164,   146,   146,   110,   110,   110,   110,   267,
+      42,   163,   179,   180,   310,   117,   134,   171,   181,   110,
+     132,   171,   132,   134,   110,   134,   110,   134,    96,   134,
+      96,   134,   132,   110,   298,   141,   139,   204,   110,   132,
+     117,   135,   135,   171,    96,   116,   117,   135,   205,   206,
+     212,   132,   170,   170,   205,   173,   197,   225,   366,   173,
+     197,   110,   134,   110,   134,   115,   110,   116,   164,   112,
+     112,   163,   179,   182,   184,   185,   134,   132,   182,   186,
+     187,   135,   109,   149,   309,   357,   139,   135,   173,   197,
+     173,   197,   109,   132,   139,   171,   176,   115,   182,   212,
+     170,    56,   176,   189,   115,   182,   110,   227,   110,   135,
+     135,   292,   171,   176,   132,   188,   189,   176,   189,   173,
+     173,   110,   110,   110,   188,   135,   135,   173,   173,   135,
+     135
 };
 
@@ -5067,5 +5087,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 292 "parser.yy"
+#line 290 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -5076,5 +5096,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 298 "parser.yy"
+#line 296 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -5085,19 +5105,19 @@
 
 /* Line 1806 of yacc.c  */
+#line 305 "parser.yy"
+    { (yyval.constant) = new ConstantNode( ConstantNode::Integer, (yyvsp[(1) - (1)].tok) ); }
+    break;
+
+  case 5:
+
+/* Line 1806 of yacc.c  */
+#line 306 "parser.yy"
+    { (yyval.constant) = new ConstantNode( ConstantNode::Float, (yyvsp[(1) - (1)].tok) ); }
+    break;
+
+  case 6:
+
+/* Line 1806 of yacc.c  */
 #line 307 "parser.yy"
-    { (yyval.constant) = new ConstantNode( ConstantNode::Integer, (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 5:
-
-/* Line 1806 of yacc.c  */
-#line 308 "parser.yy"
-    { (yyval.constant) = new ConstantNode( ConstantNode::Float, (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 6:
-
-/* Line 1806 of yacc.c  */
-#line 309 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::Character, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5106,5 +5126,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 334 "parser.yy"
+#line 332 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::String, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5113,9 +5133,16 @@
 
 /* Line 1806 of yacc.c  */
-#line 335 "parser.yy"
+#line 333 "parser.yy"
     { (yyval.constant) = (yyvsp[(1) - (2)].constant)->appendstr( (yyvsp[(2) - (2)].tok) ); }
     break;
 
   case 18:
+
+/* Line 1806 of yacc.c  */
+#line 340 "parser.yy"
+    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
+    break;
+
+  case 19:
 
 /* Line 1806 of yacc.c  */
@@ -5124,22 +5151,15 @@
     break;
 
-  case 19:
+  case 20:
 
 /* Line 1806 of yacc.c  */
 #line 344 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 20:
+    { (yyval.en) = (yyvsp[(2) - (3)].en); }
+    break;
+
+  case 21:
 
 /* Line 1806 of yacc.c  */
 #line 346 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (3)].en); }
-    break;
-
-  case 21:
-
-/* Line 1806 of yacc.c  */
-#line 348 "parser.yy"
     { (yyval.en) = new ValofExprNode( (yyvsp[(2) - (3)].sn) ); }
     break;
@@ -5148,12 +5168,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 356 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ); }
+    break;
+
+  case 24:
+
+/* Line 1806 of yacc.c  */
 #line 358 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ); }
-    break;
-
-  case 24:
-
-/* Line 1806 of yacc.c  */
-#line 360 "parser.yy"
     { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -5162,5 +5182,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 364 "parser.yy"
+#line 362 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
     break;
@@ -5169,5 +5189,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 367 "parser.yy"
+#line 365 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
     break;
@@ -5176,26 +5196,26 @@
 
 /* Line 1806 of yacc.c  */
+#line 368 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), (yyvsp[(1) - (2)].en) ); }
+    break;
+
+  case 30:
+
+/* Line 1806 of yacc.c  */
 #line 370 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), (yyvsp[(1) - (2)].en) ); }
-    break;
-
-  case 30:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), (yyvsp[(1) - (2)].en) ); }
+    break;
+
+  case 31:
 
 /* Line 1806 of yacc.c  */
 #line 372 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), (yyvsp[(1) - (2)].en) ); }
-    break;
-
-  case 31:
+    { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); }
+    break;
+
+  case 32:
 
 /* Line 1806 of yacc.c  */
 #line 374 "parser.yy"
-    { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); }
-    break;
-
-  case 32:
-
-/* Line 1806 of yacc.c  */
-#line 376 "parser.yy"
     {
 			Token fn; fn.str = new std::string( "?{}" ); // location undefined
@@ -5207,5 +5227,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 385 "parser.yy"
+#line 383 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
     break;
@@ -5214,5 +5234,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 390 "parser.yy"
+#line 388 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -5221,5 +5241,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 393 "parser.yy"
+#line 391 "parser.yy"
     { (yyval.en) = (yyvsp[(3) - (3)].en)->set_argName( (yyvsp[(1) - (3)].tok) ); }
     break;
@@ -5228,12 +5248,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 396 "parser.yy"
+    { (yyval.en) = (yyvsp[(7) - (7)].en)->set_argName( (yyvsp[(3) - (7)].en) ); }
+    break;
+
+  case 39:
+
+/* Line 1806 of yacc.c  */
 #line 398 "parser.yy"
-    { (yyval.en) = (yyvsp[(7) - (7)].en)->set_argName( (yyvsp[(3) - (7)].en) ); }
-    break;
-
-  case 39:
-
-/* Line 1806 of yacc.c  */
-#line 400 "parser.yy"
     { (yyval.en) = (yyvsp[(9) - (9)].en)->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (9)].en)->set_link( flattenCommas( (yyvsp[(5) - (9)].en) )))); }
     break;
@@ -5242,5 +5262,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 405 "parser.yy"
+#line 403 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5249,5 +5269,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 410 "parser.yy"
+#line 408 "parser.yy"
     { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5256,30 +5276,37 @@
 
 /* Line 1806 of yacc.c  */
+#line 412 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 44:
+
+/* Line 1806 of yacc.c  */
 #line 414 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 44:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
+    break;
+
+  case 45:
 
 /* Line 1806 of yacc.c  */
 #line 416 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
-    break;
-
-  case 45:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 46:
 
 /* Line 1806 of yacc.c  */
 #line 418 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 46:
-
-/* Line 1806 of yacc.c  */
-#line 420 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
     break;
 
   case 48:
+
+/* Line 1806 of yacc.c  */
+#line 426 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
+    break;
+
+  case 49:
 
 /* Line 1806 of yacc.c  */
@@ -5288,22 +5315,15 @@
     break;
 
-  case 49:
+  case 50:
 
 /* Line 1806 of yacc.c  */
 #line 430 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
-    break;
-
-  case 50:
+    { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); }
+    break;
+
+  case 51:
 
 /* Line 1806 of yacc.c  */
 #line 432 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); }
-    break;
-
-  case 51:
-
-/* Line 1806 of yacc.c  */
-#line 434 "parser.yy"
     { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5312,82 +5332,82 @@
 
 /* Line 1806 of yacc.c  */
+#line 437 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 53:
+
+/* Line 1806 of yacc.c  */
 #line 439 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 53:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 54:
 
 /* Line 1806 of yacc.c  */
 #line 441 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 54:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 55:
 
 /* Line 1806 of yacc.c  */
 #line 443 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 55:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 56:
 
 /* Line 1806 of yacc.c  */
 #line 445 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 56:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
+    break;
+
+  case 57:
 
 /* Line 1806 of yacc.c  */
 #line 447 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
-    break;
-
-  case 57:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( (yyvsp[(3) - (6)].decl) ), new VarRefNode( (yyvsp[(5) - (6)].tok) )); }
+    break;
+
+  case 58:
 
 /* Line 1806 of yacc.c  */
 #line 449 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( (yyvsp[(3) - (6)].decl) ), new VarRefNode( (yyvsp[(5) - (6)].tok) )); }
-    break;
-
-  case 58:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) )); }
+    break;
+
+  case 59:
 
 /* Line 1806 of yacc.c  */
 #line 451 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) )); }
-    break;
-
-  case 59:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
+    break;
+
+  case 60:
 
 /* Line 1806 of yacc.c  */
 #line 453 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
-    break;
-
-  case 60:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 61:
 
 /* Line 1806 of yacc.c  */
 #line 455 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ); }
-    break;
-
-  case 61:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 62:
 
 /* Line 1806 of yacc.c  */
 #line 457 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 62:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ); }
+    break;
+
+  case 63:
 
 /* Line 1806 of yacc.c  */
 #line 459 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ); }
-    break;
-
-  case 63:
-
-/* Line 1806 of yacc.c  */
-#line 461 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( (yyvsp[(2) - (2)].tok), true ) ); }
     break;
@@ -5396,5 +5416,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 465 "parser.yy"
+#line 463 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::PointTo ); }
     break;
@@ -5403,5 +5423,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 466 "parser.yy"
+#line 464 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::AddressOf ); }
     break;
@@ -5410,30 +5430,37 @@
 
 /* Line 1806 of yacc.c  */
+#line 468 "parser.yy"
+    { (yyval.en) = new OperatorNode( OperatorNode::UnPlus ); }
+    break;
+
+  case 67:
+
+/* Line 1806 of yacc.c  */
+#line 469 "parser.yy"
+    { (yyval.en) = new OperatorNode( OperatorNode::UnMinus ); }
+    break;
+
+  case 68:
+
+/* Line 1806 of yacc.c  */
 #line 470 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::UnPlus ); }
-    break;
-
-  case 67:
+    { (yyval.en) = new OperatorNode( OperatorNode::Neg ); }
+    break;
+
+  case 69:
 
 /* Line 1806 of yacc.c  */
 #line 471 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::UnMinus ); }
-    break;
-
-  case 68:
-
-/* Line 1806 of yacc.c  */
-#line 472 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::Neg ); }
-    break;
-
-  case 69:
-
-/* Line 1806 of yacc.c  */
-#line 473 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::BitNeg ); }
     break;
 
   case 71:
+
+/* Line 1806 of yacc.c  */
+#line 477 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
+    break;
+
+  case 72:
 
 /* Line 1806 of yacc.c  */
@@ -5442,29 +5469,22 @@
     break;
 
-  case 72:
-
-/* Line 1806 of yacc.c  */
-#line 481 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
-    break;
-
   case 74:
 
 /* Line 1806 of yacc.c  */
+#line 485 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 75:
+
+/* Line 1806 of yacc.c  */
 #line 487 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 75:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 76:
 
 /* Line 1806 of yacc.c  */
 #line 489 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 76:
-
-/* Line 1806 of yacc.c  */
-#line 491 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5473,12 +5493,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 495 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 79:
+
+/* Line 1806 of yacc.c  */
 #line 497 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 79:
-
-/* Line 1806 of yacc.c  */
-#line 499 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5487,12 +5507,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 503 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 82:
+
+/* Line 1806 of yacc.c  */
 #line 505 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 82:
-
-/* Line 1806 of yacc.c  */
-#line 507 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5501,26 +5521,26 @@
 
 /* Line 1806 of yacc.c  */
+#line 511 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 85:
+
+/* Line 1806 of yacc.c  */
 #line 513 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 85:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 86:
 
 /* Line 1806 of yacc.c  */
 #line 515 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 86:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 87:
 
 /* Line 1806 of yacc.c  */
 #line 517 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 87:
-
-/* Line 1806 of yacc.c  */
-#line 519 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5529,12 +5549,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 523 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 90:
+
+/* Line 1806 of yacc.c  */
 #line 525 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 90:
-
-/* Line 1806 of yacc.c  */
-#line 527 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5543,5 +5563,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 533 "parser.yy"
+#line 531 "parser.yy"
     { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5550,5 +5570,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 539 "parser.yy"
+#line 537 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5557,5 +5577,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 545 "parser.yy"
+#line 543 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5564,5 +5584,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 551 "parser.yy"
+#line 549 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::And ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5571,5 +5591,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 557 "parser.yy"
+#line 555 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5578,41 +5598,41 @@
 
 /* Line 1806 of yacc.c  */
+#line 561 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
+    break;
+
+  case 103:
+
+/* Line 1806 of yacc.c  */
 #line 563 "parser.yy"
+    { (yyval.en)=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
+    break;
+
+  case 104:
+
+/* Line 1806 of yacc.c  */
+#line 565 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
     break;
 
-  case 103:
-
-/* Line 1806 of yacc.c  */
-#line 565 "parser.yy"
-    { (yyval.en)=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
-    break;
-
-  case 104:
-
-/* Line 1806 of yacc.c  */
-#line 567 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
-    break;
-
   case 107:
 
 /* Line 1806 of yacc.c  */
+#line 576 "parser.yy"
+    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 108:
+
+/* Line 1806 of yacc.c  */
 #line 578 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 108:
+    { (yyval.en) =new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
+  case 109:
 
 /* Line 1806 of yacc.c  */
 #line 580 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 109:
-
-/* Line 1806 of yacc.c  */
-#line 582 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -5620,48 +5640,48 @@
 
 /* Line 1806 of yacc.c  */
-#line 584 "parser.yy"
-    { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 111:
-
-/* Line 1806 of yacc.c  */
-#line 589 "parser.yy"
+#line 585 "parser.yy"
     { (yyval.en) = new NullExprNode; }
     break;
 
+  case 112:
+
+/* Line 1806 of yacc.c  */
+#line 593 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
+    break;
+
   case 113:
 
 /* Line 1806 of yacc.c  */
+#line 595 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (yyvsp[(3) - (5)].en) ); }
+    break;
+
+  case 114:
+
+/* Line 1806 of yacc.c  */
 #line 597 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
-    break;
-
-  case 114:
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( (yyvsp[(4) - (6)].en) ) ); }
+    break;
+
+  case 115:
 
 /* Line 1806 of yacc.c  */
 #line 599 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (yyvsp[(3) - (5)].en) ); }
-    break;
-
-  case 115:
-
-/* Line 1806 of yacc.c  */
-#line 601 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( (yyvsp[(4) - (6)].en) ) ); }
-    break;
-
-  case 116:
-
-/* Line 1806 of yacc.c  */
-#line 603 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_link( flattenCommas( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
 
+  case 117:
+
+/* Line 1806 of yacc.c  */
+#line 605 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+    break;
+
   case 118:
 
 /* Line 1806 of yacc.c  */
 #line 609 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+    { (yyval.en) = new OperatorNode( OperatorNode::MulAssn ); }
     break;
 
@@ -5669,96 +5689,89 @@
 
 /* Line 1806 of yacc.c  */
+#line 610 "parser.yy"
+    { (yyval.en) = new OperatorNode( OperatorNode::DivAssn ); }
+    break;
+
+  case 120:
+
+/* Line 1806 of yacc.c  */
+#line 611 "parser.yy"
+    { (yyval.en) = new OperatorNode( OperatorNode::ModAssn ); }
+    break;
+
+  case 121:
+
+/* Line 1806 of yacc.c  */
+#line 612 "parser.yy"
+    { (yyval.en) = new OperatorNode( OperatorNode::PlusAssn ); }
+    break;
+
+  case 122:
+
+/* Line 1806 of yacc.c  */
 #line 613 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::MulAssn ); }
-    break;
-
-  case 120:
+    { (yyval.en) = new OperatorNode( OperatorNode::MinusAssn ); }
+    break;
+
+  case 123:
 
 /* Line 1806 of yacc.c  */
 #line 614 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::DivAssn ); }
-    break;
-
-  case 121:
+    { (yyval.en) = new OperatorNode( OperatorNode::LSAssn ); }
+    break;
+
+  case 124:
 
 /* Line 1806 of yacc.c  */
 #line 615 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::ModAssn ); }
-    break;
-
-  case 122:
+    { (yyval.en) = new OperatorNode( OperatorNode::RSAssn ); }
+    break;
+
+  case 125:
 
 /* Line 1806 of yacc.c  */
 #line 616 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::PlusAssn ); }
-    break;
-
-  case 123:
+    { (yyval.en) = new OperatorNode( OperatorNode::AndAssn ); }
+    break;
+
+  case 126:
 
 /* Line 1806 of yacc.c  */
 #line 617 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::MinusAssn ); }
-    break;
-
-  case 124:
+    { (yyval.en) = new OperatorNode( OperatorNode::ERAssn ); }
+    break;
+
+  case 127:
 
 /* Line 1806 of yacc.c  */
 #line 618 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::LSAssn ); }
-    break;
-
-  case 125:
-
-/* Line 1806 of yacc.c  */
-#line 619 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::RSAssn ); }
-    break;
-
-  case 126:
-
-/* Line 1806 of yacc.c  */
-#line 620 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::AndAssn ); }
-    break;
-
-  case 127:
-
-/* Line 1806 of yacc.c  */
-#line 621 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::ERAssn ); }
-    break;
-
-  case 128:
-
-/* Line 1806 of yacc.c  */
-#line 622 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::OrAssn ); }
     break;
 
+  case 129:
+
+/* Line 1806 of yacc.c  */
+#line 624 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+    break;
+
   case 130:
 
 /* Line 1806 of yacc.c  */
-#line 628 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 131:
-
-/* Line 1806 of yacc.c  */
-#line 633 "parser.yy"
+#line 629 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
-  case 135:
-
-/* Line 1806 of yacc.c  */
-#line 642 "parser.yy"
+  case 134:
+
+/* Line 1806 of yacc.c  */
+#line 638 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (1)].sn); }
     break;
 
-  case 141:
-
-/* Line 1806 of yacc.c  */
-#line 649 "parser.yy"
+  case 140:
+
+/* Line 1806 of yacc.c  */
+#line 645 "parser.yy"
     {
 			Token fn; fn.str = new std::string( "^?{}" ); // location undefined
@@ -5768,8 +5781,8 @@
     break;
 
-  case 142:
-
-/* Line 1806 of yacc.c  */
-#line 658 "parser.yy"
+  case 141:
+
+/* Line 1806 of yacc.c  */
+#line 654 "parser.yy"
     {
 			(yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) );
@@ -5777,26 +5790,40 @@
     break;
 
+  case 142:
+
+/* Line 1806 of yacc.c  */
+#line 661 "parser.yy"
+    { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
+    break;
+
   case 143:
 
 /* Line 1806 of yacc.c  */
-#line 665 "parser.yy"
-    { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
-    break;
-
-  case 144:
-
-/* Line 1806 of yacc.c  */
-#line 672 "parser.yy"
+#line 668 "parser.yy"
     { (yyval.sn) = new CompoundStmtNode( (yyvsp[(5) - (7)].sn) ); }
     break;
 
+  case 145:
+
+/* Line 1806 of yacc.c  */
+#line 674 "parser.yy"
+    { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
+    break;
+
   case 146:
 
 /* Line 1806 of yacc.c  */
-#line 678 "parser.yy"
-    { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
+#line 679 "parser.yy"
+    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
   case 147:
+
+/* Line 1806 of yacc.c  */
+#line 681 "parser.yy"
+    { (yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) )/*->set_extension( true )*/; }
+    break;
+
+  case 148:
 
 /* Line 1806 of yacc.c  */
@@ -5805,16 +5832,9 @@
     break;
 
-  case 148:
-
-/* Line 1806 of yacc.c  */
-#line 685 "parser.yy"
-    { (yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) )/*->set_extension( true )*/; }
-    break;
-
-  case 149:
-
-/* Line 1806 of yacc.c  */
-#line 687 "parser.yy"
-    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
+  case 151:
+
+/* Line 1806 of yacc.c  */
+#line 690 "parser.yy"
+    { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
     break;
 
@@ -5822,6 +5842,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 694 "parser.yy"
-    { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
+#line 695 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Exp, (yyvsp[(1) - (2)].en), 0 ); }
     break;
 
@@ -5829,6 +5849,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 699 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Exp, (yyvsp[(1) - (2)].en), 0 ); }
+#line 701 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
 
@@ -5836,20 +5856,20 @@
 
 /* Line 1806 of yacc.c  */
+#line 703 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (7)].en), (StatementNode *)mkList((*(yyvsp[(5) - (7)].sn), *(yyvsp[(7) - (7)].sn) )) ); }
+    break;
+
+  case 155:
+
+/* Line 1806 of yacc.c  */
 #line 705 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
-    break;
-
-  case 155:
+    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
+    break;
+
+  case 156:
 
 /* Line 1806 of yacc.c  */
 #line 707 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (7)].en), (StatementNode *)mkList((*(yyvsp[(5) - (7)].sn), *(yyvsp[(7) - (7)].sn) )) ); }
-    break;
-
-  case 156:
-
-/* Line 1806 of yacc.c  */
-#line 709 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); /* xxx */ }
     break;
 
@@ -5857,6 +5877,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 711 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); /* xxx */ }
+#line 712 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
 
@@ -5864,6 +5884,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 716 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
+#line 714 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); }
     break;
 
@@ -5871,6 +5891,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 718 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); }
+#line 721 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
 
@@ -5878,20 +5898,20 @@
 
 /* Line 1806 of yacc.c  */
-#line 725 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].en); }
-    break;
-
-  case 161:
-
-/* Line 1806 of yacc.c  */
-#line 727 "parser.yy"
+#line 723 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
 
+  case 163:
+
+/* Line 1806 of yacc.c  */
+#line 730 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(tupleContents( (yyvsp[(1) - (3)].en) ))->set_link( (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
   case 164:
 
 /* Line 1806 of yacc.c  */
 #line 734 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(tupleContents( (yyvsp[(1) - (3)].en) ))->set_link( (yyvsp[(3) - (3)].en) ) ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Case, (yyvsp[(2) - (3)].en), 0 ); }
     break;
 
@@ -5899,20 +5919,20 @@
 
 /* Line 1806 of yacc.c  */
-#line 738 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Case, (yyvsp[(2) - (3)].en), 0 ); }
-    break;
-
-  case 166:
-
-/* Line 1806 of yacc.c  */
-#line 739 "parser.yy"
+#line 735 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Default ); }
     break;
 
+  case 167:
+
+/* Line 1806 of yacc.c  */
+#line 741 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) )); }
+    break;
+
   case 168:
 
 /* Line 1806 of yacc.c  */
 #line 745 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) )); }
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
 
@@ -5920,69 +5940,69 @@
 
 /* Line 1806 of yacc.c  */
-#line 749 "parser.yy"
+#line 750 "parser.yy"
+    { (yyval.sn) = 0; }
+    break;
+
+  case 171:
+
+/* Line 1806 of yacc.c  */
+#line 756 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
 
-  case 170:
-
-/* Line 1806 of yacc.c  */
-#line 754 "parser.yy"
+  case 172:
+
+/* Line 1806 of yacc.c  */
+#line 758 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
+    break;
+
+  case 173:
+
+/* Line 1806 of yacc.c  */
+#line 763 "parser.yy"
     { (yyval.sn) = 0; }
     break;
 
-  case 172:
-
-/* Line 1806 of yacc.c  */
-#line 760 "parser.yy"
+  case 175:
+
+/* Line 1806 of yacc.c  */
+#line 769 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
 
-  case 173:
-
-/* Line 1806 of yacc.c  */
-#line 762 "parser.yy"
+  case 176:
+
+/* Line 1806 of yacc.c  */
+#line 771 "parser.yy"
+    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].sn) ))); }
+    break;
+
+  case 177:
+
+/* Line 1806 of yacc.c  */
+#line 773 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
     break;
 
-  case 174:
-
-/* Line 1806 of yacc.c  */
-#line 767 "parser.yy"
+  case 178:
+
+/* Line 1806 of yacc.c  */
+#line 775 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_link( (yyvsp[(2) - (4)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(3) - (4)].sn),*(yyvsp[(4) - (4)].sn) ))))); }
+    break;
+
+  case 179:
+
+/* Line 1806 of yacc.c  */
+#line 780 "parser.yy"
     { (yyval.sn) = 0; }
     break;
 
-  case 176:
-
-/* Line 1806 of yacc.c  */
-#line 773 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
-    break;
-
-  case 177:
-
-/* Line 1806 of yacc.c  */
-#line 775 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].sn) ))); }
-    break;
-
-  case 178:
-
-/* Line 1806 of yacc.c  */
-#line 777 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
-    break;
-
-  case 179:
-
-/* Line 1806 of yacc.c  */
-#line 779 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_link( (yyvsp[(2) - (4)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(3) - (4)].sn),*(yyvsp[(4) - (4)].sn) ))))); }
-    break;
-
-  case 180:
-
-/* Line 1806 of yacc.c  */
-#line 784 "parser.yy"
-    { (yyval.sn) = 0; }
+  case 181:
+
+/* Line 1806 of yacc.c  */
+#line 785 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Fallthru ); }
     break;
 
@@ -5990,5 +6010,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 789 "parser.yy"
+#line 786 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Fallthru ); }
     break;
@@ -5997,6 +6017,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 790 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Fallthru ); }
+#line 791 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::While, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
 
@@ -6004,13 +6024,13 @@
 
 /* Line 1806 of yacc.c  */
+#line 793 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Do, (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ); }
+    break;
+
+  case 185:
+
+/* Line 1806 of yacc.c  */
 #line 795 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::While, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
-    break;
-
-  case 185:
-
-/* Line 1806 of yacc.c  */
-#line 797 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Do, (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ); }
+    { (yyval.sn) = new StatementNode( StatementNode::For, (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].sn) ); }
     break;
 
@@ -6018,6 +6038,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 799 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::For, (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].sn) ); }
+#line 800 "parser.yy"
+    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
     break;
 
@@ -6025,6 +6045,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 804 "parser.yy"
-    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
+#line 802 "parser.yy"
+    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
     break;
 
@@ -6032,6 +6052,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 806 "parser.yy"
-    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
+#line 807 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -6040,5 +6060,5 @@
 /* Line 1806 of yacc.c  */
 #line 811 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(2) - (3)].tok) ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(3) - (4)].en) ); }
     break;
 
@@ -6046,6 +6066,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 815 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(3) - (4)].en) ); }
+#line 814 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Continue ); }
     break;
 
@@ -6054,5 +6074,5 @@
 /* Line 1806 of yacc.c  */
 #line 818 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Continue ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Continue, (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -6060,6 +6080,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 822 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Continue, (yyvsp[(2) - (3)].tok) ); }
+#line 821 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Break ); }
     break;
 
@@ -6068,5 +6088,5 @@
 /* Line 1806 of yacc.c  */
 #line 825 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Break ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Break, (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -6074,13 +6094,13 @@
 
 /* Line 1806 of yacc.c  */
+#line 827 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Return, (yyvsp[(2) - (3)].en), 0 ); }
+    break;
+
+  case 195:
+
+/* Line 1806 of yacc.c  */
 #line 829 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Break, (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 195:
-
-/* Line 1806 of yacc.c  */
-#line 831 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Return, (yyvsp[(2) - (3)].en), 0 ); }
+    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
     break;
 
@@ -6095,6 +6115,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 837 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
+#line 835 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (5)].en), 0 ); }
     break;
 
@@ -6102,6 +6122,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 839 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (5)].en), 0 ); }
+#line 842 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
     break;
 
@@ -6109,19 +6129,12 @@
 
 /* Line 1806 of yacc.c  */
+#line 844 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
+    break;
+
+  case 200:
+
+/* Line 1806 of yacc.c  */
 #line 846 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
-    break;
-
-  case 200:
-
-/* Line 1806 of yacc.c  */
-#line 848 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
-    break;
-
-  case 201:
-
-/* Line 1806 of yacc.c  */
-#line 850 "parser.yy"
     {
 			(yyvsp[(3) - (4)].pn)->set_link( (yyvsp[(4) - (4)].pn) );
@@ -6130,5 +6143,19 @@
     break;
 
+  case 202:
+
+/* Line 1806 of yacc.c  */
+#line 857 "parser.yy"
+    { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
+    break;
+
   case 203:
+
+/* Line 1806 of yacc.c  */
+#line 859 "parser.yy"
+    { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
+    break;
+
+  case 204:
 
 /* Line 1806 of yacc.c  */
@@ -6137,5 +6164,5 @@
     break;
 
-  case 204:
+  case 205:
 
 /* Line 1806 of yacc.c  */
@@ -6144,19 +6171,19 @@
     break;
 
-  case 205:
-
-/* Line 1806 of yacc.c  */
-#line 865 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
-    break;
-
   case 206:
 
 /* Line 1806 of yacc.c  */
-#line 867 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
+#line 868 "parser.yy"
+    { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
     break;
 
   case 207:
+
+/* Line 1806 of yacc.c  */
+#line 870 "parser.yy"
+    { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
+    break;
+
+  case 208:
 
 /* Line 1806 of yacc.c  */
@@ -6165,5 +6192,5 @@
     break;
 
-  case 208:
+  case 209:
 
 /* Line 1806 of yacc.c  */
@@ -6172,22 +6199,8 @@
     break;
 
-  case 209:
-
-/* Line 1806 of yacc.c  */
-#line 876 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
-    break;
-
   case 210:
 
 /* Line 1806 of yacc.c  */
-#line 878 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
-    break;
-
-  case 211:
-
-/* Line 1806 of yacc.c  */
-#line 883 "parser.yy"
+#line 879 "parser.yy"
     {
 			(yyval.pn) = new StatementNode( StatementNode::Finally, 0, (yyvsp[(2) - (2)].sn) );
@@ -6196,8 +6209,8 @@
     break;
 
-  case 213:
-
-/* Line 1806 of yacc.c  */
-#line 897 "parser.yy"
+  case 212:
+
+/* Line 1806 of yacc.c  */
+#line 893 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6206,15 +6219,15 @@
     break;
 
+  case 213:
+
+/* Line 1806 of yacc.c  */
+#line 898 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
   case 214:
 
 /* Line 1806 of yacc.c  */
-#line 902 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 215:
-
-/* Line 1806 of yacc.c  */
-#line 904 "parser.yy"
+#line 900 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6223,30 +6236,37 @@
     break;
 
+  case 216:
+
+/* Line 1806 of yacc.c  */
+#line 909 "parser.yy"
+    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
+    break;
+
   case 217:
 
 /* Line 1806 of yacc.c  */
+#line 911 "parser.yy"
+    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
+    break;
+
+  case 218:
+
+/* Line 1806 of yacc.c  */
 #line 913 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
-    break;
-
-  case 218:
+    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
+    break;
+
+  case 219:
 
 /* Line 1806 of yacc.c  */
 #line 915 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
-    break;
-
-  case 219:
+    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].constant) ); }
+    break;
+
+  case 220:
 
 /* Line 1806 of yacc.c  */
 #line 917 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
-    break;
-
-  case 220:
-
-/* Line 1806 of yacc.c  */
-#line 919 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].constant) ); }
+    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].constant), (yyvsp[(12) - (14)].label) ); }
     break;
 
@@ -6254,6 +6274,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 921 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].constant), (yyvsp[(12) - (14)].label) ); }
+#line 922 "parser.yy"
+    { (yyval.flag) = false; }
     break;
 
@@ -6261,6 +6281,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 926 "parser.yy"
-    { (yyval.flag) = false; }
+#line 924 "parser.yy"
+    { (yyval.flag) = true; }
     break;
 
@@ -6268,20 +6288,20 @@
 
 /* Line 1806 of yacc.c  */
-#line 928 "parser.yy"
-    { (yyval.flag) = true; }
-    break;
-
-  case 224:
-
-/* Line 1806 of yacc.c  */
-#line 933 "parser.yy"
+#line 929 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
+  case 226:
+
+/* Line 1806 of yacc.c  */
+#line 936 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+    break;
+
   case 227:
 
 /* Line 1806 of yacc.c  */
-#line 940 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+#line 941 "parser.yy"
+    { (yyval.en) = new AsmExprNode( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ); }
     break;
 
@@ -6289,6 +6309,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 945 "parser.yy"
-    { (yyval.en) = new AsmExprNode( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ); }
+#line 943 "parser.yy"
+    { (yyval.en) = new AsmExprNode( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ); }
     break;
 
@@ -6296,6 +6316,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 947 "parser.yy"
-    { (yyval.en) = new AsmExprNode( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ); }
+#line 948 "parser.yy"
+    { (yyval.constant) = 0; }
     break;
 
@@ -6303,13 +6323,13 @@
 
 /* Line 1806 of yacc.c  */
+#line 950 "parser.yy"
+    { (yyval.constant) = (yyvsp[(1) - (1)].constant); }
+    break;
+
+  case 231:
+
+/* Line 1806 of yacc.c  */
 #line 952 "parser.yy"
-    { (yyval.constant) = 0; }
-    break;
-
-  case 231:
-
-/* Line 1806 of yacc.c  */
-#line 954 "parser.yy"
-    { (yyval.constant) = (yyvsp[(1) - (1)].constant); }
+    { (yyval.constant) = (ConstantNode *)(yyvsp[(1) - (3)].constant)->set_link( (yyvsp[(3) - (3)].constant) ); }
     break;
 
@@ -6317,6 +6337,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 956 "parser.yy"
-    { (yyval.constant) = (ConstantNode *)(yyvsp[(1) - (3)].constant)->set_link( (yyvsp[(3) - (3)].constant) ); }
+#line 957 "parser.yy"
+    { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
     break;
 
@@ -6324,6 +6344,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 961 "parser.yy"
-    { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
+#line 959 "parser.yy"
+    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
     break;
 
@@ -6331,34 +6351,34 @@
 
 /* Line 1806 of yacc.c  */
-#line 963 "parser.yy"
-    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
-    break;
-
-  case 235:
-
-/* Line 1806 of yacc.c  */
-#line 970 "parser.yy"
+#line 966 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 237:
+
+/* Line 1806 of yacc.c  */
+#line 973 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
   case 238:
 
 /* Line 1806 of yacc.c  */
-#line 977 "parser.yy"
+#line 978 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
+  case 241:
+
+/* Line 1806 of yacc.c  */
+#line 985 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 239:
-
-/* Line 1806 of yacc.c  */
-#line 982 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 242:
-
-/* Line 1806 of yacc.c  */
-#line 989 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
+  case 246:
+
+/* Line 1806 of yacc.c  */
+#line 999 "parser.yy"
+    {}
     break;
 
@@ -6366,19 +6386,12 @@
 
 /* Line 1806 of yacc.c  */
-#line 1003 "parser.yy"
+#line 1000 "parser.yy"
     {}
     break;
 
-  case 248:
-
-/* Line 1806 of yacc.c  */
-#line 1004 "parser.yy"
-    {}
-    break;
-
-  case 256:
-
-/* Line 1806 of yacc.c  */
-#line 1033 "parser.yy"
+  case 255:
+
+/* Line 1806 of yacc.c  */
+#line 1029 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6387,8 +6400,8 @@
     break;
 
-  case 257:
-
-/* Line 1806 of yacc.c  */
-#line 1040 "parser.yy"
+  case 256:
+
+/* Line 1806 of yacc.c  */
+#line 1036 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6397,8 +6410,8 @@
     break;
 
-  case 258:
-
-/* Line 1806 of yacc.c  */
-#line 1045 "parser.yy"
+  case 257:
+
+/* Line 1806 of yacc.c  */
+#line 1041 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID );
@@ -6407,8 +6420,8 @@
     break;
 
-  case 259:
-
-/* Line 1806 of yacc.c  */
-#line 1055 "parser.yy"
+  case 258:
+
+/* Line 1806 of yacc.c  */
+#line 1051 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6417,8 +6430,8 @@
     break;
 
-  case 260:
-
-/* Line 1806 of yacc.c  */
-#line 1060 "parser.yy"
+  case 259:
+
+/* Line 1806 of yacc.c  */
+#line 1056 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6427,8 +6440,8 @@
     break;
 
-  case 261:
-
-/* Line 1806 of yacc.c  */
-#line 1065 "parser.yy"
+  case 260:
+
+/* Line 1806 of yacc.c  */
+#line 1061 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) );
@@ -6437,8 +6450,8 @@
     break;
 
-  case 262:
-
-/* Line 1806 of yacc.c  */
-#line 1073 "parser.yy"
+  case 261:
+
+/* Line 1806 of yacc.c  */
+#line 1069 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6447,8 +6460,8 @@
     break;
 
-  case 263:
-
-/* Line 1806 of yacc.c  */
-#line 1078 "parser.yy"
+  case 262:
+
+/* Line 1806 of yacc.c  */
+#line 1074 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6457,8 +6470,8 @@
     break;
 
-  case 264:
-
-/* Line 1806 of yacc.c  */
-#line 1083 "parser.yy"
+  case 263:
+
+/* Line 1806 of yacc.c  */
+#line 1079 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6467,8 +6480,8 @@
     break;
 
-  case 265:
-
-/* Line 1806 of yacc.c  */
-#line 1088 "parser.yy"
+  case 264:
+
+/* Line 1806 of yacc.c  */
+#line 1084 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6477,8 +6490,8 @@
     break;
 
-  case 266:
-
-/* Line 1806 of yacc.c  */
-#line 1093 "parser.yy"
+  case 265:
+
+/* Line 1806 of yacc.c  */
+#line 1089 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -6487,10 +6500,19 @@
     break;
 
-  case 267:
-
-/* Line 1806 of yacc.c  */
-#line 1101 "parser.yy"
+  case 266:
+
+/* Line 1806 of yacc.c  */
+#line 1097 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true );
+		}
+    break;
+
+  case 267:
+
+/* Line 1806 of yacc.c  */
+#line 1120 "parser.yy"
+    {
+			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
 		}
     break;
@@ -6508,8 +6530,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1128 "parser.yy"
-    {
-			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
-		}
+#line 1131 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
 
@@ -6518,5 +6538,5 @@
 /* Line 1806 of yacc.c  */
 #line 1135 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
+    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
     break;
 
@@ -6524,12 +6544,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1139 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
-    break;
-
-  case 272:
-
-/* Line 1806 of yacc.c  */
-#line 1144 "parser.yy"
+#line 1140 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6538,8 +6551,8 @@
     break;
 
-  case 273:
-
-/* Line 1806 of yacc.c  */
-#line 1149 "parser.yy"
+  case 272:
+
+/* Line 1806 of yacc.c  */
+#line 1145 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6548,8 +6561,8 @@
     break;
 
-  case 274:
-
-/* Line 1806 of yacc.c  */
-#line 1154 "parser.yy"
+  case 273:
+
+/* Line 1806 of yacc.c  */
+#line 1150 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD );
@@ -6558,8 +6571,8 @@
     break;
 
-  case 275:
-
-/* Line 1806 of yacc.c  */
-#line 1165 "parser.yy"
+  case 274:
+
+/* Line 1806 of yacc.c  */
+#line 1161 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6568,8 +6581,8 @@
     break;
 
-  case 276:
-
-/* Line 1806 of yacc.c  */
-#line 1170 "parser.yy"
+  case 275:
+
+/* Line 1806 of yacc.c  */
+#line 1166 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6578,8 +6591,8 @@
     break;
 
-  case 277:
-
-/* Line 1806 of yacc.c  */
-#line 1175 "parser.yy"
+  case 276:
+
+/* Line 1806 of yacc.c  */
+#line 1171 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6588,8 +6601,8 @@
     break;
 
-  case 278:
-
-/* Line 1806 of yacc.c  */
-#line 1180 "parser.yy"
+  case 277:
+
+/* Line 1806 of yacc.c  */
+#line 1176 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6598,8 +6611,8 @@
     break;
 
-  case 279:
-
-/* Line 1806 of yacc.c  */
-#line 1185 "parser.yy"
+  case 278:
+
+/* Line 1806 of yacc.c  */
+#line 1181 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6608,8 +6621,8 @@
     break;
 
-  case 280:
-
-/* Line 1806 of yacc.c  */
-#line 1194 "parser.yy"
+  case 279:
+
+/* Line 1806 of yacc.c  */
+#line 1190 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD );
@@ -6618,8 +6631,8 @@
     break;
 
-  case 281:
-
-/* Line 1806 of yacc.c  */
-#line 1199 "parser.yy"
+  case 280:
+
+/* Line 1806 of yacc.c  */
+#line 1195 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD );
@@ -6628,8 +6641,8 @@
     break;
 
-  case 286:
-
-/* Line 1806 of yacc.c  */
-#line 1216 "parser.yy"
+  case 285:
+
+/* Line 1806 of yacc.c  */
+#line 1212 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6638,8 +6651,8 @@
     break;
 
-  case 287:
-
-/* Line 1806 of yacc.c  */
-#line 1221 "parser.yy"
+  case 286:
+
+/* Line 1806 of yacc.c  */
+#line 1217 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6648,57 +6661,57 @@
     break;
 
-  case 296:
-
-/* Line 1806 of yacc.c  */
-#line 1243 "parser.yy"
+  case 295:
+
+/* Line 1806 of yacc.c  */
+#line 1239 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 299:
-
-/* Line 1806 of yacc.c  */
-#line 1255 "parser.yy"
+  case 298:
+
+/* Line 1806 of yacc.c  */
+#line 1251 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
+  case 301:
+
+/* Line 1806 of yacc.c  */
+#line 1262 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
+    break;
+
   case 302:
 
 /* Line 1806 of yacc.c  */
+#line 1264 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
+    break;
+
+  case 303:
+
+/* Line 1806 of yacc.c  */
 #line 1266 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
-    break;
-
-  case 303:
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
+    break;
+
+  case 304:
 
 /* Line 1806 of yacc.c  */
 #line 1268 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
-    break;
-
-  case 304:
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
+    break;
+
+  case 305:
 
 /* Line 1806 of yacc.c  */
 #line 1270 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
-    break;
-
-  case 305:
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
+    break;
+
+  case 306:
 
 /* Line 1806 of yacc.c  */
 #line 1272 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
-    break;
-
-  case 306:
-
-/* Line 1806 of yacc.c  */
-#line 1274 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
-    break;
-
-  case 307:
-
-/* Line 1806 of yacc.c  */
-#line 1276 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -6706,8 +6719,8 @@
     break;
 
-  case 308:
-
-/* Line 1806 of yacc.c  */
-#line 1280 "parser.yy"
+  case 307:
+
+/* Line 1806 of yacc.c  */
+#line 1276 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -6716,331 +6729,338 @@
     break;
 
+  case 309:
+
+/* Line 1806 of yacc.c  */
+#line 1285 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 310:
 
 /* Line 1806 of yacc.c  */
-#line 1289 "parser.yy"
+#line 1287 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 312:
+
+/* Line 1806 of yacc.c  */
+#line 1298 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 311:
-
-/* Line 1806 of yacc.c  */
-#line 1291 "parser.yy"
+  case 314:
+
+/* Line 1806 of yacc.c  */
+#line 1307 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
+    break;
+
+  case 315:
+
+/* Line 1806 of yacc.c  */
+#line 1309 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
+    break;
+
+  case 316:
+
+/* Line 1806 of yacc.c  */
+#line 1311 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
+    break;
+
+  case 317:
+
+/* Line 1806 of yacc.c  */
+#line 1313 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
+    break;
+
+  case 318:
+
+/* Line 1806 of yacc.c  */
+#line 1315 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
+    break;
+
+  case 319:
+
+/* Line 1806 of yacc.c  */
+#line 1317 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
+    break;
+
+  case 320:
+
+/* Line 1806 of yacc.c  */
+#line 1319 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
+    break;
+
+  case 321:
+
+/* Line 1806 of yacc.c  */
+#line 1321 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
+    break;
+
+  case 322:
+
+/* Line 1806 of yacc.c  */
+#line 1326 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
+    break;
+
+  case 323:
+
+/* Line 1806 of yacc.c  */
+#line 1328 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
+    break;
+
+  case 324:
+
+/* Line 1806 of yacc.c  */
+#line 1330 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
+    break;
+
+  case 325:
+
+/* Line 1806 of yacc.c  */
+#line 1332 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
+    break;
+
+  case 326:
+
+/* Line 1806 of yacc.c  */
+#line 1334 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
+    break;
+
+  case 327:
+
+/* Line 1806 of yacc.c  */
+#line 1336 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
+    break;
+
+  case 328:
+
+/* Line 1806 of yacc.c  */
+#line 1338 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
+    break;
+
+  case 329:
+
+/* Line 1806 of yacc.c  */
+#line 1340 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
+    break;
+
+  case 330:
+
+/* Line 1806 of yacc.c  */
+#line 1342 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
+    break;
+
+  case 331:
+
+/* Line 1806 of yacc.c  */
+#line 1344 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
+    break;
+
+  case 332:
+
+/* Line 1806 of yacc.c  */
+#line 1346 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
+    break;
+
+  case 333:
+
+/* Line 1806 of yacc.c  */
+#line 1348 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
+    break;
+
+  case 334:
+
+/* Line 1806 of yacc.c  */
+#line 1350 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
+    break;
+
+  case 336:
+
+/* Line 1806 of yacc.c  */
+#line 1357 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 337:
+
+/* Line 1806 of yacc.c  */
+#line 1359 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 338:
+
+/* Line 1806 of yacc.c  */
+#line 1361 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 313:
-
-/* Line 1806 of yacc.c  */
-#line 1302 "parser.yy"
+  case 339:
+
+/* Line 1806 of yacc.c  */
+#line 1363 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 341:
+
+/* Line 1806 of yacc.c  */
+#line 1369 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 343:
+
+/* Line 1806 of yacc.c  */
+#line 1376 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 344:
+
+/* Line 1806 of yacc.c  */
+#line 1378 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 315:
-
-/* Line 1806 of yacc.c  */
-#line 1311 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
-    break;
-
-  case 316:
-
-/* Line 1806 of yacc.c  */
-#line 1313 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
-    break;
-
-  case 317:
-
-/* Line 1806 of yacc.c  */
-#line 1315 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
-    break;
-
-  case 318:
-
-/* Line 1806 of yacc.c  */
-#line 1317 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
-    break;
-
-  case 319:
-
-/* Line 1806 of yacc.c  */
-#line 1319 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
-    break;
-
-  case 320:
-
-/* Line 1806 of yacc.c  */
-#line 1321 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
-    break;
-
-  case 321:
-
-/* Line 1806 of yacc.c  */
-#line 1323 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
-    break;
-
-  case 322:
-
-/* Line 1806 of yacc.c  */
-#line 1325 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
-    break;
-
-  case 323:
-
-/* Line 1806 of yacc.c  */
-#line 1330 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
-    break;
-
-  case 324:
-
-/* Line 1806 of yacc.c  */
-#line 1332 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
-    break;
-
-  case 325:
-
-/* Line 1806 of yacc.c  */
-#line 1334 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
-    break;
-
-  case 326:
-
-/* Line 1806 of yacc.c  */
-#line 1336 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
-    break;
-
-  case 327:
-
-/* Line 1806 of yacc.c  */
-#line 1338 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
-    break;
-
-  case 328:
-
-/* Line 1806 of yacc.c  */
-#line 1340 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
-    break;
-
-  case 329:
-
-/* Line 1806 of yacc.c  */
-#line 1342 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
-    break;
-
-  case 330:
-
-/* Line 1806 of yacc.c  */
-#line 1344 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
-    break;
-
-  case 331:
-
-/* Line 1806 of yacc.c  */
-#line 1346 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
-    break;
-
-  case 332:
-
-/* Line 1806 of yacc.c  */
-#line 1348 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
-    break;
-
-  case 333:
-
-/* Line 1806 of yacc.c  */
-#line 1350 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
-    break;
-
-  case 334:
-
-/* Line 1806 of yacc.c  */
-#line 1352 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
-    break;
-
-  case 335:
-
-/* Line 1806 of yacc.c  */
-#line 1354 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
-    break;
-
-  case 337:
-
-/* Line 1806 of yacc.c  */
-#line 1361 "parser.yy"
+  case 345:
+
+/* Line 1806 of yacc.c  */
+#line 1380 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 346:
+
+/* Line 1806 of yacc.c  */
+#line 1385 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
+    break;
+
+  case 347:
+
+/* Line 1806 of yacc.c  */
+#line 1387 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 348:
+
+/* Line 1806 of yacc.c  */
+#line 1389 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
+    break;
+
+  case 349:
+
+/* Line 1806 of yacc.c  */
+#line 1391 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 351:
+
+/* Line 1806 of yacc.c  */
+#line 1397 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 338:
-
-/* Line 1806 of yacc.c  */
-#line 1363 "parser.yy"
+  case 352:
+
+/* Line 1806 of yacc.c  */
+#line 1399 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 339:
-
-/* Line 1806 of yacc.c  */
-#line 1365 "parser.yy"
+  case 353:
+
+/* Line 1806 of yacc.c  */
+#line 1401 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 340:
-
-/* Line 1806 of yacc.c  */
-#line 1367 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
-  case 342:
-
-/* Line 1806 of yacc.c  */
-#line 1373 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 344:
-
-/* Line 1806 of yacc.c  */
-#line 1380 "parser.yy"
+  case 355:
+
+/* Line 1806 of yacc.c  */
+#line 1407 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 345:
-
-/* Line 1806 of yacc.c  */
-#line 1382 "parser.yy"
+  case 356:
+
+/* Line 1806 of yacc.c  */
+#line 1409 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 346:
-
-/* Line 1806 of yacc.c  */
-#line 1384 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 347:
-
-/* Line 1806 of yacc.c  */
-#line 1389 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
-    break;
-
-  case 348:
-
-/* Line 1806 of yacc.c  */
-#line 1391 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
-    break;
-
-  case 349:
-
-/* Line 1806 of yacc.c  */
-#line 1393 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
-    break;
-
-  case 350:
-
-/* Line 1806 of yacc.c  */
-#line 1395 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
-    break;
-
-  case 352:
-
-/* Line 1806 of yacc.c  */
-#line 1401 "parser.yy"
+  case 358:
+
+/* Line 1806 of yacc.c  */
+#line 1415 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 353:
-
-/* Line 1806 of yacc.c  */
-#line 1403 "parser.yy"
+  case 359:
+
+/* Line 1806 of yacc.c  */
+#line 1417 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 354:
-
-/* Line 1806 of yacc.c  */
-#line 1405 "parser.yy"
+  case 360:
+
+/* Line 1806 of yacc.c  */
+#line 1419 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 356:
-
-/* Line 1806 of yacc.c  */
-#line 1411 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 357:
-
-/* Line 1806 of yacc.c  */
-#line 1413 "parser.yy"
+  case 361:
+
+/* Line 1806 of yacc.c  */
+#line 1424 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
+    break;
+
+  case 362:
+
+/* Line 1806 of yacc.c  */
+#line 1426 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 363:
+
+/* Line 1806 of yacc.c  */
+#line 1428 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 359:
-
-/* Line 1806 of yacc.c  */
-#line 1419 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 360:
-
-/* Line 1806 of yacc.c  */
-#line 1421 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 361:
-
-/* Line 1806 of yacc.c  */
-#line 1423 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 362:
-
-/* Line 1806 of yacc.c  */
-#line 1428 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 363:
-
-/* Line 1806 of yacc.c  */
-#line 1430 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 364:
-
-/* Line 1806 of yacc.c  */
-#line 1432 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+  case 366:
+
+/* Line 1806 of yacc.c  */
+#line 1438 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl) ); }
     break;
 
@@ -7048,12 +7068,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1442 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl) ); }
-    break;
-
-  case 368:
-
-/* Line 1806 of yacc.c  */
-#line 1444 "parser.yy"
+#line 1440 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7062,23 +7075,30 @@
     break;
 
+  case 368:
+
+/* Line 1806 of yacc.c  */
+#line 1445 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
   case 369:
 
 /* Line 1806 of yacc.c  */
+#line 1447 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl)); }
+    break;
+
+  case 370:
+
+/* Line 1806 of yacc.c  */
 #line 1449 "parser.yy"
-    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
-    break;
-
-  case 370:
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl) ); }
+    break;
+
+  case 371:
 
 /* Line 1806 of yacc.c  */
 #line 1451 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl)); }
-    break;
-
-  case 371:
-
-/* Line 1806 of yacc.c  */
-#line 1453 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl) ); }
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
@@ -7086,6 +7106,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1455 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
+#line 1456 "parser.yy"
+    { (yyval.aggKey) = DeclarationNode::Struct; }
     break;
 
@@ -7093,6 +7113,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1460 "parser.yy"
-    { (yyval.aggKey) = DeclarationNode::Struct; }
+#line 1458 "parser.yy"
+    { (yyval.aggKey) = DeclarationNode::Union; }
     break;
 
@@ -7100,6 +7120,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1462 "parser.yy"
-    { (yyval.aggKey) = DeclarationNode::Union; }
+#line 1463 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (1)].decl); }
     break;
 
@@ -7107,41 +7127,41 @@
 
 /* Line 1806 of yacc.c  */
-#line 1467 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (1)].decl); }
-    break;
-
-  case 376:
-
-/* Line 1806 of yacc.c  */
-#line 1469 "parser.yy"
+#line 1465 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 378:
-
-/* Line 1806 of yacc.c  */
-#line 1475 "parser.yy"
+  case 377:
+
+/* Line 1806 of yacc.c  */
+#line 1471 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl)/*->set_extension( true )*/; }
     break;
 
-  case 380:
-
-/* Line 1806 of yacc.c  */
-#line 1478 "parser.yy"
+  case 379:
+
+/* Line 1806 of yacc.c  */
+#line 1474 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl)/*->set_extension( true )*/; }
     break;
 
+  case 381:
+
+/* Line 1806 of yacc.c  */
+#line 1480 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
+    break;
+
   case 382:
 
 /* Line 1806 of yacc.c  */
+#line 1482 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
+    break;
+
+  case 383:
+
+/* Line 1806 of yacc.c  */
 #line 1484 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
-    break;
-
-  case 383:
-
-/* Line 1806 of yacc.c  */
-#line 1486 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
     break;
 
@@ -7149,6 +7169,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1488 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
+#line 1489 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
@@ -7156,6 +7176,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1493 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+#line 1491 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
     break;
 
@@ -7163,6 +7183,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1495 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
+#line 1496 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
     break;
 
@@ -7170,6 +7190,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1500 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
+#line 1498 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
     break;
 
@@ -7177,6 +7197,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1502 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
+#line 1501 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -7184,13 +7204,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1505 "parser.yy"
+#line 1504 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
-  case 390:
-
-/* Line 1806 of yacc.c  */
-#line 1508 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
+  case 391:
+
+/* Line 1806 of yacc.c  */
+#line 1510 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -7198,6 +7218,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1514 "parser.yy"
-    { (yyval.en) = 0; }
+#line 1512 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
 
@@ -7205,26 +7225,19 @@
 
 /* Line 1806 of yacc.c  */
-#line 1516 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].en); }
-    break;
-
-  case 394:
-
-/* Line 1806 of yacc.c  */
-#line 1521 "parser.yy"
+#line 1517 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
+  case 395:
+
+/* Line 1806 of yacc.c  */
+#line 1526 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
+    break;
+
   case 396:
 
 /* Line 1806 of yacc.c  */
-#line 1530 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
-    break;
-
-  case 397:
-
-/* Line 1806 of yacc.c  */
-#line 1532 "parser.yy"
+#line 1528 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7233,9 +7246,16 @@
     break;
 
+  case 397:
+
+/* Line 1806 of yacc.c  */
+#line 1533 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
   case 398:
 
 /* Line 1806 of yacc.c  */
-#line 1537 "parser.yy"
-    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+#line 1535 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
     break;
 
@@ -7243,6 +7263,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1539 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
+#line 1540 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -7250,6 +7270,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1544 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
+#line 1542 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
     break;
 
@@ -7257,6 +7277,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1546 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
+#line 1547 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -7264,6 +7284,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1551 "parser.yy"
-    { (yyval.en) = 0; }
+#line 1549 "parser.yy"
+    { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
@@ -7271,90 +7291,90 @@
 
 /* Line 1806 of yacc.c  */
-#line 1553 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (2)].en); }
-    break;
-
-  case 404:
-
-/* Line 1806 of yacc.c  */
-#line 1560 "parser.yy"
+#line 1556 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 407:
+
+/* Line 1806 of yacc.c  */
+#line 1564 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
   case 408:
 
 /* Line 1806 of yacc.c  */
+#line 1566 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 409:
+
+/* Line 1806 of yacc.c  */
 #line 1568 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 411:
+
+/* Line 1806 of yacc.c  */
+#line 1576 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 409:
-
-/* Line 1806 of yacc.c  */
-#line 1570 "parser.yy"
+  case 412:
+
+/* Line 1806 of yacc.c  */
+#line 1578 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 413:
+
+/* Line 1806 of yacc.c  */
+#line 1580 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
+    break;
+
+  case 415:
+
+/* Line 1806 of yacc.c  */
+#line 1586 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 416:
+
+/* Line 1806 of yacc.c  */
+#line 1591 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
+  case 419:
+
+/* Line 1806 of yacc.c  */
+#line 1598 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
 
-  case 410:
-
-/* Line 1806 of yacc.c  */
-#line 1572 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 412:
-
-/* Line 1806 of yacc.c  */
-#line 1580 "parser.yy"
+  case 422:
+
+/* Line 1806 of yacc.c  */
+#line 1605 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 413:
-
-/* Line 1806 of yacc.c  */
-#line 1582 "parser.yy"
+  case 423:
+
+/* Line 1806 of yacc.c  */
+#line 1607 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 414:
-
-/* Line 1806 of yacc.c  */
-#line 1584 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
-    break;
-
-  case 416:
-
-/* Line 1806 of yacc.c  */
-#line 1590 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 417:
-
-/* Line 1806 of yacc.c  */
-#line 1595 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 420:
-
-/* Line 1806 of yacc.c  */
-#line 1602 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 423:
-
-/* Line 1806 of yacc.c  */
-#line 1609 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 424:
-
-/* Line 1806 of yacc.c  */
-#line 1611 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+  case 425:
+
+/* Line 1806 of yacc.c  */
+#line 1616 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -7362,5 +7382,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1620 "parser.yy"
+#line 1619 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -7369,26 +7389,19 @@
 
 /* Line 1806 of yacc.c  */
-#line 1623 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 428:
-
-/* Line 1806 of yacc.c  */
-#line 1625 "parser.yy"
+#line 1621 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); }
     break;
 
-  case 433:
-
-/* Line 1806 of yacc.c  */
-#line 1635 "parser.yy"
+  case 432:
+
+/* Line 1806 of yacc.c  */
+#line 1631 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 435:
-
-/* Line 1806 of yacc.c  */
-#line 1641 "parser.yy"
+  case 434:
+
+/* Line 1806 of yacc.c  */
+#line 1637 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7397,8 +7410,8 @@
     break;
 
-  case 436:
-
-/* Line 1806 of yacc.c  */
-#line 1646 "parser.yy"
+  case 435:
+
+/* Line 1806 of yacc.c  */
+#line 1642 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7407,29 +7420,36 @@
     break;
 
+  case 437:
+
+/* Line 1806 of yacc.c  */
+#line 1651 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
   case 438:
 
 /* Line 1806 of yacc.c  */
-#line 1655 "parser.yy"
+#line 1660 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
+    break;
+
+  case 439:
+
+/* Line 1806 of yacc.c  */
+#line 1662 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
+    break;
+
+  case 451:
+
+/* Line 1806 of yacc.c  */
+#line 1687 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 439:
-
-/* Line 1806 of yacc.c  */
-#line 1664 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 440:
-
-/* Line 1806 of yacc.c  */
-#line 1666 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
-    break;
-
-  case 452:
-
-/* Line 1806 of yacc.c  */
-#line 1691 "parser.yy"
+  case 455:
+
+/* Line 1806 of yacc.c  */
+#line 1695 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7438,6 +7458,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1699 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+#line 1700 "parser.yy"
+    { (yyval.in) = 0; }
     break;
 
@@ -7445,41 +7465,41 @@
 
 /* Line 1806 of yacc.c  */
+#line 1702 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in); }
+    break;
+
+  case 458:
+
+/* Line 1806 of yacc.c  */
 #line 1704 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
+    break;
+
+  case 459:
+
+/* Line 1806 of yacc.c  */
+#line 1708 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
+    break;
+
+  case 460:
+
+/* Line 1806 of yacc.c  */
+#line 1709 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
+    break;
+
+  case 461:
+
+/* Line 1806 of yacc.c  */
+#line 1714 "parser.yy"
     { (yyval.in) = 0; }
     break;
 
-  case 458:
-
-/* Line 1806 of yacc.c  */
-#line 1706 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in); }
-    break;
-
-  case 459:
-
-/* Line 1806 of yacc.c  */
-#line 1708 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
-    break;
-
-  case 460:
-
-/* Line 1806 of yacc.c  */
-#line 1712 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
-    break;
-
-  case 461:
-
-/* Line 1806 of yacc.c  */
-#line 1713 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
-    break;
-
-  case 462:
-
-/* Line 1806 of yacc.c  */
-#line 1718 "parser.yy"
-    { (yyval.in) = 0; }
+  case 463:
+
+/* Line 1806 of yacc.c  */
+#line 1716 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
     break;
 
@@ -7487,6 +7507,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1720 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
+#line 1717 "parser.yy"
+    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_link( (yyvsp[(3) - (3)].in) ) ); }
     break;
 
@@ -7494,27 +7514,27 @@
 
 /* Line 1806 of yacc.c  */
-#line 1721 "parser.yy"
-    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_link( (yyvsp[(3) - (3)].in) ) ); }
-    break;
-
-  case 466:
-
-/* Line 1806 of yacc.c  */
-#line 1723 "parser.yy"
+#line 1719 "parser.yy"
     { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_link( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
     break;
 
-  case 468:
-
-/* Line 1806 of yacc.c  */
-#line 1739 "parser.yy"
+  case 467:
+
+/* Line 1806 of yacc.c  */
+#line 1735 "parser.yy"
     { (yyval.en) = new VarRefNode( (yyvsp[(1) - (2)].tok) ); }
     break;
 
+  case 469:
+
+/* Line 1806 of yacc.c  */
+#line 1741 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_link( (yyvsp[(2) - (2)].en) )); }
+    break;
+
   case 470:
 
 /* Line 1806 of yacc.c  */
-#line 1745 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_link( (yyvsp[(2) - (2)].en) )); }
+#line 1749 "parser.yy"
+    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -7522,6 +7542,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1753 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
+#line 1751 "parser.yy"
+    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(2) - (2)].tok) ) ); }
     break;
 
@@ -7529,6 +7549,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1755 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(2) - (2)].tok) ) ); }
+#line 1754 "parser.yy"
+    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
     break;
 
@@ -7536,76 +7556,76 @@
 
 /* Line 1806 of yacc.c  */
+#line 1756 "parser.yy"
+    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
+    break;
+
+  case 474:
+
+/* Line 1806 of yacc.c  */
 #line 1758 "parser.yy"
-    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
-    break;
-
-  case 474:
+    { (yyval.en) = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ), true ); }
+    break;
+
+  case 475:
 
 /* Line 1806 of yacc.c  */
 #line 1760 "parser.yy"
-    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
-    break;
-
-  case 475:
-
-/* Line 1806 of yacc.c  */
-#line 1762 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ), true ); }
-    break;
-
-  case 476:
-
-/* Line 1806 of yacc.c  */
-#line 1764 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(4) - (6)].en) ); }
     break;
 
+  case 477:
+
+/* Line 1806 of yacc.c  */
+#line 1784 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
   case 478:
 
 /* Line 1806 of yacc.c  */
+#line 1786 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 479:
+
+/* Line 1806 of yacc.c  */
 #line 1788 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 481:
+
+/* Line 1806 of yacc.c  */
+#line 1794 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 479:
-
-/* Line 1806 of yacc.c  */
-#line 1790 "parser.yy"
+  case 482:
+
+/* Line 1806 of yacc.c  */
+#line 1796 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 480:
-
-/* Line 1806 of yacc.c  */
-#line 1792 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 482:
-
-/* Line 1806 of yacc.c  */
-#line 1798 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
   case 483:
 
 /* Line 1806 of yacc.c  */
-#line 1800 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 484:
-
-/* Line 1806 of yacc.c  */
-#line 1805 "parser.yy"
+#line 1801 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
     break;
 
+  case 485:
+
+/* Line 1806 of yacc.c  */
+#line 1807 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
+    break;
+
   case 486:
 
 /* Line 1806 of yacc.c  */
-#line 1811 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
+#line 1812 "parser.yy"
+    { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
     break;
 
@@ -7613,27 +7633,27 @@
 
 /* Line 1806 of yacc.c  */
-#line 1816 "parser.yy"
-    { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
-    break;
-
-  case 488:
-
-/* Line 1806 of yacc.c  */
-#line 1818 "parser.yy"
+#line 1814 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
     break;
 
+  case 489:
+
+/* Line 1806 of yacc.c  */
+#line 1820 "parser.yy"
+    { (yyval.tclass) = DeclarationNode::Type; }
+    break;
+
   case 490:
 
 /* Line 1806 of yacc.c  */
+#line 1822 "parser.yy"
+    { (yyval.tclass) = DeclarationNode::Ftype; }
+    break;
+
+  case 491:
+
+/* Line 1806 of yacc.c  */
 #line 1824 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Type; }
-    break;
-
-  case 491:
-
-/* Line 1806 of yacc.c  */
-#line 1826 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Ftype; }
+    { (yyval.tclass) = DeclarationNode::Dtype; }
     break;
 
@@ -7641,6 +7661,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1828 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Dtype; }
+#line 1829 "parser.yy"
+    { (yyval.decl) = 0; }
     break;
 
@@ -7648,6 +7668,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1833 "parser.yy"
-    { (yyval.decl) = 0; }
+#line 1831 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl) == 0 ? (yyvsp[(2) - (2)].decl) : (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -7655,12 +7675,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1835 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl) == 0 ? (yyvsp[(2) - (2)].decl) : (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 495:
-
-/* Line 1806 of yacc.c  */
-#line 1840 "parser.yy"
+#line 1836 "parser.yy"
     {
 			typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) );
@@ -7669,9 +7682,16 @@
     break;
 
+  case 495:
+
+/* Line 1806 of yacc.c  */
+#line 1841 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
+    break;
+
   case 496:
 
 /* Line 1806 of yacc.c  */
-#line 1845 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
+#line 1843 "parser.yy"
+    { (yyval.decl) = 0; }
     break;
 
@@ -7679,20 +7699,20 @@
 
 /* Line 1806 of yacc.c  */
-#line 1847 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 498:
-
-/* Line 1806 of yacc.c  */
-#line 1852 "parser.yy"
+#line 1848 "parser.yy"
     { (yyval.en) = new TypeValueNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
+  case 499:
+
+/* Line 1806 of yacc.c  */
+#line 1851 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( new TypeValueNode( (yyvsp[(3) - (3)].decl) ))); }
+    break;
+
   case 500:
 
 /* Line 1806 of yacc.c  */
-#line 1855 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( new TypeValueNode( (yyvsp[(3) - (3)].decl) ))); }
+#line 1853 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
     break;
 
@@ -7700,6 +7720,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1857 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
+#line 1858 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
@@ -7707,13 +7727,13 @@
 
 /* Line 1806 of yacc.c  */
+#line 1860 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 503:
+
+/* Line 1806 of yacc.c  */
 #line 1862 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
-    break;
-
-  case 503:
-
-/* Line 1806 of yacc.c  */
-#line 1864 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
@@ -7721,6 +7741,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1866 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
+#line 1867 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -7728,6 +7748,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1871 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
+#line 1869 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
     break;
 
@@ -7735,12 +7755,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1873 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 507:
-
-/* Line 1806 of yacc.c  */
-#line 1878 "parser.yy"
+#line 1874 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD );
@@ -7749,8 +7762,8 @@
     break;
 
-  case 508:
-
-/* Line 1806 of yacc.c  */
-#line 1883 "parser.yy"
+  case 507:
+
+/* Line 1806 of yacc.c  */
+#line 1879 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG );
@@ -7759,8 +7772,8 @@
     break;
 
-  case 509:
-
-/* Line 1806 of yacc.c  */
-#line 1891 "parser.yy"
+  case 508:
+
+/* Line 1806 of yacc.c  */
+#line 1887 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID );
@@ -7769,8 +7782,8 @@
     break;
 
-  case 510:
-
-/* Line 1806 of yacc.c  */
-#line 1896 "parser.yy"
+  case 509:
+
+/* Line 1806 of yacc.c  */
+#line 1892 "parser.yy"
     {
 			typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) );
@@ -7779,8 +7792,8 @@
     break;
 
-  case 511:
-
-/* Line 1806 of yacc.c  */
-#line 1901 "parser.yy"
+  case 510:
+
+/* Line 1806 of yacc.c  */
+#line 1897 "parser.yy"
     {
 			typedefTable.leaveTrait();
@@ -7790,15 +7803,15 @@
     break;
 
-  case 513:
-
-/* Line 1806 of yacc.c  */
-#line 1911 "parser.yy"
+  case 512:
+
+/* Line 1806 of yacc.c  */
+#line 1907 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 516:
-
-/* Line 1806 of yacc.c  */
-#line 1921 "parser.yy"
+  case 515:
+
+/* Line 1806 of yacc.c  */
+#line 1917 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7807,8 +7820,8 @@
     break;
 
-  case 517:
-
-/* Line 1806 of yacc.c  */
-#line 1926 "parser.yy"
+  case 516:
+
+/* Line 1806 of yacc.c  */
+#line 1922 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7817,8 +7830,8 @@
     break;
 
-  case 518:
-
-/* Line 1806 of yacc.c  */
-#line 1931 "parser.yy"
+  case 517:
+
+/* Line 1806 of yacc.c  */
+#line 1927 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -7827,8 +7840,8 @@
     break;
 
-  case 519:
-
-/* Line 1806 of yacc.c  */
-#line 1939 "parser.yy"
+  case 518:
+
+/* Line 1806 of yacc.c  */
+#line 1935 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7837,8 +7850,8 @@
     break;
 
-  case 520:
-
-/* Line 1806 of yacc.c  */
-#line 1944 "parser.yy"
+  case 519:
+
+/* Line 1806 of yacc.c  */
+#line 1940 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7847,15 +7860,15 @@
     break;
 
+  case 520:
+
+/* Line 1806 of yacc.c  */
+#line 1950 "parser.yy"
+    {}
+    break;
+
   case 521:
 
 /* Line 1806 of yacc.c  */
-#line 1954 "parser.yy"
-    {}
-    break;
-
-  case 522:
-
-/* Line 1806 of yacc.c  */
-#line 1956 "parser.yy"
+#line 1952 "parser.yy"
     {
 			if ( theTree ) {
@@ -7867,29 +7880,29 @@
     break;
 
+  case 523:
+
+/* Line 1806 of yacc.c  */
+#line 1964 "parser.yy"
+    { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
+    break;
+
   case 524:
 
 /* Line 1806 of yacc.c  */
-#line 1968 "parser.yy"
-    { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
-    break;
-
-  case 525:
-
-/* Line 1806 of yacc.c  */
-#line 1973 "parser.yy"
+#line 1969 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 528:
+
+/* Line 1806 of yacc.c  */
+#line 1977 "parser.yy"
+    {}
+    break;
+
   case 529:
 
 /* Line 1806 of yacc.c  */
-#line 1981 "parser.yy"
-    {}
-    break;
-
-  case 530:
-
-/* Line 1806 of yacc.c  */
-#line 1983 "parser.yy"
+#line 1979 "parser.yy"
     {
 			linkageStack.push( linkage );
@@ -7898,8 +7911,8 @@
     break;
 
-  case 531:
-
-/* Line 1806 of yacc.c  */
-#line 1988 "parser.yy"
+  case 530:
+
+/* Line 1806 of yacc.c  */
+#line 1984 "parser.yy"
     {
 			linkage = linkageStack.top();
@@ -7909,15 +7922,15 @@
     break;
 
-  case 532:
-
-/* Line 1806 of yacc.c  */
-#line 1994 "parser.yy"
+  case 531:
+
+/* Line 1806 of yacc.c  */
+#line 1990 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)/*->set_extension( true )*/; }
     break;
 
-  case 534:
-
-/* Line 1806 of yacc.c  */
-#line 2004 "parser.yy"
+  case 533:
+
+/* Line 1806 of yacc.c  */
+#line 2000 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7927,8 +7940,8 @@
     break;
 
-  case 535:
-
-/* Line 1806 of yacc.c  */
-#line 2010 "parser.yy"
+  case 534:
+
+/* Line 1806 of yacc.c  */
+#line 2006 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7938,8 +7951,8 @@
     break;
 
-  case 536:
-
-/* Line 1806 of yacc.c  */
-#line 2019 "parser.yy"
+  case 535:
+
+/* Line 1806 of yacc.c  */
+#line 2015 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7949,8 +7962,8 @@
     break;
 
-  case 537:
-
-/* Line 1806 of yacc.c  */
-#line 2025 "parser.yy"
+  case 536:
+
+/* Line 1806 of yacc.c  */
+#line 2021 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7960,8 +7973,8 @@
     break;
 
-  case 538:
-
-/* Line 1806 of yacc.c  */
-#line 2031 "parser.yy"
+  case 537:
+
+/* Line 1806 of yacc.c  */
+#line 2027 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7971,8 +7984,8 @@
     break;
 
-  case 539:
-
-/* Line 1806 of yacc.c  */
-#line 2037 "parser.yy"
+  case 538:
+
+/* Line 1806 of yacc.c  */
+#line 2033 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7982,8 +7995,8 @@
     break;
 
-  case 540:
-
-/* Line 1806 of yacc.c  */
-#line 2043 "parser.yy"
+  case 539:
+
+/* Line 1806 of yacc.c  */
+#line 2039 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7993,8 +8006,8 @@
     break;
 
-  case 541:
-
-/* Line 1806 of yacc.c  */
-#line 2051 "parser.yy"
+  case 540:
+
+/* Line 1806 of yacc.c  */
+#line 2047 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8004,8 +8017,8 @@
     break;
 
-  case 542:
-
-/* Line 1806 of yacc.c  */
-#line 2057 "parser.yy"
+  case 541:
+
+/* Line 1806 of yacc.c  */
+#line 2053 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8015,8 +8028,8 @@
     break;
 
-  case 543:
-
-/* Line 1806 of yacc.c  */
-#line 2065 "parser.yy"
+  case 542:
+
+/* Line 1806 of yacc.c  */
+#line 2061 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8026,8 +8039,8 @@
     break;
 
-  case 544:
-
-/* Line 1806 of yacc.c  */
-#line 2071 "parser.yy"
+  case 543:
+
+/* Line 1806 of yacc.c  */
+#line 2067 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8037,36 +8050,43 @@
     break;
 
-  case 548:
-
-/* Line 1806 of yacc.c  */
-#line 2086 "parser.yy"
+  case 547:
+
+/* Line 1806 of yacc.c  */
+#line 2082 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
 
-  case 551:
-
-/* Line 1806 of yacc.c  */
-#line 2096 "parser.yy"
+  case 550:
+
+/* Line 1806 of yacc.c  */
+#line 2092 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 553:
+
+/* Line 1806 of yacc.c  */
+#line 2099 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
   case 554:
 
 /* Line 1806 of yacc.c  */
-#line 2103 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 555:
-
-/* Line 1806 of yacc.c  */
-#line 2109 "parser.yy"
+#line 2105 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 560:
+
+/* Line 1806 of yacc.c  */
+#line 2120 "parser.yy"
+    {}
+    break;
+
   case 561:
 
 /* Line 1806 of yacc.c  */
-#line 2124 "parser.yy"
+#line 2121 "parser.yy"
     {}
     break;
@@ -8075,5 +8095,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2125 "parser.yy"
+#line 2122 "parser.yy"
     {}
     break;
@@ -8082,5 +8102,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2126 "parser.yy"
+#line 2123 "parser.yy"
     {}
     break;
@@ -8089,19 +8109,19 @@
 
 /* Line 1806 of yacc.c  */
-#line 2127 "parser.yy"
-    {}
-    break;
-
-  case 565:
-
-/* Line 1806 of yacc.c  */
-#line 2162 "parser.yy"
+#line 2158 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
+  case 566:
+
+/* Line 1806 of yacc.c  */
+#line 2161 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 567:
 
 /* Line 1806 of yacc.c  */
-#line 2165 "parser.yy"
+#line 2163 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8110,12 +8130,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2167 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 569:
-
-/* Line 1806 of yacc.c  */
-#line 2172 "parser.yy"
+#line 2168 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8124,428 +8137,428 @@
     break;
 
+  case 569:
+
+/* Line 1806 of yacc.c  */
+#line 2173 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
   case 570:
 
 /* Line 1806 of yacc.c  */
-#line 2177 "parser.yy"
+#line 2178 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 571:
+
+/* Line 1806 of yacc.c  */
+#line 2180 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 572:
+
+/* Line 1806 of yacc.c  */
+#line 2182 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 571:
-
-/* Line 1806 of yacc.c  */
-#line 2182 "parser.yy"
+  case 573:
+
+/* Line 1806 of yacc.c  */
+#line 2187 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 574:
+
+/* Line 1806 of yacc.c  */
+#line 2189 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 575:
+
+/* Line 1806 of yacc.c  */
+#line 2191 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 576:
+
+/* Line 1806 of yacc.c  */
+#line 2193 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 577:
+
+/* Line 1806 of yacc.c  */
+#line 2198 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 578:
+
+/* Line 1806 of yacc.c  */
+#line 2200 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 579:
+
+/* Line 1806 of yacc.c  */
+#line 2210 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 581:
+
+/* Line 1806 of yacc.c  */
+#line 2213 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 582:
+
+/* Line 1806 of yacc.c  */
+#line 2218 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 583:
+
+/* Line 1806 of yacc.c  */
+#line 2220 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 584:
+
+/* Line 1806 of yacc.c  */
+#line 2222 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 585:
+
+/* Line 1806 of yacc.c  */
+#line 2227 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 572:
-
-/* Line 1806 of yacc.c  */
-#line 2184 "parser.yy"
+  case 586:
+
+/* Line 1806 of yacc.c  */
+#line 2229 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 573:
-
-/* Line 1806 of yacc.c  */
-#line 2186 "parser.yy"
+  case 587:
+
+/* Line 1806 of yacc.c  */
+#line 2231 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 574:
-
-/* Line 1806 of yacc.c  */
-#line 2191 "parser.yy"
+  case 588:
+
+/* Line 1806 of yacc.c  */
+#line 2236 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 589:
+
+/* Line 1806 of yacc.c  */
+#line 2238 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 590:
+
+/* Line 1806 of yacc.c  */
+#line 2240 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 594:
+
+/* Line 1806 of yacc.c  */
+#line 2255 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
+    break;
+
+  case 595:
+
+/* Line 1806 of yacc.c  */
+#line 2257 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
+    break;
+
+  case 596:
+
+/* Line 1806 of yacc.c  */
+#line 2259 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 597:
+
+/* Line 1806 of yacc.c  */
+#line 2264 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 598:
+
+/* Line 1806 of yacc.c  */
+#line 2266 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 599:
+
+/* Line 1806 of yacc.c  */
+#line 2268 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 600:
+
+/* Line 1806 of yacc.c  */
+#line 2273 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 601:
+
+/* Line 1806 of yacc.c  */
+#line 2275 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 602:
+
+/* Line 1806 of yacc.c  */
+#line 2277 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 603:
+
+/* Line 1806 of yacc.c  */
+#line 2292 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 605:
+
+/* Line 1806 of yacc.c  */
+#line 2295 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 606:
+
+/* Line 1806 of yacc.c  */
+#line 2297 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 608:
+
+/* Line 1806 of yacc.c  */
+#line 2303 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 609:
+
+/* Line 1806 of yacc.c  */
+#line 2308 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 610:
+
+/* Line 1806 of yacc.c  */
+#line 2310 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 611:
+
+/* Line 1806 of yacc.c  */
+#line 2312 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 612:
+
+/* Line 1806 of yacc.c  */
+#line 2317 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 575:
-
-/* Line 1806 of yacc.c  */
-#line 2193 "parser.yy"
+  case 613:
+
+/* Line 1806 of yacc.c  */
+#line 2319 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 576:
-
-/* Line 1806 of yacc.c  */
-#line 2195 "parser.yy"
+  case 614:
+
+/* Line 1806 of yacc.c  */
+#line 2321 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 577:
-
-/* Line 1806 of yacc.c  */
-#line 2197 "parser.yy"
+  case 615:
+
+/* Line 1806 of yacc.c  */
+#line 2323 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 578:
-
-/* Line 1806 of yacc.c  */
-#line 2202 "parser.yy"
+  case 616:
+
+/* Line 1806 of yacc.c  */
+#line 2328 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 617:
+
+/* Line 1806 of yacc.c  */
+#line 2330 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 579:
-
-/* Line 1806 of yacc.c  */
-#line 2204 "parser.yy"
+  case 618:
+
+/* Line 1806 of yacc.c  */
+#line 2332 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 580:
-
-/* Line 1806 of yacc.c  */
-#line 2214 "parser.yy"
+  case 619:
+
+/* Line 1806 of yacc.c  */
+#line 2342 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 582:
-
-/* Line 1806 of yacc.c  */
-#line 2217 "parser.yy"
+  case 621:
+
+/* Line 1806 of yacc.c  */
+#line 2345 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 583:
-
-/* Line 1806 of yacc.c  */
-#line 2222 "parser.yy"
+  case 622:
+
+/* Line 1806 of yacc.c  */
+#line 2347 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 623:
+
+/* Line 1806 of yacc.c  */
+#line 2352 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 624:
+
+/* Line 1806 of yacc.c  */
+#line 2354 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 625:
+
+/* Line 1806 of yacc.c  */
+#line 2356 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 626:
+
+/* Line 1806 of yacc.c  */
+#line 2361 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 627:
+
+/* Line 1806 of yacc.c  */
+#line 2363 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 628:
+
+/* Line 1806 of yacc.c  */
+#line 2365 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 629:
+
+/* Line 1806 of yacc.c  */
+#line 2367 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 630:
+
+/* Line 1806 of yacc.c  */
+#line 2372 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 584:
-
-/* Line 1806 of yacc.c  */
-#line 2224 "parser.yy"
+  case 631:
+
+/* Line 1806 of yacc.c  */
+#line 2374 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 585:
-
-/* Line 1806 of yacc.c  */
-#line 2226 "parser.yy"
+  case 632:
+
+/* Line 1806 of yacc.c  */
+#line 2376 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 586:
-
-/* Line 1806 of yacc.c  */
-#line 2231 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 587:
-
-/* Line 1806 of yacc.c  */
-#line 2233 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 588:
-
-/* Line 1806 of yacc.c  */
-#line 2235 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 589:
-
-/* Line 1806 of yacc.c  */
-#line 2240 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 590:
-
-/* Line 1806 of yacc.c  */
-#line 2242 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 591:
-
-/* Line 1806 of yacc.c  */
-#line 2244 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 595:
-
-/* Line 1806 of yacc.c  */
-#line 2259 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
-    break;
-
-  case 596:
-
-/* Line 1806 of yacc.c  */
-#line 2261 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
-    break;
-
-  case 597:
-
-/* Line 1806 of yacc.c  */
-#line 2263 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 598:
-
-/* Line 1806 of yacc.c  */
-#line 2268 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 599:
-
-/* Line 1806 of yacc.c  */
-#line 2270 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 600:
-
-/* Line 1806 of yacc.c  */
-#line 2272 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 601:
-
-/* Line 1806 of yacc.c  */
-#line 2277 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 602:
-
-/* Line 1806 of yacc.c  */
-#line 2279 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 603:
-
-/* Line 1806 of yacc.c  */
-#line 2281 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 604:
-
-/* Line 1806 of yacc.c  */
-#line 2296 "parser.yy"
+  case 633:
+
+/* Line 1806 of yacc.c  */
+#line 2407 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 606:
-
-/* Line 1806 of yacc.c  */
-#line 2299 "parser.yy"
+  case 635:
+
+/* Line 1806 of yacc.c  */
+#line 2410 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 607:
-
-/* Line 1806 of yacc.c  */
-#line 2301 "parser.yy"
+  case 636:
+
+/* Line 1806 of yacc.c  */
+#line 2412 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 609:
-
-/* Line 1806 of yacc.c  */
-#line 2307 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 610:
-
-/* Line 1806 of yacc.c  */
-#line 2312 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 611:
-
-/* Line 1806 of yacc.c  */
-#line 2314 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 612:
-
-/* Line 1806 of yacc.c  */
-#line 2316 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 613:
-
-/* Line 1806 of yacc.c  */
-#line 2321 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 614:
-
-/* Line 1806 of yacc.c  */
-#line 2323 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 615:
-
-/* Line 1806 of yacc.c  */
-#line 2325 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 616:
-
-/* Line 1806 of yacc.c  */
-#line 2327 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 617:
-
-/* Line 1806 of yacc.c  */
-#line 2332 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 618:
-
-/* Line 1806 of yacc.c  */
-#line 2334 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 619:
-
-/* Line 1806 of yacc.c  */
-#line 2336 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 620:
-
-/* Line 1806 of yacc.c  */
-#line 2346 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 622:
-
-/* Line 1806 of yacc.c  */
-#line 2349 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 623:
-
-/* Line 1806 of yacc.c  */
-#line 2351 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 624:
-
-/* Line 1806 of yacc.c  */
-#line 2356 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 625:
-
-/* Line 1806 of yacc.c  */
-#line 2358 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 626:
-
-/* Line 1806 of yacc.c  */
-#line 2360 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 627:
-
-/* Line 1806 of yacc.c  */
-#line 2365 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 628:
-
-/* Line 1806 of yacc.c  */
-#line 2367 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 629:
-
-/* Line 1806 of yacc.c  */
-#line 2369 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 630:
-
-/* Line 1806 of yacc.c  */
-#line 2371 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 631:
-
-/* Line 1806 of yacc.c  */
-#line 2376 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 632:
-
-/* Line 1806 of yacc.c  */
-#line 2378 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 633:
-
-/* Line 1806 of yacc.c  */
-#line 2380 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 634:
-
-/* Line 1806 of yacc.c  */
-#line 2411 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 636:
-
-/* Line 1806 of yacc.c  */
-#line 2414 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
   case 637:
 
 /* Line 1806 of yacc.c  */
-#line 2416 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 638:
-
-/* Line 1806 of yacc.c  */
-#line 2421 "parser.yy"
+#line 2417 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8554,8 +8567,8 @@
     break;
 
-  case 639:
-
-/* Line 1806 of yacc.c  */
-#line 2426 "parser.yy"
+  case 638:
+
+/* Line 1806 of yacc.c  */
+#line 2422 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8564,418 +8577,432 @@
     break;
 
+  case 639:
+
+/* Line 1806 of yacc.c  */
+#line 2430 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
   case 640:
 
 /* Line 1806 of yacc.c  */
+#line 2432 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 641:
+
+/* Line 1806 of yacc.c  */
 #line 2434 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 642:
+
+/* Line 1806 of yacc.c  */
+#line 2439 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 643:
+
+/* Line 1806 of yacc.c  */
+#line 2441 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 644:
+
+/* Line 1806 of yacc.c  */
+#line 2446 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 645:
+
+/* Line 1806 of yacc.c  */
+#line 2448 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 647:
+
+/* Line 1806 of yacc.c  */
+#line 2463 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 648:
+
+/* Line 1806 of yacc.c  */
+#line 2465 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 649:
+
+/* Line 1806 of yacc.c  */
+#line 2470 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 650:
+
+/* Line 1806 of yacc.c  */
+#line 2472 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 651:
+
+/* Line 1806 of yacc.c  */
+#line 2474 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 641:
-
-/* Line 1806 of yacc.c  */
-#line 2436 "parser.yy"
+  case 652:
+
+/* Line 1806 of yacc.c  */
+#line 2476 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 642:
-
-/* Line 1806 of yacc.c  */
-#line 2438 "parser.yy"
+  case 653:
+
+/* Line 1806 of yacc.c  */
+#line 2478 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 643:
-
-/* Line 1806 of yacc.c  */
-#line 2443 "parser.yy"
+  case 655:
+
+/* Line 1806 of yacc.c  */
+#line 2484 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 656:
+
+/* Line 1806 of yacc.c  */
+#line 2486 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 657:
+
+/* Line 1806 of yacc.c  */
+#line 2488 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 658:
+
+/* Line 1806 of yacc.c  */
+#line 2493 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
+    break;
+
+  case 659:
+
+/* Line 1806 of yacc.c  */
+#line 2495 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 660:
+
+/* Line 1806 of yacc.c  */
+#line 2497 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 661:
+
+/* Line 1806 of yacc.c  */
+#line 2503 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
+    break;
+
+  case 662:
+
+/* Line 1806 of yacc.c  */
+#line 2505 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 664:
+
+/* Line 1806 of yacc.c  */
+#line 2511 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
+    break;
+
+  case 665:
+
+/* Line 1806 of yacc.c  */
+#line 2513 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
+    break;
+
+  case 666:
+
+/* Line 1806 of yacc.c  */
+#line 2515 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
+    break;
+
+  case 667:
+
+/* Line 1806 of yacc.c  */
+#line 2517 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
+    break;
+
+  case 669:
+
+/* Line 1806 of yacc.c  */
+#line 2532 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 670:
+
+/* Line 1806 of yacc.c  */
+#line 2534 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 671:
+
+/* Line 1806 of yacc.c  */
+#line 2539 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 672:
+
+/* Line 1806 of yacc.c  */
+#line 2541 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 673:
+
+/* Line 1806 of yacc.c  */
+#line 2543 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 674:
+
+/* Line 1806 of yacc.c  */
+#line 2545 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 675:
+
+/* Line 1806 of yacc.c  */
+#line 2547 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 677:
+
+/* Line 1806 of yacc.c  */
+#line 2553 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 678:
+
+/* Line 1806 of yacc.c  */
+#line 2555 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 679:
+
+/* Line 1806 of yacc.c  */
+#line 2557 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 680:
+
+/* Line 1806 of yacc.c  */
+#line 2562 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
+    break;
+
+  case 681:
+
+/* Line 1806 of yacc.c  */
+#line 2564 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 682:
+
+/* Line 1806 of yacc.c  */
+#line 2566 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 684:
+
+/* Line 1806 of yacc.c  */
+#line 2573 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 644:
-
-/* Line 1806 of yacc.c  */
-#line 2445 "parser.yy"
+  case 686:
+
+/* Line 1806 of yacc.c  */
+#line 2584 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
+    break;
+
+  case 687:
+
+/* Line 1806 of yacc.c  */
+#line 2587 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
+    break;
+
+  case 688:
+
+/* Line 1806 of yacc.c  */
+#line 2589 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
+    break;
+
+  case 689:
+
+/* Line 1806 of yacc.c  */
+#line 2592 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
+    break;
+
+  case 690:
+
+/* Line 1806 of yacc.c  */
+#line 2594 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
+    break;
+
+  case 691:
+
+/* Line 1806 of yacc.c  */
+#line 2596 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
+    break;
+
+  case 693:
+
+/* Line 1806 of yacc.c  */
+#line 2610 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 694:
+
+/* Line 1806 of yacc.c  */
+#line 2612 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 695:
+
+/* Line 1806 of yacc.c  */
+#line 2617 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 696:
+
+/* Line 1806 of yacc.c  */
+#line 2619 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 697:
+
+/* Line 1806 of yacc.c  */
+#line 2621 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 698:
+
+/* Line 1806 of yacc.c  */
+#line 2623 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 699:
+
+/* Line 1806 of yacc.c  */
+#line 2625 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 701:
+
+/* Line 1806 of yacc.c  */
+#line 2631 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 645:
-
-/* Line 1806 of yacc.c  */
-#line 2450 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 646:
-
-/* Line 1806 of yacc.c  */
-#line 2452 "parser.yy"
+  case 702:
+
+/* Line 1806 of yacc.c  */
+#line 2633 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 703:
+
+/* Line 1806 of yacc.c  */
+#line 2635 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 704:
+
+/* Line 1806 of yacc.c  */
+#line 2640 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 648:
-
-/* Line 1806 of yacc.c  */
-#line 2467 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 649:
-
-/* Line 1806 of yacc.c  */
-#line 2469 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 650:
-
-/* Line 1806 of yacc.c  */
-#line 2474 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 651:
-
-/* Line 1806 of yacc.c  */
-#line 2476 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 652:
-
-/* Line 1806 of yacc.c  */
-#line 2478 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 653:
-
-/* Line 1806 of yacc.c  */
-#line 2480 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 654:
-
-/* Line 1806 of yacc.c  */
-#line 2482 "parser.yy"
+  case 705:
+
+/* Line 1806 of yacc.c  */
+#line 2642 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 656:
-
-/* Line 1806 of yacc.c  */
-#line 2488 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 657:
-
-/* Line 1806 of yacc.c  */
-#line 2490 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 658:
-
-/* Line 1806 of yacc.c  */
-#line 2492 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 659:
-
-/* Line 1806 of yacc.c  */
-#line 2497 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
-    break;
-
-  case 660:
-
-/* Line 1806 of yacc.c  */
-#line 2499 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 661:
-
-/* Line 1806 of yacc.c  */
-#line 2501 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 662:
-
-/* Line 1806 of yacc.c  */
-#line 2507 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
-    break;
-
-  case 663:
-
-/* Line 1806 of yacc.c  */
-#line 2509 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 665:
-
-/* Line 1806 of yacc.c  */
-#line 2515 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
-    break;
-
-  case 666:
-
-/* Line 1806 of yacc.c  */
-#line 2517 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
-    break;
-
-  case 667:
-
-/* Line 1806 of yacc.c  */
-#line 2519 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
-    break;
-
-  case 668:
-
-/* Line 1806 of yacc.c  */
-#line 2521 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
-    break;
-
-  case 670:
-
-/* Line 1806 of yacc.c  */
-#line 2536 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 671:
-
-/* Line 1806 of yacc.c  */
-#line 2538 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 672:
-
-/* Line 1806 of yacc.c  */
-#line 2543 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 673:
-
-/* Line 1806 of yacc.c  */
-#line 2545 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 674:
-
-/* Line 1806 of yacc.c  */
-#line 2547 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 675:
-
-/* Line 1806 of yacc.c  */
-#line 2549 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 676:
-
-/* Line 1806 of yacc.c  */
-#line 2551 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 678:
-
-/* Line 1806 of yacc.c  */
-#line 2557 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 679:
-
-/* Line 1806 of yacc.c  */
-#line 2559 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 680:
-
-/* Line 1806 of yacc.c  */
-#line 2561 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 681:
-
-/* Line 1806 of yacc.c  */
-#line 2566 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
-    break;
-
-  case 682:
-
-/* Line 1806 of yacc.c  */
-#line 2568 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 683:
-
-/* Line 1806 of yacc.c  */
-#line 2570 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 685:
-
-/* Line 1806 of yacc.c  */
-#line 2577 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 687:
-
-/* Line 1806 of yacc.c  */
-#line 2588 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
-    break;
-
-  case 688:
-
-/* Line 1806 of yacc.c  */
-#line 2591 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
-    break;
-
-  case 689:
-
-/* Line 1806 of yacc.c  */
-#line 2593 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
-    break;
-
-  case 690:
-
-/* Line 1806 of yacc.c  */
-#line 2596 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
-    break;
-
-  case 691:
-
-/* Line 1806 of yacc.c  */
-#line 2598 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
-    break;
-
-  case 692:
-
-/* Line 1806 of yacc.c  */
-#line 2600 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
-    break;
-
-  case 694:
-
-/* Line 1806 of yacc.c  */
-#line 2614 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 695:
-
-/* Line 1806 of yacc.c  */
-#line 2616 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 696:
-
-/* Line 1806 of yacc.c  */
-#line 2621 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 697:
-
-/* Line 1806 of yacc.c  */
-#line 2623 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 698:
-
-/* Line 1806 of yacc.c  */
-#line 2625 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 699:
-
-/* Line 1806 of yacc.c  */
-#line 2627 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 700:
-
-/* Line 1806 of yacc.c  */
-#line 2629 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 702:
-
-/* Line 1806 of yacc.c  */
-#line 2635 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 703:
-
-/* Line 1806 of yacc.c  */
-#line 2637 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 704:
-
-/* Line 1806 of yacc.c  */
-#line 2639 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 705:
-
-/* Line 1806 of yacc.c  */
-#line 2644 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 706:
-
-/* Line 1806 of yacc.c  */
-#line 2646 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 709:
-
-/* Line 1806 of yacc.c  */
-#line 2656 "parser.yy"
+  case 708:
+
+/* Line 1806 of yacc.c  */
+#line 2652 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
+  case 711:
+
+/* Line 1806 of yacc.c  */
+#line 2662 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
   case 712:
+
+/* Line 1806 of yacc.c  */
+#line 2664 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+    break;
+
+  case 713:
 
 /* Line 1806 of yacc.c  */
@@ -8984,5 +9011,5 @@
     break;
 
-  case 713:
+  case 714:
 
 /* Line 1806 of yacc.c  */
@@ -8991,5 +9018,5 @@
     break;
 
-  case 714:
+  case 715:
 
 /* Line 1806 of yacc.c  */
@@ -8998,5 +9025,5 @@
     break;
 
-  case 715:
+  case 716:
 
 /* Line 1806 of yacc.c  */
@@ -9005,16 +9032,9 @@
     break;
 
-  case 716:
-
-/* Line 1806 of yacc.c  */
-#line 2674 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
   case 717:
 
 /* Line 1806 of yacc.c  */
-#line 2676 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+#line 2679 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
@@ -9022,30 +9042,37 @@
 
 /* Line 1806 of yacc.c  */
+#line 2681 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 719:
+
+/* Line 1806 of yacc.c  */
 #line 2683 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 720:
+
+/* Line 1806 of yacc.c  */
+#line 2685 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 721:
+
+/* Line 1806 of yacc.c  */
+#line 2687 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 722:
+
+/* Line 1806 of yacc.c  */
+#line 2689 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 719:
-
-/* Line 1806 of yacc.c  */
-#line 2685 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 720:
-
-/* Line 1806 of yacc.c  */
-#line 2687 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 721:
-
-/* Line 1806 of yacc.c  */
-#line 2689 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
-  case 722:
+  case 723:
 
 /* Line 1806 of yacc.c  */
@@ -9054,37 +9081,30 @@
     break;
 
-  case 723:
+  case 724:
 
 /* Line 1806 of yacc.c  */
 #line 2693 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 724:
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 725:
 
 /* Line 1806 of yacc.c  */
 #line 2695 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 726:
+
+/* Line 1806 of yacc.c  */
+#line 2697 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 725:
-
-/* Line 1806 of yacc.c  */
-#line 2697 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 726:
-
-/* Line 1806 of yacc.c  */
-#line 2699 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
   case 727:
 
 /* Line 1806 of yacc.c  */
-#line 2701 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+#line 2702 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
     break;
 
@@ -9092,6 +9112,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2706 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
+#line 2704 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
     break;
 
@@ -9099,6 +9119,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2708 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
+#line 2709 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
     break;
 
@@ -9106,23 +9126,30 @@
 
 /* Line 1806 of yacc.c  */
-#line 2713 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
-    break;
-
-  case 731:
-
-/* Line 1806 of yacc.c  */
-#line 2715 "parser.yy"
+#line 2711 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
     break;
 
-  case 733:
-
-/* Line 1806 of yacc.c  */
-#line 2742 "parser.yy"
+  case 732:
+
+/* Line 1806 of yacc.c  */
+#line 2738 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
+  case 736:
+
+/* Line 1806 of yacc.c  */
+#line 2749 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
   case 737:
+
+/* Line 1806 of yacc.c  */
+#line 2751 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+    break;
+
+  case 738:
 
 /* Line 1806 of yacc.c  */
@@ -9131,5 +9158,5 @@
     break;
 
-  case 738:
+  case 739:
 
 /* Line 1806 of yacc.c  */
@@ -9138,5 +9165,5 @@
     break;
 
-  case 739:
+  case 740:
 
 /* Line 1806 of yacc.c  */
@@ -9145,5 +9172,5 @@
     break;
 
-  case 740:
+  case 741:
 
 /* Line 1806 of yacc.c  */
@@ -9152,16 +9179,9 @@
     break;
 
-  case 741:
-
-/* Line 1806 of yacc.c  */
-#line 2761 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
   case 742:
 
 /* Line 1806 of yacc.c  */
-#line 2763 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+#line 2766 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
@@ -9169,41 +9189,41 @@
 
 /* Line 1806 of yacc.c  */
+#line 2768 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 744:
+
+/* Line 1806 of yacc.c  */
 #line 2770 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 745:
+
+/* Line 1806 of yacc.c  */
+#line 2772 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 744:
-
-/* Line 1806 of yacc.c  */
-#line 2772 "parser.yy"
+  case 746:
+
+/* Line 1806 of yacc.c  */
+#line 2774 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 745:
-
-/* Line 1806 of yacc.c  */
-#line 2774 "parser.yy"
+  case 747:
+
+/* Line 1806 of yacc.c  */
+#line 2776 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 746:
-
-/* Line 1806 of yacc.c  */
-#line 2776 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 747:
-
-/* Line 1806 of yacc.c  */
-#line 2778 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
   case 748:
 
 /* Line 1806 of yacc.c  */
-#line 2780 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+#line 2781 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
 
@@ -9211,6 +9231,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2785 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
+#line 2786 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
     break;
 
@@ -9218,20 +9238,20 @@
 
 /* Line 1806 of yacc.c  */
+#line 2788 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
+    break;
+
+  case 751:
+
+/* Line 1806 of yacc.c  */
 #line 2790 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
-    break;
-
-  case 751:
-
-/* Line 1806 of yacc.c  */
-#line 2792 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
 
-  case 752:
-
-/* Line 1806 of yacc.c  */
-#line 2794 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
+  case 754:
+
+/* Line 1806 of yacc.c  */
+#line 2814 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -9239,12 +9259,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2818 "parser.yy"
-    { (yyval.en) = 0; }
-    break;
-
-  case 756:
-
-/* Line 1806 of yacc.c  */
-#line 2820 "parser.yy"
+#line 2816 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -9253,5 +9266,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 9256 "Parser/parser.cc"
+#line 9269 "Parser/parser.cc"
       default: break;
     }
@@ -9484,5 +9497,5 @@
 
 /* Line 2067 of yacc.c  */
-#line 2823 "parser.yy"
+#line 2819 "parser.yy"
 
 // ----end of grammar----
Index: src/Parser/parser.h
===================================================================
--- src/Parser/parser.h	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/Parser/parser.h	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -143,6 +143,5 @@
      ORassign = 361,
      ATassign = 362,
-     REFassign = 363,
-     THEN = 364
+     THEN = 363
    };
 #endif
@@ -253,6 +252,5 @@
 #define ORassign 361
 #define ATassign 362
-#define REFassign 363
-#define THEN 364
+#define THEN 363
 
 
@@ -264,5 +262,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 112 "parser.yy"
+#line 110 "parser.yy"
 
 	Token tok;
@@ -281,5 +279,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 284 "Parser/parser.h"
+#line 282 "Parser/parser.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/Parser/parser.yy	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun 13 15:00:23 2016
-// Update Count     : 1578
+// Last Modified On : Wed Jun 22 21:20:17 2016
+// Update Count     : 1584
 //
 
@@ -31,8 +31,6 @@
 // two levels of extensions. The first extensions cover most of the GCC C extensions, except for:
 //
-// 1. nested functions
-// 2. generalized lvalues
-// 3. designation with and without '=' (use ':' instead)
-// 4. attributes not allowed in parenthesis of declarator
+// 1. designation with and without '=' (use ':' instead)
+// 2. attributes not allowed in parenthesis of declarator
 //
 // All of the syntactic extensions for GCC C are marked with the comment "GCC". The second extensions are for Cforall
@@ -79,5 +77,5 @@
 %token TYPEOF LABEL										// GCC
 %token ENUM STRUCT UNION
-%token OTYPE FTYPE DTYPE TRAIT						// CFA
+%token OTYPE FTYPE DTYPE TRAIT							// CFA
 %token SIZEOF OFFSETOF
 %token ATTRIBUTE EXTENSION								// GCC
@@ -106,5 +104,5 @@
 %token ANDassign	ERassign	ORassign				// &=	^=	|=
 
-%token ATassign		REFassign							// @=	:=
+%token ATassign											// @=
 
 // Types declaration
@@ -577,6 +575,4 @@
 	| unary_expression '=' assignment_expression
 		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }
-	| unary_expression REFassign assignment_expression
-		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); } // FIX ME
 	| unary_expression assignment_operator assignment_expression
 		{ $$ =new CompositeExprNode( $2, $1, $3 ); }
Index: src/examples/poly-bench.c
===================================================================
--- src/examples/poly-bench.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/examples/poly-bench.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,207 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// poly-bench.cc -- 
+//
+// Author           : Aaron Moss
+// Created On       : Sat May 16 07:26:30 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed May 27 18:25:19 2015
+// Update Count     : 5
+//
+
+extern "C" {
+#include <stdio.h>
+//#include "my_time.h"
+}
+
+#define N 200000000
+
+struct ipoint {
+	int x;
+	int y;
+};
+
+struct ipoint ?+?(struct ipoint a, struct ipoint b) {
+	struct ipoint r;
+	r.x = a.x + b.x;
+	r.y = a.y + b.y;
+	return r;
+}
+
+struct ipoint ?-?(struct ipoint a, struct ipoint b) {
+	struct ipoint r;
+	r.x = a.x - b.x;
+	r.y = a.y - b.y;
+	return r;
+}
+
+struct ipoint ?*?(struct ipoint a, struct ipoint b) {
+	struct ipoint r;
+	r.x = a.x * b.x;
+	r.y = a.y * b.y;
+	return r;
+}
+
+struct dpoint {
+	double x;
+	double y;
+};
+
+struct dpoint ?+?(struct dpoint a, struct dpoint b) {
+	struct dpoint r;
+	r.x = a.x + b.x;
+	r.y = a.y + b.y;
+	return r;
+}
+
+struct dpoint ?-?(struct dpoint a, struct dpoint b) {
+	struct dpoint r;
+	r.x = a.x - b.x;
+	r.y = a.y - b.y;
+	return r;
+}
+
+struct dpoint ?*?(struct dpoint a, struct dpoint b) {
+	struct dpoint r;
+	r.x = a.x * b.x;
+	r.y = a.y * b.y;
+	return r;
+}
+
+int a2b2_mono_int(int a, int b) {
+	return (a - b)*(a + b);
+}
+
+double a2b2_mono_double(double a, double b) {
+	return (a - b)*(a + b);
+}
+
+struct ipoint a2b2_mono_ipoint(struct ipoint a, struct ipoint b) {
+	return (a - b)*(a + b);
+}
+
+struct dpoint a2b2_mono_dpoint(struct dpoint a, struct dpoint b) {
+	return (a - b)*(a + b);
+}
+
+forall(type T | { T ?+?(T,T); T ?-?(T,T); T ?*?(T,T); })
+T a2b2_poly(T a, T b) {
+	return (a - b)*(a + b);
+}
+
+typedef int clock_t;
+long ms_between(clock_t start, clock_t end) {
+//	return (end - start) / (CLOCKS_PER_SEC / 1000);
+	return 0;
+}
+int clock() { return 3; }
+
+int main(int argc, char** argv) {
+	clock_t start, end;
+	int i;
+	
+	int a, b;
+	double c, d;
+	struct ipoint p, q;
+	struct dpoint r, s;
+	
+	printf("\n## a^2-b^2 ##\n");
+	
+	a = 5, b = 3;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		a = a2b2_mono_int(a, b);
+		b = a2b2_mono_int(b, a);
+	}
+	end = clock();
+	printf("mono_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
+	
+	a = 5, b = 3;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		a = a2b2_poly(a, b);
+		b = a2b2_poly(b, a);
+	}
+	end = clock();
+	printf("poly_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
+	
+/*	{
+	a = 5, b = 3;
+	// below doesn't actually work; a2b2_poly isn't actually assigned, just declared
+	* [int] (int, int) a2b2_poly = a2b2_mono_int;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+//			printf("\t[%d,%d]\n", a, b);
+a = a2b2_poly(a, b);
+//			printf("\t[%d,%d]\n", a, b);
+b = a2b2_poly(b, a);
+}
+end = clock();
+printf("spec_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
+}
+*/	
+	c = 5.0, d = 3.0;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		c = a2b2_mono_double(c, d);
+		d = a2b2_mono_double(d, c);
+	}
+	end = clock();
+	printf("mono_double:%7ld  [%f,%f]\n", ms_between(start, end), c, d);
+		
+	c = 5.0, d = 3.0;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		c = a2b2_poly(c, d);
+		d = a2b2_poly(d, c);
+	}
+	end = clock();
+	printf("poly_double:%7ld  [%f,%f]\n", ms_between(start, end), c, d);
+	
+	p.x = 5, p.y = 5, q.x = 3, q.y = 3;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		p = a2b2_mono_ipoint(p, q);
+		q = a2b2_mono_ipoint(q, p);
+	}
+	end = clock();
+	printf("mono_ipoint:%7ld  [(%d,%d),(%d,%d)]\n", ms_between(start, end), p.x, p.y, q.x, q.y);
+		
+	p.x = 5, p.y = 5, q.x = 3, q.y = 3;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		p = a2b2_poly(p, q);
+		q = a2b2_poly(q, p);
+	}
+	end = clock();
+	printf("poly_ipoint:%7ld  [(%d,%d),(%d,%d)]\n", ms_between(start, end), p.x, p.y, q.x, q.y);
+	
+	r.x = 5.0, r.y = 5.0, s.x = 3.0, s.y = 3.0;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		r = a2b2_mono_dpoint(r, s);
+		s = a2b2_mono_dpoint(s, r);
+	}
+	end = clock();
+	printf("mono_dpoint:%7ld  [(%f,%f),(%f,%f)]\n", ms_between(start, end), r.x, r.y, s.x, s.y);
+		
+	r.x = 5.0, r.y = 5.0, s.x = 3.0, s.y = 3.0;
+	start = clock();
+	for (i = 0; i < N/2; ++i) {
+		r = a2b2_poly(r, s);
+		s = a2b2_poly(s, r);
+	}
+	end = clock();
+	printf("poly_dpoint:%7ld  [(%f,%f),(%f,%f)]\n", ms_between(start, end), r.x, r.y, s.x, s.y);
+
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa poly-bench.c" //
+// End: //
Index: src/tests/.expect/CastError.txt
===================================================================
--- src/tests/.expect/CastError.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/CastError.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,42 @@
+CFA Version 1.0.0 (debug)
+Error: Can't choose between alternatives for expression Cast of:
+  Name: f
+
+to:
+  char
+Alternatives are:        Cost ( 1, 0, 0 ): Cast of:
+          Variable Expression: f: function
+                accepting unspecified arguments
+              returning 
+                nothing 
+
+
+        to:
+          char
+(types:
+            char
+)
+        Environment: 
+
+        Cost ( 1, 0, 0 ): Cast of:
+          Variable Expression: f: signed int
+
+        to:
+          char
+(types:
+            char
+)
+        Environment: 
+
+        Cost ( 1, 0, 0 ): Cast of:
+          Variable Expression: f: double
+
+        to:
+          char
+(types:
+            char
+)
+        Environment: 
+
+
+make: *** [CastError] Error 1
Index: src/tests/.expect/Constant0-1DP.txt
===================================================================
--- src/tests/.expect/Constant0-1DP.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/Constant0-1DP.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,34 @@
+CFA Version 1.0.0 (debug)
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for 0: pointer to signed int
+Error: duplicate object definition for 1: pointer to signed int
+Error: duplicate object definition for 0: pointer to signed int
+Error: duplicate object definition for 1: pointer to signed int
+Error: duplicate object definition for 0: pointer to signed int
+Error: duplicate object definition for 1: pointer to signed int
+Error: duplicate object definition for 0: pointer to signed int
+Error: duplicate object definition for 1: pointer to signed int
+Error: duplicate object definition for 0: const pointer to signed int
+Error: duplicate object definition for 1: const pointer to signed int
+Error: duplicate object definition for 0: const pointer to signed int
+Error: duplicate object definition for 1: const pointer to signed int
+Error: duplicate object definition for 0: const pointer to signed int
+Error: duplicate object definition for 1: const pointer to signed int
+Error: duplicate object definition for x: const pointer to pointer to signed int
+Error: duplicate object definition for 0: pointer to pointer to signed int
+Error: duplicate object definition for x: const pointer to pointer to signed int
+Error: duplicate object definition for 0: pointer to pointer to signed int
+Error: duplicate object definition for x: const pointer to pointer to signed int
+Error: duplicate object definition for 0: pointer to pointer to signed int
+make: *** [Constant0-1DP] Error 1
Index: src/tests/.expect/Constant0-1NDDP.txt
===================================================================
--- src/tests/.expect/Constant0-1NDDP.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/Constant0-1NDDP.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,18 @@
+CFA Version 1.0.0 (debug)
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 0: signed int
+Error: duplicate object definition for 1: signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for 0: const signed int
+Error: duplicate object definition for 1: const signed int
+Error: duplicate object definition for x: pointer to signed int
+Error: duplicate object definition for 0: pointer to signed int
+Error: duplicate object definition for x: const pointer to signed int
+Error: duplicate object definition for 0: const pointer to signed int
+make: *** [Constant0-1NDDP] Error 1
Index: src/tests/.expect/DeclarationErrors.txt
===================================================================
--- src/tests/.expect/DeclarationErrors.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/DeclarationErrors.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,16 @@
+CFA Version 1.0.0 (debug)
+Error: invalid combination of storage classes in declaration of x9: static static volatile const short int 
+
+Error: invalid combination of storage classes in declaration of x18: static static const volatile instance of struct __anonymous0
+  with members 
+    i: int 
+
+
+Error: invalid combination of storage classes in declaration of x19: static static const volatile volatile instance of struct __anonymous1
+  with members 
+    i: int 
+
+
+Error: invalid combination of storage classes in declaration of x28: static static volatile const instance of type Int
+
+make: *** [DeclarationErrors] Error 1
Index: src/tests/.expect/DeclarationSpecifier.txt
===================================================================
--- src/tests/.expect/DeclarationSpecifier.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/DeclarationSpecifier.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,16 @@
+CFA Version 1.0.0 (debug)
+Error: invalid combination of storage classes in declaration of x9: static static volatile const short int 
+
+Error: invalid combination of storage classes in declaration of x18: static static const volatile instance of struct __anonymous8
+  with members 
+    i: int 
+
+
+Error: invalid combination of storage classes in declaration of x19: static static const volatile volatile instance of struct __anonymous9
+  with members 
+    i: int 
+
+
+Error: invalid combination of storage classes in declaration of x28: static static volatile const instance of type Int
+
+make: *** [DeclarationSpecifier] Error 1
Index: src/tests/.expect/LabelledExit.txt
===================================================================
--- src/tests/.expect/LabelledExit.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/LabelledExit.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,3 @@
+CFA Version 1.0.0 (debug)
+Error: 'break' outside a loop or switch
+make: *** [LabelledExit] Error 1
Index: src/tests/.expect/ScopeErrors.txt
===================================================================
--- src/tests/.expect/ScopeErrors.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/ScopeErrors.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,11 @@
+CFA Version 1.0.0 (debug)
+Error: duplicate object definition for thisIsAnError: signed int
+Error: duplicate function definition for butThisIsAnError: function
+  with parameters
+    double
+  returning 
+    double
+  with body 
+    CompoundStmt
+
+make: *** [ScopeErrors] Error 1
Index: src/tests/.expect/ShortCircuit.txt
===================================================================
--- src/tests/.expect/ShortCircuit.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/ShortCircuit.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,4 @@
+1 0 
+1 
+0 
+0 1 
Index: src/tests/.expect/abs.txt
===================================================================
--- src/tests/.expect/abs.txt	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/.expect/abs.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,4 +1,2 @@
-/usr/local/bin/cfa -g -Wall -Wno-unused-function     abs.c   -o abs
-CFA Version 1.0.0 (debug)
 char			¿	abs A
 signed int		-65	abs 65
Index: src/tests/.expect/ato.txt
===================================================================
--- src/tests/.expect/ato.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/ato.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,13 @@
+-123 -123
+123 123
+-123 -123
+123 123
+-123 -123
+123 123
+-123.456 -123.456
+-123.456789012346 -123.4567890123456
+-123.456789012345679 -123.45678901234567890123456789
+-123.456-123.456i -123.456-123.456i
+-123.456789012346+123.456789012346i -123.4567890123456+123.4567890123456i
+123.456789012345679-123.456789012345679i 123.45678901234567890123456789-123.45678901234567890123456789i
+123.45678901234-123.456789i 123.45678901234-123.4567890i
Index: src/tests/.expect/io.txt
===================================================================
--- src/tests/.expect/io.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/io.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,26 @@
+9 6 28 0 7 1 2
+1 2 3
+123
+123
+
+A 
+1 2 3 4 5 6 7 8
+1.1 1.2 1.3
+1.1+2.3i 1.1-2.3i 1.1-2.3i
+
+1.11.21.3
+1.1+2.3i1.1-2.3i1.1-2.3i
+ abcxyz
+abcxyz
+
+1.1, $1.2, $1.3
+1.1+2.3i, $1.1-2.3i, $1.1-2.3i
+abc, $xyz
+
+v(27 v[27 v{27 $27 £27 ¥27 ¡27 ¿27 «27
+25, 25. 25: 25; 25! 25? 25) 25] 25} 25% 25¢ 25»
+25'27 25`27 25"27 25 27 25
+27 25
+27 25
+27 25	27 25
+27
Index: src/tests/.expect/math.txt
===================================================================
--- src/tests/.expect/math.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/math.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,59 @@
+fabs: 1 1 1 1.41421 1.41421356237309505 1.41421356237309505
+fmod: 1 1 1 1 1 1
+remainder: -1 -1 -1
+remquo: 7 0.0999999 7 0.1 7 0.0999999999999999999
+div: 7 0.0999999 7 0.1 7 0.0999999999999999999
+fma: -2 -2 -2
+fdim: 2 2 2
+nan: nan nan nan
+exp: 2.71828 2.71828182845905 2.71828182845904524 1.46869+2.28736i 1.46869393991589+2.28735528717884i 1.46869393991588516+2.28735528717884239i
+exp2: 2 2 2
+expm1: 1.71828 1.71828182845905 1.71828182845904524
+log: 0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
+log2: 3 3 3
+log10: 2 2 2
+log1p: 0.693147 0.693147180559945 0.693147180559945309
+ilogb: 0 0 0
+logb: 3 3 3
+sqrt: 1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
+cbrt: 3 3 3
+hypot: 1.41421 1.4142135623731 1.41421356237309505
+pow: 1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
+sin: 0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
+cos: 0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
+tan: 1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
+asin: 1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
+acos: 0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
+atan: 0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
+atan2: 0.785398 0.785398163397448 0.78539816339744831 atan: 0.785398 0.785398163397448 0.78539816339744831 sinh: 1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
+cosh: 1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
+tanh: 0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
+acosh: 0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
+asinh: 0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
+atanh: inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
+erf: 0.842701 0.842700792949715 0.842700792949714869
+erfc: 0.157299 0.157299207050285 0.157299207050285131
+lgamma: 1.79176 1.79175946922805 1.791759469228055
+lgamma: 1.79176 1 1.79175946922805 1 1.791759469228055 1
+tgamma: 6 6 6
+floor: 1 1 1
+ceil: 2 2 2
+trunc: 3 3 3
+rint: 2 2 2
+rint: 2 2 2
+rint: 2 2 2
+lrint: 2 2 2
+llrint: 2 2 2
+nearbyint: 4 4 4
+round: 2 2 2
+round: 2 2 2
+round: 2 2 2
+lround: 2 2 2
+llround: 2 2 2
+copysign: -1 -1 -1
+frexp: 0.5 3 0.5 3 0.5 3
+ldexp: 8 8 8
+modf: 2 0.3 2 0.3 2 0.3 nextafter: 2 2 2
+nexttoward: 2 2 2
+scalbn: 16 16 16
+scalbln: 16 16 16
Index: src/tests/.expect/minmax.txt
===================================================================
--- src/tests/.expect/minmax.txt	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/.expect/minmax.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,21 @@
+char			z a	min a
+signed int		4 3	min 3
+unsigned int		4 3	min 3
+signed long int		4 3	min 3
+unsigned long int	4 3	min 3
+signed long long int	4 3	min 3
+unsigned long long int	4 3	min 3
+float			4 3.1	min 3.1
+double			4 3.1	min 3.1
+long double		4 3.1	min 3.1
+
+char			z a	max z
+signed int		4 3	max 4
+unsigned int		4 3	max 4
+signed long int		4 3	max 4
+unsigned long int	4 3	max 4
+signed long long int	4 3	max 4
+unsigned long long int	4 3	max 4
+float			4 3.1	max 4
+double			4 3.1	max 4
+long double		4 3.1	max 4
Index: src/tests/.expect/swap.txt
===================================================================
--- src/tests/.expect/swap.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/.expect/swap.txt	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,14 @@
+char			a b			swap 	b a
+signed int		-1 -2			swap 	-2 -1
+unsigned int		1 2			swap 	2 1
+signed long int		-1 -2			swap 	-2 -1
+unsigned long int	1 2			swap 	2 1
+signed long long int	-1 -2			swap 	-2 -1
+unsigned long long int	1 2			swap 	2 1
+float			1.5 2.5			swap 	2.5 1.5
+double			1.5 2.5			swap 	2.5 1.5
+long double		1.5 2.5			swap 	2.5 1.5
+float _Complex		1.5+1.5i 2.5+2.5i	swap 	2.5+2.5i 1.5+1.5i
+double _Complex		1.5+1.5i 2.5+2.5i	swap 	2.5+2.5i 1.5+1.5i
+long double _Complex	1.5+1.5i 2.5+2.5i	swap 	2.5+2.5i 1.5+1.5i
+struct S		1 2, 2 1		swap 	2 1, 1 2
Index: src/tests/Cast.c
===================================================================
--- src/tests/Cast.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Cast.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -9,5 +9,5 @@
 	(int)f;
 	(void(*)())f;
-	([long, long double, *[]()])([f, f, f]);
+//	([long, long double, *[]()])([f, f, f]);
 }
 
Index: src/tests/CommentMisc.c
===================================================================
--- src/tests/CommentMisc.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/CommentMisc.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,40 +1,2 @@
-/* single line */
-// single line
-
-// single line containing */
-// single line containing /*
-// single line containing /* */
-
-/* 1st */ int i;
-int i; /* 2nd */
-/* 1st */ int i; /* 2nd */
-/* 1st */ /* 2nd */
-
-/* 1st
-   2nd */ int i;
-
-/*
-*/
-
-/*
-
-*/
-
-/*
-  1st
-*/
-
-/*
-  1st
-  2nd
-*/
-
-// ignore preprocessor directives
-
-#line 2
- #
- #include <fred>
-	#define mary abc
-
 // alternative ANSI99 brackets
 
Index: src/tests/Constant0-1.c
===================================================================
--- src/tests/Constant0-1.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Constant0-1.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,4 +1,3 @@
-//Constant test declaration
-// Cforall extension
+// Constant test declaration
 
 // value
@@ -6,18 +5,35 @@
 int 0;
 const int 0;
-static const int 0;
 int 1;
 const int 1;
-static const int 1;
-int 0, 1;
-const int 0, 1;
+struct { int i; } 0;
+const struct { int i; } 1;
+
+#ifdef DUPS
+
+int 0;
+const int 0;
+int 1;
+const int 1;
 int (0), (1);
 int ((0)), ((1));
-static const int 0, 1;
+const int 0, 1;
+const int (0), (1);
 struct { int i; } 0;
 const struct { int i; } 1;
-static const struct { int i; } 1;
+
+#endif // DUPS
+
+#ifndef NEWDECL
 
 // pointer
+
+int *0, *1;
+int * const (0), * const 1;
+struct { int i; } *0;
+const struct { int i; } *0;
+int (*(* const x)), **0;
+
+#ifdef DUPS
 
 int *0, *1;
@@ -28,5 +44,13 @@
 int (* const 0), (* const 1);
 int ((* const 0)), ((* const 1));
+int (*(* const x)), *(*0);
+int (*(* const x)), (*(*0));
 struct { int i; } *0;
+const struct { int i; } *0;
+int (*(* const x)), **0;
+
+#endif // DUPS
+
+#else
 
 // Cforall style
@@ -34,14 +58,22 @@
 * int x, 0;
 const * int x, 0;
-static const * int x, 0;
 * struct { int i; } 0;
 const * struct { int i; } 0;
-static const * struct { int i; } 0;
-static * int x, 0;
-static const * int x, 0;
 const * * int x, 0;
 
+#ifdef DUPS
+
+* int x, 0;
+const * int x, 0;
+
+#endif // DUPS
+
+#endif // NEWDECL
+
 int main() {
+#ifndef NEWDECL
     int 1, * 0;
+#else
     * int x, 0;
+#endif // NEWDECL
 }
Index: src/tests/Context.c
===================================================================
--- src/tests/Context.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Context.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,9 +1,10 @@
-//cforall context declaration
-context has_q( otype T ) {
+// trait declaration
+
+trait has_q( otype T ) {
 	T q( T );
 };
 
 forall( otype z | has_q( z ) ) void f() {
-	context has_r( otype T, otype U ) {
+	trait has_r( otype T, otype U ) {
 		T r( T, T (T,U) );
 	};
Index: src/tests/Enum.c
===================================================================
--- src/tests/Enum.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Enum.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,4 +1,4 @@
 //Testing enum declaration
-enum Colors {
+enum Colours {
 	Red,
 	Yellow,
@@ -10,4 +10,7 @@
 };
 
+enum Colours c1;
+Colours c2;
+
 void f( void ) {
 	enum Fruits {
@@ -17,9 +20,9 @@
 		Mango
 	} fruit = Mango;
+	enum Fruits f1;
+	Fruits f2;
 }
 
 //Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
+int main(int argc, char const *argv[]) {
 }
Index: src/tests/Exception.c
===================================================================
--- src/tests/Exception.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Exception.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -10,5 +10,5 @@
     try {
 	x/4;
-    } catch( int) {
+    } catch( int ) {
     } catch( int x ) {
     } catch( struct { int i; } ) {
Index: src/tests/Expression.c
===================================================================
--- src/tests/Expression.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Expression.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,11 +1,6 @@
-int fred() {
-    struct s { int i; } *p;
-    int i;
+int main() {
+    struct s { int i; } x, *p = &x;
+    int i = 3;
 
-    // order of evaluation (GCC is different)
-/*
-    i = sizeof( (int) {3} );
-    i = sizeof (int) {3};
-*/
     // operators
 
@@ -42,9 +37,9 @@
     i||i;
     p->i;
-    i+=i;
-    i-=i;
     i*=i;
     i/=i;
     i%=i;
+    i+=i;
+    i-=i;
     i&=i;
     i|=i;
@@ -54,20 +49,3 @@
 
     i?i:i;
-
-    // cast
-/*
-    double d;
-    int *ip;
-    (int *) i;
-    (* int) i;
-    ([char, int *])[d, d];
-    [i,ip,ip] = ([int, * int, int *])[1,(void *)2,(void *)3];
-    [i,ip,ip] = ([int, * int, int *])([1,(void *)2,(void *)3]);
-*/
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
+} // main
Index: src/tests/Forall.c
===================================================================
--- src/tests/Forall.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Forall.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -10,10 +10,10 @@
 	void f( int );
 	void h( void (*p)(void) );
-  
+
 	int x;
 	void (*y)(void);
 	char z;
 	float w;
-  
+
 	f( x );
 	f( y );
@@ -26,10 +26,10 @@
 	forall( otype T ) void f( T, T );
 	forall( otype T, otype U ) void f( T, U );
-  
+
 	int x;
 	float y;
 	int *z;
 	float *w;
-  
+
 	f( x, y );
 	f( z, w );
@@ -46,5 +46,5 @@
 }
 
-context sumable( otype T ) {
+trait sumable( otype T ) {
 	const T 0;
 	T ?+?(T, T);
Index: c/tests/Function.c
===================================================================
--- src/tests/Function.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ 	(revision )
@@ -1,32 +1,0 @@
-int a;
-float a;
-int f( int );
-float f( float );
-
-void g() {
-	// selects the same f each time but without a cast would be ambiguous
-	f( (int)a );
-	(int)f( a );
-}
-
-[ int ] p;
-[ int, double ] p;
-[ int, int, int ] p;
-[ int, int, int, int ] p;
-
-[ char ] q;
-[ int, int ] q;
-[ int, int, float ] q;
-[ int, int, int, int ] q;
-
-[ int, int ] r( int, int, int, int );
-
-void s() {
-	r( p, q );
-	r( [ q, p ] );
-	r( r( p, q ), r( q, q ) );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: src/tests/GccExtensions.c
===================================================================
--- src/tests/GccExtensions.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/GccExtensions.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,49 +1,57 @@
-int main(int argc, char const *argv[])
-    asm( "nop" );
-    __asm( "nop" );
-    __asm__( "nop" );
+int main(int argc, char const *argv[]) {
+	asm( "nop" );
+	__asm( "nop" );
+	__asm__( "nop" );
 
-    __complex__ c1;
-    _Complex c2;
+	__complex__ c1;
+	_Complex c2;
 
-    const int i1;
-    __const int i2;
-    __const__ int i3;
+	const int i1;
+	__const int i2;
+	__const__ int i3;
 
-    __extension__ const int ex;
+	__extension__ const int ex;
+	struct S {
+		__extension__ int a, b, c;
+	};
+	int i = __extension__ 3;
+	__extension__ int a, b, c;
+	__extension__ a, __extension__ b, __extension__ c;
+	__extension__ a = __extension__ b + __extension__ c;
+	__extension__ a = __extension__ ( __extension__ b + __extension__ c );
 
-    __inline int f1();
-    __inline__ int f2();
+	__inline int f1() {}
+	__inline__ int f2() {}
 
-    __signed s1;
-    __signed s2;
+	__signed s1;
+	__signed s2;
 
-    __otypeof(s1) t1;
-    __otypeof__(s1) t2;
+	__typeof(s1) t1;
+	__typeof__(s1) t2;
 
-    __volatile int v1;
-    __volatile__ int v2;
+	__volatile int v1;
+	__volatile__ int v2;
 
-    __attribute__(()) int a1;
-    const __attribute(()) int a2;
-    const static __attribute(()) int a3;
-    const static int __attribute(()) a4;
-    const static int a5 __attribute(());
-    const static int a6, __attribute(()) a7;
+	__attribute__(()) int a1;
+	const __attribute(()) int a2;
+	const static __attribute(()) int a3;
+	const static int __attribute(()) a4;
+	const static int a5 __attribute(());
+	const static int a6, __attribute(()) a7;
 
-    int * __attribute(()) p1;
-    int (* __attribute(()) p2);
-//    int (__attribute(()) (p3));
-//    int ( __attribute(()) (* __attribute(()) p4));
+	int * __attribute(()) p1;
+	int (* __attribute(()) p2);
+//	int (__attribute(()) (p3));
+//	int ( __attribute(()) (* __attribute(()) p4));
 
-    struct __attribute(()) s1;
-    struct __attribute(()) s2 { int i; };
-    struct __attribute(()) s3 { int i; } x1, __attribute(()) y1;
-    struct __attribute(()) s4 { int i; } x2, y2 __attribute(());
+	struct __attribute(()) s1;
+	struct __attribute(()) s2 { int i; };
+	struct __attribute(()) s3 { int i; } x1, __attribute(()) y1;
+	struct __attribute(()) s4 { int i; } x2, y2 __attribute(());
 
-    int m1 [10] __attribute(());
-    int m2 [10][10] __attribute(());
-    int __attribute(()) m3 [10][10];
-//    int ( __attribute(()) m4 [10] )[10];
+	int m1 [10] __attribute(());
+	int m2 [10][10] __attribute(());
+	int __attribute(()) m3 [10][10];
+//	int ( __attribute(()) m4 [10] )[10];
 
 	return 0;
Index: src/tests/IdentFuncDeclarator.c
===================================================================
--- src/tests/IdentFuncDeclarator.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/IdentFuncDeclarator.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,10 +1,3 @@
 int main() {
-	//int f0[]();
-	//int (f0[])();
-	//int f0()[];
-	//int f0()();
-	//int (*f0)()();
-	//int ((*f0())())[];
-
 	int f1;
 	int (f2);
@@ -25,59 +18,59 @@
 	int (* const * const f14);
 
-	int f15[];
+	int f15[2];
 	int f16[10];
-	int (f17[]);
+	int (f17[2]);
 	int (f18[10]);
 
-	int *f19[];
+	int *f19[2];
 	int *f20[10];
-	int **f21[];
+	int **f21[2];
 	int **f22[10];
-	int * const *f23[];
+	int * const *f23[2];
 	int * const *f24[10];
-	int * const * const f25[];
+	int * const * const f25[2];
 	int * const * const f26[10];
 
-	int *(f27[]);
+	int *(f27[2]);
 	int *(f28[10]);
-	int **(f29[]);
+	int **(f29[2]);
 	int **(f30[10]);
-	int * const *(f31[]);
+	int * const *(f31[2]);
 	int * const *(f32[10]);
-	int * const * const (f33[]);
+	int * const * const (f33[2]);
 	int * const * const (f34[10]);
 
-	int (*f35[]);
+	int (*f35[2]);
 	int (*f36[10]);
-	int (**f37[]);
+	int (**f37[2]);
 	int (**f38[10]);
-	int (* const *f39[]);
+	int (* const *f39[2]);
 	int (* const *f40[10]);
-	int (* const * const f41[]);
+	int (* const * const f41[2]);
 	int (* const * const f42[10]);
 
-	int f43[][3];
+	int f43[2][3];
 	int f44[3][3];
-	int (f45[])[3];
+	int (f45[2])[3];
 	int (f46[3])[3];
-	int ((f47[]))[3];
+	int ((f47[2]))[3];
 	int ((f48[3]))[3];
 
-	int *f49[][3];
+	int *f49[2][3];
 	int *f50[3][3];
-	int **f51[][3];
+	int **f51[2][3];
 	int **f52[3][3];
-	int * const *f53[][3];
+	int * const *f53[2][3];
 	int * const *f54[3][3];
-	int * const * const f55[][3];
+	int * const * const f55[2][3];
 	int * const * const f56[3][3];
 
-	int (*f57[][3]);
+	int (*f57[2][3]);
 	int (*f58[3][3]);
-	int (**f59[][3]);
+	int (**f59[2][3]);
 	int (**f60[3][3]);
-	int (* const *f61[][3]);
+	int (* const *f61[2][3]);
 	int (* const *f62[3][3]);
-	int (* const * const f63[][3]);
+	int (* const * const f63[2][3]);
 	int (* const * const f64[3][3]);
 
Index: src/tests/IdentFuncParamDeclarator.c
===================================================================
--- src/tests/IdentFuncParamDeclarator.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/IdentFuncParamDeclarator.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,10 +1,3 @@
 int fred(
-	//int f0[](),
-	//int (f0[])(),
-	//int f0()[],
-	//int f0()(),
-	//int (*f0)()(),
-	//int ((*f0())())[],
-
 	int f1,
 	int (f2),
@@ -147,6 +140,5 @@
 	int * const *(f116[static const 3][3]),
 	int * const * const (f117[static const 3][3])
-	) {
-}
+    );
 
 //Dummy main
Index: src/tests/LabelledExit.c
===================================================================
--- src/tests/LabelledExit.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/LabelledExit.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,3 +1,3 @@
-int main() {
+int foo() {
   	int i;
   	int x, y;
@@ -130,5 +130,5 @@
 	}
 
-#if 0
+#if 1
   Q: if ( i > 5 ) {
 		i += 1;
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Makefile.am	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jan 25 22:31:42 2016
-## Update Count     : 25
+## Last Modified On : Mon Jun 20 14:30:52 2016
+## Update Count     : 33
 ###############################################################################
 
@@ -19,6 +19,29 @@
 CC = @CFA_BINDIR@/cfa
 
-noinst_PROGRAMS = fstream_test vector_test avl_test # build but do not install
+.PHONY : list
+EXTRA_PROGRAMS = fstream_test vector_test avl_test Constant0-1DP Constant0-1ND Constant0-1NDDP # build but do not install
+
 fstream_test_SOURCES = fstream_test.c
 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
 avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
+
+all-local :
+	python test.py vector_test avl_test Operators NumericConstants Expression Enum AsmName Array Typeof Cast
+
+all-tests :
+	python test.py --all
+
+clean-local :
+	-rm -f ${EXTRA_PROGRAMS}
+
+list :
+	python test.py --list
+
+Constant0-1DP : Constant0-1.c
+	${CC} ${CFLAGS} -DDUPS ${<} -o ${@}
+
+Constant0-1ND : Constant0-1.c
+	${CC} ${CFLAGS} -DNEWDECL ${<} -o ${@}
+
+Constant0-1NDDP : Constant0-1.c
+	${CC} ${CFLAGS} -DNEWDECL -DDUPS ${<} -o ${@}
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Makefile.in	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -18,5 +18,4 @@
 ######################## -*- Mode: Makefile-Automake -*- ######################
 ###############################################################################
-
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
@@ -36,6 +35,7 @@
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
-noinst_PROGRAMS = fstream_test$(EXEEXT) vector_test$(EXEEXT) \
-	avl_test$(EXEEXT)
+EXTRA_PROGRAMS = fstream_test$(EXEEXT) vector_test$(EXEEXT) \
+	avl_test$(EXEEXT) Constant0-1DP$(EXEEXT) \
+	Constant0-1ND$(EXEEXT) Constant0-1NDDP$(EXEEXT)
 subdir = src/tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
@@ -48,5 +48,13 @@
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
+Constant0_1DP_SOURCES = Constant0-1DP.c
+Constant0_1DP_OBJECTS = Constant0-1DP.$(OBJEXT)
+Constant0_1DP_LDADD = $(LDADD)
+Constant0_1ND_SOURCES = Constant0-1ND.c
+Constant0_1ND_OBJECTS = Constant0-1ND.$(OBJEXT)
+Constant0_1ND_LDADD = $(LDADD)
+Constant0_1NDDP_SOURCES = Constant0-1NDDP.c
+Constant0_1NDDP_OBJECTS = Constant0-1NDDP.$(OBJEXT)
+Constant0_1NDDP_LDADD = $(LDADD)
 am_avl_test_OBJECTS = avl_test.$(OBJEXT) avl0.$(OBJEXT) avl1.$(OBJEXT) \
 	avl2.$(OBJEXT) avl3.$(OBJEXT) avl4.$(OBJEXT) \
@@ -84,7 +92,9 @@
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \
+SOURCES = Constant0-1DP.c Constant0-1ND.c Constant0-1NDDP.c \
+	$(avl_test_SOURCES) $(fstream_test_SOURCES) \
 	$(vector_test_SOURCES)
-DIST_SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \
+DIST_SOURCES = Constant0-1DP.c Constant0-1ND.c Constant0-1NDDP.c \
+	$(avl_test_SOURCES) $(fstream_test_SOURCES) \
 	$(vector_test_SOURCES)
 ETAGS = etags
@@ -235,7 +245,4 @@
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
-
-clean-noinstPROGRAMS:
-	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
 avl_test$(EXEEXT): $(avl_test_OBJECTS) $(avl_test_DEPENDENCIES) $(EXTRA_avl_test_DEPENDENCIES) 
 	@rm -f avl_test$(EXEEXT)
@@ -254,4 +261,7 @@
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constant0-1DP.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constant0-1ND.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constant0-1NDDP.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl-private.Po@am__quote@
@@ -504,5 +514,5 @@
 check-am: all-am
 check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile all-local
 installdirs:
 install: install-am
@@ -538,5 +548,5 @@
 clean: clean-am
 
-clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am
+clean-am: clean-generic clean-local mostlyclean-am
 
 distclean: distclean-am
@@ -607,6 +617,6 @@
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-noinstPROGRAMS ctags distclean distclean-compile \
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+	clean-generic clean-local ctags distclean distclean-compile \
 	distclean-generic distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
@@ -621,4 +631,27 @@
 
 
+.PHONY : list
+
+all-local :
+	python test.py vector_test avl_test Operators NumericConstants Expression Enum AsmName Array Typeof Cast
+
+all-tests :
+	python test.py --all
+
+clean-local :
+	-rm -f ${EXTRA_PROGRAMS}
+
+list :
+	python test.py --list
+
+Constant0-1DP : Constant0-1.c
+	${CC} ${CFLAGS} -DDUPS ${<} -o ${@}
+
+Constant0-1ND : Constant0-1.c
+	${CC} ${CFLAGS} -DNEWDECL ${<} -o ${@}
+
+Constant0-1NDDP : Constant0-1.c
+	${CC} ${CFLAGS} -DNEWDECL -DDUPS ${<} -o ${@}
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
Index: src/tests/NumericConstants.c
===================================================================
--- src/tests/NumericConstants.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/NumericConstants.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,54 +1,50 @@
 int main() {
-    1;							/* decimal */
-    2_1;
-    2_147_483_647;
-    37LL;
-    45ull;
-    89llu;
-    99LLu;
-    56_lu;
-    88_LLu;
+	1;							// decimal
+	2_1;
+	2_147_483_647;
+	37LL;
+	45ull;
+	89llu;
+	99LLu;
+	56_lu;
+	88_LLu;
 
-//    0;							/* octal */
-    0u;
-    0_3_77;
-    0_377_ul;
+//	0;							// octal
+	0u;
+	0_3_77;
+	0_377_ul;
 
-    0x1;						/* hexadecimal */
-    0x1u;
-    0xabL;
-    0x_80000000;
-    0x_fff;
-    0x_ef3d_aa5c;
-    0x_3LL;
+	0x1;						// hexadecimal
+	0x1u;
+	0xabL;
+	0x_80000000;
+	0x_fff;
+	0x_ef3d_aa5c;
+	0x_3LL;
 
-    3.;							/* integral real */
-    3_100.;
-    1_000_000.;
+	3.;							// integral real
+	3_100.;
+	1_000_000.;
 
-    3.1;						/* integral/fractional real */
-    3.141_592_654L;
-    123_456.123_456;
+	3.1;						// integral/fractional real
+	3.141_592_654L;
+	123_456.123_456;
 
-    3E1;						/* integral/exponent real */
-    3_e1f;
-    3_E1_1_F;
-    3_E_11;
-    3_e_+11;
-    3_E_-11;
+	3E1;						// integral/exponent real
+	3_e1f;
+	3_E1_1_F;
+	3_E_11;
+	3_e_+11;
+	3_E_-11;
 
-    3.0E1;						/* integral/fractional/exponent real */
-    3.0_E1L;
-    3.0_e1_1;
-    3.0_E_11_l;
-    3.0_e_+11l;
-    3.0_E_-11;
-    123_456.123_456E-16;
+	3.0E1;						// integral/fractional/exponent real
+	3.0_E1L;
+	3.0_e1_1;
+	3.0_E_11_l;
+	3.0_e_+11l;
+	3.0_E_-11;
+	123_456.123_456E-16;
 
-    0x_ff.ffp0;						/* hex real */
-    0x_1.ffff_ffff_p_128_l;
+	0x_ff.ffp0;					// hex real
+	0x_1.ffff_ffff_p_128_l;
 }
-
-// Local Variables: //
-// compile-command: "../../../bin/cfa -std=c99 NumericConstants.c" //
-// End: //
Index: src/tests/OccursError.c
===================================================================
--- src/tests/OccursError.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/OccursError.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,6 +1,8 @@
-forall( otype T ) void f( void (*)( T, T* ) );
-forall( otype U ) void g( U*, U );
+forall( otype T ) void f( void (*)( T, T * ) );
+forall( otype U ) void g( U,  U * );
+forall( otype U ) void h( U *, U );
 
 void test() {
+    f( h );
     f( g );
 }
Index: src/tests/Operators.c
===================================================================
--- src/tests/Operators.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Operators.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,3 +1,5 @@
-int ?*?( int, int );
+int ?*?( int a, int b ) {
+	return 0;
+}
 
 int ?()( int number1, int number2 ) {
@@ -5,12 +7,18 @@
 }
 
-int ?+?( int, int );
+int ?+?( int a, int b ) {
+	return 0;
+}
 
-int ?=?( int *, int );
+int ?=?( int *a, int b ) {
+	return 0;
+}
 struct accumulator {
 	int total;
 };
 
-char ?()( struct accumulator a, char number1, char number2 );
+char ?()( struct accumulator a, char number1, char number2 ) {
+	return 'a';
+}
 
 void f( void ) {
@@ -23,4 +31,9 @@
 }
 
+int main(int argc, char const *argv[]) {
+	/* code */
+	return 0;
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/tests/Scope.c
===================================================================
--- src/tests/Scope.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Scope.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -3,17 +3,22 @@
 typedef float t;
 y z;
-otype u = struct { int a; double b; };
+//otype u = struct { int a; double b; };
+typedef struct { int a; double b; } u;
 int f( int y );
 y q;
+struct x { int x; };
 
 y w( y y, u v ) {
-	otype x | { x t(u); };
+//	otype x | { x t(u); };
+	void ?{}(struct x *);
+	void ^?{}(struct x *);
+	extern struct x t( u );
 	u u = y;
-	x z = t(u);
+	struct x z = t(u);
 }
 
 y p;
 
-context has_u( otype z ) {
+trait has_u( otype z ) {
 	z u(z);
 };
@@ -40,11 +45,13 @@
 }
 
+void some_func() {}
+
 t g( void ) {
 	typedef char x;
-	try {
+//	try {
 		some_func();
-	} catch ( x x ) {
-		t y = x;
-	}
+//	} catch ( x x ) {
+//		t y = x;
+//	}
 	x z;
 }
Index: src/tests/ShortCircuit.c
===================================================================
--- src/tests/ShortCircuit.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/ShortCircuit.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,8 +1,4 @@
-int ?!=?( int, int );
-int ?!=?( float, float );
-int 0;
-
-void g( float );
-void g( int );
+void g( float f ) {}
+void g( int i ) {}
 
 void f( int a ) {
@@ -14,7 +10,46 @@
 }
 
-//Dummy main
+void g() {
+    int a;
+    struct { int b; } a;
+    if ( a ) {
+		while ( a ) {
+			int *b;
+			for ( b; a; b ) {
+			}
+		}
+    }
+}
+
+#include <fstream>
+
+struct test_t {
+	int x;
+};
+
+int ?!=?( test_t lhs, int rhs ) {
+	sout | lhs.x | " ";
+	return lhs.x != 0;
+}
+
+
 int main(int argc, char const *argv[])
 {
+	test_t true_val, false_val;
+	true_val.x = 1;
+	false_val.x = 0;
+
+	true_val && false_val;
+	sout | endl;
+
+	true_val || false_val;
+	sout | endl;
+
+	false_val && true_val;
+	sout | endl;
+
+	false_val || true_val;
+	sout | endl;
+
 	return 0;
 }
Index: c/tests/Statement.c
===================================================================
--- src/tests/Statement.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ 	(revision )
@@ -1,19 +1,0 @@
-int ?=?( int *, int );
-int ?!=?( int, int );
-int 0;
-
-void f() {
-    int a;
-    struct { int b; } a;
-    if ( a ) {
-		while ( a ) {
-			int *b;
-			for ( b; a; b ) {
-			}
-		}
-    }
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: src/tests/StructMember.c
===================================================================
--- src/tests/StructMember.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/StructMember.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -10,5 +10,4 @@
 	int (*m10)();
 	int *(*m11)(int);
-	T T;
 	T (T);
 
Index: src/tests/Subrange.c
===================================================================
--- src/tests/Subrange.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Subrange.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,5 +1,5 @@
 // A small context defining the notion of an ordered otype.  (The standard
 // library should probably contain a context for this purpose.)
-context ordered(otype T) {
+trait ordered(otype T) {
     int ?<?(T, T), ?<=?(T, T);
 };
Index: src/tests/Switch.c
===================================================================
--- src/tests/Switch.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Switch.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,3 +1,3 @@
-int fred() {
+int main(int argc, char const *argv[]) {
     int i;
     switch ( i ) case 3 : i = 1;
Index: src/tests/Tuples.c
===================================================================
--- src/tests/Tuples.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
+++ src/tests/Tuples.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -0,0 +1,32 @@
+int a;
+float a;
+int f( int );
+float f( float );
+
+void g() {
+	// selects the same f each time but without a cast would be ambiguous
+	f( (int)a );
+	(int)f( a );
+}
+
+[ int ] p;
+[ int, double ] p;
+[ int, int, int ] p;
+[ int, int, int, int ] p;
+
+[ char ] q;
+[ int, int ] q;
+[ int, int, float ] q;
+[ int, int, int, int ] q;
+
+[ int, int ] r( int, int, int, int );
+
+void s() {
+	r( p, q );
+	r( [ q, p ] );
+	r( r( p, q ), r( q, q ) );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: src/tests/Typedef.c
===================================================================
--- src/tests/Typedef.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Typedef.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -18,5 +18,5 @@
 a c;
 
-typedef otypeof(3) x, y;  // GCC
+typedef typeof(3) x, y;  // GCC
 
 x p;
@@ -24,5 +24,5 @@
 
 int main() {
-    typedef otypeof(3) z, p;
+    typedef typeof(3) z, p;
     z w;
     p x;
Index: src/tests/Typeof.c
===================================================================
--- src/tests/Typeof.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/Typeof.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -1,10 +1,10 @@
 int main() {
     int *v1;
-    otypeof(v1) v2;
-    otypeof(*v1) v3[4];
+    typeof(v1) v2;
+    typeof(*v1) v3[4];
     char *v4[4];
-    otypeof(otypeof(char *)[4]) v5;
-    otypeof (int *) v6;
-    otypeof( int ( int, int p ) ) *v7;
-    otypeof( [int] ( int, int p ) ) *v8;
+    typeof(typeof(char *)[4]) v5;
+    typeof (int *) v6;
+    typeof( int ( int, int p ) ) *v7;
+    typeof( [int] ( int, int p ) ) *v8;
 }
Index: src/tests/limits.c
===================================================================
--- src/tests/limits.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/limits.c	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// limits.c -- 
+// limits.c --
 //
 // Author           : Peter A. Buhr
@@ -12,5 +12,5 @@
 // Last Modified On : Tue May 10 20:45:28 2016
 // Update Count     : 1
-// 
+//
 
 #include <limits>
@@ -109,4 +109,9 @@
 long _Complex _1_sqrt_2 = _1_SQRT_2;
 
+int main(int argc, char const *argv[]) {
+	//DUMMY
+	return 0;
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: c/tests/poly-bench.c
===================================================================
--- src/tests/poly-bench.c	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ 	(revision )
@@ -1,207 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// poly-bench.cc -- 
-//
-// Author           : Aaron Moss
-// Created On       : Sat May 16 07:26:30 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:25:19 2015
-// Update Count     : 5
-//
-
-extern "C" {
-#include <stdio.h>
-//#include "my_time.h"
-}
-
-#define N 200000000
-
-struct ipoint {
-	int x;
-	int y;
-};
-
-struct ipoint ?+?(struct ipoint a, struct ipoint b) {
-	struct ipoint r;
-	r.x = a.x + b.x;
-	r.y = a.y + b.y;
-	return r;
-}
-
-struct ipoint ?-?(struct ipoint a, struct ipoint b) {
-	struct ipoint r;
-	r.x = a.x - b.x;
-	r.y = a.y - b.y;
-	return r;
-}
-
-struct ipoint ?*?(struct ipoint a, struct ipoint b) {
-	struct ipoint r;
-	r.x = a.x * b.x;
-	r.y = a.y * b.y;
-	return r;
-}
-
-struct dpoint {
-	double x;
-	double y;
-};
-
-struct dpoint ?+?(struct dpoint a, struct dpoint b) {
-	struct dpoint r;
-	r.x = a.x + b.x;
-	r.y = a.y + b.y;
-	return r;
-}
-
-struct dpoint ?-?(struct dpoint a, struct dpoint b) {
-	struct dpoint r;
-	r.x = a.x - b.x;
-	r.y = a.y - b.y;
-	return r;
-}
-
-struct dpoint ?*?(struct dpoint a, struct dpoint b) {
-	struct dpoint r;
-	r.x = a.x * b.x;
-	r.y = a.y * b.y;
-	return r;
-}
-
-int a2b2_mono_int(int a, int b) {
-	return (a - b)*(a + b);
-}
-
-double a2b2_mono_double(double a, double b) {
-	return (a - b)*(a + b);
-}
-
-struct ipoint a2b2_mono_ipoint(struct ipoint a, struct ipoint b) {
-	return (a - b)*(a + b);
-}
-
-struct dpoint a2b2_mono_dpoint(struct dpoint a, struct dpoint b) {
-	return (a - b)*(a + b);
-}
-
-forall(type T | { T ?+?(T,T); T ?-?(T,T); T ?*?(T,T); })
-T a2b2_poly(T a, T b) {
-	return (a - b)*(a + b);
-}
-
-typedef int clock_t;
-long ms_between(clock_t start, clock_t end) {
-//	return (end - start) / (CLOCKS_PER_SEC / 1000);
-	return 0;
-}
-int clock() { return 3; }
-
-int main(int argc, char** argv) {
-	clock_t start, end;
-	int i;
-	
-	int a, b;
-	double c, d;
-	struct ipoint p, q;
-	struct dpoint r, s;
-	
-	printf("\n## a^2-b^2 ##\n");
-	
-	a = 5, b = 3;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		a = a2b2_mono_int(a, b);
-		b = a2b2_mono_int(b, a);
-	}
-	end = clock();
-	printf("mono_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
-	
-	a = 5, b = 3;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		a = a2b2_poly(a, b);
-		b = a2b2_poly(b, a);
-	}
-	end = clock();
-	printf("poly_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
-	
-/*	{
-	a = 5, b = 3;
-	// below doesn't actually work; a2b2_poly isn't actually assigned, just declared
-	* [int] (int, int) a2b2_poly = a2b2_mono_int;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-//			printf("\t[%d,%d]\n", a, b);
-a = a2b2_poly(a, b);
-//			printf("\t[%d,%d]\n", a, b);
-b = a2b2_poly(b, a);
-}
-end = clock();
-printf("spec_int:   %7ld  [%d,%d]\n", ms_between(start, end), a, b);
-}
-*/	
-	c = 5.0, d = 3.0;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		c = a2b2_mono_double(c, d);
-		d = a2b2_mono_double(d, c);
-	}
-	end = clock();
-	printf("mono_double:%7ld  [%f,%f]\n", ms_between(start, end), c, d);
-		
-	c = 5.0, d = 3.0;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		c = a2b2_poly(c, d);
-		d = a2b2_poly(d, c);
-	}
-	end = clock();
-	printf("poly_double:%7ld  [%f,%f]\n", ms_between(start, end), c, d);
-	
-	p.x = 5, p.y = 5, q.x = 3, q.y = 3;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		p = a2b2_mono_ipoint(p, q);
-		q = a2b2_mono_ipoint(q, p);
-	}
-	end = clock();
-	printf("mono_ipoint:%7ld  [(%d,%d),(%d,%d)]\n", ms_between(start, end), p.x, p.y, q.x, q.y);
-		
-	p.x = 5, p.y = 5, q.x = 3, q.y = 3;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		p = a2b2_poly(p, q);
-		q = a2b2_poly(q, p);
-	}
-	end = clock();
-	printf("poly_ipoint:%7ld  [(%d,%d),(%d,%d)]\n", ms_between(start, end), p.x, p.y, q.x, q.y);
-	
-	r.x = 5.0, r.y = 5.0, s.x = 3.0, s.y = 3.0;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		r = a2b2_mono_dpoint(r, s);
-		s = a2b2_mono_dpoint(s, r);
-	}
-	end = clock();
-	printf("mono_dpoint:%7ld  [(%f,%f),(%f,%f)]\n", ms_between(start, end), r.x, r.y, s.x, s.y);
-		
-	r.x = 5.0, r.y = 5.0, s.x = 3.0, s.y = 3.0;
-	start = clock();
-	for (i = 0; i < N/2; ++i) {
-		r = a2b2_poly(r, s);
-		s = a2b2_poly(s, r);
-	}
-	end = clock();
-	printf("poly_dpoint:%7ld  [(%f,%f),(%f,%f)]\n", ms_between(start, end), r.x, r.y, s.x, s.y);
-
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa poly-bench.c" //
-// End: //
Index: c/tests/runTests.sh
===================================================================
--- src/tests/runTests.sh	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ 	(revision )
@@ -1,72 +1,0 @@
-#!/bin/bash
-
-##############################################################################
-#
-# Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-#
-# The contents of this file are covered under the licence agreement in the
-# file "LICENCE" distributed with Cforall.
-#
-# Runs integration tests for cfa-cc.
-#
-# Output of test run will be copied into $logfile (default: tests/log.txt).
-# Build failures for tests will be placed in tests/$test.make.txt, incorrect
-# output in tests/$test.run.txt.
-#
-# Author           : Aaron B. Moss
-# Created On       : Mon Nov 23 14:19:00 2015
-# Last Modified By : Aaron B. Moss
-# Last Modified On : Mon Nov 23 14:19:00 2015
-# Update Count     : 1
-#
-##############################################################################
-
-# list of tests to run;
-# Should be a make target for each test that generates an executable in the
-# current directory named the same; should also be an input file
-# tests/$test.in.txt and expected output tests/$test.out.txt
-# tests="vector_test avl_test"
-#
-# # log file for test output;
-# # reset at the beginning of each run
-# logfile=tests/log.txt
-# touch $logfile && rm $logfile
-#
-# # clean existing build artifacts before run
-# make clean > /dev/null 2>&1
-#
-# ret_val=0
-#
-# for test in $tests; do
-# 	echo -n "    $test" | tee -a $logfile
-#
-# 	# build, skipping to next test on error
-# 	if ! make -j 8 $test > tests/$test.make.txt 2>&1; then
-# 		ret_val=1
-# 		echo -e "\tFAILED with build error:" | tee -a $logfile
-# 		cat tests/$test.make.txt | tee -a $logfile
-# 		continue
-# 	fi
-# 	rm tests/$test.make.txt
-#
-# 	# run, testing against expected output
-# 	./$test < tests/$test.in.txt > tests/$test.run.txt 2>&1
-# 	if ! diff tests/$test.out.txt tests/$test.run.txt > tests/$test.diff.txt; then
-# 		ret_val=1
-# 		echo -e "\tFAILED with output mismatch:" | tee -a $logfile
-# 		cat tests/$test.diff.txt | tee -a $logfile
-# 		continue
-# 	fi
-# 	rm tests/$test.run.txt tests/$test.diff.txt ./$test
-#
-# 	echo -e "\tPASSED" | tee -a $logfile
-# done
-#
-# exit $((ret_val))
-
-tests="vector_test avl_test"
-
-python test.py ${tests}
-
-ret_val=0
-exit $((ret_val))
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/tests/test.py	(revision f1ee72ea704571103fb3d99d6d072a851023a942)
@@ -2,9 +2,11 @@
 from __future__ import print_function
 
-from os import listdir
-from os.path import isfile, join
+from os import listdir, environ
+from os.path import isfile, join, splitext
 from subprocess import Popen, PIPE, STDOUT
 
 import argparse
+import os
+import re
 import sys
 
@@ -13,8 +15,7 @@
 ################################################################################
 def listTests():
-	list = [f.rstrip('.c') for f in listdir('.')
-		if not f.startswith('.') and (
-			not isfile(f) or f.endswith('.c')
-		)]
+	list = [splitext(f)[0] for f in listdir('./.expect')
+		if not f.startswith('.') and f.endswith('.txt')
+		]
 
 	return list
@@ -29,4 +30,24 @@
 		return proc.returncode
 
+def file_replace(fname, pat, s_after):
+    # first, see if the pattern is even in the file.
+    with open(fname) as f:
+        if not any(re.search(pat, line) for line in f):
+            return # pattern does not occur in file so we are done.
+
+    # pattern is in the file, so perform replace operation.
+    with open(fname) as f:
+        out_fname = fname + ".tmp"
+        out = open(out_fname, "w")
+        for line in f:
+            out.write(re.sub(pat, s_after, line))
+        out.close()
+        os.rename(out_fname, fname)
+
+def fix_MakeLevel(file) :
+	if environ.get('MAKELEVEL') :
+		file_replace(file, "make\[%i\]" % int(environ.get('MAKELEVEL')), 'make' )
+
+
 ################################################################################
 #               running test functions
@@ -40,5 +61,5 @@
 
 	# build, skipping to next test on error
-	make_ret = sh("make -j 8 %s > %s 2>&1" % (test, out_file), dry_run)
+	make_ret = sh("make -j 8 %s 2> %s 1> /dev/null" % (test, out_file), dry_run)
 
 	if make_ret == 0 :
@@ -50,8 +71,8 @@
 
 	retcode = 0
+
+	fix_MakeLevel(out_file)
+
 	if not generate :
-		# touch expected files so empty output are supported by default
-		sh("touch .expect/%s.txt" % test, dry_run)
-
 		# diff the output of the files
 		retcode = sh("diff .expect/%s.txt .out/%s.log" % (test, test), dry_run)
@@ -67,11 +88,9 @@
 
 	if generate :
-		print( "Regenerate tests for: ", end="" )
-		print( ", ".join( tests ) )
+		print( "Regenerate tests for: " )
 
 	failed = False;
 	for t in tests:
-		if not generate :
-			print("%20s  " % t, end="")
+		print("%20s  " % t, end="")
 		sys.stdout.flush()
 		test_failed = run_test_instance(t, generate, dry_run)
@@ -80,11 +99,10 @@
 		if not generate :
 			print("FAILED" if test_failed else "PASSED")
+		else :
+			print( "Done" )
 
 	sh('make clean > /dev/null 2>&1', dry_run)
 
-	if generate :
-		print( "Done" )
-
-	return 0 if failed else 1
+	return 1 if failed else 0
 
 ################################################################################
@@ -93,16 +111,37 @@
 parser = argparse.ArgumentParser(description='Script which runs cforall tests')
 parser.add_argument('--dry-run', help='Don\'t run the tests, only output the commands', action='store_true')
+parser.add_argument('--list', help='List all test available', action='store_true')
 parser.add_argument('--all', help='Run all test available', action='store_true')
-parser.add_argument('--generate-expected', help='Regenerate the .expect by running the specified tets, can be used with --all option', action='store_true')
+parser.add_argument('--regenerate-expected', help='Regenerate the .expect by running the specified tets, can be used with --all option', action='store_true')
 parser.add_argument('tests', metavar='test', type=str, nargs='*', help='a list of tests to run')
 
 options = parser.parse_args()
 
-if len(options.tests) > 0 and options.all :
+if (len(options.tests) > 0  and     options.all and not options.list) \
+or (len(options.tests) == 0 and not options.all and not options.list) :
 	print('ERROR: must have option \'--all\' or non-empty test list', file=sys.stderr)
 	parser.print_help()
 	sys.exit(1)
 
-tests = listTests() if options.all else options.tests
+allTests = listTests()
 
-sys.exit( run_tests(tests, options.generate_expected, options.dry_run) )
+if options.all or options.list :
+	tests = allTests
+
+else :
+	tests = []
+	for test in options.tests:
+		if test in allTests :
+			tests.append(test)
+		else :
+			print('ERROR: No expected file for test %s, ignoring it' % test, file=sys.stderr)
+
+	if len(tests) == 0 :
+		print('ERROR: No valid test to run', file=sys.stderr)
+		sys.exit(1)
+
+if options.list :
+	print("\n".join(tests))
+
+else :
+	sys.exit( run_tests(tests, options.regenerate_expected, options.dry_run) )
