Index: ossp-adm/autotools/README RCS File: /v/ossp/cvs/ossp-adm/autotools/README,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/README,v' | diff -u /dev/null - -L'ossp-adm/autotools/README' 2>/dev/null --- ossp-adm/autotools/README +++ - 2025-04-19 11:54:39.034493896 +0200 @@ -0,0 +1,18 @@ + +Development Tools Documentation +=============================== + +autoconf.html ....... GNU Autoconf 2.53 +bison.html .......... GNU Bison 1.30 manual +flex.html ........... GNU Flex 2.5.8 manual (beta!) +lex.pdf ............. Original Lex manual page +lexyacc-code.zip .... corresponding code +lexyacc.pdf ......... ePaperPress Compact Guide to Lex & Yacc http://epaperpress.com/lexandyacc/ +libtool.html ........ GNU Libtool 1.4.2 +oper-code.zip ....... corresponding code +oper.pdf ............ ePaperPress How To Parse Expression http://epaperpress.com/oper/ +shtool.html ......... GNU Shtool 1.6.0 +treecc.html ......... TreeCC 0.1.0 manual +treecc.pdf .......... FSM, http://www.rons.net.cn/english/FSM/issue02 +yacc.pdf ............ Original Yacc manual page + Index: ossp-adm/autotools/autoconf.html RCS File: /v/ossp/cvs/ossp-adm/autotools/autoconf.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/autoconf.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/autoconf.html' 2>/dev/null --- ossp-adm/autotools/autoconf.html +++ - 2025-04-19 11:54:39.037167805 +0200 @@ -0,0 +1,17513 @@ + + + + +Autoconf + + +

Autoconf

+

Creating Automatic Configuration Scripts

+

Edition 2.53, for Autoconf version 2.53

+

8 March 2002

+
David MacKenzie
+
Ben Elliston
+
Akim Demaille
+

+


+ + +

Introduction

+ + +
+A physicist, an engineer, and a computer scientist were discussing the
+nature of God.  ``Surely a Physicist,'' said the physicist, ``because
+early in the Creation, God made Light; and you know, Maxwell's
+equations, the dual nature of electromagnetic waves, the relativistic
+consequences...'' ``An Engineer!,'' said the engineer, ``because
+before making Light, God split the Chaos into Land and Water; it takes a
+hell of an engineer to handle that big amount of mud, and orderly
+separation of solids from liquids...'' The computer scientist
+shouted: ``And the Chaos, where do you think it was coming from, hmm?''
+
+---Anonymous
+
+ +

+Autoconf is a tool for producing shell scripts that automatically +configure software source code packages to adapt to many kinds of +UNIX-like systems. The configuration scripts produced by Autoconf +are independent of Autoconf when they are run, so their users do not +need to have Autoconf. + + +

+The configuration scripts produced by Autoconf require no manual user +intervention when run; they do not normally even need an argument +specifying the system type. Instead, they individually test for the +presence of each feature that the software package they are for might need. +(Before each check, they print a one-line message stating what they are +checking for, so the user doesn't get too bored while waiting for the +script to finish.) As a result, they deal well with systems that are +hybrids or customized from the more common UNIX variants. There is +no need to maintain files that list the features supported by each +release of each variant of UNIX. + + +

+For each software package that Autoconf is used with, it creates a +configuration script from a template file that lists the system features +that the package needs or can use. After the shell code to recognize +and respond to a system feature has been written, Autoconf allows it to +be shared by many software packages that can use (or need) that feature. +If it later turns out that the shell code needs adjustment for some +reason, it needs to be changed in only one place; all of the +configuration scripts can be regenerated automatically to take advantage +of the updated code. + + +

+The Metaconfig package is similar in purpose to Autoconf, but the +scripts it produces require manual user intervention, which is quite +inconvenient when configuring large source trees. Unlike Metaconfig +scripts, Autoconf scripts can support cross-compiling, if some care is +taken in writing them. + + +

+Autoconf does not solve all problems related to making portable software +packages--for a more complete solution, it should be used in concert +with other GNU build tools like Automake and Libtool. These other tools +take on jobs like the creation of a portable, recursive `Makefile' +with all of the standard targets, linking of shared libraries, and so +on. See section The GNU build system, for more information. + + +

+Autoconf imposes some restrictions on the names of macros used with +#if in C programs (see section Preprocessor Symbol Index). + + +

+Autoconf requires GNU M4 in order to generate the scripts. It uses +features that some UNIX versions of M4, including GNU M4 1.3, +do not have. You must use version 1.4 or later of GNU M4. + + +

+See section Upgrading From Version 1, for information about upgrading from version 1. +See section History of Autoconf, for the story of Autoconf's development. +See section Questions About Autoconf, for answers to some common questions about Autoconf. + + +

+See the @href{http://www.gnu.org/software/autoconf/autoconf.html, +Autoconf web page} for up-to-date information, details on the mailing +lists, pointers to a list of known bugs, etc. + + +

+Mail suggestions to the Autoconf mailing +list. + + +

+Bug reports should be preferably submitted to the +@href{http://sources.redhat.com/cgi-bin/gnatsweb.pl?database=autoconf, +Autoconf Gnats database}, or sent to the +Autoconf Bugs mailing list. If possible, first check that your bug is +not already solved in current development versions, and that it has not +been reported yet. Be sure to include all the needed information and a +short `configure.ac' that demonstrates the problem. + + +

+Autoconf's development tree is accessible via CVS; see the Autoconf +web page for details. There is also a +@href{http://subversions.gnu.org/cgi-bin/cvsweb/autoconf/, CVSweb +interface to the Autoconf development tree}. Patches relative to the +current CVS version can be sent for review to the +Autoconf Patches mailing list. + + +

+Because of its mission, Autoconf includes only a set of often-used +macros that have already demonstrated their usefulness. Nevertheless, +if you wish to share your macros, or find existing ones, see the +@href{http://www.gnu.org/software/ac-archive/, Autoconf Macro +Archive}, which is kindly run by Peter Simons. + + + + +

The GNU build system

+ +

+Autoconf solves an important problem--reliable discovery of +system-specific build and runtime information--but this is only one +piece of the puzzle for the development of portable software. To this +end, the GNU project has developed a suite of integrated utilities to +finish the job Autoconf started: the GNU build system, whose most +important components are Autoconf, Automake, and Libtool. In this +chapter, we introduce you to those tools, point you to sources of more +information, and try to convince you to use the entire GNU build system +for your software. + + + + +

Automake

+ +

+The ubiquity of make means that a Makefile is almost the +only viable way to distribute automatic build rules for software, but +one quickly runs into make's numerous limitations. Its lack of +support for automatic dependency tracking, recursive builds in +subdirectories, reliable timestamps (e.g. for network filesystems), and +so on, mean that developers must painfully (and often incorrectly) +reinvent the wheel for each project. Portability is non-trivial, thanks +to the quirks of make on many systems. On top of all this is the +manual labor required to implement the many standard targets that users +have come to expect (make install, make distclean, +make uninstall, etc.). Since you are, of course, using Autoconf, +you also have to insert repetitive code in your Makefile.in to +recognize @CC@, @CFLAGS@, and other substitutions +provided by @command{configure}. Into this mess steps Automake. + + + +

+Automake allows you to specify your build needs in a Makefile.am +file with a vastly simpler and more powerful syntax than that of a plain +Makefile, and then generates a portable Makefile.in for +use with Autoconf. For example, the Makefile.am to build and +install a simple "Hello world" program might look like: + + + +

+bin_PROGRAMS = hello
+hello_SOURCES = hello.c
+
+ +

+The resulting Makefile.in (~400 lines) automatically supports all +the standard targets, the substitutions provided by Autoconf, automatic +dependency tracking, VPATH building, and so on. make will +build the hello program, and make install will install it +in `/usr/local/bin' (or whatever prefix was given to +@command{configure}, if not `/usr/local'). + + +

+Automake may require that additional tools be present on the +developer's machine. For example, the Makefile.in that +the developer works with may not be portable (e.g. it might use special +features of your compiler to automatically generate dependency +information). Running make dist, however, produces a +`hello-1.0.tar.gz' package (or whatever the program/version is) +with a Makefile.in that will work on any system. + + +

+The benefits of Automake increase for larger packages (especially ones +with subdirectories), but even for small programs the added convenience +and portability can be substantial. And that's not all... + + + + +

Libtool

+ +

+Very often, one wants to build not only programs, but libraries, so that +other programs can benefit from the fruits of your labor. Ideally, one +would like to produce shared (dynamically-linked) libraries, +which can be used by multiple programs without duplication on disk or in +memory and can be updated independently of the linked programs. +Producing shared libraries portably, however, is the stuff of +nightmares--each system has its own incompatible tools, compiler flags, +and magic incantations. Fortunately, GNU provides a solution: +Libtool. + + + +

+Libtool handles all the requirements of building shared libraries for +you, and at this time seems to be the only way to do so with any +portability. It also handles many other headaches, such as: the +interaction of Makefile rules with the variable suffixes of +shared libraries, linking reliably to shared libraries before they are +installed by the superuser, and supplying a consistent versioning system +(so that different versions of a library can be installed or upgraded +without breaking binary compatibility). Although Libtool, like +Autoconf, can be used on its own, it is most simply utilized in +conjunction with Automake--there, Libtool is used automatically +whenever shared libraries are needed, and you need not know its syntax. + + + + +

Pointers

+ +

+Developers who are used to the simplicity of make for small +projects on a single system might be daunted at the prospect of learning +to use Automake and Autoconf. As your software is distributed to more +and more users, however, you will otherwise quickly find yourself +putting lots of effort into reinventing the services that the GNU build +tools provide, and making the same mistakes that they once made and +overcame. (Besides, since you're already learning Autoconf, Automake +will be a piece of cake.) + + +

+There are a number of places that you can go to for more information on +the GNU build tools. + + + +

+ + + +

Making @command{configure} Scripts

+

+ + + + +

+The configuration scripts that Autoconf produces are by convention +called @command{configure}. When run, @command{configure} creates several +files, replacing configuration parameters in them with appropriate +values. The files that @command{configure} creates are: + + + +

+ +

+ + +To create a @command{configure} script with Autoconf, you need to write an +Autoconf input file `configure.ac' (or `configure.in') and run +@command{autoconf} on it. If you write your own feature tests to +supplement those that come with Autoconf, you might also write files +called `aclocal.m4' and `acsite.m4'. If you use a C header +file to contain #define directives, you might also run +@command{autoheader}, and you will distribute the generated file +`config.h.in' with the package. + + +

+Here is a diagram showing how the files that can be used in +configuration are produced. Programs that are executed are suffixed by +`*'. Optional files are enclosed in square brackets (`[]'). +@command{autoconf} and @command{autoheader} also read the installed Autoconf +macro files (by reading `autoconf.m4'). + + +

+Files used in preparing a software package for distribution: + +

+your source files --> [autoscan*] --> [configure.scan] --> configure.ac
+
+configure.ac --.
+               |   .------> autoconf* -----> configure
+[aclocal.m4] --+---+
+               |   `-----> [autoheader*] --> [config.h.in]
+[acsite.m4] ---'
+
+Makefile.in -------------------------------> Makefile.in
+
+ +

+Files used in configuring a software package: + +

+                       .-------------> [config.cache]
+configure* ------------+-------------> config.log
+                       |
+[config.h.in] -.       v            .-> [config.h] -.
+               +--> config.status* -+               +--> make*
+Makefile.in ---'                    `-> Makefile ---'
+
+ + + +

Writing `configure.ac'

+ +

+To produce a @command{configure} script for a software package, create a +file called `configure.ac' that contains invocations of the +Autoconf macros that test the system features your package needs or can +use. Autoconf macros already exist to check for many features; see +section Existing Tests, for their descriptions. For most other features, +you can use Autoconf template macros to produce custom checks; see +section Writing Tests, for information about them. For especially tricky +or specialized features, `configure.ac' might need to contain some +hand-crafted shell commands; see section Portable Shell Programming. The +@command{autoscan} program can give you a good start in writing +`configure.ac' (see section Using @command{autoscan} to Create @file{configure.ac}, for more information). + + +

+Previous versions of Autoconf promoted the name `configure.in', +which is somewhat ambiguous (the tool needed to produce this file is not +described by its extension), and introduces a slight confusion with +`config.h.in' and so on (for which `.in' means "to be +processed by @command{configure}"). Using `configure.ac' is now +preferred. + + + + +

A Shell Script Compiler

+ +

+Just as for any other computer language, in order to properly program +`configure.ac' in Autoconf you must understand what problem +the language tries to address and how it does so. + + +

+The problem Autoconf addresses is that the world is a mess. After all, +you are using Autoconf in order to have your package compile easily on +all sorts of different systems, some of them being extremely hostile. +Autoconf itself bears the price for these differences: @command{configure} +must run on all those systems, and thus @command{configure} must limit itself +to their lowest common denominator of features. + + +

+Naturally, you might then think of shell scripts; who needs +@command{autoconf}? A set of properly written shell functions is enough to +make it easy to write @command{configure} scripts by hand. Sigh! +Unfortunately, shell functions do not belong to the least common +denominator; therefore, where you would like to define a function and +use it ten times, you would instead need to copy its body ten times. + + +

+So, what is really needed is some kind of compiler, @command{autoconf}, +that takes an Autoconf program, `configure.ac', and transforms it +into a portable shell script, @command{configure}. + + +

+How does @command{autoconf} perform this task? + + +

+There are two obvious possibilities: creating a brand new language or +extending an existing one. The former option is very attractive: all +sorts of optimizations could easily be implemented in the compiler and +many rigorous checks could be performed on the Autoconf program +(e.g. rejecting any non-portable construct). Alternatively, you can +extend an existing language, such as the sh (Bourne shell) +language. + + +

+Autoconf does the latter: it is a layer on top of sh. It was +therefore most convenient to implement @command{autoconf} as a macro +expander: a program that repeatedly performs macro expansions on +text input, replacing macro calls with macro bodies and producing a pure +sh script in the end. Instead of implementing a dedicated +Autoconf macro expander, it is natural to use an existing +general-purpose macro language, such as M4, and implement the extensions +as a set of M4 macros. + + + + +

The Autoconf Language

+

+ + + +

+The Autoconf language is very different from many other computer +languages because it treats actual code the same as plain text. Whereas +in C, for instance, data and instructions have very different syntactic +status, in Autoconf their status is rigorously the same. Therefore, we +need a means to distinguish literal strings from text to be expanded: +quotation. + + +

+When calling macros that take arguments, there must not be any blank +space between the macro name and the open parenthesis. Arguments should +be enclosed within the M4 quote characters `[' and `]', and be +separated by commas. Any leading spaces in arguments are ignored, +unless they are quoted. You may safely leave out the quotes when the +argument is simple text, but always quote complex arguments such +as other macro calls. This rule applies recursively for every macro +call, including macros called from other macros. + + +

+For instance: + + + +

+AC_CHECK_HEADER([stdio.h],
+                [AC_DEFINE([HAVE_STDIO_H])],
+                [AC_MSG_ERROR([Sorry, can't do anything for you])])
+
+ +

+is quoted properly. You may safely simplify its quotation to: + + + +

+AC_CHECK_HEADER(stdio.h,
+                [AC_DEFINE(HAVE_STDIO_H)],
+                [AC_MSG_ERROR([Sorry, can't do anything for you])])
+
+ +

+Notice that the argument of AC_MSG_ERROR is still quoted; +otherwise, its comma would have been interpreted as an argument separator. + + +

+The following example is wrong and dangerous, as it is underquoted: + + + +

+AC_CHECK_HEADER(stdio.h,
+                AC_DEFINE(HAVE_STDIO_H),
+                AC_MSG_ERROR([Sorry, can't do anything for you]))
+
+ +

+In other cases, you may have to use text that also resembles a macro +call. You must quote that text even when it is not passed as a macro +argument: + + + +

+echo "Hard rock was here!  --[AC_DC]"
+
+ +

+which will result in + + + +

+echo "Hard rock was here!  --AC_DC"
+
+ +

+When you use the same text in a macro argument, you must therefore have +an extra quotation level (since one is stripped away by the macro +substitution). In general, then, it is a good idea to use double +quoting for all literal string arguments: + + + +

+AC_MSG_WARN([[AC_DC stinks  --Iron Maiden]])
+
+ +

+You are now able to understand one of the constructs of Autoconf that +has been continually misunderstood... The rule of thumb is that +whenever you expect macro expansion, expect quote expansion; +i.e., expect one level of quotes to be lost. For instance: + + + +

+AC_COMPILE_IFELSE([char b[10];],, [AC_MSG_ERROR([you lose])])
+
+ +

+is incorrect: here, the first argument of AC_COMPILE_IFELSE is +`char b[10];' and will be expanded once, which results in +`char b10;'. (There was an idiom common in Autoconf's past to +address this issue via the M4 changequote primitive, but do not +use it!) Let's take a closer look: the author meant the first argument +to be understood as a literal, and therefore it must be quoted twice: + + + +

+AC_COMPILE_IFELSE([[char b[10];]],, [AC_MSG_ERROR([you lose])])
+
+ +

+Voil`a, you actually produce `char b[10];' this time! + + +

+The careful reader will notice that, according to these guidelines, the +"properly" quoted AC_CHECK_HEADER example above is actually +lacking three pairs of quotes! Nevertheless, for the sake of readability, +double quotation of literals is used only where needed in this manual. + + +

+Some macros take optional arguments, which this documentation represents +as @ovar{arg} (not to be confused with the quote characters). You may +just leave them empty, or use `[]' to make the emptiness of the +argument explicit, or you may simply omit the trailing commas. The +three lines below are equivalent: + + + +

+AC_CHECK_HEADERS(stdio.h, [], [], [])
+AC_CHECK_HEADERS(stdio.h,,,)
+AC_CHECK_HEADERS(stdio.h)
+
+ +

+It is best to put each macro call on its own line in +`configure.ac'. Most of the macros don't add extra newlines; they +rely on the newline after the macro call to terminate the commands. +This approach makes the generated @command{configure} script a little +easier to read by not inserting lots of blank lines. It is generally +safe to set shell variables on the same line as a macro call, because +the shell allows assignments without intervening newlines. + + +

+You can include comments in `configure.ac' files by starting them +with the `#'. For example, it is helpful to begin +`configure.ac' files with a line like this: + + + +

+# Process this file with autoconf to produce a configure script.
+
+ + + +

Standard `configure.ac' Layout

+ +

+The order in which `configure.ac' calls the Autoconf macros is not +important, with a few exceptions. Every `configure.ac' must +contain a call to AC_INIT before the checks, and a call to +AC_OUTPUT at the end (see section Outputting Files). Additionally, some macros +rely on other macros having been called first, because they check +previously set values of some variables to decide what to do. These +macros are noted in the individual descriptions (see section Existing Tests), and they also warn you when @command{configure} is created if they +are called out of order. + + +

+To encourage consistency, here is a suggested order for calling the +Autoconf macros. Generally speaking, the things near the end of this +list are those that could depend on things earlier in it. For example, +library functions could be affected by types and libraries. + + + +

+Autoconf requirements
+AC_INIT(package, version, bug-report-address)
+information on the package
+checks for programs
+checks for libraries
+checks for header files
+checks for types
+checks for structures
+checks for compiler characteristics
+checks for library functions
+checks for system services
+AC_CONFIG_FILES([file...])
+AC_OUTPUT
+
+ + + +

Using @command{autoscan} to Create `configure.ac'

+

+ + + +

+The @command{autoscan} program can help you create and/or maintain a +`configure.ac' file for a software package. @command{autoscan} +examines source files in the directory tree rooted at a directory given +as a command line argument, or the current directory if none is given. +It searches the source files for common portability problems and creates +a file `configure.scan' which is a preliminary `configure.ac' +for that package, and checks a possibly existing `configure.ac' for +completeness. + + +

+When using @command{autoscan} to create a `configure.ac', you +should manually examine `configure.scan' before renaming it to +`configure.ac'; it will probably need some adjustments. +Occasionally, @command{autoscan} outputs a macro in the wrong order +relative to another macro, so that @command{autoconf} produces a warning; +you need to move such macros manually. Also, if you want the package to +use a configuration header file, you must add a call to +AC_CONFIG_HEADERS (see section Configuration Header Files). You might +also have to change or add some #if directives to your program in +order to make it work with Autoconf (see section Using @command{ifnames} to List Conditionals, for +information about a program that can help with that job). + + +

+When using @command{autoscan} to maintain a `configure.ac', simply +consider adding its suggestions. The file `autoscan.log' will +contain detailed information on why a macro is requested. + + +

+@command{autoscan} uses several data files (installed along with Autoconf) +to determine which macros to output when it finds particular symbols in +a package's source files. These data files all have the same format: +each line consists of a symbol, whitespace, and the Autoconf macro to +output if that symbol is encountered. Lines starting with `#' are +comments. + + +

+@command{autoscan} accepts the following options: + + +

+ +
@option{--help} +
+
@option{-h} +
+Print a summary of the command line options and exit. + +
@option{--version} +
+
@option{-V} +
+Print the version number of Autoconf and exit. + +
@option{--verbose} +
+
@option{-v} +
+Print the names of the files it examines and the potentially interesting +symbols it finds in them. This output can be voluminous. + +
@option{--include=dir} +
+
@option{-I dir} +
+Also look for input files in dir. Multiple invocations +accumulate. Directories are browsed from last to first. +
+ + + +

Using @command{ifnames} to List Conditionals

+

+ + + +

+@command{ifnames} can help you write `configure.ac' for a software +package. It prints the identifiers that the package already uses in C +preprocessor conditionals. If a package has already been set up to have +some portability, @command{ifnames} can thus help you figure out what its +@command{configure} needs to check for. It may help fill in some gaps in a +`configure.ac' generated by @command{autoscan} (see section Using @command{autoscan} to Create @file{configure.ac}). + + +

+@command{ifnames} scans all of the C source files named on the command line +(or the standard input, if none are given) and writes to the standard +output a sorted list of all the identifiers that appear in those files +in #if, #elif, #ifdef, or #ifndef +directives. It prints each identifier on a line, followed by a +space-separated list of the files in which that identifier occurs. + + +

+@command{ifnames} accepts the following options: + + +

+ +
@option{--help} +
+
@option{-h} +
+Print a summary of the command line options and exit. + +
@option{--version} +
+
@option{-V} +
+Print the version number of Autoconf and exit. +
+ + + +

Using @command{autoconf} to Create @command{configure}

+

+ + + +

+To create @command{configure} from `configure.ac', run the +@command{autoconf} program with no arguments. @command{autoconf} processes +`configure.ac' with the m4 macro processor, using the +Autoconf macros. If you give @command{autoconf} an argument, it reads that +file instead of `configure.ac' and writes the configuration script +to the standard output instead of to @command{configure}. If you give +@command{autoconf} the argument @option{-}, it reads from the standard +input instead of `configure.ac' and writes the configuration script +to the standard output. + + +

+The Autoconf macros are defined in several files. Some of the files are +distributed with Autoconf; @command{autoconf} reads them first. Then it +looks for the optional file `acsite.m4' in the directory that +contains the distributed Autoconf macro files, and for the optional file +`aclocal.m4' in the current directory. Those files can contain +your site's or the package's own Autoconf macro definitions +(see section Writing Autoconf Macros, for more information). If a macro is +defined in more than one of the files that @command{autoconf} reads, the +last definition it reads overrides the earlier ones. + + +

+@command{autoconf} accepts the following options: + + +

+ +
@option{--help} +
+
@option{-h} +
+Print a summary of the command line options and exit. + +
@option{--version} +
+
@option{-V} +
+Print the version number of Autoconf and exit. + +
@option{--verbose} +
+
@option{-v} +
+Report processing steps. + +
@option{--debug} +
+
@option{-d} +
+Don't remove the temporary files. + +
@option{--force} +
+
@option{-f} +
+Remake `configure' even if newer than its input files. + +
@option{--include=dir} +
+
@option{-I dir} +
+Also look for input files in dir. Multiple invocations +accumulate. Directories are browsed from last to first. + +
@option{--output=file} +
+
@option{-o file} +
+Save output (script or trace) to file. The file @option{-} stands +for the standard output. + +
@option{--warnings=category} +
+
@option{-W category} +
+ +Report the warnings related to category (which can actually be a +comma separated list). See section Reporting Messages, macro +AC_DIAGNOSE, for a comprehensive list of categories. Special +values include: + +
+ +
`all' +
+report all the warnings + +
`none' +
+report none + +
`error' +
+treats warnings as errors + +
`no-category' +
+disable warnings falling into category +
+ +Warnings about `syntax' are enabled by default, and the environment +variable WARNINGS, a comma separated list of categories, is +honored. @command{autoconf -W category} will actually +behave as if you had run: + + +
+autoconf --warnings=syntax,$WARNINGS,category
+
+ +If you want to disable @command{autoconf}'s defaults and WARNINGS, +but (for example) enable the warnings about obsolete constructs, you +would use @option{-W none,obsolete}. + + + +@command{autoconf} displays a back trace for errors, but not for +warnings; if you want them, just pass @option{-W error}. For instance, +on this `configure.ac': + + +
+AC_DEFUN([INNER],
+[AC_TRY_RUN([exit (0)])])
+
+AC_DEFUN([OUTER],
+[INNER])
+
+AC_INIT
+OUTER
+
+ +you get: + + +
+$ autoconf -Wcross
+configure.ac:8: warning: AC_TRY_RUN called without default \
+to allow cross compiling
+$ autoconf -Wcross,error
+configure.ac:8: error: AC_TRY_RUN called without default \
+to allow cross compiling
+acgeneral.m4:3044: AC_TRY_RUN is expanded from...
+configure.ac:2: INNER is expanded from...
+configure.ac:5: OUTER is expanded from...
+configure.ac:8: the top level
+
+ +
@option{--trace=macro[:format]} +
+
@option{-t macro[:format]} +
+Do not create the @command{configure} script, but list the calls to +macro according to the format. Multiple @option{--trace} +arguments can be used to list several macros. Multiple @option{--trace} +arguments for a single macro are not cumulative; instead, you should +just make format as long as needed. + +The format is a regular string, with newlines if desired, and +several special escape codes. It defaults to `$f:$l:$n:$%'; see +below for details on the format. + +
@option{--initialization} +
+
@option{-i} +
+By default, @option{--trace} does not trace the initialization of the +Autoconf macros (typically the AC_DEFUN definitions). This +results in a noticeable speedup, but can be disabled by this option. +
+ +

+It is often necessary to check the content of a `configure.ac' +file, but parsing it yourself is extremely fragile and error-prone. It +is suggested that you rely upon @option{--trace} to scan +`configure.ac'. + + +

+The format of @option{--trace} can use the following special +escapes: + + +

+ +
`$$' +
+The character `$'. + +
`$f' +
+The filename from which macro is called. + +
`$l' +
+The line number from which macro is called. + +
`$d' +
+The depth of the macro call. This is an M4 technical detail that +you probably don't want to know about. + +
`$n' +
+The name of the macro. + +
`$num' +
+The numth argument of the call to macro. + +
`$@' +
+
`$sep@' +
+
`${separator}@' +
+All the arguments passed to macro, separated by the character +sep or the string separator (`,' by default). Each +argument is quoted, i.e. enclosed in a pair of square brackets. + +
`$*' +
+
`$sep*' +
+
`${separator}*' +
+As above, but the arguments are not quoted. + +
`$%' +
+
`$sep%' +
+
`${separator}%' +
+As above, but the arguments are not quoted, all new line characters in +the arguments are smashed, and the default separator is `:'. + +The escape `$%' produces single-line trace outputs (unless you put +newlines in the `separator'), while `$@' and `$*' do +not. +
+ +

+For instance, to find the list of variables that are substituted, use: + + + +

+$ autoconf -t AC_SUBST
+configure.ac:2:AC_SUBST:ECHO_C
+configure.ac:2:AC_SUBST:ECHO_N
+configure.ac:2:AC_SUBST:ECHO_T
+More traces deleted
+
+ +

+The example below highlights the difference between `$@', +`$*', and $%. + + + +

+$ cat configure.ac
+AC_DEFINE(This, is, [an
+[example]])
+$ autoconf -t 'AC_DEFINE:@: $@
+*: $*
+$: $%'
+@: [This],[is],[an
+[example]]
+*: This,is,an
+[example]
+$: This:is:an [example]
+
+ +

+The format gives you a lot of freedom: + + + +

+$ autoconf -t 'AC_SUBST:$$ac_subst{"$1"} = "$f:$l";'
+$ac_subst{"ECHO_C"} = "configure.ac:2";
+$ac_subst{"ECHO_N"} = "configure.ac:2";
+$ac_subst{"ECHO_T"} = "configure.ac:2";
+More traces deleted
+
+ +

+A long separator can be used to improve the readability of complex +structures, and to ease its parsing (for instance when no single +character is suitable as a separator)): + + + +

+$ autoconf -t 'AM_MISSING_PROG:${|:::::|}*'
+ACLOCAL|:::::|aclocal|:::::|$missing_dir
+AUTOCONF|:::::|autoconf|:::::|$missing_dir
+AUTOMAKE|:::::|automake|:::::|$missing_dir
+More traces deleted
+
+ + + +

Using @command{autoreconf} to Update @command{configure} Scripts

+

+ + + +

+Installing the various components of the GNU Build System can be +tedious: running @command{gettextize}, @command{automake} etc. in each +directory. It may be needed either because some tools such as +@command{automake} have been updated on your system, or because some of +the sources such as `configure.ac' have been updated, or finally, +simply in order to install the GNU Build System in a fresh tree. + + +

+It runs @command{autoconf}, @command{autoheader}, @command{aclocal}, +@command{automake}, @command{libtoolize}, and @command{gettextize} (when +appropriate) repeatedly to update the GNU Build System in specified +directories, and their subdirectories (see section Configuring Other Packages in Subdirectories). By +default, it only remakes those files that are older than their sources. + + +

+If you install a new version of some tools, you can make +@command{autoreconf} remake all of the files by giving it the +@option{--force} option. + + +

+See section Automatic Remaking, for `Makefile' rules to automatically +remake @command{configure} scripts when their source files change. That +method handles the timestamps of configuration header templates +properly, but does not pass @option{--autoconf-dir=dir} or +@option{--localdir=dir}. + + +

+@command{autoreconf} accepts the following options: + + +

+ +
@option{--help} +
+
@option{-h} +
+Print a summary of the command line options and exit. + +
@option{--version} +
+
@option{-V} +
+Print the version number of Autoconf and exit. + +
@option{--verbose} +
+Print the name of each directory where @command{autoreconf} runs +@command{autoconf} (and @command{autoheader}, if appropriate). + +
@option{--debug} +
+
@option{-d} +
+Don't remove the temporary files. + +
@option{--force} +
+
@option{-f} +
+Remake even `configure' scripts and configuration headers that are +newer than their input files (`configure.ac' and, if present, +`aclocal.m4'). + +
@option{--install} +
+
@option{-i} +
+Copy missing auxiliary files. This option is similar to the option +--add-missing in @command{automake}. + +
@option{--symlink} +
+
@option{-s} +
+Instead of copying missing auxiliary files, install symbolic links. + +
@option{--include=dir} +
+
@option{-I dir} +
+Also look for input files in dir. Multiple invocations +accumulate. Directories are browsed from last to first. +
+ + + +

Initialization and Output Files

+ +

+Autoconf-generated @command{configure} scripts need some information about +how to initialize, such as how to find the package's source files; and +about the output files to produce. The following sections describe +initialization and the creation of output files. + + + + +

Initializing @command{configure}

+ +

+Every @command{configure} script must call AC_INIT before doing +anything else. The only other required macro is AC_OUTPUT +(see section Outputting Files). + + +

+

+
Macro: AC_INIT (package, version, @ovar{bug-report}, @ovar{tarname}) +
+ +Process any command-line arguments and perform various initializations +and verifications. + + +

+Set the name of the package and its version. These are +typically used in @option{--version} support, including that of +@command{configure}. The optional argument bug-report should be +the email to which users should send bug reports. The package +tarname differs from package: the latter designates the full +package name (e.g., `GNU Autoconf'), while the latter is meant for +distribution tar ball names (e.g., `autoconf'). It defaults to +package once `GNU ' strip, lower cased, and all non +alphanumeric character mapped onto `-'. + + +

+It is preferable that these arguments be static, i.e., there should not +be any shell computation, but they can be computed by M4. The following +M4 macros (e.g., AC_PACKAGE_NAME), output variables (e.g., +PACKAGE_NAME), and preprocessor symbols (e.g., +PACKAGE_NAME) are then defined: + + +

+ +
AC_PACKAGE_NAME, PACKAGE_NAME +
+ + + +Exactly package. + +
AC_PACKAGE_TARNAME, PACKAGE_TARNAME +
+ + + +Exactly tarname. + +
AC_PACKAGE_VERSION, PACKAGE_VERSION +
+ + + +Exactly version. + +
AC_PACKAGE_STRING, PACKAGE_STRING +
+ + + +Exactly `package version'. + +
AC_PACKAGE_BUGREPORT, PACKAGE_BUGREPORT +
+ + + +Exactly bug-report. +
+
+ + + +

Notices in @command{configure}

+ +

+The following macros manage version numbers for @command{configure} +scripts. Using them is optional. + + +

+

+
Macro: AC_PREREQ (version) +
+ + +Ensure that a recent enough version of Autoconf is being used. If the +version of Autoconf being used to create @command{configure} is earlier +than version, print an error message to the standard error output +and do not create @command{configure}. For example: + + + +
+AC_PREREQ(2.53)
+
+ +

+This macro is the only macro that may be used before AC_INIT, but +for consistency, you are invited not to do so. +

+ + +

+

+
Macro: AC_COPYRIGHT (copyright-notice) +
+ + +State that, in addition to the Free Software Foundation's copyright on +the Autoconf macros, parts of your @command{configure} are covered by the +copyright-notice. + + +

+The copyright-notice will show up in both the head of +@command{configure} and in `configure --version'. +

+ + +

+

+
Macro: AC_REVISION (revision-info) +
+ + +Copy revision stamp revision-info into the @command{configure} +script, with any dollar signs or double-quotes removed. This macro lets +you put a revision stamp from `configure.ac' into @command{configure} +without RCS or cvs changing it when you check in +@command{configure}. That way, you can determine easily which revision of +`configure.ac' a particular @command{configure} corresponds to. + + +

+For example, this line in `configure.ac': + + + +

+AC_REVISION($Revision$)
+
+ +

+produces this in @command{configure}: + + + +

+#! /bin/sh
+# From configure.ac Revision: 1.30
+
+ +
+ + + +

Finding @command{configure} Input

+ +

+

+
Macro: AC_CONFIG_SRCDIR (unique-file-in-source-dir) +
+ +unique-file-in-source-dir is some file that is in the package's +source directory; @command{configure} checks for this file's existence to +make sure that the directory that it is told contains the source code in +fact does. Occasionally people accidentally specify the wrong directory +with @option{--srcdir}; this is a safety check. See section @command{configure} Invocation, for more information. +
+ + +

+Packages that do manual configuration or use the install program +might need to tell @command{configure} where to find some other shell +scripts by calling AC_CONFIG_AUX_DIR, though the default places +it looks are correct for most cases. + + +

+

+
Macro: AC_CONFIG_AUX_DIR (dir) +
+ +Use the auxiliary build tools (e.g., `install-sh', +`config.sub', `config.guess', Cygnus @command{configure}, +Automake and Libtool scripts etc.) that are in directory dir. +These are auxiliary files used in configuration. dir can be +either absolute or relative to `srcdir'. The default is +`srcdir' or `srcdir/..' or +`srcdir/../..', whichever is the first that contains +`install-sh'. The other files are not checked for, so that using +AC_PROG_INSTALL does not automatically require distributing the +other auxiliary files. It checks for `install.sh' also, but that +name is obsolete because some @command{make} have a rule that creates +`install' from it if there is no `Makefile'. +
+ + + + +

Outputting Files

+ +

+Every Autoconf script, e.g., `configure.ac', should finish by +calling AC_OUTPUT. It is the macro that generates +`config.status', which will create the `Makefile's and any +other files resulting from configuration. The only required macro is +AC_INIT (see section Finding @command{configure} Input). + + +

+

+
Macro: AC_OUTPUT +
+ + +Generate `config.status' and launch it. Call this macro once, at +the end of `configure.ac'. + + +

+`config.status' will take all the configuration actions: all the +output files (see section Creating Configuration Files, macro +AC_CONFIG_FILES), header files (see section Configuration Header Files, +macro AC_CONFIG_HEADERS), commands (see section Running Arbitrary Configuration Commands, macro AC_CONFIG_COMMANDS), links (see +section Creating Configuration Links, macro AC_CONFIG_LINKS), subdirectories +to configure (see section Configuring Other Packages in Subdirectories, macro AC_CONFIG_SUBDIRS) +are honored. +

+ + +

+Historically, the usage of AC_OUTPUT was somewhat different. +See section Obsolete Macros, for a description of the arguments that +AC_OUTPUT used to support. + + +

+If you run make on subdirectories, you should run it using the +make variable MAKE. Most versions of make set +MAKE to the name of the make program plus any options it +was given. (But many do not include in it the values of any variables +set on the command line, so those are not passed on automatically.) +Some old versions of make do not set this variable. The +following macro allows you to use it even with those versions. + + +

+

+
Macro: AC_PROG_MAKE_SET +
+ + +If make predefines the variable MAKE, define output +variable SET_MAKE to be empty. Otherwise, define SET_MAKE +to contain `MAKE=make'. Calls AC_SUBST for SET_MAKE. +
+ + +

+To use this macro, place a line like this in each `Makefile.in' +that runs MAKE on other directories: + + + +

+@SET_MAKE@
+
+ + + +

Taking Configuration Actions

+ +

+`configure' is designed so that it appears to do everything itself, +but there is actually a hidden slave: `config.status'. +`configure' is in charge of examining your system, but it is +`config.status' that actually takes the proper actions based on the +results of `configure'. The most typical task of +`config.status' is to instantiate files. + + +

+This section describes the common behavior of the four standard +instantiating macros: AC_CONFIG_FILES, AC_CONFIG_HEADERS, +AC_CONFIG_COMMANDS and AC_CONFIG_LINKS. They all +have this prototype: + + + +

+AC_CONFIG_FOOS(tag..., [commands], [init-cmds])
+
+ +

+where the arguments are: + + +

+ +
tag... +
+A whitespace-separated list of tags, which are typically the names of +the files to instantiate. + +You are encouraged to use literals as tags. In particular, you +should avoid + + +
+... && my_foos="$my_foos fooo"
+... && my_foos="$my_foos foooo"
+AC_CONFIG_FOOS($my_foos)
+
+ +and use this instead: + + +
+... && AC_CONFIG_FOOS(fooo)
+... && AC_CONFIG_FOOS(foooo)
+
+ +The macros AC_CONFIG_FILES and AC_CONFIG_HEADERS use +special tags: they may have the form `output' or +`output:inputs'. The file output is instantiated +from its templates, inputs (defaulting to `output.in'). + +For instance +`AC_CONFIG_FILES(Makefile:boiler/top.mk:boiler/bot.mk)' asks for +the creation of `Makefile' that will be the expansion of the +output variables in the concatenation of `boiler/top.mk' and +`boiler/bot.mk'. + +The special value `-' might be used to denote the standard output +when used in output, or the standard input when used in the +inputs. You most probably don't need to use this in +`configure.ac', but it is convenient when using the command line +interface of `./config.status', see section Recreating a Configuration, +for more details. + +The inputs may be absolute or relative filenames. In the latter +case they are first looked for in the build tree, and then in the source +tree. + +
commands +
+Shell commands output literally into `config.status', and +associated with a tag that the user can use to tell `config.status' +which the commands to run. The commands are run each time a tag +request is given to `config.status'; typically, each time the file +`tag' is created. + +The variable set during the execution of @command{configure} are +not available here: you first need to set them via the +init-cmds. Nonetheless the following variables are precomputed: + +
+ +
srcdir +
+The path from the top build directory to the top source directory. This +is what @command{configure}'s option @option{--srcdir} sets. + +
ac_top_srcdir +
+The path from the current build directory to the top source directory. + +
ac_top_builddir +
+The path from the current build directory to the top build directory. +It can be empty, or else ends with a slash, so that you may concatenate +it. + +
ac_srcdir +
+The path from the current build directory to the corresponding source +directory. +
+ +The current directory refers to the directory (or +pseudo-directory) containing the input part of tags. For +instance, running + + +
+AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [...], [...])
+
+ + with @option{--srcdir=../package} produces the following values: + + +
+# Argument of --srcdir
+srcdir='../package'
+# Reversing deep/dir
+ac_top_builddir='../../'
+# Concatenation of $ac_top_builddir and srcdir
+ac_top_srcdir='../../../package'
+# Concatenation of $ac_top_srcdir and deep/dir
+ac_srcdir='../../../package/deep/dir'
+
+ +independently of `in/in.in'. + +
init-cmds +
+Shell commands output unquoted near the beginning of +`config.status', and executed each time `config.status' runs +(regardless of the tag). Because they are unquoted, for example, +`$var' will be output as the value of var. init-cmds +is typically used by `configure' to give `config.status' some +variables it needs to run the commands. + +You should be extremely cautious in your variable names: all the +init-cmds share the same name space and may overwrite each other +in unpredictable ways. Sorry... +
+ +

+All these macros can be called multiple times, with different +tags, of course! + + + + +

Creating Configuration Files

+ +

+Be sure to read the previous section, section Taking Configuration Actions. + + +

+

+
Macro: AC_CONFIG_FILES (file..., @ovar{cmds}, @ovar{init-cmds}) +
+ +Make AC_OUTPUT create each `file' by copying an input +file (by default `file.in'), substituting the output variable +values. +This macro is one of the instantiating macros, see section Taking Configuration Actions. See section Substitutions in Makefiles, for more information on using +output variables. See section Setting Output Variables, for more information +on creating them. This macro creates the directory that the file is in +if it doesn't exist. Usually, `Makefile's are created this way, +but other files, such as `.gdbinit', can be specified as well. + + +

+Typical calls to AC_CONFIG_FILES look like this: + + + +

+AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
+AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
+
+ +

+You can override an input file name by appending to file a +colon-separated list of input files. Examples: + + + +

+AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
+                [lib/Makefile:boiler/lib.mk])
+
+ +

+Doing this allows you to keep your file names acceptable to MS-DOS, or +to prepend and/or append boilerplate to the file. +

+ + + + +

Substitutions in Makefiles

+ +

+Each subdirectory in a distribution that contains something to be +compiled or installed should come with a file `Makefile.in', from +which @command{configure} will create a `Makefile' in that directory. +To create a `Makefile', @command{configure} performs a simple variable +substitution, replacing occurrences of `@variable@' in +`Makefile.in' with the value that @command{configure} has determined +for that variable. Variables that are substituted into output files in +this way are called output variables. They are ordinary shell +variables that are set in @command{configure}. To make @command{configure} +substitute a particular variable into the output files, the macro +AC_SUBST must be called with that variable name as an argument. +Any occurrences of `@variable@' for other variables are +left unchanged. See section Setting Output Variables, for more information +on creating output variables with AC_SUBST. + + +

+A software package that uses a @command{configure} script should be +distributed with a file `Makefile.in', but no `Makefile'; that +way, the user has to properly configure the package for the local system +before compiling it. + + +

+See section `Makefile Conventions' in The GNU Coding Standards, for more information on what to put in +`Makefile's. + + + + +

Preset Output Variables

+ +

+Some output variables are preset by the Autoconf macros. Some of the +Autoconf macros set additional output variables, which are mentioned in +the descriptions for those macros. See section Output Variable Index, for a +complete list of output variables. See section Installation Directory Variables, for the list of the preset ones related to installation +directories. Below are listed the other preset ones. They all are +precious variables (see section Setting Output Variables, +AC_ARG_VAR). + + +

+

+
Variable: CFLAGS +
+ +Debugging and optimization options for the C compiler. If it is not set +in the environment when @command{configure} runs, the default value is set +when you call AC_PROG_CC (or empty if you don't). @command{configure} +uses this variable when compiling programs to test for C features. +
+ + +

+

+
Variable: configure_input +
+ +A comment saying that the file was generated automatically by +@command{configure} and giving the name of the input file. +AC_OUTPUT adds a comment line containing this variable to the top +of every `Makefile' it creates. For other files, you should +reference this variable in a comment at the top of each input file. For +example, an input shell script should begin like this: + + + +
+#! /bin/sh
+# @configure_input@
+
+ +

+The presence of that line also reminds people editing the file that it +needs to be processed by @command{configure} in order to be used. +

+ + +

+

+
Variable: CPPFLAGS +
+ +Header file search directory (@option{-Idir}) and any other +miscellaneous options for the C and C++ preprocessors and compilers. If +it is not set in the environment when @command{configure} runs, the default +value is empty. @command{configure} uses this variable when compiling or +preprocessing programs to test for C and C++ features. +
+ + +

+

+
Variable: CXXFLAGS +
+ +Debugging and optimization options for the C++ compiler. If it is not +set in the environment when @command{configure} runs, the default value is +set when you call AC_PROG_CXX (or empty if you don't). +@command{configure} uses this variable when compiling programs to test for +C++ features. +
+ + +

+

+
Variable: DEFS +
+ +@option{-D} options to pass to the C compiler. If AC_CONFIG_HEADERS +is called, @command{configure} replaces `@DEFS@' with +@option{-DHAVE_CONFIG_H} instead (see section Configuration Header Files). This +variable is not defined while @command{configure} is performing its tests, +only when creating the output files. See section Setting Output Variables, for +how to check the results of previous tests. +
+ + +

+

+
Variable: ECHO_C +
+
Variable: ECHO_N +
+
Variable: ECHO_T +
+ + + +How does one suppress the trailing newline from echo for +question-answer message pairs? These variables provide a way: + + + +
+echo $ECHO_N "And the winner is... $ECHO_C"
+sleep 100000000000
+echo "${ECHO_T}dead."
+
+ +

+Some old and uncommon echo implementations offer no means to +achieve this, in which case ECHO_T is set to tab. You might not +want to use it. +

+ + +

+

+
Variable: FFLAGS +
+ +Debugging and optimization options for the Fortran 77 compiler. If it +is not set in the environment when @command{configure} runs, the default +value is set when you call AC_PROG_F77 (or empty if you don't). +@command{configure} uses this variable when compiling programs to test for +Fortran 77 features. +
+ + +

+

+
Variable: LDFLAGS +
+ +Stripping (@option{-s}), path (@option{-L}), and any other miscellaneous +options for the linker. Don't use this variable to pass library names +(@option{-l}) to the linker, use LIBS instead. If it is not set +in the environment when @command{configure} runs, the default value is empty. +@command{configure} uses this variable when linking programs to test for +C, C++ and Fortran 77 features. +
+ + +

+

+
Variable: LIBS +
+ +@option{-l} options to pass to the linker. The default value is empty, +but some Autoconf macros may prepend extra libraries to this variable if +those libraries are found and provide necessary functions, see +section Library Files. @command{configure} uses this variable when linking +programs to test for C, C++ and Fortran 77 features. +
+ + +

+

+
Variable: builddir +
+ +Rigorously equal to `.'. Added for symmetry only. +
+ + +

+

+
Variable: abs_builddir +
+ +Absolute path of builddir. +
+ + +

+

+
Variable: top_builddir +
+ +The relative path to the top-level of the current build tree. In the +top-level directory, this is the same as srcbuild. +
+ + +

+

+
Variable: abs_top_builddir +
+ +Absolute path of top_builddir. +
+ + +

+

+
Variable: srcdir +
+ +The relative path to the directory that contains the source code for +that `Makefile'. +
+ + +

+

+
Variable: abs_srcdir +
+ +Absolute path of srcdir. +
+ + +

+

+
Variable: top_srcdir +
+ +The relative path to the top-level source code directory for the +package. In the top-level directory, this is the same as srcdir. +
+ + +

+

+
Variable: abs_top_srcdir +
+ +Absolute path of top_srcdir. +
+ + + + +

Installation Directory Variables

+ +

+The following variables specify the directories where the package will +be installed, see section `Variables for Installation Directories' in The GNU Coding Standards, for more information. +See the end of this section for details on when and how to use these +variables. + + +

+

+
Variable: bindir +
+ +The directory for installing executables that users run. +
+ + +

+

+
Variable: datadir +
+ +The directory for installing read-only architecture-independent data. +
+ + +

+

+
Variable: exec_prefix +
+ +The installation prefix for architecture-dependent files. By default +it's the same as prefix. You should avoid installing anything +directly to exec_prefix. However, the default value for +directories containing architecture-dependent files should be relative +to exec_prefix. +
+ + +

+

+
Variable: includedir +
+ +The directory for installing C header files. +
+ + +

+

+
Variable: infodir +
+ +The directory for installing documentation in Info format. +
+ + +

+

+
Variable: libdir +
+ +The directory for installing object code libraries. +
+ + +

+

+
Variable: libexecdir +
+ +The directory for installing executables that other programs run. +
+ + +

+

+
Variable: localstatedir +
+ +The directory for installing modifiable single-machine data. +
+ + +

+

+
Variable: mandir +
+ +The top-level directory for installing documentation in man format. +
+ + +

+

+
Variable: oldincludedir +
+ +The directory for installing C header files for non-gcc compilers. +
+ + +

+

+
Variable: prefix +
+ +The common installation prefix for all files. If exec_prefix +is defined to a different value, prefix is used only for +architecture-independent files. +
+ + +

+

+
Variable: sbindir +
+ +The directory for installing executables that system +administrators run. +
+ + +

+

+
Variable: sharedstatedir +
+ +The directory for installing modifiable architecture-independent data. +
+ + +

+

+
Variable: sysconfdir +
+ +The directory for installing read-only single-machine data. +
+ + +

+Most of these variables have values that rely on prefix or +exec_prefix. It is deliberate that the directory output +variables keep them unexpanded: typically `@datadir@' will be +replaced by `${prefix}/share', not `/usr/local/share'. + + +

+This behavior is mandated by the GNU coding standards, so that when +the user runs: + + +

+ +
`make' +
+she can still specify a different prefix from the one specified to +@command{configure}, in which case, if needed, the package shall hard +code dependencies corresponding to the make-specified prefix. + +
`make install' +
+she can specify a different installation location, in which case the +package must still depend on the location which was compiled in +(i.e., never recompile when `make install' is run). This is an +extremely important feature, as many people may decide to install all +the files of a package grouped together, and then install links from +the final locations to there. +
+ +

+In order to support these features, it is essential that datadir +remains being defined as `${prefix}/share' to depend upon the +current value of prefix. + + +

+A corollary is that you should not use these variables except in +Makefiles. For instance, instead of trying to evaluate datadir +in `configure' and hardcoding it in Makefiles using +e.g. `AC_DEFINE_UNQUOTED(DATADIR, "$datadir")', you should add +`-DDATADIR="$(datadir)"' to your CPPFLAGS. + + +

+Similarly you should not rely on AC_OUTPUT_FILES to replace +datadir and friends in your shell scripts and other files, rather +let @command{make} manage their replacement. For instance Autoconf +ships templates of its shell scripts ending with `.sh', and uses +this Makefile snippet: + + + +

+.sh:
+        rm -f $@ $@.tmp
+        sed 's,@datadir\@,$(pkgdatadir),g' $< >$@.tmp
+        chmod +x $@.tmp
+        mv $@.tmp $@
+
+ +

+Three things are noteworthy: + + +

+ +
`@datadir\@' +
+The backslash prevents @command{configure} from replacing +`@datadir@' in the sed expression itself. + +
`$(pkgdatadir)' +
+Don't use `@pkgdatadir@'! Use the matching makefile variable +instead. + +
`,' +
+Don't use `/' in the sed expression(s) since most probably the +variables you use, such as `$(pkgdatadir)', will contain +some. +
+ + + +

Build Directories

+ +

+You can support compiling a software package for several architectures +simultaneously from the same copy of the source code. The object files +for each architecture are kept in their own directory. + + +

+To support doing this, make uses the VPATH variable to +find the files that are in the source directory. GNU make +and most other recent make programs can do this. Older +make programs do not support VPATH; when using them, the +source code must be in the same directory as the object files. + + +

+To support VPATH, each `Makefile.in' should contain two +lines that look like: + + + +

+srcdir = @srcdir@
+VPATH = @srcdir@
+
+ +

+Do not set VPATH to the value of another variable, for example +`VPATH = $(srcdir)', because some versions of make do not do +variable substitutions on the value of VPATH. + + +

+@command{configure} substitutes in the correct value for srcdir when +it produces `Makefile'. + + +

+Do not use the make variable $<, which expands to the +file name of the file in the source directory (found with VPATH), +except in implicit rules. (An implicit rule is one such as `.c.o', +which tells how to create a `.o' file from a `.c' file.) Some +versions of make do not set $< in explicit rules; they +expand it to an empty value. + + +

+Instead, `Makefile' command lines should always refer to source +files by prefixing them with `$(srcdir)/'. For example: + + + +

+time.info: time.texinfo
+        $(MAKEINFO) $(srcdir)/time.texinfo
+
+ + + +

Automatic Remaking

+ +

+You can put rules like the following in the top-level `Makefile.in' +for a package to automatically update the configuration information when +you change the configuration files. This example includes all of the +optional files, such as `aclocal.m4' and those related to +configuration header files. Omit from the `Makefile.in' rules for +any of these files that your package does not use. + + +

+The `$(srcdir)/' prefix is included because of limitations in the +VPATH mechanism. + + +

+The `stamp-' files are necessary because the timestamps of +`config.h.in' and `config.h' will not be changed if remaking +them does not change their contents. This feature avoids unnecessary +recompilation. You should include the file `stamp-h.in' your +package's distribution, so @command{make} will consider +`config.h.in' up to date. Don't use @command{touch} +(see section Limitations of Usual Tools), rather use @command{echo} (using +@command{date} would cause needless differences, hence CVS +conflicts etc.). + + + +

+$(srcdir)/configure: configure.ac aclocal.m4
+        cd $(srcdir) && autoconf
+
+# autoheader might not change config.h.in, so touch a stamp file.
+$(srcdir)/config.h.in: stamp-h.in
+$(srcdir)/stamp-h.in: configure.ac aclocal.m4
+        cd $(srcdir) && autoheader
+        echo timestamp > $(srcdir)/stamp-h.in
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+        ./config.status
+
+Makefile: Makefile.in config.status
+        ./config.status
+
+config.status: configure
+        ./config.status --recheck
+
+ +

+(Be careful if you copy these lines directly into your Makefile, as you +will need to convert the indented lines to start with the tab character.) + + +

+In addition, you should use `AC_CONFIG_FILES([stamp-h], [echo +timestamp > stamp-h])' so `config.status' will ensure that +`config.h' is considered up to date. See section Outputting Files, for more +information about AC_OUTPUT. + + +

+See section Recreating a Configuration, for more examples of handling +configuration-related dependencies. + + + + +

Configuration Header Files

+

+ + + + +

+When a package tests more than a few C preprocessor symbols, the command +lines to pass @option{-D} options to the compiler can get quite long. +This causes two problems. One is that the make output is hard to +visually scan for errors. More seriously, the command lines can exceed +the length limits of some operating systems. As an alternative to +passing @option{-D} options to the compiler, @command{configure} scripts can +create a C header file containing `#define' directives. The +AC_CONFIG_HEADERS macro selects this kind of output. It should +be called right after AC_INIT. + + +

+The package should `#include' the configuration header file before +any other header files, to prevent inconsistencies in declarations (for +example, if it redefines const). Use `#include <config.h>' +instead of `#include "config.h"', and pass the C compiler a +@option{-I.} option (or @option{-I..}; whichever directory contains +`config.h'). That way, even if the source directory is configured +itself (perhaps to make a distribution), other build directories can +also be configured without finding the `config.h' from the source +directory. + + +

+

+
Macro: AC_CONFIG_HEADERS (header ..., @ovar{cmds}, @ovar{init-cmds}) +
+ + +This macro is one of the instantiating macros, see section Taking Configuration Actions. Make AC_OUTPUT create the file(s) in the +whitespace-separated list header containing C preprocessor +#define statements, and replace `@DEFS@' in generated +files with @option{-DHAVE_CONFIG_H} instead of the value of DEFS. +The usual name for header is `config.h'. + + +

+If header already exists and its contents are identical to what +AC_OUTPUT would put in it, it is left alone. Doing this allows +some changes in configuration without needlessly causing object files +that depend on the header file to be recompiled. + + +

+Usually the input file is named `header.in'; however, you can +override the input file name by appending to header, a +colon-separated list of input files. Examples: + + + +

+AC_CONFIG_HEADERS([config.h:config.hin])
+AC_CONFIG_HEADERS([defines.h:defs.pre:defines.h.in:defs.post])
+
+ +

+Doing this allows you to keep your file names acceptable to MS-DOS, or +to prepend and/or append boilerplate to the file. +

+ + +

+See section Taking Configuration Actions, for more details on header. + + + + +

Configuration Header Templates

+

+ + + + +

+Your distribution should contain a template file that looks as you want +the final header file to look, including comments, with #undef +statements which are used as hooks. For example, suppose your +`configure.ac' makes these calls: + + + +

+AC_CONFIG_HEADERS([conf.h])
+AC_CHECK_HEADERS([unistd.h])
+
+ +

+Then you could have code like the following in `conf.h.in'. On +systems that have `unistd.h', @command{configure} will `#define' +`HAVE_UNISTD_H' to 1. On other systems, the whole line will be +commented out (in case the system predefines that symbol). + + + +

+/* Define as 1 if you have unistd.h.  */
+#undef HAVE_UNISTD_H
+
+ +

+You can then decode the configuration header using the preprocessor +directives: + + + +

+#include <conf.h>
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else
+/* We are in trouble. */
+#endif
+
+ +

+The use of old form templates, with `#define' instead of +`#undef' is strongly discouraged. + + +

+Since it is a tedious task to keep a template header up to date, you may +use @command{autoheader} to generate it, see section Using @command{autoheader} to Create @file{config.h.in}. + + + + +

Using @command{autoheader} to Create `config.h.in'

+

+ + + +

+The @command{autoheader} program can create a template file of C +`#define' statements for @command{configure} to use. If +`configure.ac' invokes AC_CONFIG_HEADERS(file), +@command{autoheader} creates `file.in'; if multiple file +arguments are given, the first one is used. Otherwise, +@command{autoheader} creates `config.h.in'. + + +

+In order to do its job, @command{autoheader} needs you to document all +of the symbols that you might use; i.e., there must be at least one +AC_DEFINE or one AC_DEFINE_UNQUOTED using its third +argument for each symbol (see section Defining C Preprocessor Symbols). An additional +constraint is that the first argument of AC_DEFINE must be a +literal. Note that all symbols defined by Autoconf's built-in tests are +already documented properly; you only need to document those that you +define yourself. + + +

+You might wonder why @command{autoheader} is needed: after all, why +would @command{configure} need to "patch" a `config.h.in' to +produce a `config.h' instead of just creating `config.h' from +scratch? Well, when everything rocks, the answer is just that we are +wasting our time maintaining @command{autoheader}: generating +`config.h' directly is all that is needed. When things go wrong, +however, you'll be thankful for the existence of @command{autoheader}. + + +

+The fact that the symbols are documented is important in order to +check that `config.h' makes sense. The fact that there is a +well defined list of symbols that should be #define'd (or not) is +also important for people who are porting packages to environments where +@command{configure} cannot be run: they just have to @emph{fill in the +blanks}. + + +

+But let's come back to the point: @command{autoheader}'s invocation... + + +

+If you give @command{autoheader} an argument, it uses that file instead +of `configure.ac' and writes the header file to the standard output +instead of to `config.h.in'. If you give @command{autoheader} an +argument of @option{-}, it reads the standard input instead of +`configure.ac' and writes the header file to the standard output. + + +

+@command{autoheader} accepts the following options: + + +

+ +
@option{--help} +
+
@option{-h} +
+Print a summary of the command line options and exit. + +
@option{--version} +
+
@option{-V} +
+Print the version number of Autoconf and exit. + +
@option{--verbose} +
+
@option{-v} +
+Report processing steps. + +
@option{--debug} +
+
@option{-d} +
+Don't remove the temporary files. + +
@option{--force} +
+
@option{-f} +
+Remake the template file even if newer than its input files. + +
@option{--include=dir} +
+
@option{-I dir} +
+Also look for input files in dir. Multiple invocations accumulate. +Directories are browsed from last to first. + +
@option{--warnings=category} +
+
@option{-W category} +
+ +Report the warnings related to category (which can actually be a +comma separated list). Current categories include: + +
+ +
`obsolete' +
+report the uses of obsolete constructs + +
`all' +
+report all the warnings + +
`none' +
+report none + +
`error' +
+treats warnings as errors + +
`no-category' +
+disable warnings falling into category +
+ +
+ + + +

Autoheader Macros

+ +

+@command{autoheader} scans `configure.ac' and figures out which C +preprocessor symbols it might define. It knows how to generate +templates for symbols defined by AC_CHECK_HEADERS, +AC_CHECK_FUNCS etc., but if you AC_DEFINE any additional +symbol, you must define a template for it. If there are missing +templates, @command{autoheader} fails with an error message. + + +

+The simplest way to create a template for a symbol is to supply +the description argument to an `AC_DEFINE(symbol)'; see +section Defining C Preprocessor Symbols. You may also use one of the following macros. + + +

+

+
Macro: AH_VERBATIM (key, template) +
+ + +Tell @command{autoheader} to include the template as-is in the header +template file. This template is associated with the key, +which is used to sort all the different templates and guarantee their +uniqueness. It should be the symbol that can be AC_DEFINE'd. + + +

+For example: + + + +

+AH_VERBATIM([_GNU_SOURCE],
+[/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif])
+
+ +
+ +

+

+
Macro: AH_TEMPLATE (key, description) +
+ + +Tell @command{autoheader} to generate a template for key. This macro +generates standard templates just like AC_DEFINE when a +description is given. + + +

+For example: + + + +

+AH_TEMPLATE([CRAY_STACKSEG_END],
+            [Define to one of _getb67, GETB67, getb67
+             for Cray-2 and Cray-YMP systems.  This
+             function is required for alloca.c support
+             on those systems.])
+
+ +

+will generate the following template, with the description properly +justified. + + + +

+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and
+   Cray-YMP systems. This function is required for alloca.c
+   support on those systems. */
+#undef CRAY_STACKSEG_END
+
+ +
+ +

+

+
Macro: AH_TOP (text) +
+ + +Include text at the top of the header template file. +
+ + +

+

+
Macro: AH_BOTTOM (text) +
+ + +Include text at the bottom of the header template file. +
+ + + + +

Running Arbitrary Configuration Commands

+ +

+You execute arbitrary commands either before, during and after +`config.status' is run. The three following macros accumulate the +commands to run when they are called multiple times. +AC_CONFIG_COMMANDS replaces the obsolete macro +AC_OUTPUT_COMMANDS, see section Obsolete Macros, for details. + + +

+

+
Macro: AC_CONFIG_COMMANDS (tag..., @ovar{cmds}, @ovar{init-cmds}) +
+ +Specify additional shell commands to run at the end of +`config.status', and shell commands to initialize any variables +from @command{configure}. Associate the commands to the tag. Since +typically the cmds create a file, tag should naturally be +the name of that file. This macro is one of the instantiating macros, +see section Taking Configuration Actions. + + +

+Here is an unrealistic example: + +

+fubar=42
+AC_CONFIG_COMMANDS([fubar],
+                   [echo this is extra $fubar, and so on.],
+                   [fubar=$fubar])
+
+ +

+Here is a better one: + +

+AC_CONFIG_COMMANDS([time-stamp], [date >time-stamp])
+
+ +
+ +

+

+
Macro: AC_CONFIG_COMMANDS_PRE (cmds) +
+ +Execute the cmds right before creating `config.status'. A +typical use is computing values derived from variables built during the +execution of @command{configure}: + + + +
+AC_CONFIG_COMMANDS_PRE(
+[LTLIBOBJS=`echo $LIBOBJS | sed 's/\.o/\.lo/g'`
+AC_SUBST(LTLIBOBJS)])
+
+ +
+ +

+

+
Macro: AC_CONFIG_COMMANDS_POST (cmds) +
+ +Execute the cmds right after creating `config.status'. +
+ + + + +

Creating Configuration Links

+ +

+You may find it convenient to create links whose destinations depend upon +results of tests. One can use AC_CONFIG_COMMANDS but the +creation of relative symbolic links can be delicate when the package is +built in another directory than its sources. + + +

+

+
Macro: AC_CONFIG_LINKS (dest:source..., @ovar{cmds}, @ovar{init-cmds}) +
+ + +Make AC_OUTPUT link each of the existing files source to +the corresponding link name dest. Makes a symbolic link if +possible, otherwise a hard link. The dest and source names +should be relative to the top level source or build directory. This +macro is one of the instantiating macros, see section Taking Configuration Actions. + + +

+For example, this call: + + + +

+AC_CONFIG_LINKS(host.h:config/$machine.h
+                object.h:config/$obj_format.h)
+
+ +

+creates in the current directory `host.h' as a link to +`srcdir/config/$machine.h', and `object.h' as a +link to `srcdir/config/$obj_format.h'. + + +

+The tempting value `.' for dest is invalid: it makes it +impossible for `config.status' to guess the links to establish. + + +

+One can then run: + +

+./config.status host.h object.h
+
+ +

+to create the links. +

+ + + + +

Configuring Other Packages in Subdirectories

+ +

+In most situations, calling AC_OUTPUT is sufficient to produce +`Makefile's in subdirectories. However, @command{configure} scripts +that control more than one independent package can use +AC_CONFIG_SUBDIRS to run @command{configure} scripts for other +packages in subdirectories. + + +

+

+
Macro: AC_CONFIG_SUBDIRS (dir ...) +
+ + +Make AC_OUTPUT run @command{configure} in each subdirectory +dir in the given whitespace-separated list. Each dir should +be a literal, i.e., please do not use: + + + +
+if test "$package_foo_enabled" = yes; then
+  $my_subdirs="$my_subdirs foo"
+fi
+AC_CONFIG_SUBDIRS($my_subdirs)
+
+ +

+because this prevents `./configure --help=recursive' from +displaying the options of the package foo. Rather, you should +write: + + + +

+if test "$package_foo_enabled" = yes; then
+  AC_CONFIG_SUBDIRS(foo)
+fi
+
+ +

+If a given dir is not found, an error is reported: if the +subdirectory is optional, write: + + + +

+if test -d $srcdir/foo; then
+  AC_CONFIG_SUBDIRS(foo)
+fi
+
+ +

+If a given dir contains @command{configure.gnu}, it is run instead +of @command{configure}. This is for packages that might use a +non-autoconf script @command{Configure}, which can't be called through a +wrapper @command{configure} since it would be the same file on +case-insensitive filesystems. Likewise, if a dir contains +`configure.ac' but no @command{configure}, the Cygnus +@command{configure} script found by AC_CONFIG_AUX_DIR is used. + + +

+The subdirectory @command{configure} scripts are given the same command +line options that were given to this @command{configure} script, with minor +changes if needed, which include: + + + +

+ +

+This macro also sets the output variable subdirs to the list of +directories `dir ...'. `Makefile' rules can use +this variable to determine which subdirectories to recurse into. This +macro may be called multiple times. +

+ + + + +

Default Prefix

+ +

+By default, @command{configure} sets the prefix for files it installs to +`/usr/local'. The user of @command{configure} can select a different +prefix using the @option{--prefix} and @option{--exec-prefix} options. +There are two ways to change the default: when creating +@command{configure}, and when running it. + + +

+Some software packages might want to install in a directory besides +`/usr/local' by default. To accomplish that, use the +AC_PREFIX_DEFAULT macro. + + +

+

+
Macro: AC_PREFIX_DEFAULT (prefix) +
+ +Set the default installation prefix to prefix instead of +`/usr/local'. +
+ + +

+It may be convenient for users to have @command{configure} guess the +installation prefix from the location of a related program that they +have already installed. If you wish to do that, you can call +AC_PREFIX_PROGRAM. + + +

+

+
Macro: AC_PREFIX_PROGRAM (program) +
+ +If the user did not specify an installation prefix (using the +@option{--prefix} option), guess a value for it by looking for +program in PATH, the way the shell does. If program +is found, set the prefix to the parent of the directory containing +program; otherwise leave the prefix specified in +`Makefile.in' unchanged. For example, if program is +gcc and the PATH contains `/usr/local/gnu/bin/gcc', +set the prefix to `/usr/local/gnu'. +
+ + + + +

Existing Tests

+ +

+These macros test for particular system features that packages might +need or want to use. If you need to test for a kind of feature that +none of these macros check for, you can probably do it by calling +primitive test macros with appropriate arguments (see section Writing Tests). + + +

+These tests print messages telling the user which feature they're +checking for, and what they find. They cache their results for future +@command{configure} runs (see section Caching Results). + + +

+Some of these macros set output variables. See section Substitutions in Makefiles, for how to get their values. The phrase "define +name" is used below as a shorthand to mean "define C +preprocessor symbol name to the value 1". See section Defining C Preprocessor Symbols, for how to get those symbol definitions into your program. + + + + +

Common Behavior

+ +

+Much effort has been expended to make Autoconf easy to learn. The most +obvious way to reach this goal is simply to enforce standard interfaces +and behaviors, avoiding exceptions as much as possible. Because of +history and inertia, unfortunately, there are still too many exceptions +in Autoconf; nevertheless, this section describes some of the common +rules. + + + + +

Standard Symbols

+ +

+All the generic macros that AC_DEFINE a symbol as a result of +their test transform their arguments to a standard alphabet. +First, argument is converted to upper case and any asterisks +(`*') are each converted to `P'. Any remaining characters +that are not alphanumeric are converted to underscores. + + +

+For instance, + + + +

+AC_CHECK_TYPES(struct $Expensive*)
+
+ +

+will define the symbol `HAVE_STRUCT__EXPENSIVEP' if the check +succeeds. + + + + +

Default Includes

+

+ + + +

+Several tests depend upon a set of header files. Since these headers +are not universally available, tests actually have to provide a set of +protected includes, such as: + + + +

+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+ +

+Unless you know exactly what you are doing, you should avoid using +unconditional includes, and check the existence of the headers you +include beforehand (see section Header Files). + + +

+Most generic macros provide the following default set of includes: + + + +

+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+ +

+If the default includes are used, then Autoconf will automatically check +for the presence of these headers and their compatibility, i.e., you +don't need to run AC_HEADERS_STDC, nor check for `stdlib.h' +etc. + + +

+These headers are checked for in the same order as they are included. +For instance, on some systems `string.h' and `strings.h' both +exist, but conflict. Then HAVE_STRING_H will be defined, but +HAVE_STRINGS_H won't. + + + + +

Alternative Programs

+

+ + + +

+These macros check for the presence or behavior of particular programs. +They are used to choose between several alternative programs and to +decide what to do once one has been chosen. If there is no macro +specifically defined to check for a program you need, and you don't need +to check for any special properties of it, then you can use one of the +general program-check macros. + + + + +

Particular Program Checks

+ +

+These macros check for particular programs--whether they exist, and +in some cases whether they support certain features. + + +

+

+
Macro: AC_PROG_AWK +
+ + +Check for gawk, mawk, nawk, and awk, in that +order, and set output variable AWK to the first one that is found. +It tries gawk first because that is reported to be the +best implementation. +
+ + +

+

+
Macro: AC_PROG_INSTALL +
+ + + + + +Set output variable INSTALL to the path of a BSD compatible +install program, if one is found in the current PATH. +Otherwise, set INSTALL to `dir/install-sh -c', +checking the directories specified to AC_CONFIG_AUX_DIR (or its +default directories) to determine dir (see section Outputting Files). Also set +the variables INSTALL_PROGRAM and INSTALL_SCRIPT to +`${INSTALL}' and INSTALL_DATA to `${INSTALL} -m 644'. + + +

+This macro screens out various instances of install known not to +work. It prefers to find a C program rather than a shell script, for +speed. Instead of `install-sh', it can also use `install.sh', +but that name is obsolete because some make programs have a rule +that creates `install' from it if there is no `Makefile'. + + +

+Autoconf comes with a copy of `install-sh' that you can use. If +you use AC_PROG_INSTALL, you must include either +`install-sh' or `install.sh' in your distribution, or +@command{configure} will produce an error message saying it can't find +them--even if the system you're on has a good install program. +This check is a safety measure to prevent you from accidentally leaving +that file out, which would prevent your package from installing on +systems that don't have a BSD-compatible install program. + + +

+If you need to use your own installation program because it has features +not found in standard install programs, there is no reason to use +AC_PROG_INSTALL; just put the file name of your program into your +`Makefile.in' files. +

+ + +

+

+
Macro: AC_PROG_LEX +
+ + + + + +If flex is found, set output variable LEX to `flex' +and LEXLIB to @option{-lfl}, if that library is in a standard +place. Otherwise set LEX to `lex' and LEXLIB to +@option{-ll}. + + +

+Define YYTEXT_POINTER if yytext is a `char *' instead +of a `char []'. Also set output variable LEX_OUTPUT_ROOT to +the base of the file name that the lexer generates; usually +`lex.yy', but sometimes something else. These results vary +according to whether lex or flex is being used. + + +

+You are encouraged to use Flex in your sources, since it is both more +pleasant to use than plain Lex and the C source it produces is portable. +In order to ensure portability, however, you must either provide a +function yywrap or, if you don't use it (e.g., your scanner has +no `#include'-like feature), simply include a `%noyywrap' +statement in the scanner's source. Once this done, the scanner is +portable (unless you felt free to use nonportable constructs) and +does not depend on any library. In this case, and in this case only, it +is suggested that you use this Autoconf snippet: + + + +

+AC_PROG_LEX
+if test "$LEX" != flex; then
+  LEX="$SHELL $missing_dir/missing flex"
+  AC_SUBST(LEX_OUTPUT_ROOT, lex.yy)
+  AC_SUBST(LEXLIB, '')
+fi
+
+ +

+The shell script @command{missing} can be found in the Automake +distribution. + + +

+To ensure backward compatibility, Automake's AM_PROG_LEX invokes +(indirectly) this macro twice, which will cause an annoying but benign +"AC_PROG_LEX invoked multiple times" warning. Future versions +of Automake will fix this issue, meanwhile, just ignore this message. +

+ + +

+

+
Macro: AC_PROG_LN_S +
+ + +If `ln -s' works on the current file system (the operating system +and file system support symbolic links), set the output variable +LN_S to `ln -s'; otherwise, if `ln' works, set +LN_S to `ln' and otherwise set it to `cp -p'. + + +

+If you make a link a directory other than the current directory, its +meaning depends on whether `ln' or `ln -s' is used. To safely +create links using `$(LN_S)', either find out which form is used +and adjust the arguments, or always invoke ln in the directory +where the link is to be created. + + +

+In other words, it does not work to do: + +

+$(LN_S) foo /x/bar
+
+ +

+Instead, do: + + + +

+(cd /x && $(LN_S) foo bar)
+
+ +
+ +

+

+
Macro: AC_PROG_RANLIB +
+ + +Set output variable RANLIB to `ranlib' if ranlib +is found, and otherwise to `:' (do nothing). +
+ + +

+

+
Macro: AC_PROG_YACC +
+ + +If bison is found, set output variable YACC to `bison +-y'. Otherwise, if byacc is found, set YACC to +`byacc'. Otherwise set YACC to `yacc'. +
+ + + + +

Generic Program and File Checks

+ +

+These macros are used to find programs not covered by the "particular" +test macros. If you need to check the behavior of a program as well as +find out whether it is present, you have to write your own test for it +(see section Writing Tests). By default, these macros use the environment +variable PATH. If you need to check for a program that might not +be in the user's PATH, you can pass a modified path to use +instead, like this: + + + +

+AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
+             [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc])
+
+ +

+You are strongly encouraged to declare the variable passed to +AC_CHECK_PROG etc. as precious, See section Setting Output Variables, +AC_ARG_VAR, for more details. + + +

+

+
Macro: AC_CHECK_PROG (variable, prog-to-check-for, value-if-found, @ovar{value-if-not-found}, @ovar{path}, @ovar{reject}) +
+ +Check whether program prog-to-check-for exists in PATH. If +it is found, set variable to value-if-found, otherwise to +value-if-not-found, if given. Always pass over reject (an +absolute file name) even if it is the first found in the search path; in +that case, set variable using the absolute file name of the +prog-to-check-for found that is not reject. If +variable was already set, do nothing. Calls AC_SUBST for +variable. +
+ + +

+

+
Macro: AC_CHECK_PROGS (variable, progs-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Check for each program in the whitespace-separated list +progs-to-check-for exists on the PATH. If it is found, set +variable to the name of that program. Otherwise, continue +checking the next program in the list. If none of the programs in the +list are found, set variable to value-if-not-found; if +value-if-not-found is not specified, the value of variable +is not changed. Calls AC_SUBST for variable. +
+ + +

+

+
Macro: AC_CHECK_TOOL (variable, prog-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Like AC_CHECK_PROG, but first looks for prog-to-check-for +with a prefix of the host type as determined by +AC_CANONICAL_HOST, followed by a dash (see section Getting the Canonical System Type). +For example, if the user runs `configure --host=i386-gnu', then +this call: + +
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+
+ +

+sets RANLIB to `i386-gnu-ranlib' if that program exists in +PATH, or otherwise to `ranlib' if that program exists in +PATH, or to `:' if neither program exists. +

+ + +

+

+
Macro: AC_CHECK_TOOLS (variable, progs-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Like AC_CHECK_TOOL, each of the tools in the list +progs-to-check-for are checked with a prefix of the host type as +determined by AC_CANONICAL_HOST, followed by a dash +(see section Getting the Canonical System Type). If none of the tools can be found with a +prefix, then the first one without a prefix is used. If a tool is found, +set variable to the name of that program. If none of the tools in +the list are found, set variable to value-if-not-found; if +value-if-not-found is not specified, the value of variable +is not changed. Calls AC_SUBST for variable. +
+ + +

+

+
Macro: AC_PATH_PROG (variable, prog-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Like AC_CHECK_PROG, but set variable to the entire +path of prog-to-check-for if found. +
+ + +

+

+
Macro: AC_PATH_PROGS (variable, progs-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Like AC_CHECK_PROGS, but if any of progs-to-check-for +are found, set variable to the entire path of the program +found. +
+ + +

+

+
Macro: AC_PATH_TOOL (variable, prog-to-check-for, @ovar{value-if-not-found}, @ovar{path}) +
+ +Like AC_CHECK_TOOL, but set variable to the entire +path of the program if it is found. +
+ + + + +

Files

+

+ + + +

+You might also need to check for the existence of files. Before using +these macros, ask yourself whether a run time test might not be a better +solution. Be aware that, like most Autoconf macros, they test a feature +of the host machine, and therefore, they die when cross-compiling. + + +

+

+
Macro: AC_CHECK_FILE (file, @ovar{action-if-found}, @ovar{action-if-not-found}) +
+ +Check whether file file exists on the native system. If it is +found, execute action-if-found, otherwise do +action-if-not-found, if given. +
+ + +

+

+
Macro: AC_CHECK_FILES (files, @ovar{action-if-found}, @ovar{action-if-not-found}) +
+ +Executes AC_CHECK_FILE once for each file listed in files. +Additionally, defines `HAVE_file' (see section Standard Symbols) +for each file found. +
+ + + + +

Library Files

+

+ + + +

+The following macros check for the presence of certain C, C++ or Fortran +77 library archive files. + + +

+

+
Macro: AC_CHECK_LIB (library, function, @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) +
+ +Depending on the current language(see section Language Choice), try to +ensure that the C, C++, or Fortran 77 function function is +available by checking whether a test program can be linked with the +library library to get the function. library is the base +name of the library; e.g., to check for @option{-lmp}, use `mp' as +the library argument. + + +

+action-if-found is a list of shell commands to run if the link +with the library succeeds; action-if-not-found is a list of shell +commands to run if the link fails. If action-if-found is not +specified, the default action will prepend @option{-llibrary} to +LIBS and define `HAVE_LIBlibrary' (in all +capitals). This macro is intended to support building of LIBS in +a right-to-left (least-dependent to most-dependent) fashion such that +library dependencies are satisfied as a natural side-effect of +consecutive tests. Some linkers are very sensitive to library ordering +so the order in which LIBS is generated is important to reliable +detection of libraries. + + +

+If linking with library results in unresolved symbols that would +be resolved by linking with additional libraries, give those libraries +as the other-libraries argument, separated by spaces: +e.g. @option{-lXt -lX11}. Otherwise, this macro will fail to detect +that library is present, because linking the test program will +always fail with unresolved symbols. The other-libraries argument +should be limited to cases where it is desirable to test for one library +in the presence of another that is not already in LIBS. +

+ + +

+

+
Macro: AC_SEARCH_LIBS (function, search-libs, @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) +
+ +Search for a library defining function if it's not already +available. This equates to calling AC_TRY_LINK_FUNC first +with no libraries, then for each library listed in search-libs. + + +

+Add @option{-llibrary} to LIBS for the first library found +to contain function, and run action-if-found. If the +function is not found, run action-if-not-found. + + +

+If linking with library results in unresolved symbols that would +be resolved by linking with additional libraries, give those libraries +as the other-libraries argument, separated by spaces: +e.g. @option{-lXt -lX11}. Otherwise, this macro will fail to detect +that function is present, because linking the test program will +always fail with unresolved symbols. +

+ + + + +

Library Functions

+ +

+The following macros check for particular C library functions. +If there is no macro specifically defined to check for a function you need, +and you don't need to check for any special properties of +it, then you can use one of the general function-check macros. + + + + +

Portability of C Functions

+ +

+Most usual functions can either be missing, or be buggy, or be limited +on some architectures. This section tries to make an inventory of these +portability issues. By definition, this list will always require +additions. Please help us keeping it as complete as possible. + + +

+ +
snprintf +
+ + +The ISO C99 standard says that if the output array isn't big enough and +if no other errors occur, snprintf and vsnprintf truncate +the output and return the number of bytes that ought to have been +produced. Some older systems return the truncated length (e.g., GNU C +Library 2.0.x or IRIX 6.5), some a negative value (e.g., earlier GNU C +Library versions), and some the buffer length without truncation (e.g., +32-bit Solaris 7). Also, some buggy older systems ignore the length and +overrun the buffer (e.g., 64-bit Solaris 7). + +
sprintf +
+ + +The ISO C standard says sprintf and vsprintf return the +number of bytes written, but on some old systems (SunOS 4 for +instance) they return the buffer pointer instead. + +
sscanf +
+ +On various old systems, e.g. HP-UX 9, sscanf requires that its +input string is writable (though it doesn't actually change it). This +can be a problem when using @command{gcc} since it normally puts +constant strings in read-only memory +(see section `Incompatibilities' in Using and Porting the GNU Compiler Collection). Apparently in some cases even +having format strings read-only can be a problem. + +
strnlen +
+ +AIX 4.3 provides a broken version which produces funny results: + + +
+strnlen ("foobar", 0) = 0
+strnlen ("foobar", 1) = 3
+strnlen ("foobar", 2) = 2
+strnlen ("foobar", 3) = 1
+strnlen ("foobar", 4) = 0
+strnlen ("foobar", 5) = 6
+strnlen ("foobar", 6) = 6
+strnlen ("foobar", 7) = 6
+strnlen ("foobar", 8) = 6
+strnlen ("foobar", 9) = 6
+
+ +
unlink +
+ +The POSIX spec says that unlink causes the given files to be +removed only after there are no more open file handles for it. Not all +OS's support this behaviour though. So even on systems that provide +unlink, you cannot portably assume it is OK to call it on files +that are open. For example, on Windows 9x and ME, such a call would fail; +on DOS it could even lead to file system corruption, as the file might end +up being written to after the OS has removed it. + +
va_copy +
+ +The ISO C99 standard provides va_copy for copying +va_list variables. It may be available in older environments +too, though possibly as __va_copy (eg. @command{gcc} in strict +C89 mode). These can be tested with #ifdef. A fallback to +memcpy (&dst, &src, sizeof(va_list)) will give maximum +portability. + +
va_list +
+ +va_list is not necessarily just a pointer. It can be a +struct (eg. @command{gcc} on Alpha), which means NULL is +not portable. Or it can be an array (eg. @command{gcc} in some +PowerPC configurations), which means as a function parameter it can be +effectively call-by-reference and library routines might modify the +value back in the caller (eg. vsnprintf in the GNU C Library +2.1). + +
Signed >> +
+Normally the C >> right shift of a signed type replicates the +high bit, giving a so-called "arithmetic" shift. But care should be +taken since the ISO C standard doesn't require that behaviour. On those +few processors without a native arithmetic shift (for instance Cray +vector systems) zero bits may be shifted in, the same as a shift of an +unsigned type. +
+ + + +

Particular Function Checks

+

+ + + +

+These macros check for particular C functions--whether they exist, and +in some cases how they respond when given certain arguments. + + +

+

+
Macro: AC_FUNC_ALLOCA +
+ + + + + +Check how to get alloca. Tries to get a builtin version by +checking for `alloca.h' or the predefined C preprocessor macros +__GNUC__ and _AIX. If this macro finds `alloca.h', +it defines HAVE_ALLOCA_H. + + +

+If those attempts fail, it looks for the function in the standard C +library. If any of those methods succeed, it defines +HAVE_ALLOCA. Otherwise, it sets the output variable +ALLOCA to `alloca.o' and defines C_ALLOCA (so +programs can periodically call `alloca(0)' to garbage collect). +This variable is separate from LIBOBJS so multiple programs can +share the value of ALLOCA without needing to create an actual +library, in case only some of them use the code in LIBOBJS. + + +

+This macro does not try to get alloca from the System V R3 +`libPW' or the System V R4 `libucb' because those libraries +contain some incompatible functions that cause trouble. Some versions +do not even contain alloca or contain a buggy version. If you +still want to use their alloca, use ar to extract +`alloca.o' from them instead of compiling `alloca.c'. + + +

+Source files that use alloca should start with a piece of code +like the following, to declare it properly. In some versions of AIX, +the declaration of alloca must precede everything else except for +comments and preprocessor directives. The #pragma directive is +indented so that pre-ANSI C compilers will ignore it, rather than +choke on it. + + + +

+/* AIX requires this to be the first thing in the file.  */
+#ifndef __GNUC__
+# if HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifdef _AIX
+ #pragma alloca
+#  else
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#   endif
+#  endif
+# endif
+#endif
+
+ +
+ +

+

+
Macro: AC_FUNC_CHOWN +
+ + +If the chown function is available and works (in particular, it +should accept @option{-1} for uid and gid), define +HAVE_CHOWN. +
+ + +

+

+
Macro: AC_FUNC_CLOSEDIR_VOID +
+ + + +If the closedir function does not return a meaningful value, +define CLOSEDIR_VOID. Otherwise, callers ought to check its +return value for an error indicator. +
+ + +

+

+
Macro: AC_FUNC_ERROR_AT_LINE +
+ + +If the error_at_line function is not found, require an +AC_LIBOBJ replacement of `error'. +
+ + +

+

+
Macro: AC_FUNC_FNMATCH +
+ + +If the fnmatch function is available and works (unlike the one on +Solaris 2.4), define HAVE_FNMATCH. +
+ + +

+

+
Macro: AC_FUNC_FORK +
+ + + + + + + +This macro checks for the fork and vfork functions. If a +working fork is found, define HAVE_WORKING_FORK. This macro +checks whether fork is just a stub by trying to run it. + + +

+If `vfork.h' is found, define HAVE_VFORK_H. If a working +vfork is found, define HAVE_WORKING_VFORK. Otherwise, +define vfork to be fork for backward compatibility with +previous versions of @command{autoconf}. This macro checks for several known +errors in implementations of vfork and considers the system to not +have a working vfork if it detects any of them. It is not considered +to be an implementation error if a child's invocation of signal +modifies the parent's signal handler, since child processes rarely change +their signal handlers. + + +

+Since this macro defines vfork only for backward compatibility with +previous versions of @command{autoconf} you're encouraged to define it +yourself in new code: + +

+#if !HAVE_WORKING_VFORK
+# define vfork fork
+#endif
+
+ +
+ +

+

+
Macro: AC_FUNC_FSEEKO +
+ + + +If the fseeko function is available, define HAVE_FSEEKO. +Define _LARGEFILE_SOURCE if necessary. +
+ + +

+

+
Macro: AC_FUNC_GETGROUPS +
+ + + +If the getgroups function is available and works (unlike on +Ultrix 4.3, where `getgroups (0, 0)' always fails), define +HAVE_GETGROUPS. Set GETGROUPS_LIBS to any libraries +needed to get that function. This macro runs AC_TYPE_GETGROUPS. +
+ + +

+

+
Macro: AC_FUNC_GETLOADAVG +
+ + + + + + + + + + + + + + + +Check how to get the system load averages. If the system has the +getloadavg function, define HAVE_GETLOADAVG, and set +GETLOADAVG_LIBS to any libraries needed to get that function. +Also add GETLOADAVG_LIBS to LIBS. + + +

+Otherwise, require an AC_LIBOBJ replacement (`getloadavg.c') +of `getloadavg', and possibly define several other C preprocessor +macros and output variables: + + + +

    +
  1. + +Define C_GETLOADAVG. + +
  2. + +Define SVR4, DGUX, UMAX, or UMAX4_3 if on +those systems. + +
  3. + +If `nlist.h' is found, define NLIST_STRUCT. + +
  4. + +If `struct nlist' has an `n_un.n_name' member, define +HAVE_STRUCT_NLIST_N_UN_N_NAME. The obsolete symbol +NLIST_NAME_UNION is still defined, but do not depend upon it. + +
  5. + +Programs may need to be installed setgid (or setuid) for +getloadavg to work. In this case, define +GETLOADAVG_PRIVILEGED, set the output variable NEED_SETGID +to `true' (and otherwise to `false'), and set +KMEM_GROUP to the name of the group that should own the installed +program. +
+ +
+ +

+

+
Macro: AC_FUNC_GETMNTENT +
+ + + +Check for getmntent in the `sun', `seq', and `gen' +libraries, for Irix 4, PTX, and Unixware, respectively. Then, if +getmntent is available, define HAVE_GETMNTENT. +
+ + +

+

+
Macro: AC_FUNC_GETPGRP +
+ + + + +Define GETPGRP_VOID if it is an error to pass 0 to +getpgrp; this is the POSIX.1 behavior. On older BSD +systems, you must pass 0 to getpgrp, as it takes an argument and +behaves like POSIX.1's getpgid. + + + +
+#if GETPGRP_VOID
+  pid = getpgrp ();
+#else
+  pid = getpgrp (0);
+#endif
+
+ +

+This macro does not check whether +getpgrp exists at all; if you need to work in that situation, +first call AC_CHECK_FUNC for getpgrp. +

+ + +

+

+
Macro: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK +
+ + + +If `link' is a symbolic link, then lstat should treat +`link/' the same as `link/.'. However, many older +lstat implementations incorrectly ignore trailing slashes. + + +

+It is safe to assume that if lstat incorrectly ignores +trailing slashes, then other symbolic-link-aware functions like +unlink and unlink also incorrectly ignore trailing slashes. + + +

+If lstat behaves properly, define +LSTAT_FOLLOWS_SLASHED_SYMLINK, otherwise require an +AC_LIBOBJ replacement of lstat. +

+ + +

+

+
Macro: AC_FUNC_MALLOC +
+ + +If the malloc works correctly (`malloc (0)' returns a valid +pointer), define HAVE_MALLOC. +
+ + +

+

+
Macro: AC_FUNC_MEMCMP +
+ + + +If the memcmp function is not available, or does not work on +8-bit data (like the one on SunOS 4.1.3), or fails when comparing 16 +bytes or more and with at least one buffer not starting on a 4-byte +boundary (such as the one on NeXT x86 OpenStep), require an +AC_LIBOBJ replacement for `memcmp'. +
+ + +

+

+
Macro: AC_FUNC_MKTIME +
+ + + +If the mktime function is not available, or does not work +correctly, require an AC_LIBOBJ replacement for `mktime'. +
+ + +

+

+
Macro: AC_FUNC_MMAP +
+ + + +If the mmap function exists and works correctly, define +HAVE_MMAP. Only checks private fixed mapping of already-mapped +memory. +
+ + +

+

+
Macro: AC_FUNC_OBSTACK +
+ + + +If the obstacks are found, define HAVE_OBSTACK, else require an +AC_LIBOBJ replacement for `obstack'. +
+ + +

+

+
Macro: AC_FUNC_SELECT_ARGTYPES +
+ + + + + +Determines the correct type to be passed for each of the +select function's arguments, and defines those types +in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234, and +SELECT_TYPE_ARG5 respectively. SELECT_TYPE_ARG1 defaults +to `int', SELECT_TYPE_ARG234 defaults to `int *', +and SELECT_TYPE_ARG5 defaults to `struct timeval *'. +
+ + +

+

+
Macro: AC_FUNC_SETPGRP +
+ + + +If setpgrp takes no argument (the POSIX.1 version), define +SETPGRP_VOID. Otherwise, it is the BSD version, which takes +two process IDs as arguments. This macro does not check whether +setpgrp exists at all; if you need to work in that situation, +first call AC_CHECK_FUNC for setpgrp. +
+ + +

+

+
Macro: AC_FUNC_STAT +
+
Macro: AC_FUNC_LSTAT +
+ + + + + + +Determine whether stat or lstat have the bug that it +succeeds when given the zero-length file name argument. The stat +and lstat from SunOS 4.1.4 and the Hurd (as of 1998-11-01) do +this. + + +

+If it does, then define HAVE_STAT_EMPTY_STRING_BUG (or +HAVE_LSTAT_EMPTY_STRING_BUG) and ask for an AC_LIBOBJ +replacement of it. +

+ + +

+

+
Macro: AC_FUNC_SETVBUF_REVERSED +
+ + + +If setvbuf takes the buffering type as its second argument and +the buffer pointer as the third, instead of the other way around, define +SETVBUF_REVERSED. +
+ + +

+

+
Macro: AC_FUNC_STRCOLL +
+ + + +If the strcoll function exists and works correctly, define +HAVE_STRCOLL. This does a bit more than +`AC_CHECK_FUNCS(strcoll)', because some systems have incorrect +definitions of strcoll that should not be used. +
+ + +

+

+
Macro: AC_FUNC_STRTOD +
+ + + +If the strtod function does not exist or doesn't work correctly, +ask for an AC_LIBOBJ replacement of `strtod'. In this case, +because `strtod.c' is likely to need `pow', set the output +variable POW_LIB to the extra library needed. +
+ + +

+

+
Macro: AC_FUNC_STRERROR_R +
+ + + + + +If strerror_r is available, define HAVE_STRERROR_R, and if +it is declared, define HAVE_DECL_STRERROR_R. If it returns a +char * message, define STRERROR_R_CHAR_P; otherwise it +returns an int error number. The Thread-Safe Functions option of +POSIX-200X requires strerror_r to return int, but +many systems (including, for example, version 2.2.4 of the GNU C +Library) return a char * value that is not necessarily equal to +the buffer argument. +
+ + +

+

+
Macro: AC_FUNC_STRFTIME +
+ + + +Check for strftime in the `intl' library, for SCO UNIX. +Then, if strftime is available, define HAVE_STRFTIME. +
+ + +

+

+
Macro: AC_FUNC_STRNLEN +
+ + + +Check for a working strnlen, and ask for its replacement. Some +architectures are know to provide broken versions of strnlen, such +as AIX 4.3. +
+ + +

+

+
Macro: AC_FUNC_UTIME_NULL +
+ + + +If `utime(file, NULL)' sets file's timestamp to +the present, define HAVE_UTIME_NULL. +
+ + +

+

+
Macro: AC_FUNC_VPRINTF +
+ + + + +If vprintf is found, define HAVE_VPRINTF. Otherwise, if +_doprnt is found, define HAVE_DOPRNT. (If vprintf +is available, you may assume that vfprintf and vsprintf +are also available.) +
+ + + + +

Generic Function Checks

+ +

+These macros are used to find functions not covered by the "particular" +test macros. If the functions might be in libraries other than the +default C library, first call AC_CHECK_LIB for those libraries. +If you need to check the behavior of a function as well as find out +whether it is present, you have to write your own test for +it (see section Writing Tests). + + +

+

+
Macro: AC_CHECK_FUNC (function, @ovar{action-if-found}, @ovar{action-if-not-found}) +
+ +If C function function is available, run shell commands +action-if-found, otherwise action-if-not-found. If you just +want to define a symbol if the function is available, consider using +AC_CHECK_FUNCS instead. This macro checks for functions with C +linkage even when AC_LANG(C++) has been called, since C is more +standardized than C++. (see section Language Choice, for more information +about selecting the language for checks.) +
+ + +

+

+
Macro: AC_CHECK_FUNCS (function..., @ovar{action-if-found}, @ovar{action-if-not-found}) +
+ + +For each function in the whitespace-separated argument list, +define HAVE_function (in all capitals) if it is available. +If action-if-found is given, it is additional shell code to +execute when one of the functions is found. You can give it a value of +`break' to break out of the loop on the first match. If +action-if-not-found is given, it is executed when one of the +functions is not found. +
+ + +

+Autoconf follows a philosophy that was formed over the years by those +who have struggled for portability: isolate the portability issues in +specific files, and then program as if you were in a POSIX +environment. Some functions may be missing or unfixable, and your +package must be ready to replace them. + + +

+Use the first three of the following macros to specify a function to be +replaced, and the last one (AC_REPLACE_FUNCS) to check for and +replace the function if needed. + + +

+

+
Macro: AC_LIBOBJ (function) +
+ + +Specify that `function.c' must be included in the executables +to replace a missing or broken implementation of function. + + +

+Technically, it adds `function.$ac_objext' to the output +variable LIBOBJS and calls AC_LIBSOURCE for +`function.c'. You should not directly change LIBOBJS, +since this is not traceable. +

+ + +

+

+
Macro: AC_LIBSOURCE (file) +
+ +Specify that file might be needed to compile the project. If you +need to know what files might be needed by a `configure.ac', you +should trace AC_LIBSOURCE. file must be a literal. + + +

+This macro is called automatically from AC_LIBOBJ, but you must +call it explicitly if you pass a shell variable to AC_LIBOBJ. In +that case, since shell variables cannot be traced statically, you must +pass to AC_LIBSOURCE any possible files that the shell variable +might cause AC_LIBOBJ to need. For example, if you want to pass +a variable $foo_or_bar to AC_LIBOBJ that holds either +"foo" or "bar", you should do: + + + +

+AC_LIBSOURCE(foo.c)
+AC_LIBSOURCE(bar.c)
+AC_LIBOBJ($foo_or_bar)
+
+ +

+There is usually a way to avoid this, however, and you are encouraged to +simply call AC_LIBOBJ with literal arguments. + + +

+Note that this macro replaces the obsolete AC_LIBOBJ_DECL, with +slightly different semantics: the old macro took the function name, +e.g. foo, as its argument rather than the file name. +

+ + +

+

+
Macro: AC_LIBSOURCES (files) +
+ +Like AC_LIBSOURCE, but accepts one or more files in a +comma-separated M4 list. Thus, the above example might be rewritten: + + + +
+AC_LIBSOURCES([foo.c, bar.c])
+AC_LIBOBJ($foo_or_bar)
+
+ +
+ +

+

+
Macro: AC_REPLACE_FUNCS (function...) +
+ + +Like AC_CHECK_FUNCS, but uses `AC_LIBOBJ(function)' as +action-if-not-found. You can declare your replacement function by +enclosing the prototype in `#if !HAVE_function'. If the +system has the function, it probably declares it in a header file you +should be including, so you shouldn't redeclare it lest your declaration +conflict. +
+ + + + +

Header Files

+

+ + + +

+The following macros check for the presence of certain C header files. +If there is no macro specifically defined to check for a header file you need, +and you don't need to check for any special properties of +it, then you can use one of the general header-file check macros. + + + + +

Particular Header Checks

+ +

+These macros check for particular system header files--whether they +exist, and in some cases whether they declare certain symbols. + + +

+

+
Macro: AC_HEADER_DIRENT +
+ + + + + +Check for the following header files. For the first one that is +found and defines `DIR', define the listed C preprocessor macro: + + +
  • `dirent.h' HAVE_DIRENT_H + +
  • `sys/ndir.h' HAVE_SYS_NDIR_H + +
  • `sys/dir.h' HAVE_SYS_DIR_H + +
  • `ndir.h' HAVE_NDIR_H + +The directory-library declarations in your source code should look +something like the following: + + +
    +#if HAVE_DIRENT_H
    +# include <dirent.h>
    +# define NAMLEN(dirent) strlen((dirent)->d_name)
    +#else
    +# define dirent direct
    +# define NAMLEN(dirent) (dirent)->d_namlen
    +# if HAVE_SYS_NDIR_H
    +#  include <sys/ndir.h>
    +# endif
    +# if HAVE_SYS_DIR_H
    +#  include <sys/dir.h>
    +# endif
    +# if HAVE_NDIR_H
    +#  include <ndir.h>
    +# endif
    +#endif
    +
    + +Using the above declarations, the program would declare variables to be +of type struct dirent, not struct direct, and would access +the length of a directory entry name by passing a pointer to a +struct dirent to the NAMLEN macro. + +This macro also checks for the SCO Xenix `dir' and `x' libraries. +
  • + +
    +
    Macro: AC_HEADER_MAJOR +
    + + + +If `sys/types.h' does not define major, minor, and +makedev, but `sys/mkdev.h' does, define +MAJOR_IN_MKDEV; otherwise, if `sys/sysmacros.h' does, define +MAJOR_IN_SYSMACROS. +
    + +
    +
    Macro: AC_HEADER_STAT +
    + + +If the macros S_ISDIR, S_ISREG et al. defined in +`sys/stat.h' do not work properly (returning false positives), +define STAT_MACROS_BROKEN. This is the case on Tektronix UTekV, +Amdahl UTS and Motorola System V/88. +
    + +
    +
    Macro: AC_HEADER_STDC +
    + + +Define STDC_HEADERS if the system has ANSI C header files. +Specifically, this macro checks for `stdlib.h', `stdarg.h', +`string.h', and `float.h'; if the system has those, it +probably has the rest of the ANSI C header files. This macro also +checks whether `string.h' declares memchr (and thus +presumably the other mem functions), whether `stdlib.h' +declare free (and thus presumably malloc and other related +functions), and whether the `ctype.h' macros work on characters +with the high bit set, as ANSI C requires. + +Use STDC_HEADERS instead of __STDC__ to determine whether +the system has ANSI-compliant header files (and probably C library +functions) because many systems that have GCC do not have ANSI C +header files. + +On systems without ANSI C headers, there is so much variation that +it is probably easier to declare the functions you use than to figure +out exactly what the system header files declare. Some systems contain +a mix of functions ANSI and BSD; some are mostly ANSI but +lack `memmove'; some define the BSD functions as macros in +`string.h' or `strings.h'; some have only the BSD +functions but `string.h'; some declare the memory functions in +`memory.h', some in `string.h'; etc. It is probably +sufficient to check for one string function and one memory function; if +the library has the ANSI versions of those then it probably has +most of the others. If you put the following in `configure.ac': + + +
    +AC_HEADER_STDC
    +AC_CHECK_FUNCS(strchr memcpy)
    +
    + +then, in your code, you can put declarations like this: + + +
    +#if STDC_HEADERS
    +# include <string.h>
    +#else
    +# if !HAVE_STRCHR
    +#  define strchr index
    +#  define strrchr rindex
    +# endif
    +char *strchr (), *strrchr ();
    +# if !HAVE_MEMCPY
    +#  define memcpy(d, s, n) bcopy ((s), (d), (n))
    +#  define memmove(d, s, n) bcopy ((s), (d), (n))
    +# endif
    +#endif
    +
    + +If you use a function like memchr, memset, strtok, +or strspn, which have no BSD equivalent, then macros won't +suffice; you must provide an implementation of each function. An easy +way to incorporate your implementations only when needed (since the ones +in system C libraries may be hand optimized) is to, taking memchr +for example, put it in `memchr.c' and use +`AC_REPLACE_FUNCS(memchr)'. +
    + +
    +
    Macro: AC_HEADER_SYS_WAIT +
    + + +If `sys/wait.h' exists and is compatible with POSIX.1, define +HAVE_SYS_WAIT_H. Incompatibility can occur if `sys/wait.h' +does not exist, or if it uses the old BSD union wait instead +of int to store a status value. If `sys/wait.h' is not +POSIX.1 compatible, then instead of including it, define the +POSIX.1 macros with their usual interpretations. Here is an +example: + + +
    +#include <sys/types.h>
    +#if HAVE_SYS_WAIT_H
    +# include <sys/wait.h>
    +#endif
    +#ifndef WEXITSTATUS
    +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
    +#endif
    +#ifndef WIFEXITED
    +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
    +#endif
    +
    + +
    + + +_POSIX_VERSION is defined when `unistd.h' is included on +POSIX.1 systems. If there is no `unistd.h', it is definitely +not a POSIX.1 system. However, some non-POSIX.1 systems do +have `unistd.h'. + +The way to check if the system supports POSIX.1 is: + + +
    +#if HAVE_UNISTD_H
    +# include <sys/types.h>
    +# include <unistd.h>
    +#endif
    +
    +#ifdef _POSIX_VERSION
    +/* Code for POSIX.1 systems.  */
    +#endif
    +
    + +
    +
    Macro: AC_HEADER_TIME +
    + + +If a program may include both `time.h' and `sys/time.h', +define TIME_WITH_SYS_TIME. On some older systems, +`sys/time.h' includes `time.h', but `time.h' is not +protected against multiple inclusion, so programs should not explicitly +include both files. This macro is useful in programs that use, for +example, struct timeval or struct timezone as well as +struct tm. It is best used in conjunction with +HAVE_SYS_TIME_H, which can be checked for using +AC_CHECK_HEADERS(sys/time.h). + + +
    +#if TIME_WITH_SYS_TIME
    +# include <sys/time.h>
    +# include <time.h>
    +#else
    +# if HAVE_SYS_TIME_H
    +#  include <sys/time.h>
    +# else
    +#  include <time.h>
    +# endif
    +#endif
    +
    + +
    + +
    +
    Macro: AC_HEADER_TIOCGWINSZ +
    + + +If the use of TIOCGWINSZ requires `<sys/ioctl.h>', then +define GWINSZ_IN_SYS_IOCTL. Otherwise TIOCGWINSZ can be +found in `<termios.h>'. + +Use: + + +
    +#if HAVE_TERMIOS_H
    +# include <termios.h>
    +#endif
    +
    +#if GWINSZ_IN_SYS_IOCTL
    +# include <sys/ioctl.h>
    +#endif
    +
    + +
    + + + +

    Generic Header Checks

    + +

    +These macros are used to find system header files not covered by the +"particular" test macros. If you need to check the contents of a header +as well as find out whether it is present, you have to write your own +test for it (see section Writing Tests). + + +

    +

    +
    Macro: AC_CHECK_HEADER (header-file, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +If the system header file header-file is usable, execute shell +commands action-if-found, otherwise execute +action-if-not-found. If you just want to define a symbol if the +header file is available, consider using AC_CHECK_HEADERS +instead. + + +

    +The meaning of "usable" depends upon the content of includes: + + +

    + +
    if includes is empty +
    +check whether + + +
    +header-file
    +
    + +can be preprocessed without error. + +
    if include is set +
    +Check whether + + +
    +includes
    +#include <header-file>
    +
    + +can be compiled without error. You may use +AC_CHECK_HEADER (and AC_CHECK_HEADERS) to check whether +two headers are compatible. +
    + +

    +You may pass any kind of dummy content for includes, such as a +single space, a comment, to check whether header-file compiles +with success. +

    + + +

    +

    +
    Macro: AC_CHECK_HEADERS (header-file..., @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + + +For each given system header file header-file in the +whitespace-separated argument list that exists, define +HAVE_header-file (in all capitals). If action-if-found +is given, it is additional shell code to execute when one of the header +files is found. You can give it a value of `break' to break out of +the loop on the first match. If action-if-not-found is given, it +is executed when one of the header files is not found. + + +

    +Be sure to read the documentation of AC_CHECK_HEADER to +understand the influence of includes. +

    + + + + +

    Declarations

    +

    + + + +

    +The following macros check for the declaration of variables and +functions. If there is no macro specifically defined to check for a +symbol you need, then you can use the general macros (see section Generic Declaration Checks) or, for more complex tests, you may use +AC_TRY_COMPILE (see section Examining Syntax). + + + + +

    Particular Declaration Checks

    + +

    +The following macros check for certain declarations. + + +

    +

    +
    Macro: AC_DECL_SYS_SIGLIST +
    + + +Define SYS_SIGLIST_DECLARED if the variable sys_siglist +is declared in a system header file, either `signal.h' or +`unistd.h'. +
    + + + + +

    Generic Declaration Checks

    + +

    +These macros are used to find declarations not covered by the "particular" +test macros. + + +

    +

    +
    Macro: AC_CHECK_DECL (symbol, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +If symbol (a function or a variable) is not declared in +includes and a declaration is needed, run the shell commands +action-if-not-found, otherwise action-if-found. If no +includes are specified, the default includes are used +(see section Default Includes). + + +

    +This macro actually tests whether it is valid to use symbol as an +r-value, not if it is really declared, because it is much safer to avoid +introducing extra declarations when they are not needed. +

    + + +

    +

    +
    Macro: AC_CHECK_DECLS (symbols, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + + +For each of the symbols (comma-separated list), define +HAVE_DECL_symbol (in all capitals) to `1' if +symbol is declared, otherwise to `0'. If +action-if-not-found is given, it is additional shell code to +execute when one of the function declarations is needed, otherwise +action-if-found is executed. + + +

    +This macro uses an m4 list as first argument: + +

    +AC_CHECK_DECLS(strdup)
    +AC_CHECK_DECLS([strlen])
    +AC_CHECK_DECLS([malloc, realloc, calloc, free])
    +
    + +

    +Unlike the other `AC_CHECK_*S' macros, when a symbol is not +declared, HAVE_DECL_symbol is defined to `0' instead +of leaving HAVE_DECL_symbol undeclared. When you are +sure that the check was performed, use +HAVE_DECL_symbol just like any other result of Autoconf: + + + +

    +#if !HAVE_DECL_SYMBOL
    +extern char *symbol;
    +#endif
    +
    + +

    +If the test may have not been performed, however, because it is safer +not to declare a symbol than to use a declaration that conflicts +with the system's one, you should use: + + + +

    +#if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
    +char *malloc (size_t *s);
    +#endif
    +
    + +

    +You fall into the second category only in extreme situations: either +your files may be used without being configured, or they are used during +the configuration. In most cases the traditional approach is enough. +

    + + + + +

    Structures

    +

    + + + +

    +The following macros check for the presence of certain members in C +structures. If there is no macro specifically defined to check for a +member you need, then you can use the general structure-member macro +(see section Generic Structure Checks) or, for more complex tests, you may use +AC_TRY_COMPILE (see section Examining Syntax). + + + + +

    Particular Structure Checks

    + +

    +The following macros check for certain structures or structure members. + + +

    +

    +
    Macro: AC_STRUCT_ST_BLKSIZE +
    + + + +If struct stat contains an st_blksize member, define +HAVE_STRUCT_STAT_ST_BLKSIZE. The former name, +HAVE_ST_BLKSIZE is to be avoided, as its support will cease in +the future. This macro is obsoleted, and should be replaced by + + + +
    +AC_CHECK_MEMBERS([struct stat.st_blksize])
    +
    + +
    + +

    +

    +
    Macro: AC_STRUCT_ST_BLOCKS +
    + + + + +If struct stat contains an st_blocks member, define +HAVE_STRUCT STAT_ST_BLOCKS. Otherwise, require an +AC_LIBOBJ replacement of `fileblocks'. The former name, +HAVE_ST_BLOCKS is to be avoided, as its support will cease in the +future. +
    + + +

    +

    +
    Macro: AC_STRUCT_ST_RDEV +
    + + + +If struct stat contains an st_rdev member, define +HAVE_STRUCT_STAT_ST_RDEV. The former name for this macro, +HAVE_ST_RDEV, is to be avoided as it will cease to be supported +in the future. Actually, even the new macro is obsolete, and should be +replaced by: + +
    +AC_CHECK_MEMBERS([struct stat.st_rdev])
    +
    + +
    + +

    +

    +
    Macro: AC_STRUCT_TM +
    + + +If `time.h' does not define struct tm, define +TM_IN_SYS_TIME, which means that including `sys/time.h' +had better define struct tm. +
    + + +

    +

    +
    Macro: AC_STRUCT_TIMEZONE +
    + + + +Figure out how to get the current timezone. If struct tm has a +tm_zone member, define HAVE_STRUCT_TM_TM_ZONE (and the +obsoleted HAVE_TM_ZONE). Otherwise, if the external array +tzname is found, define HAVE_TZNAME. +
    + + + + +

    Generic Structure Checks

    + +

    +These macros are used to find structure members not covered by the +"particular" test macros. + + +

    +

    +
    Macro: AC_CHECK_MEMBER (aggregate.member, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +Check whether member is a member of the aggregate aggregate. +If no includes are specified, the default includes are used +(see section Default Includes). + + + +
    +AC_CHECK_MEMBER(struct passwd.pw_gecos,,
    +                [AC_MSG_ERROR([We need `passwd.pw_gecos'!])],
    +                [#include <pwd.h>])
    +
    + +

    +You can use this macro for sub-members: + + + +

    +AC_CHECK_MEMBER(struct top.middle.bot)
    +
    + +
    + +

    +

    +
    Macro: AC_CHECK_MEMBERS (members, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +Check for the existence of each `aggregate.member' of +members using the previous macro. When member belongs to +aggregate, define HAVE_aggregate_member (in all +capitals, with spaces and dots replaced by underscores). + + +

    +This macro uses m4 lists: + +

    +AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
    +
    + +
    + + + +

    Types

    + +

    +The following macros check for C types, either builtin or typedefs. If +there is no macro specifically defined to check for a type you need, and +you don't need to check for any special properties of it, then you can +use a general type-check macro. + + + + +

    Particular Type Checks

    + +

    +These macros check for particular C types in `sys/types.h', +`stdlib.h' and others, if they exist. + + +

    +

    +
    Macro: AC_TYPE_GETGROUPS +
    + + +Define GETGROUPS_T to be whichever of gid_t or int +is the base type of the array argument to getgroups. +
    + + +

    +

    +
    Macro: AC_TYPE_MODE_T +
    + + +Equivalent to `AC_CHECK_TYPE(mode_t, int)'. +
    + + +

    +

    +
    Macro: AC_TYPE_OFF_T +
    + + +Equivalent to `AC_CHECK_TYPE(off_t, long)'. +
    + + +

    +

    +
    Macro: AC_TYPE_PID_T +
    + + +Equivalent to `AC_CHECK_TYPE(pid_t, int)'. +
    + + +

    +

    +
    Macro: AC_TYPE_SIGNAL +
    + + +If `signal.h' declares signal as returning a pointer to a +function returning void, define RETSIGTYPE to be +void; otherwise, define it to be int. + + +

    +Define signal handlers as returning type RETSIGTYPE: + + + +

    +RETSIGTYPE
    +hup_handler ()
    +{
    +...
    +}
    +
    + +
    + +

    +

    +
    Macro: AC_TYPE_SIZE_T +
    + + +Equivalent to `AC_CHECK_TYPE(size_t, unsigned)'. +
    + + +

    +

    +
    Macro: AC_TYPE_UID_T +
    + + + +If uid_t is not defined, define uid_t to be int and +gid_t to be int. +
    + + + + +

    Generic Type Checks

    + +

    +These macros are used to check for types not covered by the "particular" +test macros. + + +

    +

    +
    Macro: AC_CHECK_TYPE (type, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +Check whether type is defined. It may be a compiler builtin type +or defined by the includes (see section Default Includes). +
    + + +

    +

    +
    Macro: AC_CHECK_TYPES (types, @ovar{action-if-found}, @ovar{action-if-not-found}, @dvar{includes, default-includes}) +
    + +For each type of the types that is defined, define +HAVE_type (in all capitals). If no includes are +specified, the default includes are used (see section Default Includes). If +action-if-found is given, it is additional shell code to execute +when one of the types is found. If action-if-not-found is given, +it is executed when one of the types is not found. + + +

    +This macro uses m4 lists: + +

    +AC_CHECK_TYPES(ptrdiff_t)
    +AC_CHECK_TYPES([unsigned long long, uintmax_t])
    +
    + +
    + +

    +Autoconf, up to 2.13, used to provide to another version of +AC_CHECK_TYPE, broken by design. In order to keep backward +compatibility, a simple heuristics, quite safe but not totally, is +implemented. In case of doubt, read the documentation of the former +AC_CHECK_TYPE, see section Obsolete Macros. + + + + +

    Compilers and Preprocessors

    + +

    + +All the tests for compilers (AC_PROG_CC, AC_PROG_CXX, +AC_PROG_F77) define the output variable EXEEXT based on +the output of the 1compiler, typically to the empty string if Unix and +`.exe' if Win32 or OS/2. + + +

    + +They also define the output variable OBJEXT based on the +output of the compiler, after .c files have been excluded, typically +to `o' if Unix, `obj' if Win32. + + +

    +If the compiler being used does not produce executables, they fail. If +the executables can't be run, and cross-compilation is not enabled, they +fail too. See section Manual Configuration, for more on support for cross +compiling. + + + + +

    Specific Compiler Characteristics

    + +

    +Some compilers exhibit different behaviors. + + +

    + +
    Static/Dynamic Expressions +
    +Autoconf relies on a trick to extract one bit of information from the C +compiler: using negative array sizes. For instance the following +excerpt of a C source demonstrates how to test whether `int's are 4 +bytes long: + + +
    +int
    +main (void)
    +{
    +  static int test_array [sizeof (int) == 4 ? 1 : -1];
    +  test_array [0] = 0
    +  return 0;
    +}
    +
    + +To our knowledge, there is a single compiler that does not support this +trick: the HP C compilers (the real one, not only the "bundled") on +HP-UX 11.00: + + +
    +$ cc -c -Ae +O2 +Onolimit conftest.c
    +cc: "conftest.c": error 1879: Variable-length arrays cannot \
    +    have static storage.
    +
    + +Autoconf works around this problem by casting sizeof (int) to +long before comparing it. +
    + + + +

    Generic Compiler Characteristics

    + +

    +

    +
    Macro: AC_CHECK_SIZEOF (type, @ovar{unused}, @dvar{includes, default-includes}) +
    + +Define SIZEOF_type (see section Standard Symbols) to be the +size in bytes of type. If `type' is unknown, it gets a size +of 0. If no includes are specified, the default includes are used +(see section Default Includes). If you provide include, make sure to +include `stdio.h' which is required for this macro to run. + + +

    +This macro now works even when cross-compiling. The unused +argument was used when cross-compiling. + + +

    +For example, the call + + + +

    +AC_CHECK_SIZEOF(int *)
    +
    + +

    +defines SIZEOF_INT_P to be 8 on DEC Alpha AXP systems. +

    + + + + +

    C Compiler Characteristics

    + +

    +

    +
    Macro: AC_PROG_CC (@ovar{compiler-search-list}) +
    + + + +Determine a C compiler to use. If CC is not already set in the +environment, check for gcc and cc, then for other C +compilers. Set output variable CC to the name of the compiler +found. + + +

    +This macro may, however, be invoked with an optional first argument +which, if specified, must be a space separated list of C compilers to +search for. This just gives the user an opportunity to specify an +alternative search list for the C compiler. For example, if you didn't +like the default order, then you could invoke AC_PROG_CC like +this: + + + +

    +AC_PROG_CC(cl egcs gcc cc)
    +
    + +

    +If using the GNU C compiler, set shell variable GCC to +`yes'. If output variable CFLAGS was not already set, set +it to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems +where GCC does not accept @option{-g}), or @option{-g} for other compilers. +

    + + +

    +

    +
    Macro: AC_PROG_CC_C_O +
    + + +If the C compiler does not accept the @option{-c} and @option{-o} options +simultaneously, define NO_MINUS_C_MINUS_O. This macro actually +tests both the compiler found by AC_PROG_CC, and, if different, +the first cc in the path. The test fails if one fails. This +macro was created for GNU Make to choose the default C compilation +rule. +
    + + +

    +

    +
    Macro: AC_PROG_CC_STDC +
    + + +If the C compiler is not in ANSI C mode by default, try to add an +option to output variable CC to make it so. This macro tries +various options that select ANSI C on some system or another. It +considers the compiler to be in ANSI C mode if it handles function +prototypes correctly. + + +

    +If you use this macro, you should check after calling it whether the C +compiler has been set to accept ANSI C; if not, the shell variable +ac_cv_prog_cc_stdc is set to `no'. If you wrote your source +code in ANSI C, you can make an un-ANSIfied copy of it by +using the program ansi2knr, which comes with Automake. +

    + + +

    +

    +
    Macro: AC_PROG_CPP +
    + + +Set output variable CPP to a command that runs the +C preprocessor. If `$CC -E' doesn't work, `/lib/cpp' is used. +It is only portable to run CPP on files with a `.c' +extension. + + +

    +If the current language is C (see section Language Choice), many of the +specific test macros use the value of CPP indirectly by calling +AC_TRY_CPP, AC_CHECK_HEADER, AC_EGREP_HEADER, or +AC_EGREP_CPP. + + +

    +Some preprocessors don't indicate missing include files by the error +status. For such preprocessors an internal variable is set that causes +other macros to check the standard error from the preprocessor and +consider the test failed if any warnings have been reported. +

    + + +

    +The following macros check for C compiler or machine architecture +features. To check for characteristics not listed here, use +AC_TRY_COMPILE (see section Examining Syntax) or AC_TRY_RUN +(see section Checking Run Time Behavior) + + +

    +

    +
    Macro: AC_C_BIGENDIAN (@ovar{action-if-true}, @ovar{action-if-false}, @ovar{action-if-unknown}) +
    + + + +If words are stored with the most significant byte first (like Motorola +and SPARC CPUs), execute action-if-true. If words are stored with +the less significant byte first (like Intel and VAX CPUs), execute +action-if-false. + + +

    +This macro runs a test-case if endianness cannot be determined from the +system header files. When cross-compiling the test-case is not run but +grep'ed for some magic values. action-if-unknown is executed if +the latter case fails to determine the byte sex of the host system. + + +

    +The default for action-if-true is to define +`WORDS_BIGENDIAN'. The default for action-if-false is to do +nothing. And finally, the default for action-if-unknown is to +abort configure and tell the installer which variable he should preset +to bypass this test. +

    + + +

    +

    +
    Macro: AC_C_CONST +
    + + +If the C compiler does not fully support the ANSI C qualifier +const, define const to be empty. Some C compilers that do +not define __STDC__ do support const; some compilers that +define __STDC__ do not completely support const. Programs +can simply use const as if every C compiler supported it; for +those that don't, the `Makefile' or configuration header file will +define it as empty. + + +

    +Occasionally installers use a C++ compiler to compile C code, typically +because they lack a C compiler. This causes problems with const, +because C and C++ treat const differently. For example: + + + +

    +const int foo;
    +
    + +

    +is valid in C but not in C++. These differences unfortunately cannot be +papered over by defining const to be empty. + + +

    +If @command{autoconf} detects this situation, it leaves const alone, +as this generally yields better results in practice. However, using a +C++ compiler to compile C code is not recommended or supported, and +installers who run into trouble in this area should get a C compiler +like GCC to compile their C code. +

    + + +

    +

    +
    Macro: AC_C_VOLATILE +
    + + +If the C compiler does not understand the keyword volatile, +define volatile to be empty. Programs can simply use +volatile as if every C compiler supported it; for those that do +not, the `Makefile' or configuration header will define it as +empty. + + +

    +If the correctness of your program depends on the semantics of +volatile, simply defining it to be empty does, in a sense, break +your code. However, given that the compiler does not support +volatile, you are at its mercy anyway. At least your +program will compile, when it wouldn't before. + + +

    +In general, the volatile keyword is a feature of ANSI C, so +you might expect that volatile is available only when +__STDC__ is defined. However, Ultrix 4.3's native compiler does +support volatile, but does not defined __STDC__. +

    + + +

    +

    +
    Macro: AC_C_INLINE +
    + + +If the C compiler supports the keyword inline, do nothing. +Otherwise define inline to __inline__ or __inline +if it accepts one of those, otherwise define inline to be empty. +
    + + +

    +

    +
    Macro: AC_C_CHAR_UNSIGNED +
    + + +If the C type char is unsigned, define __CHAR_UNSIGNED__, +unless the C compiler predefines it. +
    + + +

    +

    +
    Macro: AC_C_LONG_DOUBLE +
    + + +If the C compiler supports a working long double type with more +range or precision than the double type, define +HAVE_LONG_DOUBLE. +
    + + +

    +

    +
    Macro: AC_C_STRINGIZE +
    + + +If the C preprocessor supports the stringizing operator, define +HAVE_STRINGIZE. The stringizing operator is `#' and is +found in macros such as this: + + + +
    +#define x(y) #y
    +
    + +
    + +

    +

    +
    Macro: AC_C_PROTOTYPES +
    + + + + +Check to see if function prototypes are understood by the compiler. If +so, define PROTOTYPES and __PROTOTYPES. +In the case the compiler does not handle +prototypes, you should use ansi2knr, which comes with the +Automake distribution, to unprotoize function definitions. For +function prototypes, you should first define PARAMS: + + + +
    +#ifndef PARAMS
    +# if PROTOTYPES
    +#  define PARAMS(protos) protos
    +# else /* no PROTOTYPES */
    +#  define PARAMS(protos) ()
    +# endif /* no PROTOTYPES */
    +#endif
    +
    + +

    +then use it this way: + + + +

    +size_t my_strlen PARAMS ((const char *));
    +
    + +
    + +

    +This macro also defines __PROTOTYPES; this is for the benefit of +header files that cannot use macros that infringe on user name space. + + +

    +

    +
    Macro: AC_PROG_GCC_TRADITIONAL +
    + + +Add @option{-traditional} to output variable CC if using the +GNU C compiler and ioctl does not work properly without +@option{-traditional}. That usually happens when the fixed header files +have not been installed on an old system. Since recent versions of the +GNU C compiler fix the header files automatically when installed, +this is becoming a less prevalent problem. +
    + + + + +

    C++ Compiler Characteristics

    + +

    +

    +
    Macro: AC_PROG_CXX (@ovar{compiler-search-list}) +
    + + + +Determine a C++ compiler to use. Check if the environment variable +CXX or CCC (in that order) is set; if so, then set output +variable CXX to its value. + + +

    +Otherwise, if the macro is invoked without an argument, then search for +a C++ compiler under the likely names (first g++ and c++ +then other names). If none of those checks succeed, then as a last +resort set CXX to g++. + + +

    +This macro may, however, be invoked with an optional first argument +which, if specified, must be a space separated list of C++ compilers to +search for. This just gives the user an opportunity to specify an +alternative search list for the C++ compiler. For example, if you +didn't like the default order, then you could invoke AC_PROG_CXX +like this: + + + +

    +AC_PROG_CXX(cl KCC CC cxx cc++ xlC aCC c++ g++ egcs gcc)
    +
    + +

    +If using the GNU C++ compiler, set shell variable GXX to +`yes'. If output variable CXXFLAGS was not already set, set +it to @option{-g -O2} for the GNU C++ compiler (@option{-O2} on +systems where G++ does not accept @option{-g}), or @option{-g} for other +compilers. +

    + + +

    +

    +
    Macro: AC_PROG_CXXCPP +
    + + +Set output variable CXXCPP to a command that runs the C++ +preprocessor. If `$CXX -E' doesn't work, `/lib/cpp' is used. +It is only portable to run CXXCPP on files with a `.c', +`.C', or `.cc' extension. + + +

    +If the current language is C++ (see section Language Choice), many of the +specific test macros use the value of CXXCPP indirectly by +calling AC_TRY_CPP, AC_CHECK_HEADER, +AC_EGREP_HEADER, or AC_EGREP_CPP. + + +

    +Some preprocessors don't indicate missing include files by the error +status. For such preprocessors an internal variable is set that causes +other macros to check the standard error from the preprocessor and +consider the test failed if any warnings have been reported. However, +it is not known whether such broken preprocessors exist for C++. +

    + + + + +

    Fortran 77 Compiler Characteristics

    + +

    +

    +
    Macro: AC_PROG_F77 (@ovar{compiler-search-list}) +
    + + + +Determine a Fortran 77 compiler to use. If F77 is not already +set in the environment, then check for g77 and f77, and +then some other names. Set the output variable F77 to the name +of the compiler found. + + +

    +This macro may, however, be invoked with an optional first argument +which, if specified, must be a space separated list of Fortran 77 +compilers to search for. This just gives the user an opportunity to +specify an alternative search list for the Fortran 77 compiler. For +example, if you didn't like the default order, then you could invoke +AC_PROG_F77 like this: + + + +

    +AC_PROG_F77(fl32 f77 fort77 xlf cf77 g77 f90 xlf90)
    +
    + +

    +If using g77 (the GNU Fortran 77 compiler), then +AC_PROG_F77 will set the shell variable G77 to `yes'. +If the output variable FFLAGS was not already set in the +environment, then set it to @option{-g -02} for g77 (or @option{-O2} +where g77 does not accept @option{-g}). Otherwise, set +FFLAGS to @option{-g} for all other Fortran 77 compilers. +

    + + +

    +

    +
    Macro: AC_PROG_F77_C_O +
    + + +Test if the Fortran 77 compiler accepts the options @option{-c} and +@option{-o} simultaneously, and define F77_NO_MINUS_C_MINUS_O if it +does not. +
    + + +

    +The following macros check for Fortran 77 compiler characteristics. To +check for characteristics not listed here, use AC_TRY_COMPILE +(see section Examining Syntax) or AC_TRY_RUN (see section Checking Run Time Behavior), +making sure to first set the current language to Fortran 77 +AC_LANG(Fortran 77) (see section Language Choice). + + +

    +

    +
    Macro: AC_F77_LIBRARY_LDFLAGS +
    + + +Determine the linker flags (e.g. @option{-L} and @option{-l}) for the +Fortran 77 intrinsic and run-time libraries that are required to +successfully link a Fortran 77 program or shared library. The output +variable FLIBS is set to these flags. + + +

    +This macro is intended to be used in those situations when it is +necessary to mix, e.g. C++ and Fortran 77 source code into a single +program or shared library (see section `Mixing Fortran 77 With C and C++' in GNU Automake). + + +

    +For example, if object files from a C++ and Fortran 77 compiler must be +linked together, then the C++ compiler/linker must be used for linking +(since special C++-ish things need to happen at link time like calling +global constructors, instantiating templates, enabling exception +support, etc.). + + +

    +However, the Fortran 77 intrinsic and run-time libraries must be linked +in as well, but the C++ compiler/linker doesn't know by default how to +add these Fortran 77 libraries. Hence, the macro +AC_F77_LIBRARY_LDFLAGS was created to determine these Fortran 77 +libraries. + + +

    +The macro AC_F77_DUMMY_MAIN or AC_F77_MAIN will probably +also be necessary to link C/C++ with Fortran; see below. +

    + + +

    +

    +
    Macro: AC_F77_DUMMY_MAIN (@ovar{action-if-found}, @ovar{action-if-not-found}) +
    + + +With many compilers, the Fortran libraries detected by +AC_F77_LIBRARY_LDFLAGS provide their own main entry +function that initializes things like Fortran I/O, and which then calls +a user-provided entry function named e.g. MAIN__ to run the +user's program. The AC_F77_DUMMY_MAIN or AC_F77_MAIN +macro figures out how to deal with this interaction. + + +

    +When using Fortran for purely numerical functions (no I/O, etcetera), +users often prefer to provide their own main and skip the Fortran +library initializations. In this case, however, one may still need to +provide a dummy MAIN__ routine in order to prevent linking errors +on some systems. AC_F77_DUMMY_MAIN detects whether any such +routine is required for linking, and what its name is; the shell +variable F77_DUMMY_MAIN holds this name, unknown when no +solution was found, and none when no such dummy main is needed. + + +

    +By default, action-if-found defines F77_DUMMY_MAIN to the +name of this routine (e.g. MAIN__) if it is required. +@ovar{action-if-not-found} defaults to exiting with an error. + + +

    +In order to link with Fortran routines, the user's C/C++ program should +then include the following code to define the dummy main if it is +needed: + + + +

    +#ifdef F77_DUMMY_MAIN
    +#  ifdef __cplusplus
    +     extern "C"
    +#  endif
    +   int F77_DUMMY_MAIN() { return 1; }
    +#endif
    +
    + +

    +Note that AC_F77_DUMMY_MAIN is called automatically from +AC_F77_WRAPPERS; there is generally no need to call it explicitly +unless one wants to change the default actions. +

    + + +

    +

    +
    Macro: AC_F77_MAIN +
    + + +As discussed above for AC_F77_DUMMY_MAIN, many Fortran libraries +allow you to provide an entry point called e.g. MAIN__ instead of +the usual main, which is then called by a main function in +the Fortran libraries that initializes things like Fortran I/O. The +AC_F77_MAIN macro detects whether it is possible to +utilize such an alternate main function, and defines F77_MAIN to +the name of the function. (If no alternate main function name is found, +F77_MAIN is simply defined to main.) + + +

    +Thus, when calling Fortran routines from C that perform things like I/O, +one should use this macro and name the "main" function F77_MAIN +instead of main. +

    + + +

    +

    +
    Macro: AC_F77_WRAPPERS +
    + + + +Defines C macros F77_FUNC(name,NAME) and +F77_FUNC_(name,NAME) to properly mangle the names of C/C++ +identifiers, and identifiers with underscores, respectively, so that +they match the name-mangling scheme used by the Fortran 77 compiler. + + +

    +Fortran 77 is case-insensitive, and in order to achieve this the Fortran +77 compiler converts all identifiers into a canonical case and format. +To call a Fortran 77 subroutine from C or to write a C function that is +callable from Fortran 77, the C program must explicitly use identifiers +in the format expected by the Fortran 77 compiler. In order to do this, +one simply wraps all C identifiers in one of the macros provided by +AC_F77_WRAPPERS. For example, suppose you have the following +Fortran 77 subroutine: + + + +

    +      subroutine foobar(x,y)
    +      double precision x, y
    +      y = 3.14159 * x
    +      return
    +      end
    +
    + +

    +You would then declare its prototype in C or C++ as: + + + +

    +#define FOOBAR_F77 F77_FUNC(foobar,FOOBAR)
    +#ifdef __cplusplus
    +extern "C"  /* prevent C++ name mangling */
    +#endif
    +void FOOBAR_F77(double *x, double *y);
    +
    + +

    +Note that we pass both the lowercase and uppercase versions of the +function name to F77_FUNC so that it can select the right one. +Note also that all parameters to Fortran 77 routines are passed as +pointers (see section `Mixing Fortran 77 With C and C++' in GNU Automake). + + +

    +Although Autoconf tries to be intelligent about detecting the +name-mangling scheme of the Fortran 77 compiler, there may be Fortran 77 +compilers that it doesn't support yet. In this case, the above code +will generate a compile-time error, but some other behavior +(e.g. disabling Fortran-related features) can be induced by checking +whether the F77_FUNC macro is defined. + + +

    +Now, to call that routine from a C program, we would do something like: + + + +

    +{
    +    double x = 2.7183, y;
    +    FOOBAR_F77(&x, &y);
    +}
    +
    + +

    +If the Fortran 77 identifier contains an underscore +(e.g. foo_bar), you should use F77_FUNC_ instead of +F77_FUNC (with the same arguments). This is because some Fortran +77 compilers mangle names differently if they contain an underscore. +

    + + +

    +

    +
    Macro: AC_F77_FUNC (name, @ovar{shellvar}) +
    + +Given an identifier name, set the shell variable shellvar to +hold the mangled version name according to the rules of the +Fortran 77 linker (see also AC_F77_WRAPPERS). shellvar is +optional; if it is not supplied, the shell variable will be simply +name. The purpose of this macro is to give the caller a way to +access the name-mangling information other than through the C +preprocessor as above; for example, to call Fortran routines from some +language other than C/C++. +
    + + + + +

    System Services

    + +

    +The following macros check for operating system services or capabilities. + + +

    +

    +
    Macro: AC_PATH_X +
    + +Try to locate the X Window System include files and libraries. If the +user gave the command line options @option{--x-includes=dir} and +@option{--x-libraries=dir}, use those directories. If either or +both were not given, get the missing values by running xmkmf on a +trivial `Imakefile' and examining the `Makefile' that it +produces. If that fails (such as if xmkmf is not present), look +for them in several directories where they often reside. If either +method is successful, set the shell variables x_includes and +x_libraries to their locations, unless they are in directories +the compiler searches by default. + + +

    +If both methods fail, or the user gave the command line option +@option{--without-x}, set the shell variable no_x to `yes'; +otherwise set it to the empty string. +

    + + +

    +

    +
    Macro: AC_PATH_XTRA +
    + + + + + + +An enhanced version of AC_PATH_X. It adds the C compiler flags +that X needs to output variable X_CFLAGS, and the X linker flags +to X_LIBS. Define X_DISPLAY_MISSING if X is not +available. + + +

    +This macro also checks for special libraries that some systems need in +order to compile X programs. It adds any that the system needs to +output variable X_EXTRA_LIBS. And it checks for special X11R6 +libraries that need to be linked with before @option{-lX11}, and adds +any found to the output variable X_PRE_LIBS. + + +

    + +

    +

    +
    Macro: AC_SYS_INTERPRETER +
    + +Check whether the system supports starting scripts with a line of the +form `#! /bin/csh' to select the interpreter to use for the script. +After running this macro, shell code in @command{configure.ac} can check +the shell variable interpval; it will be set to `yes' +if the system supports `#!', `no' if not. +
    + + +

    +

    +
    Macro: AC_SYS_LARGEFILE +
    + + + + +Arrange for +@href{http://www.sas.com/standards/large.file/x_open.20Mar96.html, +large-file support}. On some hosts, one must use special compiler +options to build programs that can access large files. Append any such +options to the output variable CC. Define +_FILE_OFFSET_BITS and _LARGE_FILES if necessary. + + +

    +Large-file support can be disabled by configuring with the +@option{--disable-largefile} option. + + +

    +If you use this macro, check that your program works even when +off_t is longer than long, since this is common when +large-file support is enabled. For example, it is not correct to print +an arbitrary off_t value X with printf ("%ld", +(long) X). +

    + + +

    +

    +
    Macro: AC_SYS_LONG_FILE_NAMES +
    + + +If the system supports file names longer than 14 characters, define +HAVE_LONG_FILE_NAMES. +
    + + +

    +

    +
    Macro: AC_SYS_POSIX_TERMIOS +
    + + + +Check to see if POSIX termios headers and functions are available on the +system. If so, set the shell variable am_cv_sys_posix_termios to +`yes'. If not, set the variable to `no'. +
    + + + + +

    UNIX Variants

    + +

    +The following macros check for certain operating systems that need +special treatment for some programs, due to exceptional oddities in +their header files or libraries. These macros are warts; they will be +replaced by a more systematic approach, based on the functions they make +available or the environments they provide. + + +

    +

    +
    Macro: AC_AIX +
    + + +If on AIX, define _ALL_SOURCE. Allows the use of some BSD +functions. Should be called before any macros that run the C compiler. +
    + + +

    +

    +
    Macro: AC_ISC_POSIX +
    + + +For INTERACTIVE UNIX (ISC), add @option{-lcposix} to output +variable LIBS if necessary for POSIX facilities. Call this +after AC_PROG_CC and before any other macros that use POSIX +interfaces. INTERACTIVE UNIX is no longer sold, and Sun says that +they will drop support for it on 2006-07-23, so this macro is becoming +obsolescent. +
    + + +

    +

    +
    Macro: AC_MINIX +
    + + + + +If on Minix, define _MINIX and _POSIX_SOURCE and define +_POSIX_1_SOURCE to be 2. This allows the use of POSIX +facilities. Should be called before any macros that run the C compiler. +
    + + + + +

    Writing Tests

    + +

    +If the existing feature tests don't do something you need, you have to +write new ones. These macros are the building blocks. They provide +ways for other macros to check whether various kinds of features are +available and report the results. + + +

    +This chapter contains some suggestions and some of the reasons why the +existing tests are written the way they are. You can also learn a lot +about how to write Autoconf tests by looking at the existing ones. If +something goes wrong in one or more of the Autoconf tests, this +information can help you understand the assumptions behind them, which +might help you figure out how to best solve the problem. + + +

    +These macros check the output of the C compiler system. They do +not cache the results of their tests for future use (see section Caching Results), because they don't know enough about the information they are +checking for to generate a cache variable name. They also do not print +any messages, for the same reason. The checks for particular kinds of C +features call these macros and do cache their results and print messages +about what they're checking for. + + +

    +When you write a feature test that could be applicable to more than one +software package, the best thing to do is encapsulate it in a new macro. +See section Writing Autoconf Macros, for how to do that. + + + + +

    Examining Declarations

    + +

    +The macro AC_TRY_CPP is used to check whether particular header +files exist. You can check for one at a time, or more than one if you +need several header files to all exist for some purpose. + + +

    +

    +
    Macro: AC_TRY_CPP (input, @ovar{action-if-true}, @ovar{action-if-false}) +
    + +If the preprocessor produces no error messages while processing the +input (typically includes), run shell commands +action-if-true. Otherwise run shell commands +action-if-false. Beware that input is double quoted. Shell +variable, back quote, and backslash substitutions are performed on +input. + + +

    +This macro uses CPPFLAGS, but not CFLAGS, because +@option{-g}, @option{-O}, etc. are not valid options to many C +preprocessors. +

    + + +

    +Here is how to find out whether a header file contains a particular +declaration, such as a typedef, a structure, a structure member, or a +function. Use AC_EGREP_HEADER instead of running grep +directly on the header file; on some systems the symbol might be defined +in another header file that the file you are checking `#include's. + + +

    +

    +
    Macro: AC_EGREP_HEADER (pattern, header-file, action-if-found, @ovar{action-if-not-found}) +
    + +If the output of running the preprocessor on the system header file +header-file matches the egrep regular expression +pattern, execute shell commands action-if-found, otherwise +execute action-if-not-found. +
    + + +

    +To check for C preprocessor symbols, either defined by header files or +predefined by the C preprocessor, use AC_EGREP_CPP. Here is an +example of the latter: + + + +

    +AC_EGREP_CPP(yes,
    +[#ifdef _AIX
    +  yes
    +#endif
    +], is_aix=yes, is_aix=no)
    +
    + +

    +

    +
    Macro: AC_EGREP_CPP (pattern, program, @ovar{action-if-found}, @ovar{action-if-not-found}) +
    + +program is the text of a C or C++ program, on which shell +variable, back quote, and backslash substitutions are performed. If the +output of running the preprocessor on program matches the +egrep regular expression pattern, execute shell commands +action-if-found, otherwise execute action-if-not-found. + + +

    +This macro calls AC_PROG_CPP or AC_PROG_CXXCPP (depending +on which language is current, see section Language Choice), if it hasn't +been called already. +

    + + + + +

    Examining Syntax

    + +

    +To check for a syntax feature of the C, C++ or Fortran 77 compiler, such +as whether it recognizes a certain keyword, use AC_TRY_COMPILE to +try to compile a small program that uses that feature. You can also use +it to check for structures and structure members that are not present on +all systems. + + +

    +

    +
    Macro: AC_TRY_COMPILE (includes, function-body, @ovar{action-if-found}, @ovar{action-if-not-found}) +
    + +Create a test program in the current language (see section Language Choice) +to see whether a function whose body consists of function-body can +be compiled. If the file compiles successfully, run shell commands +action-if-found, otherwise run action-if-not-found. + + +

    +This macro double quotes both includes and function-body. + + +

    +For C and C++, includes is any #include statements needed +by the code in function-body (includes will be ignored if +the currently selected language is Fortran 77). This macro also uses +CFLAGS or CXXFLAGS if either C or C++ is the currently +selected language, as well as CPPFLAGS, when compiling. If +Fortran 77 is the currently selected language then FFLAGS will be +used when compiling. + + +

    +This macro does not try to link; use AC_TRY_LINK if you need to +do that (see section Examining Libraries). +

    + + + + +

    Examining Libraries

    + +

    +To check for a library, a function, or a global variable, Autoconf +@command{configure} scripts try to compile and link a small program that +uses it. This is unlike Metaconfig, which by default uses nm +or ar on the C library to try to figure out which functions are +available. Trying to link with the function is usually a more reliable +approach because it avoids dealing with the variations in the options +and output formats of nm and ar and in the location of the +standard libraries. It also allows configuring for cross-compilation or +checking a function's runtime behavior if needed. On the other hand, it +can be slower than scanning the libraries once. + + +

    +A few systems have linkers that do not return a failure exit status when +there are unresolved functions in the link. This bug makes the +configuration scripts produced by Autoconf unusable on those systems. +However, some of them can be given options that make the exit status +correct. This is a problem that Autoconf does not currently handle +automatically. If users encounter this problem, they might be able to +solve it by setting LDFLAGS in the environment to pass whatever +options the linker needs (for example, @option{-Wl,-dn} on @sc{mips +risc/os}). + + +

    +AC_TRY_LINK is used to compile test programs to test for +functions and global variables. It is also used by AC_CHECK_LIB +to check for libraries (see section Library Files), by adding the library being +checked for to LIBS temporarily and trying to link a small +program. + + +

    +

    +
    Macro: AC_TRY_LINK (includes, function-body, @ovar{action-if-found}, @ovar{action-if-not-found}) +
    + +Depending on the current language (see section Language Choice), create a +test program to see whether a function whose body consists of +function-body can be compiled and linked. If the file compiles +and links successfully, run shell commands action-if-found, +otherwise run action-if-not-found. + + +

    +This macro double quotes both includes and function-body. + + +

    +For C and C++, includes is any #include statements needed +by the code in function-body (includes will be ignored if +the currently selected language is Fortran 77). This macro also uses +CFLAGS or CXXFLAGS if either C or C++ is the currently +selected language, as well as CPPFLAGS, when compiling. If +Fortran 77 is the currently selected language then FFLAGS will be +used when compiling. However, both LDFLAGS and LIBS will +be used during linking in all cases. +

    + + +

    +

    +
    Macro: AC_TRY_LINK_FUNC (function, @ovar{action-if-found}, @ovar{action-if-not-found}) +
    + +Depending on the current language (see section Language Choice), create a +test program to see whether a program whose body consists of +a prototype of and a call to function can be compiled and linked. + + +

    +If the file compiles and links successfully, run shell commands +action-if-found, otherwise run action-if-not-found. +

    + + + + +

    Checking Run Time Behavior

    + +

    +Sometimes you need to find out how a system performs at run time, such +as whether a given function has a certain capability or bug. If you +can, make such checks when your program runs instead of when it is +configured. You can check for things like the machine's endianness when +your program initializes itself. + + +

    +If you really need to test for a run-time behavior while configuring, +you can write a test program to determine the result, and compile and +run it using AC_TRY_RUN. Avoid running test programs if +possible, because this prevents people from configuring your package for +cross-compiling. + + + + +

    Running Test Programs

    + +

    +Use the following macro if you need to test run-time behavior of the +system while configuring. + + +

    +

    +
    Macro: AC_TRY_RUN (program, @ovar{action-if-true}, @ovar{action-if-false}, @ovar{action-if-cross-compiling}) +
    + +If program compiles and links successfully and returns an exit +status of 0 when executed, run shell commands action-if-true. +Otherwise, run shell commands action-if-false. + + +

    +This macro double quotes program, the text of a program in the +current language (see section Language Choice), on which shell variable and +back quote substitutions are performed. This macro uses CFLAGS +or CXXFLAGS, CPPFLAGS, LDFLAGS, and LIBS +when compiling. + + +

    +If the C compiler being used does not produce executables that run on +the system where @command{configure} is being run, then the test program is +not run. If the optional shell commands action-if-cross-compiling +are given, they are run instead. Otherwise, @command{configure} prints +an error message and exits. + + +

    +In the action-if-false section, the exit status of the program is +available in the shell variable `$?', but be very careful to limit +yourself to positive values smaller than 127; bigger values shall be +saved into a file by the program. Note also that you have simply +no guarantee that this exit status is issued by the program, or by +the failure of its compilation. In other words, use this feature if +sadist only, it was reestablished because the Autoconf maintainers grew +tired of receiving "bug reports". +

    + + +

    +Try to provide a pessimistic default value to use when cross-compiling +makes run-time tests impossible. You do this by passing the optional +last argument to AC_TRY_RUN. @command{autoconf} prints a warning +message when creating @command{configure} each time it encounters a call to +AC_TRY_RUN with no action-if-cross-compiling argument +given. You may ignore the warning, though users will not be able to +configure your package for cross-compiling. A few of the macros +distributed with Autoconf produce this warning message. + + +

    +To configure for cross-compiling you can also choose a value for those +parameters based on the canonical system name (see section Manual Configuration). Alternatively, set up a test results cache file with +the correct values for the host system (see section Caching Results). + + +

    +To provide a default for calls of AC_TRY_RUN that are embedded in +other macros, including a few of the ones that come with Autoconf, you +can call AC_PROG_CC before running them. Then, if the shell +variable cross_compiling is set to `yes', use an alternate +method to get the results instead of calling the macros. + + + + +

    Guidelines for Test Programs

    + +

    +Test programs should not write anything to the standard output. They +should return 0 if the test succeeds, nonzero otherwise, so that success +can be distinguished easily from a core dump or other failure; +segmentation violations and other failures produce a nonzero exit +status. Test programs should exit, not return, from +main, because on some systems (old Suns, at least) the argument +to return in main is ignored. + + +

    +Test programs can use #if or #ifdef to check the values of +preprocessor macros defined by tests that have already run. For +example, if you call AC_HEADER_STDC, then later on in +`configure.ac' you can have a test program that includes an +ANSI C header file conditionally: + + + +

    +#if STDC_HEADERS
    +# include <stdlib.h>
    +#endif
    +
    + +

    +If a test program needs to use or create a data file, give it a name +that starts with `conftest', such as `conftest.data'. The +@command{configure} script cleans up by running `rm -rf conftest*' +after running test programs and if the script is interrupted. + + + + +

    Test Functions

    + +

    +Function declarations in test programs should have a prototype +conditionalized for C++. In practice, though, test programs rarely need +functions that take arguments. + + + +

    +#ifdef __cplusplus
    +foo (int i)
    +#else
    +foo (i) int i;
    +#endif
    +
    + +

    +Functions that test programs declare should also be conditionalized for +C++, which requires `extern "C"' prototypes. Make sure to not +include any header files containing clashing prototypes. + + + +

    +#ifdef __cplusplus
    +extern "C" void *malloc (size_t);
    +#else
    +char *malloc ();
    +#endif
    +
    + +

    +If a test program calls a function with invalid parameters (just to see +whether it exists), organize the program to ensure that it never invokes +that function. You can do this by calling it in another function that is +never invoked. You can't do it by putting it after a call to +exit, because GCC version 2 knows that exit never returns +and optimizes out any code that follows it in the same block. + + +

    +If you include any header files, make sure to call the functions +relevant to them with the correct number of arguments, even if they are +just 0, to avoid compilation errors due to prototypes. GCC version 2 +has internal prototypes for several functions that it automatically +inlines; for example, memcpy. To avoid errors when checking for +them, either pass them the correct number of arguments or redeclare them +with a different return type (such as char). + + + + +

    Systemology

    + +

    +This section aims at presenting some systems and pointers to +documentation. It may help you addressing particular problems reported +by users. + + +

    + +
    QNX 4.25 +
    + +QNX is a realtime operating system running on Intel architecture +meant to be scalable from the small embedded systems to hundred +processor super-computer. It claims to be POSIX certified. More +information is available on the @href{www.qnx.com, QNX home page}, +including the @href{http://support.qnx.com/support/docs/qnx4/, QNX +man pages}. +
    + + + +

    Multiple Cases

    + +

    +Some operations are accomplished in several possible ways, depending on +the UNIX variant. Checking for them essentially requires a "case +statement". Autoconf does not directly provide one; however, it is +easy to simulate by using a shell variable to keep track of whether a +way to perform the operation has been found yet. + + +

    +Here is an example that uses the shell variable fstype to keep +track of whether the remaining cases need to be checked. + + + +

    +AC_MSG_CHECKING([how to get file system type])
    +fstype=no
    +# The order of these tests is important.
    +AC_TRY_CPP([#include <sys/statvfs.h>
    +#include <sys/fstyp.h>],
    +           [AC_DEFINE(FSTYPE_STATVFS) fstype=SVR4])
    +if test $fstype = no; then
    +  AC_TRY_CPP([#include <sys/statfs.h>
    +#include <sys/fstyp.h>],
    +             [AC_DEFINE(FSTYPE_USG_STATFS) fstype=SVR3])
    +fi
    +if test $fstype = no; then
    +  AC_TRY_CPP([#include <sys/statfs.h>
    +#include <sys/vmount.h>],
    +             [AC_DEFINE(FSTYPE_AIX_STATFS) fstype=AIX])
    +fi
    +# (more cases omitted here)
    +AC_MSG_RESULT([$fstype])
    +
    + + + +

    Language Choice

    +

    + + + +

    +Autoconf-generated @command{configure} scripts check for the C compiler and +its features by default. Packages that use other programming languages +(maybe more than one, e.g. C and C++) need to test features of the +compilers for the respective languages. The following macros determine +which programming language is used in the subsequent tests in +`configure.ac'. + + +

    +

    +
    Macro: AC_LANG (language) +
    +Do compilation tests using the compiler, preprocessor and file +extensions for the specified language. + + +

    +Supported languages are: + + +

    + +
    `C' +
    +Do compilation tests using CC and CPP and use extension +`.c' for test programs. + +
    `C++' +
    +Do compilation tests using CXX and CXXCPP and use +extension `.C' for test programs. + +
    `Fortran 77' +
    +Do compilation tests using F77 and use extension `.f' for +test programs. +
    +
    + +

    +

    +
    Macro: AC_LANG_PUSH (language) +
    + +Remember the current language (as set by AC_LANG) on a stack, and +then select the language. Use this macro and AC_LANG_POP +in macros that need to temporarily switch to a particular language. +
    + + +

    +

    +
    Macro: AC_LANG_POP (@ovar{language}) +
    + +Select the language that is saved on the top of the stack, as set by +AC_LANG_PUSH, and remove it from the stack. + + +

    +If given, language specifies the language we just quit. It +is a good idea to specify it when it's known (which should be the +case...), since Autoconf will detect inconsistencies. + + + +

    +AC_LANG_PUSH(Fortran 77)
    +# Perform some tests on Fortran 77.
    +# ...
    +AC_LANG_POP(Fortran 77)
    +
    + +
    + +

    +

    +
    Macro: AC_REQUIRE_CPP +
    + +Ensure that whichever preprocessor would currently be used for tests has +been found. Calls AC_REQUIRE (see section Prerequisite Macros) with an +argument of either AC_PROG_CPP or AC_PROG_CXXCPP, +depending on which language is current. +
    + + + + +

    Results of Tests

    + +

    +Once @command{configure} has determined whether a feature exists, what can +it do to record that information? There are four sorts of things it can +do: define a C preprocessor symbol, set a variable in the output files, +save the result in a cache file for future @command{configure} runs, and +print a message letting the user know the result of the test. + + + + +

    Defining C Preprocessor Symbols

    + +

    +A common action to take in response to a feature test is to define a C +preprocessor symbol indicating the results of the test. That is done by +calling AC_DEFINE or AC_DEFINE_UNQUOTED. + + +

    +By default, AC_OUTPUT places the symbols defined by these macros +into the output variable DEFS, which contains an option +@option{-Dsymbol=value} for each symbol defined. Unlike in +Autoconf version 1, there is no variable DEFS defined while +@command{configure} is running. To check whether Autoconf macros have +already defined a certain C preprocessor symbol, test the value of the +appropriate cache variable, as in this example: + + + +

    +AC_CHECK_FUNC(vprintf, [AC_DEFINE(HAVE_VPRINTF)])
    +if test "$ac_cv_func_vprintf" != yes; then
    +  AC_CHECK_FUNC(_doprnt, [AC_DEFINE(HAVE_DOPRNT)])
    +fi
    +
    + +

    +If AC_CONFIG_HEADERS has been called, then instead of creating +DEFS, AC_OUTPUT creates a header file by substituting the +correct values into #define statements in a template file. +See section Configuration Header Files, for more information about this kind of +output. + + +

    +

    +
    Macro: AC_DEFINE (variable, @ovar{value}, @ovar{description}) +
    + +Define C preprocessor variable variable. If value is given, +set variable to that value (verbatim), otherwise set it to 1. +value should not contain literal newlines, and if you are not +using AC_CONFIG_HEADERS it should not contain any `#' +characters, as make tends to eat them. To use a shell variable +(which you need to do in order to define a value containing the M4 quote +characters `[' or `]'), use AC_DEFINE_UNQUOTED instead. +description is only useful if you are using +AC_CONFIG_HEADERS. In this case, description is put into +the generated `config.h.in' as the comment before the macro define. +The following example defines the C preprocessor variable +EQUATION to be the string constant `"$a > $b"': + + + +
    +AC_DEFINE(EQUATION, "$a > $b")
    +
    + +
    + +

    +

    +
    Macro: AC_DEFINE_UNQUOTED (variable, @ovar{value}, @ovar{description}) +
    + +Like AC_DEFINE, but three shell expansions are +performed--once--on variable and value: variable expansion +(`$'), command substitution (``'), and backslash escaping +(`\'). Single and double quote characters in the value have no +special meaning. Use this macro instead of AC_DEFINE when +variable or value is a shell variable. Examples: + + + +
    +AC_DEFINE_UNQUOTED(config_machfile, "$machfile")
    +AC_DEFINE_UNQUOTED(GETGROUPS_T, $ac_cv_type_getgroups)
    +AC_DEFINE_UNQUOTED($ac_tr_hdr)
    +
    + +
    + +

    +Due to the syntactical bizarreness of the Bourne shell, do not use +semicolons to separate AC_DEFINE or AC_DEFINE_UNQUOTED +calls from other macro calls or shell code; that can cause syntax errors +in the resulting @command{configure} script. Use either spaces or +newlines. That is, do this: + + + +

    +AC_CHECK_HEADER(elf.h, [AC_DEFINE(SVR4) LIBS="$LIBS -lelf"])
    +
    + +

    +or this: + + + +

    +AC_CHECK_HEADER(elf.h,
    + [AC_DEFINE(SVR4)
    +  LIBS="$LIBS -lelf"])
    +
    + +

    +instead of this: + + + +

    +AC_CHECK_HEADER(elf.h, [AC_DEFINE(SVR4); LIBS="$LIBS -lelf"])
    +
    + + + +

    Setting Output Variables

    + +

    +Another way to record the results of tests is to set output +variables, which are shell variables whose values are substituted into +files that @command{configure} outputs. The two macros below create new +output variables. See section Preset Output Variables, for a list of output +variables that are always available. + + +

    +

    +
    Macro: AC_SUBST (variable, @ovar{value}) +
    + +Create an output variable from a shell variable. Make AC_OUTPUT +substitute the variable variable into output files (typically one +or more `Makefile's). This means that AC_OUTPUT will +replace instances of `@variable@' in input files with the +value that the shell variable variable has when AC_OUTPUT +is called. This value of variable should not contain literal +newlines. + + +

    +If value is given, in addition assign it to `variable'. +

    + + +

    +

    +
    Macro: AC_SUBST_FILE (variable) +
    + +Another way to create an output variable from a shell variable. Make +AC_OUTPUT insert (without substitutions) the contents of the file +named by shell variable variable into output files. This means +that AC_OUTPUT will replace instances of +`@variable@' in output files (such as `Makefile.in') +with the contents of the file that the shell variable variable +names when AC_OUTPUT is called. Set the variable to +`/dev/null' for cases that do not have a file to insert. + + +

    +This macro is useful for inserting `Makefile' fragments containing +special dependencies or other make directives for particular host +or target types into `Makefile's. For example, `configure.ac' +could contain: + + + +

    +AC_SUBST_FILE(host_frag)
    +host_frag=$srcdir/conf/sun4.mh
    +
    + +

    +and then a `Makefile.in' could contain: + + + +

    +@host_frag@
    +
    + +
    + +

    + + +Running @command{configure} in different environments can be extremely +dangerous. If for instance the user runs `CC=bizarre-cc +./configure', then the cache, `config.h' and many other output +files will depend upon @command{bizarre-cc} being the C compiler. If +for some reason the user runs @command{/configure} again, or if it is +run via `./config.status --recheck', (See section Automatic Remaking, +and see section Recreating a Configuration), then the configuration can be +inconsistent, composed of results depending upon two different +compilers. + + +

    +Such variables are named precious variables, and can be declared +as such by AC_ARG_VAR. + + +

    +

    +
    Macro: AC_ARG_VAR (variable, description) +
    + +Declare variable is a precious variable, and include its +description in the variable section of `./configure --help'. + + +

    +Being precious means that + +

    + +
    + + + +

    Caching Results

    +

    + + + +

    +To avoid checking for the same features repeatedly in various +@command{configure} scripts (or in repeated runs of one script), +@command{configure} can optionally save the results of many checks in a +cache file (see section Cache Files). If a @command{configure} script +runs with caching enabled and finds a cache file, it reads the results +of previous runs from the cache and avoids rerunning those checks. As a +result, @command{configure} can then run much faster than if it had to +perform all of the checks every time. + + +

    +

    +
    Macro: AC_CACHE_VAL (cache-id, commands-to-set-it) +
    + +Ensure that the results of the check identified by cache-id are +available. If the results of the check were in the cache file that was +read, and @command{configure} was not given the @option{--quiet} or +@option{--silent} option, print a message saying that the result was +cached; otherwise, run the shell commands commands-to-set-it. If +the shell commands are run to determine the value, the value will be +saved in the cache file just before @command{configure} creates its output +files. See section Cache Variable Names, for how to choose the name of the +cache-id variable. + + +

    +The commands-to-set-it must have no side effects except for +setting the variable cache-id, see below. +

    + + +

    +

    +
    Macro: AC_CACHE_CHECK (message, cache-id, commands-to-set-it) +
    + +A wrapper for AC_CACHE_VAL that takes care of printing the +messages. This macro provides a convenient shorthand for the most +common way to use these macros. It calls AC_MSG_CHECKING for +message, then AC_CACHE_VAL with the cache-id and +commands arguments, and AC_MSG_RESULT with cache-id. + + +

    +The commands-to-set-it must have no side effects except for +setting the variable cache-id, see below. +

    + + +

    +It is very common to find buggy macros using AC_CACHE_VAL or +AC_CACHE_CHECK, because people are tempted to call +AC_DEFINE in the commands-to-set-it. Instead, the code that +follows the call to AC_CACHE_VAL should call +AC_DEFINE, by examining the value of the cache variable. For +instance, the following macro is broken: + + + +

    +AC_DEFUN([AC_SHELL_TRUE],
    +[AC_CACHE_CHECK([whether true(1) works], [ac_cv_shell_true_works],
    +                [ac_cv_shell_true_works=no
    +                 true && ac_cv_shell_true_works=yes
    +                 if test $ac_cv_shell_true_works = yes; then
    +                   AC_DEFINE([TRUE_WORKS], 1
    +                             [Define if `true(1)' works properly.])
    +                 fi])
    +])
    +
    + +

    +This fails if the cache is enabled: the second time this macro is run, +TRUE_WORKS will not be defined. The proper implementation +is: + + + +

    +AC_DEFUN([AC_SHELL_TRUE],
    +[AC_CACHE_CHECK([whether true(1) works], [ac_cv_shell_true_works],
    +                [ac_cv_shell_true_works=no
    +                 true && ac_cv_shell_true_works=yes])
    + if test $ac_cv_shell_true_works = yes; then
    +   AC_DEFINE([TRUE_WORKS], 1
    +             [Define if `true(1)' works properly.])
    + fi
    +])
    +
    + +

    +Also, commands-to-set-it should not print any messages, for +example with AC_MSG_CHECKING; do that before calling +AC_CACHE_VAL, so the messages are printed regardless of whether +the results of the check are retrieved from the cache or determined by +running the shell commands. + + + + +

    Cache Variable Names

    +

    + + + +

    +The names of cache variables should have the following format: + + + +

    +package-prefix_cv_value-type_specific-value_@ovar{additional-options}
    +
    + +

    +for example, `ac_cv_header_stat_broken' or +`ac_cv_prog_gcc_traditional'. The parts of the variable name are: + + +

    + +
    package-prefix +
    +An abbreviation for your package or organization; the same prefix you +begin local Autoconf macros with, except lowercase by convention. +For cache values used by the distributed Autoconf macros, this value is +`ac'. + +
    _cv_ +
    +Indicates that this shell variable is a cache value. This string +must be present in the variable name, including the leading +underscore. + +
    value-type +
    +A convention for classifying cache values, to produce a rational naming +system. The values used in Autoconf are listed in section Macro Names. + +
    specific-value +
    +Which member of the class of cache values this test applies to. +For example, which function (`alloca'), program (`gcc'), or +output variable (`INSTALL'). + +
    additional-options +
    +Any particular behavior of the specific member that this test applies to. +For example, `broken' or `set'. This part of the name may +be omitted if it does not apply. +
    + +

    +The values assigned to cache variables may not contain newlines. +Usually, their values will be boolean (`yes' or `no') or the +names of files or functions; so this is not an important restriction. + + + + +

    Cache Files

    + +

    +A cache file is a shell script that caches the results of configure +tests run on one system so they can be shared between configure scripts +and configure runs. It is not useful on other systems. If its contents +are invalid for some reason, the user may delete or edit it. + + +

    +By default, @command{configure} uses no cache file (technically, it uses +@option{--cache-file=/dev/null}), to avoid problems caused by accidental +use of stale cache files. + + +

    +To enable caching, @command{configure} accepts @option{--config-cache} (or +@option{-C}) to cache results in the file `config.cache'. +Alternatively, @option{--cache-file=file} specifies that +file be the cache file. The cache file is created if it does not +exist already. When @command{configure} calls @command{configure} scripts in +subdirectories, it uses the @option{--cache-file} argument so that they +share the same cache. See section Configuring Other Packages in Subdirectories, for information on +configuring subdirectories with the AC_CONFIG_SUBDIRS macro. + + +

    +`config.status' only pays attention to the cache file if it is +given the @option{--recheck} option, which makes it rerun +@command{configure}. + + +

    +It is wrong to try to distribute cache files for particular system types. +There is too much room for error in doing that, and too much +administrative overhead in maintaining them. For any features that +can't be guessed automatically, use the standard method of the canonical +system type and linking files (see section Manual Configuration). + + +

    +The site initialization script can specify a site-wide cache file to +use, instead of the usual per-program cache. In this case, the cache +file will gradually accumulate information whenever someone runs a new +@command{configure} script. (Running @command{configure} merges the new cache +results with the existing cache file.) This may cause problems, +however, if the system configuration (e.g. the installed libraries or +compilers) changes and the stale cache file is not deleted. + + + + +

    Cache Checkpointing

    + +

    +If your configure script, or a macro called from configure.ac, happens +to abort the configure process, it may be useful to checkpoint the cache +a few times at key points using AC_CACHE_SAVE. Doing so will +reduce the amount of time it takes to re-run the configure script with +(hopefully) the error that caused the previous abort corrected. + + +

    +

    +
    Macro: AC_CACHE_LOAD +
    + +Loads values from existing cache file, or creates a new cache file if a +cache file is not found. Called automatically from AC_INIT. +
    + + +

    +

    +
    Macro: AC_CACHE_SAVE +
    + +Flushes all cached values to the cache file. Called automatically from +AC_OUTPUT, but it can be quite useful to call +AC_CACHE_SAVE at key points in configure.ac. +
    + + +

    +For instance: + + + +

    + ... AC_INIT, etc. ...
    +# Checks for programs.
    +AC_PROG_CC
    +AC_PROG_GCC_TRADITIONAL
    + ... more program checks ...
    +AC_CACHE_SAVE
    +
    +# Checks for libraries.
    +AC_CHECK_LIB(nsl, gethostbyname)
    +AC_CHECK_LIB(socket, connect)
    + ... more lib checks ...
    +AC_CACHE_SAVE
    +
    +# Might abort...
    +AM_PATH_GTK(1.0.2,, [AC_MSG_ERROR([GTK not in path])])
    +AM_PATH_GTKMM(0.9.5,, [AC_MSG_ERROR([GTK not in path])])
    + ... AC_OUTPUT, etc. ...
    +
    + + + +

    Printing Messages

    +

    + + + +

    +@command{configure} scripts need to give users running them several kinds +of information. The following macros print messages in ways appropriate +for each kind. The arguments to all of them get enclosed in shell +double quotes, so the shell performs variable and back-quote +substitution on them. + + +

    +These macros are all wrappers around the echo shell command. +@command{configure} scripts should rarely need to run echo directly +to print messages for the user. Using these macros makes it easy to +change how and when each kind of message is printed; such changes need +only be made to the macro definitions and all of the callers will change +automatically. + + +

    +To diagnose static issues, i.e., when @command{autoconf} is run, see +section Reporting Messages. + + +

    +

    +
    Macro: AC_MSG_CHECKING (feature-description) +
    + +Notify the user that @command{configure} is checking for a particular +feature. This macro prints a message that starts with `checking ' +and ends with `...' and no newline. It must be followed by a call +to AC_MSG_RESULT to print the result of the check and the +newline. The feature-description should be something like +`whether the Fortran compiler accepts C++ comments' or `for +c89'. + + +

    +This macro prints nothing if @command{configure} is run with the +@option{--quiet} or @option{--silent} option. +

    + + +

    +

    +
    Macro: AC_MSG_RESULT (result-description) +
    + +Notify the user of the results of a check. result-description is +almost always the value of the cache variable for the check, typically +`yes', `no', or a file name. This macro should follow a call +to AC_MSG_CHECKING, and the result-description should be +the completion of the message printed by the call to +AC_MSG_CHECKING. + + +

    +This macro prints nothing if @command{configure} is run with the +@option{--quiet} or @option{--silent} option. +

    + + +

    +

    +
    Macro: AC_MSG_NOTICE (message) +
    + +Deliver the message to the user. It is useful mainly to print a +general description of the overall purpose of a group of feature checks, +e.g., + + + +
    +AC_MSG_NOTICE([checking if stack overflow is detectable])
    +
    + +

    +This macro prints nothing if @command{configure} is run with the +@option{--quiet} or @option{--silent} option. +

    + + +

    +

    +
    Macro: AC_MSG_ERROR (error-description, @ovar{exit-status}) +
    + +Notify the user of an error that prevents @command{configure} from +completing. This macro prints an error message to the standard error +output and exits @command{configure} with exit-status (1 by default). +error-description should be something like `invalid value +$HOME for \$HOME'. + + +

    +The error-description should start with a lower-case letter, and +"cannot" is preferred to "can't". +

    + + +

    +

    +
    Macro: AC_MSG_WARN (problem-description) +
    + +Notify the @command{configure} user of a possible problem. This macro +prints the message to the standard error output; @command{configure} +continues running afterward, so macros that call AC_MSG_WARN should +provide a default (back-up) behavior for the situations they warn about. +problem-description should be something like `ln -s seems to +make hard links'. +
    + + + + +

    Programming in M4

    + +

    +Autoconf is written on top of two layers: M4sugar, which provides +convenient macros for pure M4 programming, and M4sh, which +provides macros dedicated to shell script generation. + + +

    +As of this version of Autoconf, these two layers are still experimental, +and their interface might change in the future. As a matter of fact, +anything that is not documented must not be used. + + + + +

    M4 Quotation

    +

    + + + +

    +The most common brokenness of existing macros is an improper quotation. +This section, which users of Autoconf can skip, but which macro writers +must read, first justifies the quotation scheme that was chosen +for Autoconf and then ends with a rule of thumb. Understanding the +former helps one to follow the latter. + + + + +

    Active Characters

    + +

    +To fully understand where proper quotation is important, you first need +to know what are the special characters in Autoconf: `#' introduces +a comment inside which no macro expansion is performed, `,' +separates arguments, `[' and `]' are the quotes themselves, +and finally `(' and `)' (which m4 tries to match by +pairs). + + +

    +In order to understand the delicate case of macro calls, we first have +to present some obvious failures. Below they are "obvious-ified", +although you find them in real life, they are usually in disguise. + + +

    +Comments, introduced by a hash and running up to the newline, are opaque +tokens to the top level: active characters are turned off, and there is +no macro expansion: + + + +

    +# define([def], ine)
    +=># define([def], ine)
    +
    + +

    +Each time there can be a macro expansion, there is a quotation +expansion; i.e., one level of quotes is stripped: + + + +

    +int tab[10];
    +=>int tab10;
    +[int tab[10];]
    +=>int tab[10];
    +
    + +

    +Without this in mind, the reader will try hopelessly to use her macro +array: + + + +

    +define([array], [int tab[10];])
    +array
    +=>int tab10;
    +[array]
    +=>array
    +
    + +

    +How can you correctly output the intended results(2)? + + + + +

    One Macro Call

    + +

    +Let's proceed on the interaction between active characters and macros +with this small macro, which just returns its first argument: + + + +

    +define([car], [$1])
    +
    + +

    +The two pairs of quotes above are not part of the arguments of +define; rather, they are understood by the top level when it +tries to find the arguments of define. Therefore, it is +equivalent to write: + + + +

    +define(car, $1)
    +
    + +

    +But, while it is acceptable for a `configure.ac' to avoid unneeded +quotes, it is bad practice for Autoconf macros which must both be more +robust and also advocate perfect style. + + +

    +At the top level, there are only two possible quotings: either you +quote or you don't: + + + +

    +car(foo, bar, baz)
    +=>foo
    +[car(foo, bar, baz)]
    +=>car(foo, bar, baz)
    +
    + +

    +Let's pay attention to the special characters: + + + +

    +car(#)
    +error-->EOF in argument list
    +
    + +

    +The closing parenthesis is hidden in the comment; with a hypothetical +quoting, the top level understood it this way: + + + +

    +car([#)]
    +
    + +

    +Proper quotation, of course, fixes the problem: + + + +

    +car([#])
    +=>#
    +
    + +

    +The reader will easily understand the following examples: + + + +

    +car(foo, bar)
    +=>foo
    +car([foo, bar])
    +=>foo, bar
    +car((foo, bar))
    +=>(foo, bar)
    +car([(foo], [bar)])
    +=>(foo
    +car([], [])
    +=>
    +car([[]], [[]])
    +=>[]
    +
    + +

    +With this in mind, we can explore the cases where macros invoke +macros... + + + + +

    Quotation and Nested Macros

    + +

    +The examples below use the following macros: + + + +

    +define([car], [$1])
    +define([active], [ACT, IVE])
    +define([array], [int tab[10]])
    +
    + +

    +Each additional embedded macro call introduces other possible +interesting quotations: + + + +

    +car(active)
    +=>ACT
    +car([active])
    +=>ACT, IVE
    +car([[active]])
    +=>active
    +
    + +

    +In the first case, the top level looks for the arguments of car, +and finds `active'. Because m4 evaluates its arguments +before applying the macro, `active' is expanded, which results in: + + + +

    +car(ACT, IVE)
    +=>ACT
    +
    + +

    +In the second case, the top level gives `active' as first and only +argument of car, which results in: + + + +

    +active
    +=>ACT, IVE
    +
    + +

    +i.e., the argument is evaluated after the macro that invokes it. +In the third case, car receives `[active]', which results in: + + + +

    +[active]
    +=>active
    +
    + +

    +exactly as we already saw above. + + +

    +The example above, applied to a more realistic example, gives: + + + +

    +car(int tab[10];)
    +=>int tab10;
    +car([int tab[10];])
    +=>int tab10;
    +car([[int tab[10];]])
    +=>int tab[10];
    +
    + +

    +Huh? The first case is easily understood, but why is the second wrong, +and the third right? To understand that, you must know that after +m4 expands a macro, the resulting text is immediately subjected +to macro expansion and quote removal. This means that the quote removal +occurs twice--first before the argument is passed to the car +macro, and second after the car macro expands to the first +argument. + + +

    +As the author of the Autoconf macro car, you then consider it to +be incorrect that your users have to double-quote the arguments of +car, so you "fix" your macro. Let's call it qar for +quoted car: + + + +

    +define([qar], [[$1]])
    +
    + +

    +and check that qar is properly fixed: + + + +

    +qar([int tab[10];])
    +=>int tab[10];
    +
    + +

    +Ahhh! That's much better. + + +

    +But note what you've done: now that the arguments are literal strings, +if the user wants to use the results of expansions as arguments, she has +to use an unquoted macro call: + + + +

    +qar(active)
    +=>ACT
    +
    + +

    +where she wanted to reproduce what she used to do with car: + + + +

    +car([active])
    +=>ACT, IVE
    +
    + +

    +Worse yet: she wants to use a macro that produces a set of cpp +macros: + + + +

    +define([my_includes], [#include <stdio.h>])
    +car([my_includes])
    +=>#include <stdio.h>
    +qar(my_includes)
    +error-->EOF in argument list
    +
    + +

    +This macro, qar, because it double quotes its arguments, forces +its users to leave their macro calls unquoted, which is dangerous. +Commas and other active symbols are interpreted by m4 before +they are given to the macro, often not in the way the users expect. +Also, because qar behaves differently from the other macros, +it's an exception that should be avoided in Autoconf. + + + + +

    changequote is Evil

    + +

    +The temptation is often high to bypass proper quotation, in particular +when it's late at night. Then, many experienced Autoconf hackers +finally surrender to the dark side of the force and use the ultimate +weapon: changequote. + + +

    +The M4 builtin changequote belongs to a set of primitives that +allow one to adjust the syntax of the language to adjust it to her +needs. For instance, by default M4 uses ``' and `'' as +quotes, but in the context of shell programming (and actually of most +programming languages), it's about the worst choice one can make: +because of strings and back quoted expression in shell (such as +`'this'' and ``that`'), because of literal characters in usual +programming language (as in `'0''), there are many unbalanced +``' and `''. Proper M4 quotation then becomes a nightmare, if +not impossible. In order to make M4 useful in such a context, its +designers have equipped it with changequote, which makes it +possible to chose another pair of quotes. M4sugar, M4sh, Autoconf, and +Autotest all have chosen to use `[' and `]'. Not especially +because they are unlikely characters, but because they are +characters unlikely to be unbalanced. + + +

    +There are other magic primitives, such as changecom to specify +what syntactic forms are comments (it is common to see +`changecom(<!--, -->)' when M4 is used to produce HTML pages), +changeword and changesyntax to change other syntactic +details (such as the character to denote the n-th argument, `$' by +default, the parenthesis around arguments etc.). + + +

    +These primitives are really meant to make M4 more useful for specific +domains: they should be considered like command line options: +@option{--quotes}, @option{--comments}, @option{--words}, and +--syntax. Nevertheless, they are implemented as M4 builtins, as +it makes M4 libraries self contained (no need for additional options). + + +

    +There lies the problem... + + +

    +The problem is that it is then tempting to use them in the middle of an +M4 script, as opposed to its initialization. This, if not carefully +thought, can lead to disastrous effects: you are changing the +language in the middle of the execution. Changing and restoring the +syntax is often not enough: if you happened to invoke macros in between, +these macros will be lost, as the current syntax will probably not be +the one they were implemented with. + + + + +

    Quadrigraphs

    +

    + + + + + + + + +

    +When writing an autoconf macro you may occasionally need to generate +special characters that are difficult to express with the standard +autoconf quoting rules. For example, you may need to output the regular +expression `[^[]', which matches any character other than `['. +This expression contains unbalanced brackets so it cannot be put easily +into an M4 macro. + + +

    +You can work around this problem by using one of the following +quadrigraphs: + + +

    + +
    `@<:@' +
    +`[' +
    `@:>@' +
    +`]' +
    `@S|@' +
    +`$' +
    `@%:@' +
    +`#' +
    `@&t@' +
    +Expands to nothing. +
    + +

    +Quadrigraphs are replaced at a late stage of the translation process, +after @command{m4} is run, so they do not get in the way of M4 quoting. +For example, the string `^@<:@', independently of its quotation, +will appear as `^[' in the output. + + +

    +The empty quadrigraph can be used: + + + +

    + +

    +The name `@&t@' was suggested by Paul Eggert: + + + +

    +

    +I should give some credit to the `@&t@' pun. The `&' is my +own invention, but the `t' came from the source code of the +ALGOL68C compiler, written by Steve Bourne (of Bourne shell fame), +and which used `mt' to denote the empty string. In C, it would +have looked like something like: + + + +

    +char const mt[] = "";
    +
    + +

    +but of course the source code was written in Algol 68. + + +

    +I don't know where he got `mt' from: it could have been his own +invention, and I suppose it could have been a common pun around the +Cambridge University computer lab at the time. +

    + + + +

    Quotation Rule Of Thumb

    + +

    +To conclude, the quotation rule of thumb is: + + +

    +One pair of quotes per pair of parentheses. + + +

    +Never over-quote, never under-quote, in particular in the definition of +macros. In the few places where the macros need to use brackets +(usually in C program text or regular expressions), properly quote +the arguments! + + +

    +It is common to read Autoconf programs with snippets like: + + + +

    +AC_TRY_LINK(
    +changequote(<<, >>)dnl
    +<<#include <time.h>
    +#ifndef tzname /* For SGI.  */
    +extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
    +#endif>>,
    +changequote([, ])dnl
    +[atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
    +
    + +

    +which is incredibly useless since AC_TRY_LINK is already +double quoting, so you just need: + + + +

    +AC_TRY_LINK(
    +[#include <time.h>
    +#ifndef tzname /* For SGI.  */
    +extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
    +#endif],
    +            [atoi (*tzname);],
    +            [ac_cv_var_tzname=yes],
    +            [ac_cv_var_tzname=no])
    +
    + +

    +The M4-fluent reader will note that these two examples are rigorously +equivalent, since m4 swallows both the `changequote(<<, >>)' +and `<<' `>>' when it collects the arguments: these +quotes are not part of the arguments! + + +

    +Simplified, the example above is just doing this: + + + +

    +changequote(<<, >>)dnl
    +<<[]>>
    +changequote([, ])dnl
    +
    + +

    +instead of simply: + + + +

    +[[]]
    +
    + +

    +With macros that do not double quote their arguments (which is the +rule), double-quote the (risky) literals: + + + +

    +AC_LINK_IFELSE([AC_LANG_PROGRAM(
    +[[#include <time.h>
    +#ifndef tzname /* For SGI.  */
    +extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
    +#endif]],
    +                                [atoi (*tzname);])],
    +               [ac_cv_var_tzname=yes],
    +               [ac_cv_var_tzname=no])
    +
    + +

    +See See section Quadrigraphs, for what to do if you run into a hopeless case +where quoting does not suffice. + + +

    +When you create a @command{configure} script using newly written macros, +examine it carefully to check whether you need to add more quotes in +your macros. If one or more words have disappeared in the m4 +output, you need more quotes. When in doubt, quote. + + +

    +However, it's also possible to put on too many layers of quotes. If +this happens, the resulting @command{configure} script will contain +unexpanded macros. The @command{autoconf} program checks for this problem +by doing `grep AC_ configure'. + + + + +

    Invoking @command{autom4te}

    + +

    +The Autoconf suite, including M4sugar, M4sh, and Autotest in addition to +Autoconf per se, heavily rely on M4. All these different uses revealed +common needs factored into a layer over @command{m4}: +@command{autom4te}(3). + + +

    +@command{autom4te} should basically considered as a replacement of +@command{m4} itself. In particular, its handling of command line +arguments is modeled after M4's: + + + +

    +autom4te options files
    +
    + +

    +where the files are directly passed to @command{m4}. In addition +to the regular expansion, it handles the replacement of the quadrigraphs +(see section Quadrigraphs), and of `__oline__', the current line in the +output. It supports an extended syntax for the files: + + +

    + +
    `file.m4f' +
    +This file is an M4 frozen file. Note that all the previous files +are ignored. See the option @option{--melt} for the rationale. + +
    `file?' +
    +If found in the library path, the file is included for expansion, +otherwise it is ignored instead of triggering a failure. +
    + +

    +Of course, it supports the Autoconf common subset of options: + + +

    + +
    @option{--help} +
    +
    @option{-h} +
    +Print a summary of the command line options and exit. + +
    @option{--version} +
    +
    @option{-V} +
    +Print the version number of Autoconf and exit. + +
    @option{--verbose} +
    +
    @option{-v} +
    +Report processing steps. + +
    @option{--debug} +
    +
    @option{-d} +
    +Don't remove the temporary files and be even more verbose. + +
    @option{--include=dir} +
    +
    @option{-I dir} +
    +Also look for input files in dir. Multiple invocations +accumulate. Contrary to M4 but in agreement with common sense, +directories are browsed from last to first. + +
    @option{--output=file} +
    +
    @option{-o file} +
    +Save output (script or trace) to file. The file @option{-} stands +for the standard output. +
    + +

    +As an extension of @command{m4}, it includes the following options: + + +

    + +
    @option{--warnings=category} +
    +
    @option{-W category} +
    + +Report the warnings related to category (which can actually be a +comma separated list). See section Reporting Messages, macro +AC_DIAGNOSE, for a comprehensive list of categories. Special +values include: + +
    + +
    `all' +
    +report all the warnings + +
    `none' +
    +report none + +
    `error' +
    +treats warnings as errors + +
    `no-category' +
    +disable warnings falling into category +
    + +Warnings about `syntax' are enabled by default, and the environment +variable WARNINGS, a comma separated list of categories, is +honored. @command{autom4te -W category} will actually +behave as if you had run: + + +
    +autom4te --warnings=syntax,$WARNINGS,category
    +
    + +If you want to disable @command{autom4te}'s defaults and +WARNINGS, but (for example) enable the warnings about obsolete +constructs, you would use @option{-W none,obsolete}. + + + +@command{autom4te} displays a back trace for errors, but not for +warnings; if you want them, just pass @option{-W error}. For instance, +on this `configure.ac': + + +
    +AC_DEFUN([INNER],
    +[AC_TRY_RUN([exit (0)])])
    +
    +AC_DEFUN([OUTER],
    +[INNER])
    +
    +AC_INIT
    +OUTER
    +
    + +you get: + + +
    +$ autom4te -l autoconf -Wcross
    +configure.ac:8: warning: AC_TRY_RUN called without default \
    +to allow cross compiling
    +$ autom4te -l autoconf -Wcross,error
    +configure.ac:8: error: AC_TRY_RUN called without default \
    +to allow cross compiling
    +acgeneral.m4:3044: AC_TRY_RUN is expanded from...
    +configure.ac:2: INNER is expanded from...
    +configure.ac:5: OUTER is expanded from...
    +configure.ac:8: the top level
    +
    + +
    @option{--melt} +
    +
    @option{-m} +
    +Do not use frozen files. Any argument file.m4f will be +replaced with file.m4. This helps tracing the macros which +are executed only when the files are frozen, typically +m4_define. For instance, running: + + +
    +autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
    +
    + +is roughly equivalent to running: + + +
    +m4 1.m4 2.m4 3.m4 4.m4 input.m4
    +
    + +while + + +
    +autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
    +
    + +is equivalent to: + + +
    +m4 --reload-state=4.m4f input.m4
    +
    + +
    @option{--freeze} +
    +
    @option{-f} +
    +Produce a frozen state file. @command{autom4te} freezing is stricter +than M4's: it must produce no warnings, and no output other than empty +lines (a line with white spaces is not empty) and comments +(starting with `#'). Please, note that contrary to @command{m4}, +this options takes no argument: + + +
    +autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
    +
    + +corresponds to + + +
    +m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
    +
    + +
    @option{--mode=octal-mode} +
    +
    @option{-m octal-mode} +
    +Set the mode of the non traces output to octal-mode. By default, +`0666'. +
    + +

    + +As another additional feature over @command{m4}, @command{autom4te} +caches its results. GNU M4 is able to produce a regular output and +traces at the same time. Traces are heavily used in the GNU Build +System: @command{autoheader} uses them to build `config.h.in', +@command{autoreconf} to determine what GNU Build System components are +used, @command{automake} to "parse" `configure.ac' etc. To save +the long runs of @command{m4}, traces are cached while performing +regular expansion, and conversely. This cache is (actually, the caches +are) stored in the directory `autom4te.cache'. It can safely +be removed at any moment (especially if for some reason +@command{autom4te} considers it is trashed). + + +

    + +
    @option{--force} +
    +
    @option{-f} +
    +Do not consider the cache (but update it anyway). +
    + +

    +Because traces are so important to the GNU Build System, +@command{autom4te} provides high level tracing features as compared to +M4, and helps exploiting the cache: + + +

    + +
    @option{--trace=macro[:format]} +
    +
    @option{-t macro[:format]} +
    +Trace the invocations to macro according to the format. +Multiple @option{--trace} arguments can be used to list several macros. +Multiple @option{--trace} arguments for a single macro are not +cumulative; instead, you should just make format as long as +needed. + +The format is a regular string, with newlines if desired, and +several special escape codes. It defaults to `$f:$l:$n:$%'. It can +use the following special escapes: + +
    + +
    `$$' +
    +The character `$'. + +
    `$f' +
    +The filename from which macro is called. + +
    `$l' +
    +The line number from which macro is called. + +
    `$d' +
    +The depth of the macro call. This is an M4 technical detail that +you probably don't want to know about. + +
    `$n' +
    +The name of the macro. + +
    `$num' +
    +The numth argument of the call to macro. + +
    `$@' +
    +
    `$sep@' +
    +
    `${separator}@' +
    +All the arguments passed to macro, separated by the character +sep or the string separator (`,' by default). Each +argument is quoted, i.e. enclosed in a pair of square brackets. + +
    `$*' +
    +
    `$sep*' +
    +
    `${separator}*' +
    +As above, but the arguments are not quoted. + +
    `$%' +
    +
    `$sep%' +
    +
    `${separator}%' +
    +As above, but the arguments are not quoted, all new line characters in +the arguments are smashed, and the default separator is `:'. + +The escape `$%' produces single-line trace outputs (unless you put +newlines in the `separator'), while `$@' and `$*' do +not. +
    + +See section Using @command{autoconf} to Create @command{configure}, for examples of trace uses. + +
    @option{--preselect=macro} +
    +
    @option{-p macro} +
    +Cache the traces of macro, but do not enable traces. This is +especially important to save cpu cycles in the future. For instance, +when invoked, @command{autoconf} preselects all the macros that +@command{autoheader}, automake, autoreconf etc. will +trace, so that running @command{m4} is not needed to trace them: the +cache suffices. This results in a huge speed-up. +
    + +

    + +Finally, @command{autom4te} introduces the concept of @dfn{Autom4te +libraries}. They consists in a powerful yet extremely simple feature: +sets of combined command line arguments: + + +

    + +
    @option{--language=language} +
    +
    @option{-l =language} +
    +Use the language Autom4te library. Current languages include: + +
    + +
    M4sugar +
    +create M4sugar output. + +
    M4sh +
    +create M4sh executable shell scripts. + +
    Autotest +
    +create Autotest executable test suites. + +
    Autoconf +
    +create Autoconf executable configure scripts. +
    +
    + +

    + +As an example, if Autoconf is installed in its default location, +`/usr/local', running `autom4te -l m4sugar foo.m4' is strictly +equivalent to running `autom4te --include /usr/local/share/autoconf +m4sugar/m4sugar.m4f --warning syntax foo.m4'. Recursive expansion +applies: running `autom4te -l m4sh foo.m4', is the same as +`autom4te --language M4sugar m4sugar/m4sh.m4f foo.m4', i.e., +`autom4te --include /usr/local/share/autoconf m4sugar/m4sugar.m4f +m4sugar/m4sh.m4f --mode 777 foo.m4'. The definition of the languages is +stored in `autom4te.cfg'. + + + + +

    Programming in M4sugar

    + +

    + +M4 by itself provides only a small, but sufficient, set of all-purpose +macros. M4sugar introduces additional generic macros. Its name was +coined by Lars J. Aas: "Readability And Greater Understanding Stands 4 +M4sugar". + + + + +

    Redefined M4 Macros

    + +

    +With a few exceptions, all the M4 native macros are moved in the +`m4_' pseudo-namespace, e.g., M4sugar renames define as +m4_define etc. + + +

    +Some M4 macros are redefined, and are slightly incompatible with their +native equivalent. + + +

    +

    +
    Macro: dnl +
    + +This macro kept its original name: no m4_dnl is defined. +
    + + +

    +

    +
    Macro: m4_defn (macro) +
    + +Contrary to the M4 builtin, this macro fails if macro is not +defined. See m4_undefine. +
    + + +

    +

    +
    Macro: m4_exit (exit-status) +
    + +This macro corresponds to m4exit. +
    + + +

    +

    +
    Macro: m4_if (comment) +
    +
    Macro: m4_if (string-1, string-2, equal, @ovar{not-equal}) +
    +
    Macro: m4_if (string-1, string-2, equal, ...) +
    + +This macro corresponds to ifelse. +
    + + +

    +

    +
    Macro: m4_undefine (macro) +
    + +Contrary to the M4 builtin, this macro fails if macro is not +defined. Use + + + +
    +m4_ifdef([macro], [m4_undefine([macro])])
    +
    + +

    +to recover the behavior of the builtin. +

    + + +

    +

    +
    Macro: m4_bpatsubst (string, regexp, @ovar{replacement}) +
    + +This macro corresponds to patsubst. The name m4_patsubst +is kept for future versions of M4sh, on top of GNU M4 which will +provide extended regular expression syntax via epatsubst. +
    + + +

    +

    +
    Macro: m4_popdef (macro) +
    + +Contrary to the M4 builtin, this macro fails if macro is not +defined. See m4_undefine. +
    + + +

    +

    +
    Macro: m4_bregexp (string, regexp, @ovar{replacement}) +
    + +This macro corresponds to regexp. The name m4_regexp +is kept for future versions of M4sh, on top of GNU M4 which will +provide extended regular expression syntax via eregexp. +
    + + +

    +

    +
    Macro: m4_wrap (text) +
    + +This macro corresponds to m4wrap. + + +

    +You are encouraged to end text with `[]', so that there are +no risks that two consecutive invocations of m4_wrap result in an +unexpected pasting of tokens, as in + + + +

    +m4_define([foo], [Foo])
    +m4_define([bar], [Bar])
    +m4_define([foobar], [FOOBAR])
    +m4_wrap([bar])
    +m4_wrap([foo])
    +=>FOOBAR
    +
    + +
    + + + +

    Evaluation Macros

    + +

    +The following macros give some control over the order of the evaluation +by adding or removing levels of quotes. They are meant for hard core M4 +programmers. + + +

    +

    +
    Macro: m4_dquote (arg1, ...) +
    + +Return the arguments as a quoted list of quoted arguments. +
    + + +

    +

    +
    Macro: m4_quote (arg1, ...) +
    + +Return the arguments as a single entity, i.e., wrap them into a pair of +quotes. +
    + + +

    +The following example aims at emphasing the difference between (i), not +using these macros, (ii), using m4_quote, and (iii), using +m4_dquote. + + + +

    +$ cat example.m4
    +# Over quote, so that quotes are visible.
    +m4_define([show], [$[]1 = [$1], $[]@ = [$@]])
    +m4_divert(0)dnl
    +show(a, b)
    +show(m4_quote(a, b))
    +show(m4_dquote(a, b))
    +$ autom4te -l m4sugar example.m4
    +$1 = a, $@ = [a],[b]
    +$1 = a,b, $@ = [a,b]
    +$1 = [a],[b], $@ = [[a],[b]]
    +
    + + + +

    Forbidden Patterns

    + +

    +M4sugar provides a means to define suspicious patterns, patterns +describing tokens which should not be found in the output. For +instance, if an Autoconf `configure' script includes tokens such as +`AC_DEFINE', or `dnl', then most probably something went +wrong (typically a macro was not evaluated because of over quotation). + + +

    +M4sugar forbids all the tokens matching `^m4_' and `^dnl$'. + + +

    +

    +
    Macro: m4_pattern_forbid (pattern) +
    + +Declare no token matching pattern must be found in the output. +Comments are not checked; this can be a problem if, for instance, you +have some macro left unexpanded after an `#include'. No consensus +is currently found in the Autoconf community, as some people consider it +should be valid to name macros in comments (which doesn't makes sense to +the author of this documentation, as `#'-comments should document +the output, not the input, documented vy `dnl'-comments). +
    + + +

    +Of course, you might encounter exceptions to these generic rules, for +instance you might have to refer to `$m4_flags'. + + +

    +

    +
    Macro: m4_pattern_allow (pattern) +
    + +Any token matching pattern is allowed, including if it matches an +m4_pattern_forbid pattern. +
    + + + + +

    Programming in M4sh

    + +

    +M4sh provides portable alternatives for some common shell constructs +that unfortunately are not portable in practice. + + +

    +

    +
    Macro: AS_DIRNAME (pathname) +
    + +Return the directory portion of pathname, using the algorithm +required by POSIX. See section Limitations of Usual Tools, for more +details about what this returns and why it is more portable than the +@command{dirname} command. +
    + + + + +

    Writing Autoconf Macros

    + +

    +When you write a feature test that could be applicable to more than one +software package, the best thing to do is encapsulate it in a new macro. +Here are some instructions and guidelines for writing Autoconf macros. + + + + +

    Macro Definitions

    + +

    + +Autoconf macros are defined using the AC_DEFUN macro, which is +similar to the M4 builtin m4_define macro. In addition to +defining a macro, AC_DEFUN adds to it some code that is used to +constrain the order in which macros are called (see section Prerequisite Macros). + + +

    +An Autoconf macro definition looks like this: + + + +

    +AC_DEFUN(macro-name, macro-body)
    +
    + +

    +You can refer to any arguments passed to the macro as `$1', +`$2', etc. See section `How to define new macros' in GNU m4, for more complete information on writing M4 macros. + + +

    +Be sure to properly quote both the macro-body and the +macro-name to avoid any problems if the macro happens to have +been previously defined. + + +

    +Each macro should have a header comment that gives its prototype, and a +brief description. When arguments have default values, display them in +the prototype. For example: + + + +

    +# AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
    +# --------------------------------------
    +m4_define([AC_MSG_ERROR],
    +[{ _AC_ECHO([configure: error: $1], 2); exit m4_default([$2], 1); }])
    +
    + +

    +Comments about the macro should be left in the header comment. Most +other comments will make their way into `configure', so just keep +using `#' to introduce comments. + + +

    + +If you have some very special comments about pure M4 code, comments +that make no sense in `configure' and in the header comment, then +use the builtin dnl: it causes m4 to discard the text +through the next newline. + + +

    +Keep in mind that dnl is rarely needed to introduce comments; +dnl is more useful to get rid of the newlines following macros +that produce no output, such as AC_REQUIRE. + + + + +

    Macro Names

    + +

    +All of the Autoconf macros have all-uppercase names starting with +`AC_' to prevent them from accidentally conflicting with other +text. All shell variables that they use for internal purposes have +mostly-lowercase names starting with `ac_'. To ensure that your +macros don't conflict with present or future Autoconf macros, you should +prefix your own macro names and any shell variables they use with some +other sequence. Possibilities include your initials, or an abbreviation +for the name of your organization or software package. + + +

    +Most of the Autoconf macros' names follow a structured naming convention +that indicates the kind of feature check by the name. The macro names +consist of several words, separated by underscores, going from most +general to most specific. The names of their cache variables use the +same convention (see section Cache Variable Names, for more information on +them). + + +

    +The first word of the name after `AC_' usually tells the category +of feature being tested. Here are the categories used in Autoconf for +specific test macros, the kind of macro that you are more likely to +write. They are also used for cache variables, in all-lowercase. Use +them where applicable; where they're not, invent your own categories. + + +

    + +
    C +
    +C language builtin features. +
    DECL +
    +Declarations of C variables in header files. +
    FUNC +
    +Functions in libraries. +
    GROUP +
    +UNIX group owners of files. +
    HEADER +
    +Header files. +
    LIB +
    +C libraries. +
    PATH +
    +The full path names to files, including programs. +
    PROG +
    +The base names of programs. +
    MEMBER +
    +Members of aggregates. +
    SYS +
    +Operating system features. +
    TYPE +
    +C builtin or declared types. +
    VAR +
    +C variables in libraries. +
    + +

    +After the category comes the name of the particular feature being +tested. Any further words in the macro name indicate particular aspects +of the feature. For example, AC_FUNC_UTIME_NULL checks the +behavior of the utime function when called with a NULL +pointer. + + +

    +An internal macro should have a name that starts with an underscore; +Autoconf internals should therefore start with `_AC_'. +Additionally, a macro that is an internal subroutine of another macro +should have a name that starts with an underscore and the name of that +other macro, followed by one or more words saying what the internal +macro does. For example, AC_PATH_X has internal macros +_AC_PATH_X_XMKMF and _AC_PATH_X_DIRECT. + + + + +

    Reporting Messages

    +

    + + + +

    +When macros statically diagnose abnormal situations, benign or fatal, +they should report them using these macros. For dynamic issues, i.e., +when @command{configure} is run, see section Printing Messages. + + +

    +

    +
    Macro: AC_DIAGNOSE (category, message) +
    + +Report message as a warning (or as an error if requested by the +user) if it falls into the category. You are encouraged to use +standard categories, which currently include: + + +
    + +
    `all' +
    +messages that don't fall into one of the following category. Use of an +empty category is equivalent. + +
    `cross' +
    +related to cross compilation issues. + +
    `obsolete' +
    +use of an obsolete construct. + +
    `syntax' +
    +dubious syntactic constructs, incorrectly ordered macro calls. +
    +
    + +

    +

    +
    Macro: AC_WARNING (message) +
    + +Equivalent to `AC_DIAGNOSE([syntax], message)', but you are +strongly encouraged to use a finer grained category. +
    + + +

    +

    +
    Macro: AC_FATAL (message) +
    + +Report a severe error message, and have @command{autoconf} die. +
    + + +

    +When the user runs `autoconf -W error', warnings from +AC_DIAGNOSE and AC_WARNING are reported as error, see +section Using @command{autoconf} to Create @command{configure}. + + + + +

    Dependencies Between Macros

    + +

    +Some Autoconf macros depend on other macros having been called first in +order to work correctly. Autoconf provides a way to ensure that certain +macros are called if needed and a way to warn the user if macros are +called in an order that might cause incorrect operation. + + + + +

    Prerequisite Macros

    + +

    +A macro that you write might need to use values that have previously +been computed by other macros. For example, AC_DECL_YYTEXT +examines the output of flex or lex, so it depends on +AC_PROG_LEX having been called first to set the shell variable +LEX. + + +

    +Rather than forcing the user of the macros to keep track of the +dependencies between them, you can use the AC_REQUIRE macro to do +it automatically. AC_REQUIRE can ensure that a macro is only +called if it is needed, and only called once. + + +

    +

    +
    Macro: AC_REQUIRE (macro-name) +
    + +If the M4 macro macro-name has not already been called, call it +(without any arguments). Make sure to quote macro-name with +square brackets. macro-name must have been defined using +AC_DEFUN or else contain a call to AC_PROVIDE to indicate +that it has been called. + + +

    +AC_REQUIRE must be used inside an AC_DEFUN'd macro; it +must not be called from the top level. +

    + + +

    +AC_REQUIRE is often misunderstood. It really implements +dependencies between macros in the sense that if one macro depends upon +another, the latter will be expanded before the body of the +former. In particular, `AC_REQUIRE(FOO)' is not replaced with the +body of FOO. For instance, this definition of macros: + + + +

    +AC_DEFUN([TRAVOLTA],
    +[test "$body_temparature_in_celsius" -gt "38" &&
    +  dance_floor=occupied])
    +AC_DEFUN([NEWTON_JOHN],
    +[test "$hair_style" = "curly" &&
    +  dance_floor=occupied])
    +
    +AC_DEFUN([RESERVE_DANCE_FLOOR],
    +[if date | grep '^Sat.*pm' >/dev/null 2>&1; then
    +  AC_REQUIRE([TRAVOLTA])
    +  AC_REQUIRE([NEWTON_JOHN])
    +fi])
    +
    + +

    +with this `configure.ac' + + + +

    +AC_INIT
    +RESERVE_DANCE_FLOOR
    +if test "$dance_floor" = occupied; then
    +  AC_MSG_ERROR([cannot pick up here, let's move])
    +fi
    +
    + +

    +will not leave you with a better chance to meet a kindred soul at +other times than Saturday night since it expands into: + + + +

    +test "$body_temperature_in_Celsius" -gt "38" &&
    +  dance_floor=occupied
    +test "$hair_style" = "curly" &&
    +  dance_floor=occupied
    +fi
    +if date | grep '^Sat.*pm' >/dev/null 2>&1; then
    +
    +fi
    +
    + +

    +This behavior was chosen on purpose: (i) it prevents messages in +required macros from interrupting the messages in the requiring macros; +(ii) it avoids bad surprises when shell conditionals are used, as in: + + + +

    +if ...; then
    +  AC_REQUIRE([SOME_CHECK])
    +fi
    +...
    +SOME_CHECK
    +
    + +

    +You are encouraged to put all AC_REQUIREs at the beginning of a +macro. You can use dnl to avoid the empty lines they leave. + + + + +

    Suggested Ordering

    + +

    +Some macros should be run before another macro if both are called, but +neither requires that the other be called. For example, a macro +that changes the behavior of the C compiler should be called before any +macros that run the C compiler. Many of these dependencies are noted in +the documentation. + + +

    +Autoconf provides the AC_BEFORE macro to warn users when macros +with this kind of dependency appear out of order in a +`configure.ac' file. The warning occurs when creating +@command{configure} from `configure.ac', not when running +@command{configure}. + + +

    +For example, AC_PROG_CPP checks whether the C compiler +can run the C preprocessor when given the @option{-E} option. It should +therefore be called after any macros that change which C compiler is +being used, such as AC_PROG_CC. So AC_PROG_CC contains: + + + +

    +AC_BEFORE([$0], [AC_PROG_CPP])dnl
    +
    + +

    +This warns the user if a call to AC_PROG_CPP has already occurred +when AC_PROG_CC is called. + + +

    +

    +
    Macro: AC_BEFORE (this-macro-name, called-macro-name) +
    + +Make m4 print a warning message to the standard error output if +called-macro-name has already been called. this-macro-name +should be the name of the macro that is calling AC_BEFORE. The +macro called-macro-name must have been defined using +AC_DEFUN or else contain a call to AC_PROVIDE to indicate +that it has been called. +
    + + + + +

    Obsoleting Macros

    + +

    +Configuration and portability technology has evolved over the years. +Often better ways of solving a particular problem are developed, or +ad-hoc approaches are systematized. This process has occurred in many +parts of Autoconf. One result is that some of the macros are now +considered obsolete; they still work, but are no longer considered +the best thing to do, hence they should be replaced with more modern +macros. Ideally, @command{autoupdate} should substitute the old macro calls +with their modern implementation. + + +

    +Autoconf provides a simple means to obsolete a macro. + + +

    +

    +
    Macro: AU_DEFUN (old-macro, implementation, @ovar{message}) +
    + + +Define old-macro as implementation. The only difference +with AC_DEFUN is that the user will be warned that +old-macro is now obsolete. + + +

    +If she then uses @command{autoupdate}, the call to old-macro will be +replaced by the modern implementation. The additional +message is then printed. +

    + + + + +

    Coding Style

    + +

    +The Autoconf macros follow a strict coding style. You are encouraged to +follow this style, especially if you intend to distribute your macro, +either by contributing it to Autoconf itself, or via other means. + + +

    +The first requirement is to pay great attention to the quotation, for +more details, see section The Autoconf Language, and section M4 Quotation. + + +

    +Do not try to invent new interfaces. It is likely that there is a macro +in Autoconf that resembles the macro you are defining: try to stick to +this existing interface (order of arguments, default values, etc.). We +are conscious that some of these interfaces are not perfect; +nevertheless, when harmless, homogeneity should be preferred over +creativity. + + +

    +Be careful about clashes both between M4 symbols and between shell +variables. + + +

    +If you stick to the suggested M4 naming scheme (see section Macro Names), +you are unlikely to generate conflicts. Nevertheless, when you need to +set a special value, avoid using a regular macro name; rather, +use an "impossible" name. For instance, up to version 2.13, the macro +AC_SUBST used to remember what symbols were already defined +by setting AC_SUBST_symbol, which is a regular macro name. +But since there is a macro named AC_SUBST_FILE, it was just +impossible to `AC_SUBST(FILE)'! In this case, +AC_SUBST(symbol) or _AC_SUBST(symbol) should +have been used (yes, with the parentheses)...or better yet, high-level +macros such as AC_EXPAND_ONCE. + + +

    +No Autoconf macro should ever enter the user-variable name space; i.e., +except for the variables that are the actual result of running the +macro, all shell variables should start with ac_. In +addition, small macros or any macro that is likely to be embedded in +other macros should be careful not to use obvious names. + + +

    + +Do not use dnl to introduce comments: most of the comments you +are likely to write are either header comments which are not output +anyway, or comments that should make their way into `configure'. +There are exceptional cases where you do want to comment special M4 +constructs, in which case dnl is right, but keep in mind that it +is unlikely. + + +

    +M4 ignores the leading spaces before each argument, use this feature to +indent in such a way that arguments are (more or less) aligned with the +opening parenthesis of the macro being called. For instance, instead of + + + +

    +AC_CACHE_CHECK(for EMX OS/2 environment,
    +ac_cv_emxos2,
    +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
    +[ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
    +
    + +

    +write + + + +

    +AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
    +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
    +                   [ac_cv_emxos2=yes],
    +                   [ac_cv_emxos2=no])])
    +
    + +

    +or even + + + +

    +AC_CACHE_CHECK([for EMX OS/2 environment],
    +               [ac_cv_emxos2],
    +               [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
    +                                                   [return __EMX__;])],
    +                                  [ac_cv_emxos2=yes],
    +                                  [ac_cv_emxos2=no])])
    +
    + +

    +When using AC_TRY_RUN or any macro that cannot work when +cross-compiling, provide a pessimistic value (typically `no'). + + +

    +Feel free to use various tricks to prevent auxiliary tools, such as +syntax-highlighting editors, from behaving improperly. For instance, +instead of: + + + +

    +m4_bpatsubst([$1], [$"])
    +
    + +

    +use + + + +

    +m4_bpatsubst([$1], [$""])
    +
    + +

    +so that Emacsen do not open a endless "string" at the first quote. +For the same reasons, avoid: + + + +

    +test $[#] != 0
    +
    + +

    +and use: + + + +

    +test $[@%:@] != 0
    +
    + +

    +Otherwise, the closing bracket would be hidden inside a `#'-comment, +breaking the bracket-matching highlighting from Emacsen. Note the +preferred style to escape from M4: `$[1]', `$[@]', etc. Do +not escape when it is unneeded. Common examples of useless quotation +are `[$]$1' (write `$$1'), `[$]var' (use `$var'), +etc. If you add portability issues to the picture, you'll prefer +`${1+"$[@]"}' to `"[$]@"', and you'll prefer do something +better than hacking Autoconf :-). + + +

    +When using @command{sed}, don't use @option{-e} except for indenting +purpose. With the s command, the preferred separator is `/' +unless `/' itself is used in the command, in which case you should +use `,'. + + +

    +See section Macro Definitions, for details on how to define a macro. If a +macro doesn't use AC_REQUIRE and it is expected to never be the +object of an AC_REQUIRE directive, then use define. In +case of doubt, use AC_DEFUN. All the AC_REQUIRE +statements should be at the beginning of the macro, dnl'ed. + + +

    +You should not rely on the number of arguments: instead of checking +whether an argument is missing, test that it is not empty. It provides +both a simpler and a more predictable interface to the user, and saves +room for further arguments. + + +

    +Unless the macro is short, try to leave the closing `])' at the +beginning of a line, followed by a comment that repeats the name of the +macro being defined. This introduces an additional newline in +@command{configure}; normally, that is not a problem, but if you want to +remove it you can use `[]dnl' on the last line. You can similarly +use `[]dnl' after a macro call to remove its newline. `[]dnl' +is recommended instead of `dnl' to ensure that M4 does not +interpret the `dnl' as being attached to the preceding text or +macro output. For example, instead of: + + + +

    +AC_DEFUN([AC_PATH_X],
    +[AC_MSG_CHECKING([for X])
    +AC_REQUIRE_CPP()
    +# ...omitted...
    +  AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
    +fi])
    +
    + +

    +you would write: + + + +

    +AC_DEFUN([AC_PATH_X],
    +[AC_REQUIRE_CPP()[]dnl
    +AC_MSG_CHECKING([for X])
    +# ...omitted...
    +  AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
    +fi[]dnl
    +])# AC_PATH_X
    +
    + +

    +If the macro is long, try to split it into logical chunks. Typically, +macros that check for a bug in a function and prepare its +AC_LIBOBJ replacement should have an auxiliary macro to perform +this setup. Do not hesitate to introduce auxiliary macros to factor +your code. + + +

    +In order to highlight the recommended coding style, here is a macro +written the old way: + + + +

    +dnl Check for EMX on OS/2.
    +dnl _AC_EMXOS2
    +AC_DEFUN(_AC_EMXOS2,
    +[AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
    +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
    +ac_cv_emxos2=yes, ac_cv_emxos2=no)])
    +test "$ac_cv_emxos2" = yes && EMXOS2=yes])
    +
    + +

    +and the new way: + + + +

    +# _AC_EMXOS2
    +# ----------
    +# Check for EMX on OS/2.
    +define([_AC_EMXOS2],
    +[AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
    +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
    +                   [ac_cv_emxos2=yes],
    +                   [ac_cv_emxos2=no])])
    +test "$ac_cv_emxos2" = yes && EMXOS2=yes[]dnl
    +])# _AC_EMXOS2
    +
    + + + +

    Portable Shell Programming

    + +

    +When writing your own checks, there are some shell-script programming +techniques you should avoid in order to make your code portable. The +Bourne shell and upward-compatible shells like the Korn shell and Bash +have evolved over the years, but to prevent trouble, do not take +advantage of features that were added after UNIX version 7, circa +1977. You should not use shell functions, aliases, negated character +classes, or other features that are not found in all Bourne-compatible +shells; restrict yourself to the lowest common denominator. Even +unset is not supported by all shells! Also, include a space +after the exclamation point in interpreter specifications, like this: + + + +

    +#! /usr/bin/perl
    +
    + +

    +If you omit the space before the path, then 4.2BSD based systems +(such as Sequent DYNIX) will ignore the line, because they interpret +`#! /' as a 4-byte magic number. Some old systems have quite +small limits on the length of the `#!' line too, for instance 32 +bytes (not including the newline) on SunOS 4. + + +

    +The set of external programs you should run in a @command{configure} script +is fairly small. See section `Utilities in Makefiles' in GNU Coding Standards, for the list. This +restriction allows users to start out with a fairly small set of +programs and build the rest, avoiding too many interdependencies between +packages. + + +

    +Some of these external utilities have a portable subset of features; see +section Limitations of Usual Tools. + + + + +

    Shellology

    + +

    +There are several families of shells, most prominently the Bourne +family and the C shell family which are deeply incompatible. If you +want to write portable shell scripts, avoid members of the C shell +family. + + +

    +Below we describe some of the members of the Bourne shell family. + + +

    + +
    Ash +
    + +@command{ash} is often used on GNU/Linux and BSD systems as a +light-weight Bourne-compatible shell. Ash 0.2 has some bugs that are +fixed in the 0.3.x series, but portable shell scripts should workaround +them, since version 0.2 is still shipped with many GNU/Linux +distributions. + +To be compatible with Ash 0.2: + + + + +
    Bash +
    + +To detect whether you are running @command{bash}, test if +BASH_VERSION is set. To disable its extensions and require +POSIX compatibility, run `set -o posix'. See section `Bash POSIX Mode' in The GNU Bash Reference Manual, for +details. + +
    Bash 2.05 and later +
    + +Versions 2.05 and later of @command{bash} use a different format for the +output of the @command{set} builtin, designed to make evaluating this +output easier. However, this output is not compatible with earlier +versions of @command{bash} (or with many other shells, probably). So if +you use @command{bash} 2.05 or higher to execute @command{configure}, +you'll need to use @command{bash} 2.05 for all other build tasks as well. + +
    @command{/usr/xpg4/bin/sh on Solaris} +
    + +The POSIX-compliant Bourne shell on a Solaris system is +@command{/usr/xpg4/bin/sh} and is part of an extra optional package. +There is no extra charge for this package, but it is also not part of a +minimal OS install and therefore some folks may not have it. + +
    Zsh +
    + +To detect whether you are running @command{zsh}, test if +ZSH_VERSION is set. By default @command{zsh} is not +compatible with the Bourne shell: you have to run `emulate sh' and +set NULLCMD to `:'. See section `Compatibility' in The Z Shell Manual, for details. + +Zsh 3.0.8 is the native @command{/bin/sh} on Mac OS X 10.0.3. +
    + +

    +The following discussion between Russ Allbery and Robert Lipe is worth +reading: + + +

    +Russ Allbery: + + + +

    +

    +The GNU assumption that @command{/bin/sh} is the one and only shell +leads to a permanent deadlock. Vendors don't want to break user's +existant shell scripts, and there are some corner cases in the Bourne +shell that are not completely compatible with a POSIX shell. Thus, +vendors who have taken this route will never (OK..."never say +never") replace the Bourne shell (as @command{/bin/sh}) with a +POSIX shell. +

    + +

    +Robert Lipe: + + + +

    +

    +This is exactly the problem. While most (at least most System V's) do +have a Bourne shell that accepts shell functions most vendor +@command{/bin/sh} programs are not the POSIX shell. + + +

    +So while most modern systems do have a shell _somewhere_ that meets the +POSIX standard, the challenge is to find it. +

    + + + +

    Here-Documents

    + +

    +Don't rely on `\' being preserved just because it has no special +meaning together with the next symbol. in the native @command{/bin/sh} +on OpenBSD 2.7 `\"' expands to `"' in here-documents with +unquoted delimiter. As a general rule, if `\\' expands to `\' +use `\\' to get `\'. + + +

    +With OpenBSD 2.7's @command{/bin/sh} + + + +

    +$ cat <<EOF
    +> \" \\
    +> EOF
    +" \
    +
    + +

    +and with Bash: + + + +

    +bash-2.04$ cat <<EOF
    +> \" \\
    +> EOF
    +\" \
    +
    + +

    +Many older shells (including the Bourne shell) implement here-documents +inefficiently. Users can generally speed things up by using a faster +shell, e.g., by using the command `bash ./configure' rather than +plain `./configure'. + + +

    +Some shells can be extremely inefficient when there are a lot of +here-documents inside a single statement. For instance if your +`configure.ac' includes something like: + + + +

    +if <cross_compiling>; then
    +  assume this and that
    +else
    +  check this
    +  check that
    +  check something else
    +  ...
    +  on and on forever
    +  ...
    +fi
    +
    + +

    +A shell parses the whole if/fi construct, creating +temporary files for each here document in it. Some shells create links +for such here-documents on every fork, so that the clean-up code +they had installed correctly removes them. It is creating the links +that the shell can take forever. + + +

    +Moving the tests out of the if/fi, or creating multiple +if/fi constructs, would improve the performance +significantly. Anyway, this kind of construct is not exactly the +typical use of Autoconf. In fact, it's even not recommended, because M4 +macros can't look into shell conditionals, so we may fail to expand a +macro when it was expanded before in a conditional path, and the +condition turned out to be false at run-time, and we end up not +executing the macro at all. + + + + +

    File Descriptors

    + +

    +Some file descriptors shall not be used, since some systems, admittedly +arcane, use them for special purpose: + + + +

    +3 --- some systems may open it to `/dev/tty'.
    +4 --- used on the Kubota Titan.
    +
    + +

    +Don't redirect several times the same file descriptor, as you are doomed +to failure under Ultrix. + + + +

    +ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
    +UWS V4.4 (Rev. 11)
    +$ eval 'echo matter >fullness' >void
    +illegal io
    +$ eval '(echo matter >fullness)' >void
    +illegal io
    +$ (eval '(echo matter >fullness)') >void
    +Ambiguous output redirect.
    +
    + +

    +In each case the expected result is of course `fullness' containing +`matter' and `void' being empty. + + +

    +Don't try to redirect the standard error of a command substitution: it +must be done inside the command substitution: when running +`: `cd /zorglub` 2>/dev/null' expect the error message to +escape, while `: `cd /zorglub 2>/dev/null`' works properly. + + +

    +It is worth noting that Zsh (but not Ash nor Bash) makes it possible +in assignments though: `foo=`cd /zorglub` 2>/dev/null'. + + +

    +Most shells, if not all (including Bash, Zsh, Ash), output traces on +stderr, even for sub-shells. This might result in undesired content +if you meant to capture the standard-error output of the inner command: + + + +

    +$ ash -x -c '(eval "echo foo >&2") 2>stderr'
    +$ cat stderr
    ++ eval echo foo >&2
    ++ echo foo
    +foo
    +$ bash -x -c '(eval "echo foo >&2") 2>stderr'
    +$ cat stderr
    ++ eval 'echo foo >&2'
    +++ echo foo
    +foo
    +$ zsh -x -c '(eval "echo foo >&2") 2>stderr'
    +# Traces on startup files deleted here.
    +$ cat stderr
    ++zsh:1> eval echo foo >&2
    ++zsh:1> echo foo
    +foo
    +
    + +

    +You'll appreciate the various levels of detail... + + +

    +One workaround is to grep out uninteresting lines, hoping not to remove +good ones... + + +

    +Don't try to move/delete open files, such as in `exec >foo; mv foo +bar', see See section Limitations of Shell Builtins, @command{mv} for more details. + + + + +

    File System Conventions

    + +

    +While @command{autoconf} and friends will usually be run on some Unix +variety, it can and will be used on other systems, most notably DOS +variants. This impacts several assumptions regarding file and +path names. + + +

    +For example, the following code: + + + +

    +case $foo_dir in
    +  /*) # Absolute
    +     ;;
    +  *)
    +     foo_dir=$dots$foo_dir ;;
    +esac
    +
    + +

    +will fail to properly detect absolute paths on those systems, because +they can use a drivespec, and will usually use a backslash as directory +separator. The canonical way to check for absolute paths is: + + + +

    +case $foo_dir in
    +  [\\/]* | ?:[\\/]* ) # Absolute
    +     ;;
    +  *)
    +     foo_dir=$dots$foo_dir ;;
    +esac
    +
    + +

    +Make sure you quote the brackets if appropriate and keep the backslash as +first character (see section Limitations of Shell Builtins). + + +

    +Also, because the colon is used as part of a drivespec, these systems don't +use it as path separator. When creating or accessing paths, use the +PATH_SEPARATOR output variable instead. @command{configure} sets this +to the appropriate value (`:' or `;') when it starts up. + + +

    +File names need extra care as well. While DOS-based environments +that are Unixy enough to run @command{autoconf} (such as DJGPP) will +usually be able to handle long file names properly, there are still +limitations that can seriously break packages. Several of these issues +can be easily detected by the +@href{ftp://ftp.gnu.org/gnu/non-gnu/doschk/doschk-1.1.tar.gz, doschk} +package. + + +

    +A short overview follows; problems are marked with SFN/LFN to +indicate where they apply: SFN means the issues are only relevant to +plain DOS, not to DOS boxes under Windows, while LFN +identifies problems that exist even under Windows. + + +

    + +
    No multiple dots (SFN) +
    +DOS cannot handle multiple dots in filenames. This is an especially +important thing to remember when building a portable configure script, +as @command{autoconf} uses a .in suffix for template files. + +This is perfectly OK on Unices: + + +
    +AC_CONFIG_HEADER(config.h)
    +AC_CONFIG_FILES([source.c foo.bar])
    +AC_OUTPUT
    +
    + +but it causes problems on DOS, as it requires `config.h.in', +`source.c.in' and `foo.bar.in'. To make your package more portable +to DOS-based environments, you should use this instead: + + +
    +AC_CONFIG_HEADER(config.h:config.hin)
    +AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
    +AC_OUTPUT
    +
    + +
    No leading dot (SFN) +
    +DOS cannot handle filenames that start with a dot. This is usually +not a very important issue for @command{autoconf}. + +
    Case insensitivity (LFN) +
    +DOS is case insensitive, so you cannot, for example, have both a +file called `INSTALL' and a directory called `install'. This +also affects @command{make}; if there's a file called `INSTALL' in +the directory, @command{make install} will do nothing (unless the +`install' target is marked as PHONY). + +
    The 8+3 limit (SFN) +
    +Because the DOS file system only stores the first 8 characters of +the filename and the first 3 of the extension, those must be unique. +That means that `foobar-part1.c', `foobar-part2.c' and +`foobar-prettybird.c' all resolve to the same filename +(`FOOBAR-P.C'). The same goes for `foo.bar' and +`foo.bartender'. + +Note: This is not usually a problem under Windows, as it uses numeric +tails in the short version of filenames to make them unique. However, a +registry setting can turn this behaviour off. While this makes it +possible to share file trees containing long file names between SFN +and LFN environments, it also means the above problem applies there +as well. + +
    Invalid characters +
    +Some characters are invalid in DOS filenames, and should therefore +be avoided. In a LFN environment, these are `/', `\', +`?', `*', `:', `<', `>', `|' and `"'. +In a SFN environment, other characters are also invalid. These +include `+', `,', `[' and `]'. +
    + + + +

    Shell Substitutions

    + +

    +Contrary to a persistent urban legend, the Bourne shell does not +systematically split variables and backquoted expressions, in particular +on the right-hand side of assignments and in the argument of case. +For instance, the following code: + + + +

    +case "$given_srcdir" in
    +.)  top_srcdir="`echo "$dots" | sed 's,/$,,'`"
    +*)  top_srcdir="$dots$given_srcdir" ;;
    +esac
    +
    + +

    +is more readable when written as: + + + +

    +case $given_srcdir in
    +.)  top_srcdir=`echo "$dots" | sed 's,/$,,'`
    +*)  top_srcdir=$dots$given_srcdir ;;
    +esac
    +
    + +

    +and in fact it is even more portable: in the first case of the +first attempt, the computation of top_srcdir is not portable, +since not all shells properly understand "`..."..."...`". +Worse yet, not all shells understand "`...\"...\"...`" +the same way. There is just no portable way to use double-quoted +strings inside double-quoted backquoted expressions (pfew!). + + +

    + +
    $@ +
    + +One of the most famous shell-portability issues is related to +`"$@"': when there are no positional arguments, it is supposed to +be equivalent to nothing. But some shells, for instance under Digital +Unix 4.0 and 5.0, will then replace it with an empty argument. To be +portable, use `${1+"$@"}'. + +
    ${var:-value} +
    + +Old BSD shells, including the Ultrix sh, don't accept the +colon for any shell substitution, and complain and die. + +
    ${var=literal} +
    + +Be sure to quote: + + +
    +: ${var='Some words'}
    +
    + +otherwise some shells, such as on Digital Unix V 5.0, will die because +of a "bad substitution". + +Solaris' @command{/bin/sh} has a frightening bug in its interpretation +of this. Imagine you need set a variable to a string containing +`}'. This `}' character confuses Solaris' @command{/bin/sh} +when the affected variable was already set. This bug can be exercised +by running: + + +
    +$ unset foo
    +$ foo=${foo='}'}
    +$ echo $foo
    +}
    +$ foo=${foo='}'   # no error; this hints to what the bug is
    +$ echo $foo
    +}
    +$ foo=${foo='}'}
    +$ echo $foo
    +}}
    + ^ ugh!
    +
    + +It seems that `}' is interpreted as matching `${', even +though it is enclosed in single quotes. The problem doesn't happen +using double quotes. + +
    ${var=expanded-value} +
    + +On Ultrix, +running + + +
    +default="yu,yaa"
    +: ${var="$default"}
    +
    + +will set var to `M-yM-uM-,M-yM-aM-a', i.e., the 8th bit of +each char will be set. You won't observe the phenomenon using a simple +`echo $var' since apparently the shell resets the 8th bit when it +expands $var. Here are two means to make this shell confess its sins: + + +
    +$ cat -v <<EOF
    +$var
    +EOF
    +
    + +and + + +
    +$ set | grep '^var=' | cat -v
    +
    + +One classic incarnation of this bug is: + + +
    +default="a b c"
    +: ${list="$default"}
    +for c in $list; do
    +  echo $c
    +done
    +
    + +You'll get `a b c' on a single line. Why? Because there are no +spaces in `$list': there are `M- ', i.e., spaces with the 8th +bit set, hence no IFS splitting is performed!!! + +One piece of good news is that Ultrix works fine with `: +${list=$default}'; i.e., if you don't quote. The bad news is +then that QNX 4.25 then sets list to the last item of +default! + +The portable way out consists in using a double assignment, to switch +the 8th bit twice on Ultrix: + + +
    +list=${list="$default"}
    +
    + +...but beware of the `}' bug from Solaris (see above). For safety, +use: + + +
    +test "${var+set}" = set || var={value}
    +
    + +
    `commands` +
    + + +While in general it makes no sense, do not substitute a single builtin +with side effects as Ash 0.2, trying to optimize, does not fork a +sub-shell to perform the command. + +For instance, if you wanted to check that @command{cd} is silent, do not +use `test -z "`cd /`"' because the following can happen: + + +
    +$ pwd
    +/tmp
    +$ test -n "`cd /`" && pwd
    +/
    +
    + +The result of `foo=`exit 1`' is left as an exercise to the reader. + +
    $(commands) +
    + +This construct is meant to replace ``commands`'; they can be +nested while this is impossible to do portably with back quotes. +Unfortunately it is not yet widely supported. Most notably, even recent +releases of Solaris don't support it: + + +
    +$ showrev -c /bin/sh | grep version
    +Command version: SunOS 5.8 Generic 109324-02 February 2001
    +$ echo $(echo blah)
    +syntax error: `(' unexpected
    +
    + +nor does IRIX 6.5's Bourne shell: + +
    +$ uname -a
    +IRIX firebird-image 6.5 07151432 IP22
    +$ echo $(echo blah)
    +$(echo blah)
    +
    + +
    + + + +

    Assignments

    + +

    +When setting several variables in a row, be aware that the order of the +evaluation is undefined. For instance `foo=1 foo=2; echo $foo' +gives `1' with sh on Solaris, but `2' with Bash. You must use +`;' to enforce the order: `foo=1; foo=2; echo $foo'. + + +

    +Don't rely on the exit status of an assignment: Ash 0.2 does not change +the status and propagates that of the last statement: + + + +

    +$ false || foo=bar; echo $?
    +1
    +$ false || foo=`:`; echo $?
    +0
    +
    + +

    +and to make things even worse, QNX 4.25 just sets the exit status +to 0 in any case: + + + +

    +$ foo=`exit 1`; echo $?
    +0
    +
    + +

    +To assign default values, follow this algorithm: + + + +

      +
    1. + +If the default value is a literal and does not contain any closing +brace, use: + + +
      +: ${var='my literal'}
      +
      + +
    2. + +If the default value contains no closing brace, has to be expanded, and +the variable being initialized will never be IFS-split (i.e., it's not a +list), then use: + + +
      +: ${var="$default"}
      +
      + +
    3. + +If the default value contains no closing brace, has to be expanded, and +the variable being initialized will be IFS-split (i.e., it's a list), +then use: + + +
      +var=${var="$default"}
      +
      + +
    4. + +If the default value contains a closing brace, then use: + + +
      +test "${var+set}" = set || var='${indirection}'
      +
      + +
    + +

    +In most cases `var=${var="$default"}' is fine, but in case of +doubt, just use the latter. See section Shell Substitutions, items +`${var:-value}' and `${var=value}' +for the rationale. + + + + +

    Special Shell Variables

    + +

    +Some shell variables should not be used, since they can have a deep +influence on the behavior of the shell. In order to recover a sane +behavior from the shell, some variables should be unset, but +@command{unset} is not portable (see section Limitations of Shell Builtins) and a +fallback value is needed. We list these values below. + + +

    + +
    CDPATH +
    + +When this variable is set cd is verbose, so idioms such as +`abs=`cd $rel && pwd`' break because abs receives the path +twice. + +Setting CDPATH to the empty value is not enough for most shells. +A simple path separator is enough except for zsh, which prefers a +leading dot: + + +
    +zsh-3.1.6$ mkdir foo && (CDPATH=: cd foo)
    +/tmp/foo
    +zsh-3.1.6$ (CDPATH=:. cd foo)
    +/tmp/foo
    +zsh-3.1.6$ (CDPATH=.: cd foo)
    +zsh-3.1.6$
    +
    + +(of course we could just @command{unset} CDPATH, since it also +behaves properly if set to the empty string). + +Life wouldn't be so much fun if @command{bash} and @command{zsh} had the +same behavior: + + +
    +bash-2.02$ mkdir foo && (CDPATH=: cd foo)
    +bash-2.02$ (CDPATH=:. cd foo)
    +bash-2.02$ (CDPATH=.: cd foo)
    +/tmp/foo
    +
    + +Of course, even better style would be to use PATH_SEPARATOR instead +of a `:'. +Therefore, a portable solution to neutralize CDPATH is + + +
    +CDPATH=${ZSH_VERSION+.}$PATH_SEPARATOR
    +
    + +Note that since @command{zsh} supports @command{unset}, you may unset +CDPATH using PATH_SEPARATOR as a fallback, see +section Limitations of Shell Builtins. + +
    IFS +
    + +Don't set the first character of IFS to backslash. Indeed, +Bourne shells use the first character (backslash) when joining the +components in `"$@"' and some shells then re-interpret (!) the +backslash escapes, so you can end up with backspace and other strange +characters. + +
    LANG +
    +
    LC_ALL +
    +
    LC_COLLATE +
    +
    LC_CTYPE +
    +
    LC_MESSAGES +
    +
    LC_NUMERIC +
    +
    LC_TIME +
    + + + + + + + + +Autoconf-generated scripts normally set all these variables to +`C' because so much configuration code assumes the C locale and +POSIX requires that @env{LC_ALL} be set to `C' if the C +locale is desired. However, some older, nonstandard systems (notably +SCO) break if @env{LC_ALL} is set to `C', so when running on +these systems Autoconf-generated scripts first try to unset the +variables instead. + +
    LANGUAGE +
    + + +@env{LANGUAGE} is not specified by POSIX, but it is a GNU +extension that overrides @env{LC_ALL} in some cases, so +Autoconf-generated scripts set it too. + +
    LINENO +
    + +Most modern shells provide the current line number in LINENO. +Its value is the line number of the beginning of the current command. +Autoconf attempts to execute @command{configure} with a modern shell. +If no such shell is available, it attempts to implement LINENO +with a Sed prepass that replaces the each instance of the string +$LINENO (not followed by an alphanumeric character) with the +line's number. + +You should not rely on LINENO within @command{eval}, as the +behavior differs in practice. Also, the possibility of the Sed +prepass means that you should not rely on $LINENO when quoted, +when in here-documents, or when in long commands that cross line +boundaries. Subshells should be OK, though. In the following +example, lines 1, 6, and 9 are portable, but the other instances of +LINENO are not: + + +
    +$ cat lineno
    +echo 1. $LINENO
    +cat <<EOF
    +3. $LINENO
    +4. $LINENO
    +EOF
    +( echo 6. $LINENO )
    +eval 'echo 7. $LINENO'
    +echo 8. '$LINENO'
    +echo 9. $LINENO '
    +10.' $LINENO
    +$ bash-2.05 lineno
    +1. 1
    +3. 2
    +4. 2
    +6. 6
    +7. 1
    +8. $LINENO
    +9. 9
    +10. 9
    +$ zsh-3.0.6 lineno
    +1. 1
    +3. 2
    +4. 2
    +6. 6
    +7. 7
    +8. $LINENO
    +9. 9
    +10. 9
    +$ pdksh-5.2.14 lineno
    +1. 1
    +3. 2
    +4. 2
    +6. 6
    +7. 0
    +8. $LINENO
    +9. 9
    +10. 9
    +$ sed '=' <lineno |
    +>   sed '
    +>     N
    +>     s,$,-,
    +>     : loop
    +>     s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,
    +>     t loop
    +>     s,-$,,
    +>     s,^[0-9]*\n,,
    +>   ' |
    +>   sh
    +1. 1
    +3. 3
    +4. 4
    +6. 6
    +7. 7
    +8. 8
    +9. 9
    +10. 10
    +
    + +
    NULLCMD +
    + +When executing the command `>foo', @command{zsh} executes +`$NULLCMD >foo'. The Bourne shell considers NULLCMD is +`:', while @command{zsh}, even in Bourne shell compatibility mode, +sets NULLCMD to `cat'. If you forgot to set NULLCMD, +your script might be suspended waiting for data on its standard input. + +
    status +
    + +This variable is an alias to `$?' for zsh (at least 3.1.6), +hence read-only. Do not use it. + +
    PATH_SEPARATOR +
    + +If it is not set, @command{configure} will detect the appropriate path +separator for the build system and set the PATH_SEPARATOR output +variable accordingly. + +On DJGPP systems, the PATH_SEPARATOR environment variable can be +set to either `:' or `;' to control the path separator +@command{bash} uses to set up certain environment variables (such as +PATH). Since this only works inside @command{bash}, you want +@command{configure} to detect the regular DOS path separator +(`;'), so it can be safely substituted in files that may not support +`;' as path separator. So it is recommended to either unset this +variable or set it to `;'. + +
    RANDOM +
    + +Many shells provide RANDOM, a variable that returns a different +integer when used. Most of the time, its value does not change when it +is not used, but on IRIX 6.5 the value changes all the time. This +can be observed by using @command{set}. +
    + + + +

    Limitations of Shell Builtins

    + +

    +No, no, we are serious: some shells do have limitations! :) + + +

    +You should always keep in mind that any built-in or command may support +options, and therefore have a very different behavior with arguments +starting with a dash. For instance, the innocent `echo "$word"' +can give unexpected results when word starts with a dash. It is +often possible to avoid this problem using `echo "x$word"', taking +the `x' into account later in the pipe. + + +

    + +
    @command{.} +
    + +Use @command{.} only with regular files (use `test -f'). Bash +2.03, for instance, chokes on `. /dev/null'. Also, remember that +@command{.} uses @env{PATH} if its argument contains no slashes, so if +you want to use @command{.} on a file `foo' in the current +directory, you must use `. ./foo'. + +
    @command{!} +
    + +You can't use @command{!}, you'll have to rewrite your code. + +
    @command{break} +
    + +The use of `break 2', etcetera, is safe. + +
    @command{case} +
    + +You don't need to quote the argument; no splitting is performed. + +You don't need the final `;;', but you should use it. + +Because of a bug in its fnmatch, @command{bash} fails to properly +handle backslashes in character classes: + + +
    +bash-2.02$ case /tmp in [/\\]*) echo OK;; esac
    +bash-2.02$
    +
    + +This is extremely unfortunate, since you are likely to use this code to +handle UNIX or MS-DOS absolute paths. To work around this +bug, always put the backslash first: + + +
    +bash-2.02$ case '\TMP' in [\\/]*) echo OK;; esac
    +OK
    +bash-2.02$ case /tmp in [\\/]*) echo OK;; esac
    +OK
    +
    + +Some shells, such as Ash 0.3.8, are confused by empty +case/esac: + + +
    +ash-0.3.8 $ case foo in esac;
    +error-->Syntax error: ";" unexpected (expecting ")")
    +
    + +Many shells still do not support parenthesized cases, which is a pity +for those of us using tools that rely on balanced parentheses. For +instance, Solaris 2.8's Bourne shell: + + +
    +$ case foo in (foo) echo foo;; esac
    +error-->syntax error: `(' unexpected
    +
    + +
    @command{echo} +
    + +The simple echo is probably the most surprising source of +portability troubles. It is not possible to use `echo' portably +unless both options and escape sequences are omitted. New applications +which are not aiming at portability should use `printf' instead of +`echo'. + +Don't expect any option. See section Preset Output Variables, ECHO_N +etc. for a means to simulate @option{-c}. + +Do not use backslashes in the arguments, as there is no consensus on +their handling. On `echo '\n' | wc -l', the @command{sh} of +Digital Unix 4.0, MIPS RISC/OS 4.52, answer 2, but the Solaris' +@command{sh}, Bash and Zsh (in @command{sh} emulation mode) report 1. +Please note that the problem is truly @command{echo}: all the shells +understand `'\n'' as the string composed of a backslash and an +`n'. + +Because of these problems, do not pass a string containing arbitrary +characters to @command{echo}. For example, `echo "$foo"' is safe +if you know that foo's value cannot contain backslashes and cannot +start with `-', but otherwise you should use a here-document like +this: + + +
    +cat <<EOF
    +$foo
    +EOF
    +
    + +
    @command{exit} +
    + +The default value of @command{exit} is supposed to be $?; +unfortunately, some shells, such as the DJGPP port of Bash 2.04, just +perform `exit 0'. + + +
    +bash-2.04$ foo=`exit 1` || echo fail
    +fail
    +bash-2.04$ foo=`(exit 1)` || echo fail
    +fail
    +bash-2.04$ foo=`(exit 1); exit` || echo fail
    +bash-2.04$
    +
    + +Using `exit $?' restores the expected behavior. + +Some shell scripts, such as those generated by @command{autoconf}, use a +trap to clean up before exiting. If the last shell command exited with +nonzero status, the trap also exits with nonzero status so that the +invoker can tell that an error occurred. + +Unfortunately, in some shells, such as Solaris 8 @command{sh}, an exit +trap ignores the exit command's status. In these shells, a trap +cannot determine whether it was invoked by plain exit or by +exit 1. Instead of calling exit directly, use the +AC_MSG_ERROR macro that has a workaround for this problem. + +
    @command{export} +
    + +The builtin @command{export} dubs environment variable a shell +variable. Each update of exported variables corresponds to an update of +the environment variables. Conversely, each environment variable +received by the shell when it is launched should be imported as a shell +variable marked as exported. + +Alas, many shells, such as Solaris 2.5, IRIX 6.3, IRIX 5.2, AIX 4.1.5 +and DU 4.0, forget to @command{export} the environment variables they +receive. As a result, two variables are coexisting: the environment +variable and the shell variable. The following code demonstrates this +failure: + + +
    +#! /bin/sh
    +echo $FOO
    +FOO=bar
    +echo $FOO
    +exec /bin/sh $0
    +
    + +when run with `FOO=foo' in the environment, these shells will print +alternately `foo' and `bar', although it should only print +`foo' and then a sequence of `bar's. + +Therefore you should @command{export} again each environment variable +that you update. + +
    @command{false} +
    + +Don't expect @command{false} to exit with status 1: in the native Bourne +shell of Solaris 8, it exits with status 255. + +
    @command{for} +
    + +To loop over positional arguments, use: + + +
    +for arg
    +do
    +  echo "$arg"
    +done
    +
    + +You may not leave the do on the same line as for, +since some shells improperly grok: + + +
    +for arg; do
    +  echo "$arg"
    +done
    +
    + +If you want to explicitly refer to the positional arguments, given the +`$@' bug (see section Shell Substitutions), use: + + +
    +for arg in ${1+"$@"}; do
    +  echo "$arg"
    +done
    +
    + +
    @command{if} +
    + +Using `!' is not portable. Instead of: + + +
    +if ! cmp -s file file.new; then
    +  mv file.new file
    +fi
    +
    + +use: + + +
    +if cmp -s file file.new; then :; else
    +  mv file.new file
    +fi
    +
    + +There are shells that do not reset the exit status from an @command{if}: + + +
    +$ if (exit 42); then true; fi; echo $?
    +42
    +
    + +whereas a proper shell should have printed `0'. This is especially +bad in Makefiles since it produces false failures. This is why properly +written Makefiles, such as Automake's, have such hairy constructs: + + +
    +if test -f "$file"; then
    +  install "$file" "$dest"
    +else
    +  :
    +fi
    +
    + +
    @command{set} +
    + +This builtin faces the usual problem with arguments starting with a +dash. Modern shells such as Bash or Zsh understand @option{--} to specify +the end of the options (any argument after @option{--} is a parameters, +even `-x' for instance), but most shells simply stop the option +processing as soon as a non-option argument is found. Therefore, use +`dummy' or simply `x' to end the option processing, and use +@command{shift} to pop it out: + + +
    +set x $my_list; shift
    +
    + +
    @command{shift} +
    + +Not only is @command{shift}ing a bad idea when there is nothing left to +shift, but in addition it is not portable: the shell of MIPS +RISC/OS 4.52 refuses to do it. + +
    @command{source} +
    + +This command is not portable, as POSIX does not require it; use +@command{.} instead. + +
    @command{test} +
    + +The test program is the way to perform many file and string +tests. It is often invoked by the alternate name `[', but using +that name in Autoconf code is asking for trouble since it is an M4 quote +character. + +If you need to make multiple checks using test, combine them with +the shell operators `&&' and `||' instead of using the +test operators @option{-a} and @option{-o}. On System V, the +precedence of @option{-a} and @option{-o} is wrong relative to the unary +operators; consequently, POSIX does not specify them, so using them +is nonportable. If you combine `&&' and `||' in the same +statement, keep in mind that they have equal precedence. + +You may use `!' with @command{test}, but not with @command{if}: +`test ! -r foo || exit 1'. + +
    @command{test (files)} +
    +To enable @command{configure} scripts to support cross-compilation, they +shouldn't do anything that tests features of the build system instead of +the host system. But occasionally you may find it necessary to check +whether some arbitrary file exists. To do so, use `test -f' or +`test -r'. Do not use `test -x', because 4.3BSD does not +have it. Do not use `test -e' either, because Solaris 2.5 does not +have it. + +
    @command{test (strings)} +
    +Avoid `test "string"', in particular if string might +start with a dash, since test might interpret its argument as an +option (e.g., `string = "-n"'). + +Contrary to a common belief, `test -n string' and `test +-z string' are portable, nevertheless many shells (such +as Solaris 2.5, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4 etc.) have +bizarre precedence and may be confused if string looks like an +operator: + + +
    +$ test -n =
    +test: argument expected
    +
    + +If there are risks, use `test "xstring" = x' or `test +"xstring" != x' instead. + +It is frequent to find variations of the following idiom: + + +
    +test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
    +  action
    +
    + +to take an action when a token matches a given pattern. Such constructs +should always be avoided by using: + + +
    +echo "$ac_feature" | grep '[^-a-zA-Z0-9_]' >/dev/null 2>&1 &&
    +  action
    +
    + +Use case where possible since it is faster, being a shell builtin: + + +
    +case $ac_feature in
    +  *[!-a-zA-Z0-9_]*) action;;
    +esac
    +
    + +Alas, negated character classes are probably not portable, although no +shell is known to not support the POSIX.2 syntax `[!...]' +(when in interactive mode, @command{zsh} is confused by the +`[!...]' syntax and looks for an event in its history because of +`!'). Many shells do not support the alternative syntax +`[^...]' (Solaris, Digital Unix, etc.). + +One solution can be: + + +
    +expr "$ac_feature" : '.*[^-a-zA-Z0-9_]' >/dev/null &&
    +  action
    +
    + +or better yet + + +
    +expr "x$ac_feature" : '.*[^-a-zA-Z0-9_]' >/dev/null &&
    +  action
    +
    + +`expr "Xfoo" : "Xbar"' is more robust than `echo +"Xfoo" | grep "^Xbar"', because it avoids problems when +`foo' contains backslashes. + +
    @command{trap} +
    + +It is safe to trap at least the signals 1, 2, 13 and 15. You can also +trap 0, i.e., have the @command{trap} run when the script ends (either via an +explicit @command{exit}, or the end of the script). + +Although POSIX is not absolutely clear on this point, it is widely +admitted that when entering the trap `$?' should be set to the exit +status of the last command run before the trap. The ambiguity can be +summarized as: "when the trap is launched by an @command{exit}, what is +the last command run: that before @command{exit}, or +@command{exit} itself?" + +Bash considers @command{exit} to be the last command, while Zsh and +Solaris 8 @command{sh} consider that when the trap is run it is +still in the @command{exit}, hence it is the previous exit status +that the trap receives: + + +
    +$ cat trap.sh
    +trap 'echo $?' 0
    +(exit 42); exit 0
    +$ zsh trap.sh
    +42
    +$ bash trap.sh
    +0
    +
    + +The portable solution is then simple: when you want to `exit 42', +run `(exit 42); exit 42', the first @command{exit} being used to +set the exit status to 42 for Zsh, and the second to trigger the trap +and pass 42 as exit status for Bash. + +The shell in FreeBSD 4.0 has the following bug: `$?' is reset to 0 +by empty lines if the code is inside @command{trap}. + + +
    +$ trap 'false
    +
    +echo $?' 0
    +$ exit
    +0
    +
    + +Fortunately, this bug only affects @command{trap}. + +
    @command{true} +
    + + +Don't worry: as far as we know @command{true} is portable. +Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the +portable shell community tends to prefer using @command{:}. This has a +funny side effect: when asked whether @command{false} is more portable +than @command{true} Alexandre Oliva answered: + + +
    +

    +In a sense, yes, because if it doesn't exist, the shell will produce an +exit status of failure, which is correct for @command{false}, but not +for @command{true}. +

    + +
    @command{unset} +
    + +You cannot assume the support of @command{unset}, nevertheless, because +it is extremely useful to disable embarrassing variables such as +CDPATH, you can test for its existence and use +it provided you give a neutralizing value when @command{unset} is +not supported: + + +
    +if (unset FOO) >/dev/null 2>&1; then
    +  unset=unset
    +else
    +  unset=false
    +fi
    +$unset CDPATH || CDPATH=:
    +
    + +See section Special Shell Variables, for some neutralizing values. Also, see +section Limitations of Shell Builtins, documentation of @command{export}, for +the case of environment variables. +
    + + + +

    Limitations of Usual Tools

    + +

    +The small set of tools you can expect to find on any machine can still +include some limitations you should be aware of. + + +

    + +
    @command{awk} +
    + +Don't leave white spaces before the parentheses in user functions calls, +GNU awk will reject it: + + +
    +$ gawk 'function die () { print "Aaaaarg!"  }
    +        BEGIN { die () }'
    +gawk: cmd. line:2:         BEGIN { die () }
    +gawk: cmd. line:2:                      ^ parse error
    +$ gawk 'function die () { print "Aaaaarg!"  }
    +        BEGIN { die() }'
    +Aaaaarg!
    +
    + +If you want your program to be deterministic, don't depend on for +on arrays: + + +
    +$ cat for.awk
    +END {
    +  arr["foo"] = 1
    +  arr["bar"] = 1
    +  for (i in arr)
    +    print i
    +}
    +$ gawk -f for.awk </dev/null
    +foo
    +bar
    +$ nawk -f for.awk </dev/null
    +bar
    +foo
    +
    + +Some AWK, such as HPUX 11.0's native one, have regex engines fragile to +inner anchors: + + +
    +$ echo xfoo | $AWK '/foo|^bar/ { print }'
    +$ echo bar | $AWK '/foo|^bar/ { print }'
    +bar
    +$ echo xfoo | $AWK '/^bar|foo/ { print }'
    +xfoo
    +$ echo bar | $AWK '/^bar|foo/ { print }'
    +bar
    +
    + +Either do not depend on such patterns (i.e., use `/^(.*foo|bar)/', +or use a simple test to reject such AWK. + +
    @command{cat} +
    + +Don't rely on any option. The option @option{-v}, which displays +non-printing characters, seems portable, though. + +
    @command{cc} +
    +When a compilation such as `cc foo.c -o foo' fails, some compilers +(such as CDS on Reliant UNIX) leave a `foo.o'. + +HP-UX @command{cc} doesn't accept `.S' files to preprocess and +assemble. `cc -c foo.S' will appear to succeed, but in fact does +nothing. + +
    @command{cmp} +
    + +@command{cmp} performs a raw data comparison of two files, while +@command{diff} compares two text files. Therefore, if you might compare +DOS files, even if only checking whether two files are different, use +@command{diff} to avoid spurious differences due to differences of +newline encoding. + +
    @command{cp} +
    + +SunOS @command{cp} does not support @option{-f}, although its +@command{mv} does. It's possible to deduce why @command{mv} and +@command{cp} are different with respect to @option{-f}. @command{mv} +prompts by default before overwriting a read-only file. @command{cp} +does not. Therefore, @command{mv} requires a @option{-f} option, but +@command{cp} does not. @command{mv} and @command{cp} behave differently +with respect to read-only files because the simplest form of +@command{cp} cannot overwrite a read-only file, but the simplest form of +@command{mv} can. This is because @command{cp} opens the target for +write access, whereas @command{mv} simply calls link (or, in +newer systems, rename). + +
    @command{date} +
    + +Some versions of @command{date} do not recognize special % directives, +and unfortunately, instead of complaining, they just pass them through, +and exit with success: + + +
    +$ uname -a
    +OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
    +$ date "+%s"
    +%s
    +
    + +
    @command{diff} +
    + +Option @option{-u} is nonportable. + +Some implementations, such as Tru64's, fail when comparing to +`/dev/null'. Use an empty file instead. + +
    @command{dirname} +
    + +Not all hosts have a working @command{dirname}, and you should instead +use AS_DIRNAME (see section Programming in M4sh). For example: + + +
    +dir=`dirname "$file"`       # This is not portable.
    +dir=`AS_DIRNAME(["$file"])` # This is more portable.
    +
    + +This handles a few subtleties in the standard way required by +POSIX. For example, under UN*X, should `dirname //1' give +`/'? Paul Eggert answers: + + +
    +

    +No, under some older flavors of Unix, leading `//' is a special +path name: it refers to a "super-root" and is used to access other +machines' files. Leading `///', `////', etc. are equivalent +to `/'; but leading `//' is special. I think this tradition +started with Apollo Domain/OS, an OS that is still in use on some older +hosts. + + +

    +POSIX allows but does not require the special treatment for `//'. +It says that the behavior of dirname on path names of the form +`//([^/]+/*)?' is implementation defined. In these cases, GNU +@command{dirname} returns `/', but it's more portable to return +`//' as this works even on those older flavors of Unix. +

    + +
    @command{egrep} +
    + +The empty alternative is not portable, use `?' instead. For +instance with Digital Unix v5.0: + + +
    +> printf "foo\n|foo\n" | egrep '^(|foo|bar)$'
    +|foo
    +> printf "bar\nbar|\n" | egrep '^(foo|bar|)$'
    +bar|
    +> printf "foo\nfoo|\n|bar\nbar\n" | egrep '^(foo||bar)$'
    +foo
    +|bar
    +
    + +@command{egrep} also suffers the limitations of @command{grep}. + +
    @command{expr} +
    + +No @command{expr} keyword starts with `x', so use @samp{expr +x"word" : 'xregex'} to keep @command{expr} from +misinterpreting word. + +Don't use length, substr, match and index. + +
    @command{expr (`|')} +
    + +You can use `|'. Although POSIX does require that `expr +"' return the empty string, it does not specify the result when you +`|' together the empty string (or zero) with the empty string. For +example: + + +
    +expr '' \| ''
    +
    + +GNU/Linux and POSIX.2-1992 return the empty string for this +case, but traditional Unix returns `0' (Solaris is one such +example). In the latest POSIX draft, the specification has been +changed to match traditional Unix's behavior (which is bizarre, but it's +too late to fix this). Please note that the same problem does arise +when the empty string results from a computation, as in: + + +
    +expr bar : foo \| foo : bar
    +
    + +Avoid this portability problem by avoiding the empty string. + +
    @command{expr (`:')} +
    + +Don't use `\?', `\+' and `\|' in patterns, they are +not supported on Solaris. + +The POSIX.2-1992 standard is ambiguous as to whether `expr a : +b' (and `expr 'a' : '\(b\)'') output `0' or the empty string. +In practice, it outputs the empty string on most platforms, but portable +scripts should not assume this. For instance, the QNX 4.25 native +@command{expr} returns `0'. + +You may believe that one means to get a uniform behavior would be to use +the empty string as a default value: + + +
    +expr a : b \| ''
    +
    + +unfortunately this behaves exactly as the original expression, see the +`@command{expr' (`:')} entry for more information. + +Older @command{expr} implementations (e.g. SunOS 4 @command{expr} and +Solaris 8 @command{/usr/ucb/expr}) have a silly length limit that causes +@command{expr} to fail if the matched substring is longer than 120 +bytes. In this case, you might want to fall back on `echo|sed' if +@command{expr} fails. + +Don't leave, there is some more! + +The QNX 4.25 @command{expr}, in addition of preferring `0' to +the empty string, has a funny behavior in its exit status: it's always 1 +when parentheses are used! + + +
    +$ val=`expr 'a' : 'a'`; echo "$?: $val"
    +0: 1
    +$ val=`expr 'a' : 'b'`; echo "$?: $val"
    +1: 0
    +
    +$ val=`expr 'a' : '\(a\)'`; echo "?: $val"
    +1: a
    +$ val=`expr 'a' : '\(b\)'`; echo "?: $val"
    +1: 0
    +
    + +In practice this can be a big problem if you are ready to catch failures +of @command{expr} programs with some other method (such as using +@command{sed}), since you may get twice the result. For instance + + +
    +$ expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'
    +
    + +will output `a' on most hosts, but `aa' on QNX 4.25. A +simple work around consists in testing @command{expr} and use a variable +set to @command{expr} or to @command{false} according to the result. + +
    @command{find} +
    +The option @option{-maxdepth} seems to be GNU specific. Tru64 v5.1, +NetBSD 1.5 and Solaris 2.5 @command{find} commands do not understand it. + +The replacement of `{}' is guaranteed only if the argument is +exactly {}, not if it's only a part of an argument. For +instance on DU, and HP-UX 10.20 and HP-UX 11: + + +
    +$ touch foo
    +$ find . -name foo -exec echo "{}-{}" \;
    +{}-{}
    +
    + +while GNU @command{find} reports `./foo-./foo'. + +
    @command{grep} +
    + +Don't use `grep -s' to suppress output, because `grep -s' on +System V does not suppress output, only error messages. Instead, +redirect the standard output and standard error (in case the file +doesn't exist) of grep to `/dev/null'. Check the exit +status of grep to determine whether it found a match. + +Don't use multiple regexps with @option{-e}, as some grep will only +honor the last pattern (eg., IRIX 6.5 and Solaris 2.5.1). Anyway, +Stardent Vistra SVR4 grep lacks @option{-e}... Instead, use +alternation and egrep. + +
    @command{ln} +
    + + +Don't rely on @command{ln} having a @option{-f} option. Symbolic links +are not available on old systems, use `ln' as a fall back. + +For versions of the DJGPP before 2.04, @command{ln} emulates soft links +for executables by generating a stub that in turn calls the real +program. This feature also works with nonexistent files like in the +Unix spec. So `ln -s file link' will generate `link.exe', +which will attempt to call `file.exe' if run. But this feature only +works for executables, so `cp -p' is used instead for these +systems. DJGPP versions 2.04 and later have full symlink support. + +
    @command{mv} +
    + + +The only portable options are @option{-f} and @option{-i}. + +Moving individual files between file systems is portable (it was in V6), +but it is not always atomic: when doing `mv new existing', there's +a critical section where neither the old nor the new version of +`existing' actually exists. + +Moving directories across mount points is not portable, use @command{cp} +and @command{rm}. + +Moving/Deleting open files isn't portable. The following can't be done +on DOS/WIN32: + + +
    +exec > foo
    +mv foo bar
    +
    + +nor can + + +
    +exec > foo
    +rm -f foo
    +
    + +
    @command{sed} +
    + +Patterns should not include the separator (unless escaped), even as part +of a character class. In conformance with POSIX, the Cray +@command{sed} will reject `s/[^/]*$//': use `s,[^/]*$,,'. + +Sed scripts should not use branch labels longer than 8 characters and +should not contain comments. + +Don't include extra `;', as some @command{sed}, such as NetBSD +1.4.2's, try to interpret the second as a command: + + +
    +$ echo a | sed 's/x/x/;;s/x/x/'
    +sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
    +
    + +Input should have reasonably long lines, since some @command{sed} have +an input buffer limited to 4000 bytes. + +Alternation, `\|', is common but POSIX.2 does not require its +support, so it should be avoided in portable scripts. Solaris 8 +@command{sed} does not support alternation; e.g. `sed '/a\|b/d'' +deletes only lines that contain the literal string `a|b'. + +Anchors (`^' and `$') inside groups are not portable. + +Nested parenthesization in patterns (e.g., `\(\(a*\)b*)\)') is +quite portable to modern hosts, but is not supported by some older +@command{sed} implementations like SVR3. + +Of course the option @option{-e} is portable, but it is not needed. No +valid Sed program can start with a dash, so it does not help +disambiguating. Its sole usefulness is helping enforcing indenting as +in: + + +
    +sed -e instruction-1 \
    +    -e instruction-2
    +
    + +as opposed to + + +
    +sed instruction-1;instruction-2
    +
    + +Contrary to yet another urban legend, you may portably use `&' in +the replacement part of the s command to mean "what was +matched". All descendents of Bell Lab's V7 @command{sed} (at least; we +don't have first hand experience with older @command{sed}s) have +supported it. + +
    @command{sed (`t')} +
    + +Some old systems have @command{sed} that "forget" to reset their +`t' flag when starting a new cycle. For instance on MIPS +RISC/OS, and on IRIX 5.3, if you run the following @command{sed} +script (the line numbers are not actual part of the texts): + + +
    +s/keep me/kept/g  # a
    +t end             # b
    +s/.*/deleted/g    # c
    +: end             # d
    +
    + +on + + +
    +delete me         # 1
    +delete me         # 2
    +keep me           # 3
    +delete me         # 4
    +
    + +you get + + +
    +deleted
    +delete me
    +kept
    +deleted
    +
    + +instead of + + +
    +deleted
    +deleted
    +kept
    +deleted
    +
    + +Why? When processing 1, a matches, therefore sets the t flag, b jumps to +d, and the output is produced. When processing line 2, the t flag is +still set (this is the bug). Line a fails to match, but @command{sed} +is not supposed to clear the t flag when a substitution fails. Line b +sees that the flag is set, therefore it clears it, and jumps to d, hence +you get `delete me' instead of `deleted'. When processing 3 t +is clear, a matches, so the flag is set, hence b clears the flags and +jumps. Finally, since the flag is clear, 4 is processed properly. + +There are two things one should remind about `t' in @command{sed}. +Firstly, always remember that `t' jumps if some substitution +succeeded, not only the immediately preceding substitution, therefore, +always use a fake `t clear; : clear' to reset the t flag where +indeed. + +Secondly, you cannot rely on @command{sed} to clear the flag at each new +cycle. + +One portable implementation of the script above is: + + +
    +t clear
    +: clear
    +s/keep me/kept/g
    +t end
    +s/.*/deleted/g
    +: end
    +
    + +
    @command{touch} +
    + +On some old BSD systems, @command{touch} or any command that +results in an empty file does not update the timestamps, so use a +command like echo as a workaround. + +GNU @command{touch} 3.16r (and presumably all before that) fails to work +on SunOS 4.1.3 when the empty file is on an NFS-mounted 4.2 volume. + +
    + + + +

    Limitations of Make

    + +

    +Make itself suffers a great number of limitations, only a few of which +being listed here. First of all, remember that since commands are +executed by the shell, all its weaknesses are inherited... + + +

    + +
    $< +
    +POSIX says that the `$<' construct in makefiles can be used +only in inference rules and in the `.DEFAULT' rule; its meaning in +ordinary rules is unspecified. Solaris 8's @command{make} for instance +will replace it with the argument. + +
    Leading underscore in macro names +
    +Some Make don't support leading underscores in macro names, such as on +NEWS-OS 4.2R. + + +
    +$ cat Makefile
    +_am_include = #
    +_am_quote =
    +all:; @echo this is test
    +$ make
    +Make: Must be a separator on rules line 2.  Stop.
    +$ cat Makefile2
    +am_include = #
    +am_quote =
    +all:; @echo this is test
    +$ make -f Makefile2
    +this is test
    +
    + +
    VPATH +
    + +Don't use it! For instance any assignment to VPATH causes Sun +@command{make} to only execute the first set of double-colon rules. +
    + + + +

    Manual Configuration

    + +

    +A few kinds of features can't be guessed automatically by running test +programs. For example, the details of the object-file format, or +special options that need to be passed to the compiler or linker. You +can check for such features using ad-hoc means, such as having +@command{configure} check the output of the uname program, or +looking for libraries that are unique to particular systems. However, +Autoconf provides a uniform method for handling unguessable features. + + + + +

    Specifying the System Type

    + +

    +Like other GNU @command{configure} scripts, Autoconf-generated +@command{configure} scripts can make decisions based on a canonical name +for the system type, which has the form: +`cpu-vendor-os', where os can be +`system' or `kernel-system' + + +

    +@command{configure} can usually guess the canonical name for the type of +system it's running on. To do so it runs a script called +@command{config.guess}, which infers the name using the uname +command or symbols predefined by the C preprocessor. + + +

    +Alternately, the user can specify the system type with command line +arguments to @command{configure}. Doing so is necessary when +cross-compiling. In the most complex case of cross-compiling, three +system types are involved. The options to specify them are: + + +

    + +
    @option{--build=build-type} +
    +the type of system on which the package is being configured and +compiled. It defaults to the result of running @command{config.guess}. + +
    @option{--host=host-type} +
    + +the type of system on which the package will run. By default it is the +same as the build machine. Specifying it enables the cross-compilation +mode. + +
    @option{--target=target-type} +
    +the type of system for which any compiler tools in the package will +produce code (rarely needed). By default, it is the same as host. +
    + +

    +If you mean to override the result of @command{config.guess}, use +@option{--build}, not @option{--host}, since the latter enables +cross-compilation. For historical reasons, passing @option{--host} also +changes the build type. Therefore, whenever you specify --host, +be sure to specify --build too. This will be fixed in the +future. + + + +

    +./configure --build=i686-pc-linux-gnu --host=m68k-coff
    +
    + +

    +will enter cross-compilation mode, but @command{configure} will fail if it +can't run the code generated by the specified compiler if you configure +as follows: + + + +

    +./configure CC=m68k-coff-gcc
    +
    + +

    + +@command{configure} recognizes short aliases for many system types; for +example, `decstation' can be used instead of +`mips-dec-ultrix4.2'. @command{configure} runs a script called +@command{config.sub} to canonicalize system type aliases. + + +

    +This section deliberately omits the description of the obsolete +interface, see section Hosts and Cross-Compilation. + + + + +

    Getting the Canonical System Type

    + +

    +The following macros make the system type available to @command{configure} +scripts. + + +

    + + + + + +

    +The variables `build_alias', `host_alias', and +`target_alias' are always exactly the arguments of @option{--build}, +@option{--host}, and @option{--target}; in particular, they are left empty +if the user did not use them, even if the corresponding +AC_CANONICAL macro was run. Any configure script may use these +variables anywhere. These are the variables that should be used when in +interaction with the user. + + +

    +If you need to recognize some special environments based on their system +type, run the following macros to get canonical system names. These +variables are not set before the macro call. + + +

    +If you use these macros, you must distribute @command{config.guess} and +@command{config.sub} along with your source code. See section Outputting Files, for +information about the AC_CONFIG_AUX_DIR macro which you can use +to control in which directory @command{configure} looks for those scripts. + + +

    +

    +
    Macro: AC_CANONICAL_BUILD +
    + + + + + +Compute the canonical build-system type variable, build, and its +three individual parts build_cpu, build_vendor, and +build_os. + + +

    +If @option{--build} was specified, then build is the +canonicalization of build_alias by @command{config.sub}, +otherwise it is determined by the shell script @command{config.guess}. +

    + + +

    +

    +
    Macro: AC_CANONICAL_HOST +
    + + + + + +Compute the canonical host-system type variable, host, and its +three individual parts host_cpu, host_vendor, and +host_os. + + +

    +If @option{--host} was specified, then host is the +canonicalization of host_alias by @command{config.sub}, +otherwise it defaults to build. +

    + + +

    +

    +
    Macro: AC_CANONICAL_TARGET +
    + + + + + +Compute the canonical target-system type variable, target, and its +three individual parts target_cpu, target_vendor, and +target_os. + + +

    +If @option{--target} was specified, then target is the +canonicalization of target_alias by @command{config.sub}, +otherwise it defaults to host. +

    + + +

    +Note that there can be artifacts due to the backward compatibility +code. See section Hosts and Cross-Compilation, for more. + + + + +

    Using the System Type

    + +

    +How do you use a canonical system type? Usually, you use it in one or +more case statements in `configure.ac' to select +system-specific C files. Then, using AC_CONFIG_LINKS, link those +files which have names based on the system name, to generic names, such +as `host.h' or `target.c' (see section Creating Configuration Links). The +case statement patterns can use shell wild cards to group several +cases together, like in this fragment: + + + +

    +case $target in
    +i386-*-mach* | i386-*-gnu*)
    +             obj_format=aout emulation=mach bfd_gas=yes ;;
    +i960-*-bout) obj_format=bout ;;
    +esac
    +
    + +

    +and later in `configure.ac', use: + + + +

    +AC_CONFIG_LINKS(host.h:config/$machine.h
    +                object.h:config/$obj_format.h)
    +
    + +

    +Note that the above example uses $target because it's taken from +a tool which can be built on some architecture ($build), run on +another ($host), but yet handle data for a third architecture +($target). Such tools are usually part of a compiler suite, they +generate code for a specific $target. + + +

    +However $target should be meaningless for most packages. If you +want to base a decision on the system where your program will be run, +make sure you use the $host variable, as in the following +excerpt: + + + +

    +case $host in
    +  *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
    +    MUMBLE_INIT="mumble.ini"
    +    ;;
    +  *)
    +    MUMBLE_INIT=".mumbleinit"
    +    ;;
    +esac
    +AC_SUBST([MUMBLE_INIT])
    +
    + +

    +You can also use the host system type to find cross-compilation tools. +See section Generic Program and File Checks, for information about the AC_CHECK_TOOL +macro which does that. + + + + +

    Site Configuration

    + +

    +@command{configure} scripts support several kinds of local configuration +decisions. There are ways for users to specify where external software +packages are, include or exclude optional features, install programs +under modified names, and set default values for @command{configure} +options. + + + + +

    Working With External Software

    + +

    +Some packages require, or can optionally use, other software packages +that are already installed. The user can give @command{configure} +command line options to specify which such external software to use. +The options have one of these forms: + + + +

    +--with-package[=arg]
    +--without-package
    +
    + +

    +For example, @option{--with-gnu-ld} means work with the GNU linker +instead of some other linker. @option{--with-x} means work with The X +Window System. + + +

    +The user can give an argument by following the package name with +`=' and the argument. Giving an argument of `no' is for +packages that are used by default; it says to not use the +package. An argument that is neither `yes' nor `no' could +include a name or number of a version of the other package, to specify +more precisely which other package this program is supposed to work +with. If no argument is given, it defaults to `yes'. +@option{--without-package} is equivalent to +@option{--with-package=no}. + + +

    +@command{configure} scripts do not complain about +@option{--with-package} options that they do not support. This +behavior permits configuring a source tree containing multiple packages +with a top-level @command{configure} script when the packages support +different options, without spurious error messages about options that +some of the packages support. An unfortunate side effect is that option +spelling errors are not diagnosed. No better approach to this problem +has been suggested so far. + + +

    +For each external software package that may be used, `configure.ac' +should call AC_ARG_WITH to detect whether the @command{configure} +user asked to use it. Whether each package is used or not by default, +and which arguments are valid, is up to you. + + +

    +

    +
    Macro: AC_ARG_WITH (package, help-string, @ovar{action-if-given}, @ovar{action-if-not-given}) +
    + +If the user gave @command{configure} the option @option{--with-package} +or @option{--without-package}, run shell commands +action-if-given. If neither option was given, run shell commands +action-if-not-given. The name package indicates another +software package that this program should work with. It should consist +only of alphanumeric characters and dashes. + + +

    +The option's argument is available to the shell commands +action-if-given in the shell variable withval, which is +actually just the value of the shell variable with_package, +with any @option{-} characters changed into `_'. You may use that +variable instead, if you wish. + + +

    +The argument help-string is a description of the option that +looks like this: + +

    +  --with-readline         support fancy command line editing
    +
    + +

    +help-string may be more than one line long, if more detail is +needed. Just make sure the columns line up in `configure --help'. +Avoid tabs in the help string. You'll need to enclose it in `[' +and `]' in order to produce the leading spaces. + + +

    +You should format your help-string with the macro +AC_HELP_STRING (see section Making Your Help Strings Look Pretty). +

    + + +

    +

    +
    Macro: AC_WITH (package, action-if-given, @ovar{action-if-not-given}) +
    + +This is an obsolete version of AC_ARG_WITH that does not +support providing a help string. +
    + + + + +

    Choosing Package Options

    + +

    +If a software package has optional compile-time features, the user can +give @command{configure} command line options to specify whether to +compile them. The options have one of these forms: + + + +

    +--enable-feature[=arg]
    +--disable-feature
    +
    + +

    +These options allow users to choose which optional features to build and +install. @option{--enable-feature} options should never make a +feature behave differently or cause one feature to replace another. +They should only cause parts of the program to be built rather than left +out. + + +

    +The user can give an argument by following the feature name with +`=' and the argument. Giving an argument of `no' requests +that the feature not be made available. A feature with an +argument looks like @option{--enable-debug=stabs}. If no argument is +given, it defaults to `yes'. @option{--disable-feature} is +equivalent to @option{--enable-feature=no}. + + +

    +@command{configure} scripts do not complain about +@option{--enable-feature} options that they do not support. +This behavior permits configuring a source tree containing multiple +packages with a top-level @command{configure} script when the packages +support different options, without spurious error messages about options +that some of the packages support. +An unfortunate side effect is that option spelling errors are not diagnosed. +No better approach to this problem has been suggested so far. + + +

    +For each optional feature, `configure.ac' should call +AC_ARG_ENABLE to detect whether the @command{configure} user asked +to include it. Whether each feature is included or not by default, and +which arguments are valid, is up to you. + + +

    +

    +
    Macro: AC_ARG_ENABLE (feature, help-string, @ovar{action-if-given}, @ovar{action-if-not-given}) +
    + +If the user gave @command{configure} the option +@option{--enable-feature} or @option{--disable-feature}, run +shell commands action-if-given. If neither option was given, run +shell commands action-if-not-given. The name feature +indicates an optional user-level facility. It should consist only of +alphanumeric characters and dashes. + + +

    +The option's argument is available to the shell commands +action-if-given in the shell variable enableval, which is +actually just the value of the shell variable +enable_feature, with any @option{-} characters changed into +`_'. You may use that variable instead, if you wish. The +help-string argument is like that of AC_ARG_WITH +(see section Working With External Software). + + +

    +You should format your help-string with the macro +AC_HELP_STRING (see section Making Your Help Strings Look Pretty). +

    + + +

    +

    +
    Macro: AC_ENABLE (feature, action-if-given, @ovar{action-if-not-given}) +
    + +This is an obsolete version of AC_ARG_ENABLE that does not +support providing a help string. +
    + + + + +

    Making Your Help Strings Look Pretty

    + +

    +Properly formatting the `help strings' which are used in +AC_ARG_WITH (see section Working With External Software) and AC_ARG_ENABLE +(see section Choosing Package Options) can be challenging. Specifically, you want +your own `help strings' to line up in the appropriate columns of +`configure --help' just like the standard Autoconf `help +strings' do. This is the purpose of the AC_HELP_STRING macro. + + +

    +

    +
    Macro: AC_HELP_STRING (left-hand-side, right-hand-side) +
    + + + +

    +Expands into an help string that looks pretty when the user executes +`configure --help'. It is typically used in AC_ARG_WITH +(see section Working With External Software) or AC_ARG_ENABLE (see section Choosing Package Options). The following example will make this clearer. + + + +

    +AC_DEFUN(TEST_MACRO,
    +[AC_ARG_WITH(foo,
    +             AC_HELP_STRING([--with-foo],
    +                            [use foo (default is NO)]),
    +             ac_cv_use_foo=$withval, ac_cv_use_foo=no),
    +AC_CACHE_CHECK(whether to use foo,
    +               ac_cv_use_foo, ac_cv_use_foo=no)])
    +
    + +

    +Please note that the call to AC_HELP_STRING is unquoted. +Then the last few lines of `configure --help' will appear like +this: + + + +

    +--enable and --with options recognized:
    +  --with-foo              use foo (default is NO)
    +
    + +

    +The AC_HELP_STRING macro is particularly helpful when the +left-hand-side and/or right-hand-side are composed of macro +arguments, as shown in the following example. + + + +

    +AC_DEFUN(MY_ARG_WITH,
    +[AC_ARG_WITH([$1],
    +             AC_HELP_STRING([--with-$1], [use $1 (default is $2)]),
    +             ac_cv_use_$1=$withval, ac_cv_use_$1=no),
    +AC_CACHE_CHECK(whether to use $1, ac_cv_use_$1, ac_cv_use_$1=$2)])
    +
    + +
    + + + +

    Configuring Site Details

    + +

    +Some software packages require complex site-specific information. Some +examples are host names to use for certain services, company names, and +email addresses to contact. Since some configuration scripts generated +by Metaconfig ask for such information interactively, people sometimes +wonder how to get that information in Autoconf-generated configuration +scripts, which aren't interactive. + + +

    +Such site configuration information should be put in a file that is +edited only by users, not by programs. The location of the file +can either be based on the prefix variable, or be a standard +location such as the user's home directory. It could even be specified +by an environment variable. The programs should examine that file at +run time, rather than at compile time. Run time configuration is more +convenient for users and makes the configuration process simpler than +getting the information while configuring. See section `Variables for Installation Directories' in GNU Coding Standards, for more information on where to put data files. + + + + +

    Transforming Program Names When Installing

    + +

    +Autoconf supports changing the names of programs when installing them. +In order to use these transformations, `configure.ac' must call the +macro AC_ARG_PROGRAM. + + +

    +

    +
    Macro: AC_ARG_PROGRAM +
    + + +Place in output variable program_transform_name a sequence of +sed commands for changing the names of installed programs. + + +

    +If any of the options described below are given to @command{configure}, +program names are transformed accordingly. Otherwise, if +AC_CANONICAL_TARGET has been called and a @option{--target} value +is given, the target type followed by a dash is used as a prefix. +Otherwise, no program name transformation is done. +

    + + + + +

    Transformation Options

    + +

    +You can specify name transformations by giving @command{configure} these +command line options: + + +

    + +
    @option{--program-prefix=prefix} +
    +prepend prefix to the names; + +
    @option{--program-suffix=suffix} +
    +append suffix to the names; + +
    @option{--program-transform-name=expression} +
    +perform sed substitution expression on the names. +
    + + + +

    Transformation Examples

    + +

    +These transformations are useful with programs that can be part of a +cross-compilation development environment. For example, a +cross-assembler running on a Sun 4 configured with +@option{--target=i960-vxworks} is normally installed as +`i960-vxworks-as', rather than `as', which could be confused +with a native Sun 4 assembler. + + +

    +You can force a program name to begin with `g', if you don't want +GNU programs installed on your system to shadow other programs with +the same name. For example, if you configure GNU diff with +@option{--program-prefix=g}, then when you run `make install' it is +installed as `/usr/local/bin/gdiff'. + + +

    +As a more sophisticated example, you could use + + + +

    +--program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
    +
    + +

    + + +

    +to prepend `g' to most of the program names in a source tree, +excepting those like gdb that already have one and those like +less and lesskey that aren't GNU programs. (That is +assuming that you have a source tree containing those programs that is +set up to use this feature.) + + +

    +One way to install multiple versions of some programs simultaneously is +to append a version number to the name of one or both. For example, if +you want to keep Autoconf version 1 around for awhile, you can configure +Autoconf version 2 using @option{--program-suffix=2} to install the +programs as `/usr/local/bin/autoconf2', +`/usr/local/bin/autoheader2', etc. Nevertheless, pay attention +that only the binaries are renamed, therefore you'd have problems with +the library files which might overlap. + + + + +

    Transformation Rules

    + +

    +Here is how to use the variable program_transform_name in a +`Makefile.in': + + + +

    +PROGRAMS = cp ls rm
    +transform = @program_transform_name@
    +install:
    +        for p in $(PROGRAMS); do \
    +          $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
    +                                              sed '$(transform)'`; \
    +        done
    +
    +uninstall:
    +        for p in $(PROGRAMS); do \
    +          rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
    +        done
    +
    + +

    +It is guaranteed that program_transform_name is never empty, and +that there are no useless separators. Therefore you may safely embed +program_transform_name within a sed program using `;': + + + +

    +transform = @program_transform_name@
    +transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
    +
    + +

    +Whether to do the transformations on documentation files (Texinfo or +man) is a tricky question; there seems to be no perfect answer, +due to the several reasons for name transforming. Documentation is not +usually particular to a specific architecture, and Texinfo files do not +conflict with system documentation. But they might conflict with +earlier versions of the same files, and man pages sometimes do +conflict with system documentation. As a compromise, it is probably +best to do name transformations on man pages but not on Texinfo +manuals. + + + + +

    Setting Site Defaults

    + +

    +Autoconf-generated @command{configure} scripts allow your site to provide +default values for some configuration values. You do this by creating +site- and system-wide initialization files. + + +

    + +If the environment variable @command{CONFIG_SITE} is set, @command{configure} +uses its value as the name of a shell script to read. Otherwise, it +reads the shell script `prefix/share/config.site' if it exists, +then `prefix/etc/config.site' if it exists. Thus, +settings in machine-specific files override those in machine-independent +ones in case of conflict. + + +

    +Site files can be arbitrary shell scripts, but only certain kinds of +code are really appropriate to be in them. Because @command{configure} +reads any cache file after it has read any site files, a site file can +define a default cache file to be shared between all Autoconf-generated +@command{configure} scripts run on that system (see section Cache Files). If +you set a default cache file in a site file, it is a good idea to also +set the output variable CC in that site file, because the cache +file is only valid for a particular compiler, but many systems have +several available. + + +

    +You can examine or override the value set by a command line option to +@command{configure} in a site file; options set shell variables that have +the same names as the options, with any dashes turned into underscores. +The exceptions are that @option{--without-} and @option{--disable-} options +are like giving the corresponding @option{--with-} or @option{--enable-} +option and the value `no'. Thus, @option{--cache-file=localcache} +sets the variable cache_file to the value `localcache'; +@option{--enable-warnings=no} or @option{--disable-warnings} sets the variable +enable_warnings to the value `no'; @option{--prefix=/usr} sets the +variable prefix to the value `/usr'; etc. + + +

    +Site files are also good places to set default values for other output +variables, such as CFLAGS, if you need to give them non-default +values: anything you would normally do, repetitively, on the command +line. If you use non-default values for prefix or +exec_prefix (wherever you locate the site file), you can set them +in the site file if you specify it with the @command{CONFIG_SITE} +environment variable. + + +

    +You can set some cache values in the site file itself. Doing this is +useful if you are cross-compiling, so it is impossible to check features +that require running a test program. You could "prime the cache" by +setting those values correctly for that system in +`prefix/etc/config.site'. To find out the names of the cache +variables you need to set, look for shell variables with `_cv_' in +their names in the affected @command{configure} scripts, or in the Autoconf +M4 source code for those macros. + + +

    +The cache file is careful to not override any variables set in the site +files. Similarly, you should not override command-line options in the +site files. Your code should check that variables such as prefix +and cache_file have their default values (as set near the top of +@command{configure}) before changing them. + + +

    +Here is a sample file `/usr/share/local/gnu/share/config.site'. The +command `configure --prefix=/usr/share/local/gnu' would read this +file (if @command{CONFIG_SITE} is not set to a different file). + + + +

    +# config.site for configure
    +#
    +# Change some defaults.
    +test "$prefix" = NONE && prefix=/usr/share/local/gnu
    +test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
    +test "$sharedstatedir" = '$prefix/com' && sharedstatedir=/var
    +test "$localstatedir" = '$prefix/var' && localstatedir=/var
    +
    +# Give Autoconf 2.x generated configure scripts a shared default
    +# cache file for feature test results, architecture-specific.
    +if test "$cache_file" = /dev/null; then
    +  cache_file="$prefix/var/config.cache"
    +  # A cache file is only valid for one C compiler.
    +  CC=gcc
    +fi
    +
    + + + +

    Running @command{configure} Scripts

    +

    + + + +

    +Below are instructions on how to configure a package that uses a +@command{configure} script, suitable for inclusion as an `INSTALL' +file in the package. A plain-text version of `INSTALL' which you +may use comes with Autoconf. + + + + +

    Basic Installation

    + +

    +These are generic installation instructions. + + +

    +The @command{configure} shell script attempts to guess correct values +for various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the +package. It may also create one or more `.h' files containing +system-dependent definitions. Finally, it creates a shell script +`config.status' that you can run in the future to recreate the +current configuration, and a file `config.log' containing compiler +output (useful mainly for debugging @command{configure}). + + +

    +It can also use an optional file (typically called `config.cache' +and enabled with @option{--cache-file=config.cache} or simply +@option{-C}) that saves the results of its tests to speed up +reconfiguring. (Caching is disabled by default to prevent problems with +accidental use of stale cache files.) + + +

    +If you need to do unusual things to compile the package, please try to +figure out how @command{configure} could check whether to do them, and +mail diffs or instructions to the address given in the `README' so +they can be considered for the next release. If you are using the +cache, and at some point `config.cache' contains results you don't +want to keep, you may remove or edit it. + + +

    +The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called autoconf. You only need +`configure.ac' if you want to change it or regenerate +`configure' using a newer version of autoconf. + + +

    +The simplest way to compile this package is: + + + +

      +
    1. + +cd to the directory containing the package's source code and type +`./configure' to configure the package for your system. If you're +using csh on an old version of System V, you might need to type +`sh ./configure' instead to prevent csh from trying to +execute @command{configure} itself. + +Running @command{configure} takes awhile. While running, it prints some +messages telling which features it is checking for. + +
    2. + +Type `make' to compile the package. + +
    3. + +Optionally, type `make check' to run any self-tests that come with +the package. + +
    4. + +Type `make install' to install the programs and any data files and +documentation. + +
    5. + +You can remove the program binaries and object files from the source +code directory by typing `make clean'. To also remove the files +that @command{configure} created (so you can compile the package for a +different kind of computer), type `make distclean'. There is also +a `make maintainer-clean' target, but that is intended mainly for +the package's developers. If you use it, you may have to get all sorts +of other programs in order to regenerate files that came with the +distribution. +
    + + + +

    Compilers and Options

    + +

    +Some systems require unusual options for compilation or linking that the +@command{configure} script does not know about. Run @samp{./configure +--help} for details on some of the pertinent environment variables. + + +

    +You can give @command{configure} initial values for variables by setting +them in the environment. You can do that on the command line like this: + + + +

    +./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
    +
    + +

    +See section Defining Variables, for more details. + + + + +

    Compiling For Multiple Architectures

    + +

    +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of @command{make} +that supports the VPATH variable, such as GNU @command{make}. +@command{cd} to the directory where you want the object files and +executables to go and run the @command{configure} script. +@command{configure} automatically checks for the source code in the +directory that @command{configure} is in and in `..'. + + +

    +If you have to use a @command{make} that does not support the +VPATH variable, you have to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' +before reconfiguring for another architecture. + + + + +

    Installation Names

    + +

    +By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving +@command{configure} the option @option{--prefix=path}. + + +

    +You can specify separate installation prefixes for architecture-specific +files and architecture-independent files. If you give +@command{configure} the option @option{--exec-prefix=path}, the +package will use path as the prefix for installing programs and +libraries. Documentation and other data files will still use the +regular prefix. + + +

    +In addition, if you use an unusual directory layout you can give options +like @option{--bindir=path} to specify different values for +particular kinds of files. Run `configure --help' for a list of +the directories you can set and what kinds of files go in them. + + +

    +If the package supports it, you can cause programs to be installed with +an extra prefix or suffix on their names by giving @command{configure} +the option @option{--program-prefix=PREFIX} or +@option{--program-suffix=SUFFIX}. + + + + +

    Optional Features

    + +

    +Some packages pay attention to @option{--enable-feature} options +to @command{configure}, where feature indicates an optional part +of the package. They may also pay attention to +@option{--with-package} options, where package is something +like `gnu-as' or `x' (for the X Window System). The +`README' should mention any @option{--enable-} and @option{--with-} +options that the package recognizes. + + +

    +For packages that use the X Window System, @command{configure} can +usually find the X include and library files automatically, but if it +doesn't, you can use the @command{configure} options +@option{--x-includes=dir} and @option{--x-libraries=dir} to +specify their locations. + + + + +

    Specifying the System Type

    + +

    +There may be some features @command{configure} cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +same architectures, @command{configure} can figure that out, but +if it prints a message saying it cannot guess the machine type, give it +the @option{--build=type} option. type can either be a +short name for the system type, such as `sun4', or a canonical name +which has the form: + + + +

    +cpu-company-system
    +
    + +

    +where system can have one of these forms: + + + +

    +os kernel-os
    +
    + +

    +See the file `config.sub' for the possible values of each field. +If `config.sub' isn't included in this package, then this package +doesn't need to know the machine type. + + +

    +If you are building compiler tools for cross-compiling, you +should use the @option{--target=type} option to select the type of +system they will produce code for. + + +

    +If you want to use a cross compiler, that generates code for a +platform different from the build platform, you should specify the +host platform (i.e., that on which the generated programs will +eventually be run) with @option{--host=type}. + + + + +

    Sharing Defaults

    + +

    +If you want to set default values for @command{configure} scripts to +share, you can create a site shell script called `config.site' that +gives default values for variables like CC, cache_file, +and prefix. @command{configure} looks for +`prefix/share/config.site' if it exists, then +`prefix/etc/config.site' if it exists. Or, you can set the +CONFIG_SITE environment variable to the location of the site +script. A warning: not all @command{configure} scripts look for a site +script. + + + + +

    Defining Variables

    + +

    +Variables not defined in a site shell script can be set in the +environment passed to @command{configure}. However, some packages may +run configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the @command{configure} command line, using `VAR=value'. +For example: + + + +

    +./configure CC=/usr/local2/bin/gcc
    +
    + +

    +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + + + + +

    @command{configure} Invocation

    + +

    +@command{configure} recognizes the following options to control how it +operates. + + +

    + +
    @option{--help} +
    +
    @option{-h} +
    +Print a summary of the options to @command{configure}, and exit. + +
    @option{--version} +
    +
    @option{-V} +
    +Print the version of Autoconf used to generate the @command{configure} +script, and exit. + +
    @option{--cache-file=file} +
    + +Enable the cache: use and save the results of the tests in file, +traditionally `config.cache'. file defaults to +`/dev/null' to disable caching. + +
    @option{--config-cache} +
    +
    @option{-C} +
    +Alias for @option{--cache-file=config.cache}. + +
    @option{--quiet} +
    +
    @option{--silent} +
    +
    @option{-q} +
    +Do not print messages saying which checks are being made. To suppress +all normal output, redirect it to `/dev/null' (any error messages +will still be shown). + +
    @option{--srcdir=dir} +
    +Look for the package's source code in directory dir. Usually +@command{configure} can determine that directory automatically. +
    + +

    +@command{configure} also accepts some other, not widely useful, options. +Run `configure --help' for more details. + + + + +

    Recreating a Configuration

    +

    + + + +

    +The @command{configure} script creates a file named `config.status', +which actually configures, instantiates, the template files. It +also records the configuration options that were specified when the +package was last configured in case reconfiguring is needed. + + +

    +Synopsis: + +

    +./config.status option... [file...]
    +
    + +

    +It configures the files, if none are specified, all the templates +are instantiated. The files must be specified without their +dependencies, as in + + + +

    +./config.status foobar
    +
    + +

    +not + + + +

    +./config.status foobar:foo.in:bar.in
    +
    + +

    +The supported options are: + + +

    + +
    @option{--help} +
    +
    @option{-h} +
    +Print a summary of the command line options, the list of the template +files and exit. + +
    @option{--version} +
    +
    @option{-V} +
    +Print the version number of Autoconf and exit. + +
    @option{--debug} +
    +
    @option{-d} +
    +Don't remove the temporary files. + +
    @option{--file=file[:template]} +
    +Require that file be instantiated as if +`AC_CONFIG_FILES(file:template)' was used. Both +file and template may be `-' in which case the standard +output and/or standard input, respectively, is used. If a +template filename is relative, it is first looked for in the build +tree, and then in the source tree. See section Taking Configuration Actions, for +more details. + +This option and the following ones provide one way for separately +distributed packages to share the values computed by @command{configure}. +Doing so can be useful if some of the packages need a superset of the +features that one of them, perhaps a common library, does. These +options allow a `config.status' file to create files other than the +ones that its `configure.ac' specifies, so it can be used for a +different package. + +
    @option{--header=file[:template]} +
    +Same as @option{--file} above, but with `AC_CONFIG_HEADERS'. + +
    @option{--recheck} +
    +Ask `config.status' to update itself and exit (no instantiation). +This option is useful if you change @command{configure}, so that the +results of some tests might be different from the previous run. The +@option{--recheck} option re-runs @command{configure} with the same arguments +you used before, plus the @option{--no-create} option, which prevents +@command{configure} from running `config.status' and creating +`Makefile' and other files, and the @option{--no-recursion} option, +which prevents @command{configure} from running other @command{configure} +scripts in subdirectories. (This is so other `Makefile' rules can +run `config.status' when it changes; see section Automatic Remaking, +for an example). +
    + +

    +`config.status' checks several optional environment variables that +can alter its behavior: + + +

    +

    +
    Variable: CONFIG_SHELL +
    + +The shell with which to run @command{configure} for the @option{--recheck} +option. It must be Bourne-compatible. The default is a shell that +supports @env{LINENO} if available, and `/bin/sh' otherwise. +
    + + +

    +

    +
    Variable: CONFIG_STATUS +
    + +The file name to use for the shell script that records the +configuration. The default is `./config.status'. This variable is +useful when one package uses parts of another and the @command{configure} +scripts shouldn't be merged because they are maintained separately. +
    + + +

    +You can use `./config.status' in your Makefiles. For example, in +the dependencies given above (see section Automatic Remaking), +`config.status' is run twice when `configure.ac' has changed. +If that bothers you, you can make each run only regenerate the files for +that rule: + +

    +config.h: stamp-h
    +stamp-h: config.h.in config.status
    +        ./config.status config.h
    +        echo > stamp-h
    +
    +Makefile: Makefile.in config.status
    +        ./config.status Makefile
    +
    + +

    +The calling convention of `config.status' has changed, see +section Obsolete `config.status' Invocation, for details. + + + + +

    Obsolete Constructs

    + +

    +Autoconf changes, and throughout the years some constructs are obsoleted. +Most of the changes involve the macros, but the tools themselves, or +even some concepts, are now considered obsolete. + + +

    +You may completely skip this chapter if you are new to Autoconf, its +intention is mainly to help maintainers updating their packages by +understanding how to move to more modern constructs. + + + + +

    Obsolete `config.status' Invocation

    + +

    +`config.status' now supports arguments to specify the files to +instantiate, see section Recreating a Configuration, for more details. +Before, environment variables had to be used. + + +

    +

    +
    Variable: CONFIG_COMMANDS +
    + +The tags of the commands to execute. The default is the arguments given +to AC_OUTPUT and AC_CONFIG_COMMANDS in +`configure.ac'. +
    + + +

    +

    +
    Variable: CONFIG_FILES +
    + +The files in which to perform `@variable@' substitutions. +The default is the arguments given to AC_OUTPUT and +AC_CONFIG_FILES in `configure.ac'. +
    + + +

    +

    +
    Variable: CONFIG_HEADERS +
    + +The files in which to substitute C #define statements. The +default is the arguments given to AC_CONFIG_HEADERS; if that +macro was not called, `config.status' ignores this variable. +
    + + +

    +

    +
    Variable: CONFIG_LINKS +
    + +The symbolic links to establish. The default is the arguments given to +AC_CONFIG_LINKS; if that macro was not called, +`config.status' ignores this variable. +
    + + +

    +In section Recreating a Configuration, using this old interface, the example +would be: + + + +

    +config.h: stamp-h
    +stamp-h: config.h.in config.status
    +        CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
    +          CONFIG_HEADERS=config.h ./config.status
    +        echo > stamp-h
    +
    +Makefile: Makefile.in config.status
    +        CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
    +          CONFIG_FILES=Makefile ./config.status
    +
    + +

    +(If `configure.ac' does not call AC_CONFIG_HEADERS, there is +no need to set @command{CONFIG_HEADERS} in the make rules, equally +for @command{CONFIG_COMMANDS} etc.) + + + + +

    `acconfig.h'

    + +

    + + + + + +

    +In order to produce `config.h.in', @command{autoheader} needs to +build or to find templates for each symbol. Modern releases of Autoconf +use AH_VERBATIM and AH_TEMPLATE (see section Autoheader Macros), but in older releases a file, `acconfig.h', contained the +list of needed templates. @command{autoheader} copies comments and +#define and #undef statements from `acconfig.h' in +the current directory, if present. This file used to be mandatory if +you AC_DEFINE any additional symbols. + + +

    +Modern releases of Autoconf also provide AH_TOP and +AH_BOTTOM if you need to prepend/append some information to +`config.h.in'. Ancient versions of Autoconf had a similar feature: +if `./acconfig.h' contains the string `@TOP@', +@command{autoheader} copies the lines before the line containing +`@TOP@' into the top of the file that it generates. Similarly, +if `./acconfig.h' contains the string `@BOTTOM@', +@command{autoheader} copies the lines after that line to the end of the +file it generates. Either or both of those strings may be omitted. An +even older alternate way to produce the same effect in jurasik versions +of Autoconf is to create the files `file.top' (typically +`config.h.top') and/or `file.bot' in the current +directory. If they exist, @command{autoheader} copies them to the +beginning and end, respectively, of its output. + + +

    +In former versions of Autoconf, the files used in preparing a software +package for distribution were: + +

    +configure.ac --.   .------> autoconf* -----> configure
    +               +---+
    +[aclocal.m4] --+   `---.
    +[acsite.m4] ---'       |
    +                       +--> [autoheader*] -> [config.h.in]
    +[acconfig.h] ----.     |
    +                 +-----'
    +[config.h.top] --+
    +[config.h.bot] --'
    +
    + +

    +Use only the AH_ macros, `configure.ac' should be +self-contained, and should not depend upon `acconfig.h' etc. + + + + +

    Using @command{autoupdate} to Modernize `configure.ac'

    +

    + + + +

    +The @command{autoupdate} program updates a `configure.ac' file that +calls Autoconf macros by their old names to use the current macro names. +In version 2 of Autoconf, most of the macros were renamed to use a more +uniform and descriptive naming scheme. See section Macro Names, for a +description of the new scheme. Although the old names still work +(see section Obsolete Macros, for a list of the old macros and the corresponding +new names), you can make your `configure.ac' files more readable +and make it easier to use the current Autoconf documentation if you +update them to use the new macro names. + + +

    + +If given no arguments, @command{autoupdate} updates `configure.ac', +backing up the original version with the suffix `~' (or the value +of the environment variable SIMPLE_BACKUP_SUFFIX, if that is +set). If you give @command{autoupdate} an argument, it reads that file +instead of `configure.ac' and writes the updated file to the +standard output. + + +

    +@command{autoupdate} accepts the following options: + + +

    + +
    @option{--help} +
    +
    @option{-h} +
    +Print a summary of the command line options and exit. + +
    @option{--version} +
    +
    @option{-V} +
    +Print the version number of Autoconf and exit. + +
    @option{--verbose} +
    +
    @option{-v} +
    +Report processing steps. + +
    @option{--debug} +
    +
    @option{-d} +
    +Don't remove the temporary files. + +
    @option{--force} +
    +
    @option{-f} +
    +Force the update even if the file has not changed. Disregard the cache. + +
    @option{--include=dir} +
    +
    @option{-I dir} +
    +Also look for input files in dir. Multiple invocations accumulate. +Directories are browsed from last to first. +
    + + + +

    Obsolete Macros

    + +

    +Several macros are obsoleted in Autoconf, for various reasons (typically +they failed to quote properly, couldn't be extended for more recent +issues etc.). They are still supported, but deprecated: their use +should be avoided. + + +

    +During the jump from Autoconf version 1 to version 2, most of the +macros were renamed to use a more uniform and descriptive naming scheme, +but their signature did not change. See section Macro Names, for a +description of the new naming scheme. Below, there is just the mapping +from old names to new names for these macros, the reader is invited to +refer to the definition of the new macro for the signature and the +description. + + +

    +

    +
    Macro: AC_ALLOCA +
    + +AC_FUNC_ALLOCA +
    + + +

    +

    +
    Macro: AC_ARG_ARRAY +
    + +removed because of limited usefulness +
    + + +

    +

    +
    Macro: AC_C_CROSS +
    + +This macro is obsolete; it does nothing. +
    + + +

    +

    +
    Macro: AC_CANONICAL_SYSTEM +
    + +Determine the system type and set output variables to the names of the +canonical system types. See section Getting the Canonical System Type, for details about the +variables this macro sets. + + +

    +The user is encouraged to use either AC_CANONICAL_BUILD, or +AC_CANONICAL_HOST, or AC_CANONICAL_TARGET, depending on +the needs. Using AC_CANONICAL_TARGET is enough to run the two +other macros. +

    + + +

    +

    +
    Macro: AC_CHAR_UNSIGNED +
    + +AC_C_CHAR_UNSIGNED +
    + + +

    +

    +
    Macro: AC_CHECK_TYPE (type, default) +
    + +Autoconf, up to 2.13, used to provide this version of +AC_CHECK_TYPE, deprecated because of its flaws. Firstly, although +it is a member of the CHECK clan, singular sub-family, it does +more than just checking. Second, missing types are not +typedef'd, they are #define'd, which can lead to +incompatible code in the case of pointer types. + + +

    +This use of AC_CHECK_TYPE is obsolete and discouraged, see +section Generic Type Checks, for the description of the current macro. + + +

    +If the type type is not defined, define it to be the C (or C++) +builtin type default; e.g., `short' or `unsigned'. + + +

    +This macro is equivalent to: + + + +

    +AC_CHECK_TYPE([type],
    +              [AC_DEFINE([type], [default],
    +                         [Define to `default' if <sys/types.h>
    +                          does not define.])])
    +
    + +

    +In order to keep backward compatibility, the two versions of +AC_CHECK_TYPE are implemented, selected by a simple heuristics: + + + +

      +
    1. + +If there are three or four arguments, the modern version is used. + +
    2. + +If the second argument appears to be a C or C++ type, then the +obsolete version is used. This happens if the argument is a C or C++ +builtin type or a C identifier ending in `_t', optionally +followed by one of `[(* ' and then by a string of zero or more +characters taken from the set `[]()* _a-zA-Z0-9'. + +
    3. + +If the second argument is spelled with the alphabet of valid C and C++ +types, the user is warned and the modern version is used. + +
    4. + +Otherwise, the modern version is used. +
    + +

    +You are encouraged either to use a valid builtin type, or to use the +equivalent modern code (see above), or better yet, to use +AC_CHECK_TYPES together with + + + +

    +#if !HAVE_LOFF_T
    +typedef loff_t off_t;
    +#endif
    +
    + +
    + +

    +

    +
    Macro: AC_CHECKING (feature-description) +
    + +Same as `AC_MSG_NOTICE([checking feature-description...]'. +
    + + +

    +

    +
    Macro: AC_COMPILE_CHECK (echo-text, includes, function-body, action-if-found, @ovar{action-if-not-found}) +
    + +This is an obsolete version of AC_TRY_LINK (see section Examining Libraries), with the addition that it prints `checking for +echo-text' to the standard output first, if echo-text is +non-empty. Use AC_MSG_CHECKING and AC_MSG_RESULT instead +to print messages (see section Printing Messages). +
    + + +

    +

    +
    Macro: AC_CONST +
    + +AC_C_CONST +
    + + +

    +

    +
    Macro: AC_CROSS_CHECK +
    + +Same as AC_C_CROSS, which is obsolete too, and does nothing +:-). +
    + + +

    +

    +
    Macro: AC_CYGWIN +
    + +Check for the Cygwin environment in which case the shell variable +CYGWIN is set to `yes'. Don't use this macro, the dignified +means to check the nature of the host is using +AC_CANONICAL_HOST. As a matter of fact this macro is defined as: + + + +
    +AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
    +case $host_os in
    +  *cygwin* ) CYGWIN=yes;;
    +         * ) CYGWIN=no;;
    +esac
    +
    + +

    +Beware that the variable CYGWIN has a very special meaning when +running CygWin32, and should not be changed. That's yet another reason +not to use this macro. +

    + + +

    +

    +
    Macro: AC_DECL_YYTEXT +
    + +Does nothing, now integrated in AC_PROG_LEX. +
    + + +

    +

    +
    Macro: AC_DIR_HEADER +
    + + + + + +Like calling AC_FUNC_CLOSEDIR_VOID andAC_HEADER_DIRENT, +but defines a different set of C preprocessor macros to indicate which +header file is found: + + +
  • Header Old Symbol New Symbol + +
  • `dirent.h' DIRENT HAVE_DIRENT_H + +
  • `sys/ndir.h' SYSNDIR HAVE_SYS_NDIR_H + +
  • `sys/dir.h' SYSDIR HAVE_SYS_DIR_H + +
  • `ndir.h' NDIR HAVE_NDIR_H + +
  • + +
    +
    Macro: AC_DYNIX_SEQ +
    + +If on Dynix/PTX (Sequent UNIX), add @option{-lseq} to output variable +LIBS. This macro used to be defined as + + +
    +AC_CHECK_LIB(seq, getmntent, LIBS="-lseq $LIBS")
    +
    + +now it is just AC_FUNC_GETMNTENT. +
    + +
    +
    Macro: AC_EXEEXT +
    + + +Defined the output variable EXEEXT based on the output of the +compiler, which is now done automatically. Typically set to empty +string if Unix and `.exe' if Win32 or OS/2. +
    + +
    +
    Macro: AC_EMXOS2 +
    + +Similar to AC_CYGWIN but checks for the EMX environment on OS/2 +and sets EMXOS2. +
    + +
    +
    Macro: AC_ERROR +
    + +AC_MSG_ERROR +
    + +
    +
    Macro: AC_FIND_X +
    + +AC_PATH_X +
    + +
    +
    Macro: AC_FIND_XTRA +
    + +AC_PATH_XTRA +
    + +
    +
    Macro: AC_FUNC_CHECK +
    + +AC_CHECK_FUNC +
    + +
    +
    Macro: AC_FUNC_WAIT3 +
    + + +If wait3 is found and fills in the contents of its third argument +(a `struct rusage *'), which HP-UX does not do, define +HAVE_WAIT3. + +These days portable programs should use waitpid, not +wait3, as wait3 is being removed from the Open Group +standards, and will not appear in the next revision of POSIX. +
    + +
    +
    Macro: AC_GCC_TRADITIONAL +
    + +AC_PROG_GCC_TRADITIONAL +
    + +
    +
    Macro: AC_GETGROUPS_T +
    + +AC_TYPE_GETGROUPS +
    + +
    +
    Macro: AC_GETLOADAVG +
    + +AC_FUNC_GETLOADAVG +
    + +
    +
    Macro: AC_HAVE_FUNCS +
    + +AC_CHECK_FUNCS +
    + +
    +
    Macro: AC_HAVE_HEADERS +
    + +AC_CHECK_HEADERS +
    + +
    +
    Macro: AC_HAVE_LIBRARY (library, @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) +
    + +This macro is equivalent to calling AC_CHECK_LIB with a +function argument of main. In addition, library can +be written as any of `foo', @option{-lfoo}, or `libfoo.a'. In +all of those cases, the compiler is passed @option{-lfoo}. However, +library cannot be a shell variable; it must be a literal name. +
    + +
    +
    Macro: AC_HAVE_POUNDBANG +
    + +AC_SYS_INTERPRETER (different calling convention) +
    + +
    +
    Macro: AC_HEADER_CHECK +
    + +AC_CHECK_HEADER +
    + +
    +
    Macro: AC_HEADER_EGREP +
    + +AC_EGREP_HEADER +
    + +
    +
    Macro: AC_INIT (unique-file-in-source-dir) +
    + +Formerly AC_INIT used to have a single argument, and was +equivalent to: + + +
    +AC_INIT
    +AC_CONFIG_SRCDIR(unique-file-in-source-dir)
    +
    + +
    + +
    +
    Macro: AC_INLINE +
    + +AC_C_INLINE +
    + +
    +
    Macro: AC_INT_16_BITS +
    + + +If the C type int is 16 bits wide, define INT_16_BITS. +Use `AC_CHECK_SIZEOF(int)' instead. +
    + +
    +
    Macro: AC_IRIX_SUN +
    + +If on IRIX (Silicon Graphics UNIX), add @option{-lsun} to output +LIBS. If you were using it to get getmntent, use +AC_FUNC_GETMNTENT instead. If you used it for the NIS versions +of the password and group functions, use `AC_CHECK_LIB(sun, +getpwnam)'. Up to Autoconf 2.13, it used to be + + +
    +AC_CHECK_LIB(sun, getmntent, LIBS="-lsun $LIBS")
    +
    + +now it is defined as + + +
    +AC_FUNC_GETMNTENT
    +AC_CHECK_LIB(sun, getpwnam)
    +
    + +
    + +
    +
    Macro: AC_LANG_C +
    + +Same as `AC_LANG(C)'. +
    + +
    +
    Macro: AC_LANG_CPLUSPLUS +
    + +Same as `AC_LANG(C++)'. +
    + +
    +
    Macro: AC_LANG_FORTRAN77 +
    + +Same as `AC_LANG(Fortran 77)'. +
    + +
    +
    Macro: AC_LANG_RESTORE +
    + +Select the language that is saved on the top of the stack, as set +by AC_LANG_SAVE, remove it from the stack, and call +AC_LANG(language). +
    + +
    +
    Macro: AC_LANG_SAVE +
    + +Remember the current language (as set by AC_LANG) on a stack. +The current language does not change. AC_LANG_PUSH is preferred. +
    + +
    +
    Macro: AC_LINK_FILES (source..., dest...) +
    + +This is an obsolete version of AC_CONFIG_LINKS. An updated +version of: + + +
    +AC_LINK_FILES(config/$machine.h config/$obj_format.h,
    +              host.h            object.h)
    +
    + +is: + + +
    +AC_CONFIG_LINKS(host.h:config/$machine.h
    +                object.h:config/$obj_format.h)
    +
    + +
    + +
    +
    Macro: AC_LN_S +
    + +AC_PROG_LN_S +
    + +
    +
    Macro: AC_LONG_64_BITS +
    + + +Define LONG_64_BITS if the C type long int is 64 bits wide. +Use the generic macro `AC_CHECK_SIZEOF([long int])' instead. +
    + +
    +
    Macro: AC_LONG_DOUBLE +
    + +AC_C_LONG_DOUBLE +
    + +
    +
    Macro: AC_LONG_FILE_NAMES +
    + +AC_SYS_LONG_FILE_NAMES +
    + +
    +
    Macro: AC_MAJOR_HEADER +
    + +AC_HEADER_MAJOR +
    + +
    +
    Macro: AC_MEMORY_H +
    + + +Used to define NEED_MEMORY_H if the mem functions were +defined in `memory.h'. Today it is equivalent to +`AC_CHECK_HEADERS(memory.h)'. Adjust your code to depend upon +HAVE_MEMORY_H, not NEED_MEMORY_H, see See section Standard Symbols. +
    + +
    +
    Macro: AC_MINGW32 +
    + +Similar to AC_CYGWIN but checks for the MingW32 compiler +environment and sets MINGW32. +
    + +
    +
    Macro: AC_MINUS_C_MINUS_O +
    + +AC_PROG_CC_C_O +
    + +
    +
    Macro: AC_MMAP +
    + +AC_FUNC_MMAP +
    + +
    +
    Macro: AC_MODE_T +
    + +AC_TYPE_MODE_T +
    + +
    +
    Macro: AC_OBJEXT +
    + + +Defined the output variable OBJEXT based on the output of the +compiler, after .c files have been excluded. Typically set to `o' +if Unix, `obj' if Win32. Now the compiler checking macros handle +this automatically. +
    + +
    +
    Macro: AC_OBSOLETE (this-macro-name, @ovar{suggestion}) +
    + +Make m4 print a message to the standard error output warning that +this-macro-name is obsolete, and giving the file and line number +where it was called. this-macro-name should be the name of the +macro that is calling AC_OBSOLETE. If suggestion is given, +it is printed at the end of the warning message; for example, it can be +a suggestion for what to use instead of this-macro-name. + +For instance + + +
    +AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
    +
    + +You are encouraged to use AU_DEFUN instead, since it gives better +services to the user. +
    + +
    +
    Macro: AC_OFF_T +
    + +AC_TYPE_OFF_T +
    + +
    +
    Macro: AC_OUTPUT (@ovar{file}..., @ovar{extra-cmds}, @ovar{init-cmds}) +
    + +The use of AC_OUTPUT with argument is deprecated, this obsoleted +interface is equivalent to: + + +
    +AC_CONFIG_FILES(file...)
    +AC_CONFIG_COMMANDS([default],
    +                   extra-cmds, init-cmds)
    +AC_OUTPUT
    +
    + +
    + +
    +
    Macro: AC_OUTPUT_COMMANDS (extra-cmds, @ovar{init-cmds}) +
    + +Specify additional shell commands to run at the end of +`config.status', and shell commands to initialize any variables +from @command{configure}. This macro may be called multiple times. It is +obsolete, replaced by AC_CONFIG_COMMANDS. + +Here is an unrealistic example: + + +
    +fubar=27
    +AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.],
    +                   [fubar=$fubar])
    +AC_OUTPUT_COMMANDS([echo this is another, extra, bit],
    +                   [echo init bit])
    +
    + +Aside from the fact that AC_CONFIG_COMMANDS requires an +additional key, an important difference is that +AC_OUTPUT_COMMANDS is quoting its arguments twice, while +AC_CONFIG_COMMANDS. This means that AC_CONFIG_COMMANDS +can safely be given macro calls as arguments: + + +
    +AC_CONFIG_COMMANDS(foo, [my_FOO()])
    +
    + +conversely, where one level of quoting was enough for literal strings +with AC_OUTPUT_COMMANDS, you need two with +AC_CONFIG_COMMANDS. The following lines are equivalent: + + +
    +AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
    +AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
    +
    + +
    + +
    +
    Macro: AC_PID_T +
    + +AC_TYPE_PID_T +
    + +
    +
    Macro: AC_PREFIX +
    + +AC_PREFIX_PROGRAM +
    + +
    +
    Macro: AC_PROGRAMS_CHECK +
    + +AC_CHECK_PROGS +
    + +
    +
    Macro: AC_PROGRAMS_PATH +
    + +AC_PATH_PROGS +
    + +
    +
    Macro: AC_PROGRAM_CHECK +
    + +AC_CHECK_PROG +
    + +
    +
    Macro: AC_PROGRAM_EGREP +
    + +AC_EGREP_CPP +
    + +
    +
    Macro: AC_PROGRAM_PATH +
    + +AC_PATH_PROG +
    + +
    +
    Macro: AC_REMOTE_TAPE +
    + +removed because of limited usefulness +
    + +
    +
    Macro: AC_RESTARTABLE_SYSCALLS +
    + +AC_SYS_RESTARTABLE_SYSCALLS +
    + +
    +
    Macro: AC_RETSIGTYPE +
    + +AC_TYPE_SIGNAL +
    + +
    +
    Macro: AC_RSH +
    + +Removed because of limited usefulness. +
    + +
    +
    Macro: AC_SCO_INTL +
    + + +If on SCO UNIX, add @option{-lintl} to output variable LIBS. This +macro used to + + +
    +AC_CHECK_LIB(intl, strftime, LIBS="-lintl $LIBS")
    +
    + +now it just calls AC_FUNC_STRFTIME instead. +
    + +
    +
    Macro: AC_SETVBUF_REVERSED +
    + +AC_FUNC_SETVBUF_REVERSED +
    + +
    +
    Macro: AC_SET_MAKE +
    + +AC_PROG_MAKE_SET +
    + +
    +
    Macro: AC_SIZEOF_TYPE +
    + +AC_CHECK_SIZEOF +
    + +
    +
    Macro: AC_SIZE_T +
    + +AC_TYPE_SIZE_T +
    + +
    +
    Macro: AC_STAT_MACROS_BROKEN +
    + +AC_HEADER_STAT +
    + +
    +
    Macro: AC_STDC_HEADERS +
    + +AC_HEADER_STDC +
    + +
    +
    Macro: AC_STRCOLL +
    + +AC_FUNC_STRCOLL +
    + +
    +
    Macro: AC_ST_BLKSIZE +
    + +AC_STRUCT_ST_BLKSIZE +
    + +
    +
    Macro: AC_ST_BLOCKS +
    + +AC_STRUCT_ST_BLOCKS +
    + +
    +
    Macro: AC_ST_RDEV +
    + +AC_STRUCT_ST_RDEV +
    + +
    +
    Macro: AC_SYS_RESTARTABLE_SYSCALLS +
    + + +If the system automatically restarts a system call that is interrupted +by a signal, define HAVE_RESTARTABLE_SYSCALLS. This macro does +not check if system calls are restarted in general--it tests whether a +signal handler installed with signal (but not sigaction) +causes system calls to be restarted. It does not test if system calls +can be restarted when interrupted by signals that have no handler. + +These days portable programs should use sigaction with +SA_RESTART if they want restartable system calls. They should +not rely on HAVE_RESTARTABLE_SYSCALLS, since nowadays whether a +system call is restartable is a dynamic issue, not a configuration-time +issue. +
    + +
    +
    Macro: AC_SYS_SIGLIST_DECLARED +
    + +AC_DECL_SYS_SIGLIST +
    + +
    +
    Macro: AC_TEST_CPP +
    + +AC_TRY_CPP +
    + +
    +
    Macro: AC_TEST_PROGRAM +
    + +AC_TRY_RUN +
    + +
    +
    Macro: AC_TIMEZONE +
    + +AC_STRUCT_TIMEZONE +
    + +
    +
    Macro: AC_TIME_WITH_SYS_TIME +
    + +AC_HEADER_TIME +
    + +
    +
    Macro: AC_UID_T +
    + +AC_TYPE_UID_T +
    + +
    +
    Macro: AC_UNISTD_H +
    + +Same as `AC_CHECK_HEADERS(unistd.h)'. +
    + +
    +
    Macro: AC_USG +
    + + +Define USG if the BSD string functions are defined in +`strings.h'. You should no longer depend upon USG, but on +HAVE_STRING_H, see See section Standard Symbols. +
    + +
    +
    Macro: AC_UTIME_NULL +
    + +AC_FUNC_UTIME_NULL +
    + +
    +
    Macro: AC_VALIDATE_CACHED_SYSTEM_TUPLE (@ovar{cmd}) +
    + +If the cache file is inconsistent with the current host, target and +build system types, it used to execute cmd or print a default +error message. + +This is now handled by default. +
    + +
    +
    Macro: AC_VERBOSE (result-description) +
    + +AC_MSG_RESULT. +
    + +
    +
    Macro: AC_VFORK +
    + +AC_FUNC_VFORK +
    + +
    +
    Macro: AC_VPRINTF +
    + +AC_FUNC_VPRINTF +
    + +
    +
    Macro: AC_WAIT3 +
    + +AC_FUNC_WAIT3 +
    + +
    +
    Macro: AC_WARN +
    + +AC_MSG_WARN +
    + +
    +
    Macro: AC_WORDS_BIGENDIAN +
    + +AC_C_BIGENDIAN +
    + +
    +
    Macro: AC_XENIX_DIR +
    + + +This macro used to add @option{-lx} to output variable LIBS if on +Xenix. Also, if `dirent.h' is being checked for, added +@option{-ldir} to LIBS. Now it is merely an alias of +AC_HEADER_DIRENT instead, plus some code to detect whether +running XENIX on which you should not depend: + + +
    +AC_MSG_CHECKING([for Xenix])
    +AC_EGREP_CPP(yes,
    +[#if defined M_XENIX && !defined M_UNIX
    +  yes
    +#endif],
    +             [AC_MSG_RESULT([yes]); XENIX=yes],
    +             [AC_MSG_RESULT([no]); XENIX=])
    +
    + +
    + +
    +
    Macro: AC_YYTEXT_POINTER +
    + +AC_DECL_YYTEXT +
    + + + +

    Upgrading From Version 1

    + +

    +Autoconf version 2 is mostly backward compatible with version 1. +However, it introduces better ways to do some things, and doesn't +support some of the ugly things in version 1. So, depending on how +sophisticated your `configure.ac' files are, you might have to do +some manual work in order to upgrade to version 2. This chapter points +out some problems to watch for when upgrading. Also, perhaps your +@command{configure} scripts could benefit from some of the new features in +version 2; the changes are summarized in the file `NEWS' in the +Autoconf distribution. + + + + +

    Changed File Names

    + +

    +If you have an `aclocal.m4' installed with Autoconf (as opposed to +in a particular package's source directory), you must rename it to +`acsite.m4'. See section Using @command{autoconf} to Create @command{configure}. + + +

    +If you distribute `install.sh' with your package, rename it to +`install-sh' so make builtin rules won't inadvertently +create a file called `install' from it. AC_PROG_INSTALL +looks for the script under both names, but it is best to use the new name. + + +

    +If you were using `config.h.top', `config.h.bot', or +`acconfig.h', you still can, but you will have less clutter if you +use the AH_ macros. See section Autoheader Macros. + + + + +

    Changed Makefiles

    + +

    +Add `@CFLAGS@', `@CPPFLAGS@', and `@LDFLAGS@' in +your `Makefile.in' files, so they can take advantage of the values +of those variables in the environment when @command{configure} is run. +Doing this isn't necessary, but it's a convenience for users. + + +

    +Also add `@configure_input@' in a comment to each input file for +AC_OUTPUT, so that the output files will contain a comment saying +they were produced by @command{configure}. Automatically selecting the +right comment syntax for all the kinds of files that people call +AC_OUTPUT on became too much work. + + +

    +Add `config.log' and `config.cache' to the list of files you +remove in distclean targets. + + +

    +If you have the following in `Makefile.in': + + + +

    +prefix = /usr/local
    +exec_prefix = $(prefix)
    +
    + +

    +you must change it to: + + + +

    +prefix = @prefix@
    +exec_prefix = @exec_prefix@
    +
    + +

    +The old behavior of replacing those variables without `@' +characters around them has been removed. + + + + +

    Changed Macros

    + +

    +Many of the macros were renamed in Autoconf version 2. You can still +use the old names, but the new ones are clearer, and it's easier to find +the documentation for them. See section Obsolete Macros, for a table showing the +new names for the old macros. Use the @command{autoupdate} program to +convert your `configure.ac' to using the new macro names. +See section Using @command{autoupdate} to Modernize @file{configure.ac}. + + +

    +Some macros have been superseded by similar ones that do the job better, +but are not call-compatible. If you get warnings about calling obsolete +macros while running @command{autoconf}, you may safely ignore them, but +your @command{configure} script will generally work better if you follow +the advice it prints about what to replace the obsolete macros with. In +particular, the mechanism for reporting the results of tests has +changed. If you were using echo or AC_VERBOSE (perhaps +via AC_COMPILE_CHECK), your @command{configure} script's output will +look better if you switch to AC_MSG_CHECKING and +AC_MSG_RESULT. See section Printing Messages. Those macros work best +in conjunction with cache variables. See section Caching Results. + + + + +

    Changed Results

    + +

    +If you were checking the results of previous tests by examining the +shell variable DEFS, you need to switch to checking the values of +the cache variables for those tests. DEFS no longer exists while +@command{configure} is running; it is only created when generating output +files. This difference from version 1 is because properly quoting the +contents of that variable turned out to be too cumbersome and +inefficient to do every time AC_DEFINE is called. See section Cache Variable Names. + + +

    +For example, here is a `configure.ac' fragment written for Autoconf +version 1: + + + +

    +AC_HAVE_FUNCS(syslog)
    +case "$DEFS" in
    +*-DHAVE_SYSLOG*) ;;
    +*) # syslog is not in the default libraries.  See if it's in some other.
    +  saved_LIBS="$LIBS"
    +  for lib in bsd socket inet; do
    +    AC_CHECKING(for syslog in -l$lib)
    +    LIBS="$saved_LIBS -l$lib"
    +    AC_HAVE_FUNCS(syslog)
    +    case "$DEFS" in
    +    *-DHAVE_SYSLOG*) break ;;
    +    *) ;;
    +    esac
    +    LIBS="$saved_LIBS"
    +  done ;;
    +esac
    +
    + +

    +Here is a way to write it for version 2: + + + +

    +AC_CHECK_FUNCS(syslog)
    +if test $ac_cv_func_syslog = no; then
    +  # syslog is not in the default libraries.  See if it's in some other.
    +  for lib in bsd socket inet; do
    +    AC_CHECK_LIB($lib, syslog, [AC_DEFINE(HAVE_SYSLOG)
    +      LIBS="$LIBS -l$lib"; break])
    +  done
    +fi
    +
    + +

    +If you were working around bugs in AC_DEFINE_UNQUOTED by adding +backslashes before quotes, you need to remove them. It now works +predictably, and does not treat quotes (except back quotes) specially. +See section Setting Output Variables. + + +

    +All of the boolean shell variables set by Autoconf macros now use +`yes' for the true value. Most of them use `no' for false, +though for backward compatibility some use the empty string instead. If +you were relying on a shell variable being set to something like 1 or +`t' for true, you need to change your tests. + + + + +

    Changed Macro Writing

    + +

    +When defining your own macros, you should now use AC_DEFUN +instead of define. AC_DEFUN automatically calls +AC_PROVIDE and ensures that macros called via AC_REQUIRE +do not interrupt other macros, to prevent nested `checking...' +messages on the screen. There's no actual harm in continuing to use the +older way, but it's less convenient and attractive. See section Macro Definitions. + + +

    +You probably looked at the macros that came with Autoconf as a guide for +how to do things. It would be a good idea to take a look at the new +versions of them, as the style is somewhat improved and they take +advantage of some new features. + + +

    +If you were doing tricky things with undocumented Autoconf internals +(macros, variables, diversions), check whether you need to change +anything to account for changes that have been made. Perhaps you can +even use an officially supported technique in version 2 instead of +kludging. Or perhaps not. + + +

    +To speed up your locally written feature tests, add caching to them. +See whether any of your tests are of general enough usefulness to +encapsulate into macros that you can share. + + + + +

    Upgrading From Version 2.13

    + +

    +The introduction of the previous section (see section Upgrading From Version 1) perfectly +suits this section... + + + +

    +

    +Autoconf version 2.50 is mostly backward compatible with version 2.13. +However, it introduces better ways to do some things, and doesn't +support some of the ugly things in version 2.13. So, depending on how +sophisticated your `configure.ac' files are, you might have to do +some manual work in order to upgrade to version 2.50. This chapter +points out some problems to watch for when upgrading. Also, perhaps +your @command{configure} scripts could benefit from some of the new +features in version 2.50; the changes are summarized in the file +`NEWS' in the Autoconf distribution. +

    + + + +

    Changed Quotation

    + +

    +The most important changes are invisible to you: the implementation of +most macros have completely changed. This allowed more factorization of +the code, better error messages, a higher uniformity of the user's +interface etc. Unfortunately, as a side effect, some construct which +used to (miraculously) work might break starting with Autoconf 2.50. +The most common culprit is bad quotation. + + +

    +For instance, in the following example, the message is not properly +quoted: + + + +

    +AC_INIT
    +AC_CHECK_HEADERS(foo.h,,
    +AC_MSG_ERROR(cannot find foo.h, bailing out))
    +AC_OUTPUT
    +
    + +

    +Autoconf 2.13 simply ignores it: + + + +

    +$ autoconf-2.13; ./configure --silent
    +creating cache ./config.cache
    +configure: error: cannot find foo.h
    +$
    +
    + +

    +while Autoconf 2.50 will produce a broken `configure': + + + +

    +$ autoconf-2.50; ./configure --silent
    +configure: error: cannot find foo.h
    +./configure: exit: bad non-numeric arg `bailing'
    +./configure: exit: bad non-numeric arg `bailing'
    +$
    +
    + +

    +The message needs to be quoted, and the AC_MSG_ERROR invocation +too! + + + +

    +AC_INIT
    +AC_CHECK_HEADERS(foo.h,,
    +                 [AC_MSG_ERROR([cannot find foo.h, bailing out])])
    +AC_OUTPUT
    +
    + +

    +Many many (and many more) Autoconf macros were lacking proper quotation, +including no less than... AC_DEFUN itself! + + + +

    +$ cat configure.in
    +AC_DEFUN([AC_PROG_INSTALL],
    +[# My own much better version
    +])
    +AC_INIT
    +AC_PROG_INSTALL
    +AC_OUTPUT
    +$ autoconf-2.13
    +autoconf: Undefined macros:
    +***BUG in Autoconf--please report*** AC_FD_MSG
    +***BUG in Autoconf--please report*** AC_EPI
    +configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
    +configure.in:5:AC_PROG_INSTALL
    +$ autoconf-2.50
    +$
    +
    + + + +

    New Macros

    + +

    + + + +

    +Because Autoconf has been dormant for years, Automake provided +Autoconf-like macros for a while. Autoconf 2.50 now provides better +versions of these macros, integrated in the AC_ namespace, +instead of AM_. But in order to ease the upgrading via +@command{autoupdate}, bindings to such AM_ macros are provided. + + +

    +Unfortunately Automake did not quote the name of these macros! +Therefore, when @command{m4} finds something like +`AC_DEFUN(AM_TYPE_PTRDIFF_T, ...)' in `aclocal.m4', +AM_TYPE_PTRDIFF_T is +expanded, replaced with its Autoconf definition. + + +

    +Fortunately Autoconf catches pre-AC_INIT expansions, and will +complain, in its own words: + + + +

    +$ cat configure.in
    +AC_INIT
    +AM_TYPE_PTRDIFF_T
    +$ aclocal-1.4
    +$ autoconf
    +./aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
    +actypes.m4:289: AM_TYPE_PTRDIFF_T is expanded from...
    +./aclocal.m4:17: the top level
    +$
    +
    + +

    +Future versions of Automake will simply no longer define most of these +macros, and will properly quote the names of the remaining macros. +But you don't have to wait for it to happen to do the right thing right +now: do not depend upon macros from Automake as it is simply not its job +to provide macros (but the one it requires by itself): + + + +

    +$ cat configure.in
    +AC_INIT
    +AM_TYPE_PTRDIFF_T
    +$ rm aclocal.m4
    +$ autoupdate
    +autoupdate: `configure.in' is updated
    +$ cat configure.in
    +AC_INIT
    +AC_CHECK_TYPES([ptrdiff_t])
    +$ aclocal-1.4
    +$ autoconf
    +$
    +
    + + + +

    Hosts and Cross-Compilation

    + +

    +Based on the experience of compiler writers, and after long public +debates, many aspects of the cross-compilation chain have changed: + + + +

    + +

    +The relationship between build, host, and target have been cleaned up: +the chain of default is now simply: target defaults to host, host to +build, and build to the result of @command{config.guess}. Nevertheless, +in order to ease the transition from 2.13 to 2.50, the following +transition scheme is implemented. Do not rely on it, as it will +be completely disabled in a couple of releases (we cannot keep it, as it +proves to cause more problems than to cure). + + +

    +They all default to the result of running @command{config.guess}, unless +you specify either @option{--build} or @option{--host}. In this case, +the default becomes the system type you specified. If you specify both, +and they're different, @command{configure} will enter cross compilation +mode, so it won't run any tests that require execution. + + +

    +Hint: if you mean to override the result of @command{config.guess}, +prefer @option{--build} over @option{--host}. In the future, +@option{--host} will not override the name of the build system type. +Whenever you specify --host, be sure to specify --build +too. + + +

    +For backward compatibility, @command{configure} will accept a system +type as an option by itself. Such an option will override the defaults +for build, host and target system types. The following configure +statement will configure a cross toolchain that will run on NetBSD/alpha +but generate code for GNU Hurd/sparc, which is also the build platform. + + + +

    +./configure --host=alpha-netbsd sparc-gnu
    +
    + +

    +In Autoconf, the variables build, host, and target +had a different semantics before and after the invocation of +AC_CANONICAL_BUILD etc. Now, the argument of @option{--build} is +strictly copied into build_alias, and is left empty otherwise. +After the AC_CANONICAL_BUILD, build is set to the +canonicalized build type. To ease the transition, before, its contents +is the same as that of build_alias. Do not rely on this +broken feature. + + +

    +For consistency with the backward compatibility scheme exposed above, +when @option{--host} is specified by @option{--build} isn't, the build +system will be assumed to be the same as @option{--host}, and +`build_alias' will be set to that value. Eventually, this +historically incorrect behavior will go away. + + +

    +The former scheme to enable cross-compilation proved to cause more harm +than good, in particular, it used to be triggered too easily, leaving +regular end users puzzled in front of cryptic error messages. +@command{configure} could even enter cross-compilation mode, only +because the compiler was not functional. This is mainly because +@command{configure} used to try to detect cross-compilation, instead of +waiting for an explicit flag from the user. + + +

    +Now, @command{configure} enters cross-compilation mode iff +@option{--host} is passed. + + +

    +That's the short documentation. To ease the transition between 2.13 and +its successors, a more complicated scheme is implemented. Do not +rely on the following, as it will be removed in a near future. + + +

    +If you specify @option{--host}, but not @option{--build}, when +@command{configure} performs the first compiler test it will try to run +an executable produced by the compiler. If the execution fails, it will +enter cross-compilation mode. This is fragile. Moreover, by the time +the compiler test is performed, it may be too late to modify the +build-system type: other tests may have already been performed. +Therefore, whenever you specify --host, be sure to specify +--build too. + + + +

    +./configure --build=i686-pc-linux-gnu --host=m68k-coff
    +
    + +

    +will enter cross-compilation mode. The former interface, which +consisted in setting the compiler to a cross-compiler without informing +@command{configure} is obsolete. For instance, @command{configure} will +fail if it can't run the code generated by the specified compiler if you +configure as follows: + + + +

    +./configure CC=m68k-coff-gcc
    +
    + + + +

    AC_LIBOBJ vs. LIBOBJS

    + +

    +Up to Autoconf 2.13, the replacement of functions was triggered via the +variable LIBOBJS. Since Autoconf 2.50, the macro +AC_LIBOBJ should be used instead (see section Generic Function Checks). +Starting at Autoconf 2.53, the use of LIBOBJS is an error. + + +

    +This change is mandated by the unification of the GNU Build System +components. In particular, the various fragile techniques used to parse +a `configure.ac' are all replaced with the use of traces. As a +consequence, any action must be traceable, which obsoletes critical +variable assignments. Fortunately, LIBOBJS was the only problem. + + +

    +At the time this documentation is written, Automake does not rely on +traces yet, but this is planed for a near future. Nevertheless, to +ease the transition, and to guarantee this future Automake release will +be able to use Autoconf 2.53, using LIBOBJS directly will make +@command{autoconf} fail. But note that the output, @command{configure}, +is correct and fully functional: you have some delay to adjust your +source. + + +

    +There are two typical uses of LIBOBJS: asking for a replacement +function, and adjusting LIBOBJS for Automake and/or Libtool. + + +

    +As for function replacement, the fix is immediate: use +AC_LIBOBJ. For instance: + + + +

    +LIBOBJS="$LIBOBJS fnmatch.o"
    +LIBOBJS="$LIBOBJS malloc.$ac_objext"
    +
    + +

    +should be replaced with: + + + +

    +AC_LIBOBJ([fnmatch])
    +AC_LIBOBJ([malloc])
    +
    + +

    +When asked for automatic de-ANSI-fication, Automake needs +LIBOBJS'ed filenames to have `$U' appended to the +base names. Libtool requires the definition of LTLIBOBJS, which +suffixes are mapped to `.lo'. Although Autoconf provides them with +means to free the user to do that by herself, by the time of this +writing, none do. Therefore, it is common to see `configure.ac' +end with: + + + +

    +# This is necessary so that .o files in LIBOBJS are also built via
    +# the ANSI2KNR-filtering rules.
    +LIBOBJS=`echo "$LIBOBJS" | sed 's/\.o /\$U.o /g;s/\.o$/\$U.o/'`
    +LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.o/\.lo/g'`
    +AC_SUBST(LTLIBOBJS)
    +
    + +

    +First, note that this code is wrong, because `.o' is not the +only possible extension(4)! Because the token LIBOBJS is now +forbidden, you will have to replace this snippet with: + + + +

    +# This is necessary so that .o files in LIBOBJS are also built via
    +# the ANSI2KNR-filtering rules.
    +LIB@&t@OBJS=`echo "$LIB@&t@OBJS" |
    +             sed 's,\.[[^.]]* ,$U&,g;s,\.[[^.]]*$,$U&,'`
    +LTLIBOBJS=`echo "$LIB@&t@OBJS" |
    +           sed 's,\.[[^.]]* ,.lo ,g;s,\.[[^.]]*$,.lo,'`
    +AC_SUBST(LTLIBOBJS)
    +
    + +

    +Unfortunately, @command{autoupdate} cannot help here, since... this is +not a macro! Of course, first make sure your release of Automake and/or +Libtool still requires these. + + + + +

    Generating Test Suites with Autotest

    + +

    + + + + +

    +Note: This section describes an experimental feature which will
    +be part of Autoconf in a forthcoming release.  Although we believe
    +Autotest is stabilizing, this documentation describes an interface which
    +might change in the future: do not depend upon Autotest without
    +subscribing to the Autoconf mailing lists.
    +
    + +

    +It is paradoxical that portable projects depend on nonportable tools to +run their test suite. Autoconf by itself is the paragon of this +problem: although it aims at perfectly portability, up to 2.13, its test +suite was using DejaGNU, a rich and complex testing framework, but which +is far from being standard on Unix systems. Worse yet, it was likely to +be missing on the most fragile platforms, the very platforms that are +most likely to torture Autoconf and exhibit deficiencies. + + +

    +To circumvent this problem many package maintainers have developed their +own testing framework, based on simple shell scripts whose sole output +are their exit status: the test succeeded, or failed. In addition, most +of these tests share some common patterns, what results in lots of +duplicated code, tedious maintenance etc. + + +

    +Following exactly the same reasoning that yielded to the inception of +Autoconf, Autotest provides a test suite generation frame work, based on +M4 macros, building a portable shell script. The suite itself is +equipped with automatic logging and tracing facilities which greatly +diminish the interaction with bug reporters, and simple timing reports. + + +

    +Autoconf itself has been using Autotest for years, and we do attest that +it has considerably improved the strength of the test suite, and the +quality of bug reports. Other projects are known to use some generation +of Autotest, such as Bison, Free Recode, Free Wdiff, GNU Tar, each of +them having different needs, what slowly polishes Autotest as a general +testing framework. + + +

    +Nonetheless, compared to DejaGNU, Autotest is inadequate for interactive +tool testing, which is probably its main limitation. + + + + +

    Using an Autotest Test Suite

    + + + +

    @command{testsuite} Scripts

    + +

    + + + +

    +Generating testing or validation suites using Autotest is rather easy. +The whole validation suite is held in a file to be processed through +@command{autom4te}, itself using GNU m4 under the scene, to +produce a stand-alone Bourne shell script which then gets distributed. +Neither @command{autom4te} nor GNU m4 are not needed anymore at +the installer end. + + +

    + +Each test of the validation suite should be part of some test group. A +test group is a sequence of interwoven tests that ought to be +executed together, usually because one test in the group creates data +files than a later test in the same group needs to read. Complex test +groups make later debugging more tedious. It is much better keeping +keep only a few tests per test group, and if you can put only one test +per test group, this is just ideal. + + +

    +For all but the simplest packages, some file such as `testsuite.at' +does not fully hold all test sources, as these are often easier to +maintain in separate files. Each of these separate files holds a single +test group, or a sequence of test groups all addressing some common +functionality in the package. In such cases, file `testsuite.at' +only initializes the whole validation suite, and sometimes do elementary +health checking, before listing include statements for all other test +files. The special file `package.m4', containing the +identification of the package, is automatically included if found. + + +

    +The validation scripts that Autotest produces are by convention called +@command{testsuite}. When run, @command{testsuite} executes each test +group in turn, producing only one summary line per test to say if that +particular test succeeded or failed. At end of all tests, summarizing +counters get printed. If any test failed, one debugging script gets +automatically generated for each test group which failed. These +debugging scripts are named `testsuite.nn', where nn is +the sequence number of the test group. In the ideal situation, none of +the tests fail, and consequently, no debugging script is generated out +of validation. + + +

    +The automatic generation of debugging scripts for failed test has the +purpose of easing the chase for bugs. + + +

    +It often happens in practice that individual tests in the validation +suite need to get information coming out of the configuration process. +Some of this information, common for all validation suites, is provided +through the file `atconfig', automatically created by +AC_CONFIG_TESTDIR. For configuration informations which your +testing environment specifically needs, you might prepare an optional +file named `atlocal.in', instantiated by AC_CONFIG_FILES. +The configuration process produces `atconfig' and `atlocal' +out of these two input files, and these two produced files are +automatically read by the `testsuite' script. + + +

    +Here is a diagram showing the relationship between files. + + +

    +Files used in preparing a software package for distribution: + + + +

    +subfile-1.at ->.
    +    ...         \
    +subfile-i.at ---->-- testsuite.at -->.
    +    ...         /                     \
    +subfile-n.at ->'                       >-- autom4te* -->testsuite
    +                                      /
    +                      [package.m4] ->'
    +
    + +

    +Files used in configuring a software package: + + + +

    +                                     .--> atconfig
    +                                    /
    +[atlocal.in] -->  config.status* --<
    +                                    \
    +                                     `--> [atlocal]
    +
    + +

    +Files created during the test suite execution: + + + +

    +atconfig -->.                    .--> testsuite.log
    +             \                  /
    +              >-- testsuite* --<
    +             /                  \
    +[atlocal] ->'                    `--> [testsuite.nn*]
    +
    + + + +

    Autotest Logs

    + +

    +When run, the test suite creates a log file named after itself, e.g., a +test suite named @command{testsuite} creates `testsuite.log'. It +contains a lot of information, usually more than maintainers actually +need, but therefore most of the time it contains all that is needed: + + +

    + +
    command line arguments +
    +A very bad Unix habit which is unfortunately wide spread consists of +setting environment variables before the command, such as in +`CC=my-home-grown-cc ./testsuite'. This results in the test suite +not knowing this change, hence (i) it can't report it to you, and (ii) +it cannot preserve the value of CC for subsequent runs(5). Autoconf faced exactly the same problem, and solved it by asking +users to pass the variable definitions as command line arguments. +Autotest requires this rule too, but has no means to enforce it; the log +then contains a trace of the variables the user changed. + +
    `ChangeLog' excerpts +
    +The topmost lines of all the `ChangeLog's found in the source +hierarchy. This is especially useful when bugs are reported against +development versions of the package, since the version string does not +provide sufficient information to know the exact state of the sources +the user compiled. Of course this relies on the use of a +`ChangeLog'. + +
    build machine +
    +Running a test suite in a cross-compile environment is not an easy task, +since it would mean having the test suite run on a machine build, +while running programs on a machine host. It is much simpler to +run both the test suite and the programs on host, but then, from +the point of view of the test suite, there remains a single environment, +host = build. The log contains relevant information on the +state of the build machine, including some important environment +variables. + +
    tested programs +
    +The absolute path and answers to @option{--version} of the tested +programs (see section Writing `testsuite.at', AT_TESTED). + +
    configuration log +
    +The contents of `config.log', as created by @command{configure}, +are appended. It contains the configuration flags and a detailed report +on the configuration itself. +
    + + + +

    Writing `testsuite.at'

    + +

    +The `testsuite.at' is a Bourne shell script making use of special +Autotest M4 macros. It often contains a call to AT_INIT nears +its beginning followed by one call to m4_include per source file +for tests. Each such included file, or the remainder of +`testsuite.at' if include files are not used, contain a sequence of +test groups. Each test group begins with one call to AT_SETUP, +it contains an arbitrary number of shell commands or calls to +AT_CHECK, and it completes with one call to AT_CLEANUP. + + +

    +

    +
    Macro: AT_INIT (@ovar{name}) +
    + +Initialize Autotest. Giving a name to the test suite is +encouraged if your package includes several test suites. In any case, +the test suite always displays the package name and version. It also +inherits the package bug report address. +
    + + +

    +

    +
    Macro: AT_TESTED (executables) +
    + +Log the path and answer to @option{--version} of each program in +space-separated list executables. Several invocations register +new executables, in other words, don't fear registering one program +several times. +
    + + +

    +Autotest test suites rely on the PATH to find the tested program. +This saves from generating the absolute paths to the various tools, and +makes it possible to test installed programs. Therefore, knowing what +programs are being exercised is crucial to understand some problems in +the test suite itself, or its occasional misuses. It is a good idea to +also subscribe foreign programs you depend upon, to ease incompatibility +diagnostics. + + +

    +

    +
    Macro: AT_SETUP (test-group-name) +
    + +This macro starts a group of related tests, all to be executed in the +same subshell. It accepts a single argument, which holds a few words +(no more than about 30 or 40 characters) quickly describing the purpose +of the test group being started. +
    + + +

    +

    +
    Macro: AT_KEYWORDS (keywords) +
    + +Associate the space-separated list of keywords to the enclosing +test group. This makes it possible to run "slices" of the test suite. +For instance if some of your test groups exercise some `foo' +feature, then using `AT_KEYWORDS(foo)' lets you run +`./testsuite -k foo' to run exclusively these test groups. The +title of the test group is automatically recorded to +AT_KEYWORDS. + + +

    +Several invocations within a test group accumulate new keywords. In +other words, don't fear registering several times the same keyword in a +test group. +

    + + +

    +

    +
    Macro: AT_CLEANUP +
    + +End the current test group. +
    + + +

    +

    +
    Macro: AT_DATA (file, contents) +
    + +Initialize an input data file with given contents. Of +course, the contents have to be properly quoted between square +brackets to protect against included commas or spurious m4 +expansion. The contents ought to end with an end of line. +
    + + +

    +

    +
    Macro: AT_CHECK (commands, @dvar{status, `0'}, @ovar{stdout}, @ovar{stderr}) +
    + +Execute a test by performing given shell commands. These commands +should normally exit with status, while producing expected +stdout and stderr contents. If commands exit with +status 77, then the whole test group is skipped. + + +

    +The commands must not redirect the standard output, nor the +standard error. + + +

    +If status, or stdout, or stderr is `ignore', then +the corresponding value is not checked. + + +

    +The special value `expout' for stdout means the expected +output of the commands is the content of the file `expout'. +If stdout is `stdout', then the standard output of the +commands is available for further tests in the file `stdout'. +Similarly for stderr with `expout' and `stderr'. +

    + + + + +

    Running @command{testsuite} Scripts

    +

    + + + +

    +Autotest test suites support the following arguments: + + +

    + +
    `--help' +
    +
    `-h' +
    +Display the list of options and exit successfully. + +
    `--version' +
    +
    `-V' +
    +Display the version of the test suite and exit successfully. + +
    `--clean' +
    +
    `-c' +
    +Remove all the files the test suite might have created and exit. Meant +for clean Makefile targets. + +
    `--list' +
    +
    `-l' +
    +List all the tests (or only the selection), including their possible +keywords. +
    + +

    +By default all the tests are performed (or described with +@option{--list}) in the default environment first silently, then +verbosely, but the environment, set of tests, and verbosity level can be +tuned: + + +

    + +
    `variable=value' +
    +Set the environment variable to value. Do not run +`FOO=foo ./testsuite' as debugging scripts would then run in a +different environment. + + +The variable AUTOTEST_PATH specifies the testing path to prepend +to PATH. It handles specially relative paths (not starting with +`/'): they are considered to be relative to the top level of the +package being built. All the directories are made absolute, first +starting from the top level build tree, then from the +source tree. For instance `./testsuite +AUTOTEST_PATH=tests:bin' for a `/src/foo-1.0' source package built +in `/tmp/foo' results in `/tmp/foo/tests:/tmp/foo/bin' and +then `/src/foo-1.0/tests:/src/foo-1.0/bin' being prepended to +PATH. + +
    `number' +
    +
    `number-number' +
    +
    `number-' +
    +
    `-number' +
    +Add the corresponding test groups, with obvious semantics, to the +selection. + +
    `--keywords=keywords' +
    +
    `-k keywords' +
    +Add to the selection the test groups which title or keywords (arguments +to AT_SETUP or AT_KEYWORDS) match all the keywords +of the comma separated list keywords. + +Running `./testsuite -k autoupdate,FUNC' will select all the tests +tagged with `autoupdate' and `FUNC' (as in +`AC_CHECK_FUNC', `AC_FUNC_FNMATCH' etc.) while +`./testsuite -k autoupdate -k FUNC' runs all the tests tagged with +`autoupdate' or `FUNC'. + +
    `--errexit' +
    +
    `-e' +
    +If any test fails, immediately abort testing. It implies +@option{--debug}: post test group clean up, debugging script generation, +and logging are inhibited. This option is meant for the full test +suite, it is not really useful for generated debugging scripts. + +
    `--verbose' +
    +
    `-v' +
    +Force more verbosity in the detailed output of what is being done. This +is the default for debugging scripts. + +
    `--debug' +
    +
    `-d' +
    +Do not remove the files after a test group was performed --but they are +still removed before, therefore using this option is sane when +running several test groups. Do not create debugging scripts. Do not +log (in order to preserve supposedly existing full log file). This is +the default for debugging scripts. + +
    `--trace' +
    +
    `-x' +
    +Trigger shell tracing of the test groups. +
    + + + +

    Making @command{testsuite} Scripts

    + +

    +For putting Autotest into movement, you need some configuration and +Makefile machinery. We recommend, at least if your package uses deep or +shallow hierarchies, that you use `tests/' as the name of the +directory holding all your tests and their `Makefile'. Here is a +check list of things to do. + + + +

    + +

    +With Automake, here is a minimal example about how to link `make +check' with a validation suite. + + + +

    +EXTRA_DIST = testsuite.at testsuite
    +TESTSUITE = $(srcdir)/testsuite
    +check-local: atconfig atlocal $(TESTSUITE)
    +        $(SHELL) $(TESTSUITE)
    +
    +AUTOTEST = $(AUTOM4TE) --language=autotest
    +$(TESTSUITE): $(srcdir)/testsuite.at
    +        $(AUTOTEST) -I $(srcdir) $.at -o $.tmp
    +        mv $.tmp $
    +
    + +

    +You might want to list explicitly the dependencies, i.e., the list of +the files `testsuite.at' includes. + + +

    +With strict Autoconf, you might need to add lines inspired from the +following: + + + +

    +subdir = tests
    +
    +atconfig: $(top_builddir)/config.status
    +	cd $(top_builddir) && \
    +           $(SHELL) ./config.status $(subdir)/$
    +
    +atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
    +	cd $(top_builddir) && \
    +           $(SHELL) ./config.status $(subdir)/$
    +
    + +

    +and manage to have `atconfig.in' and $(EXTRA_DIST) +distributed. + + + + +

    Questions About Autoconf

    + +

    +Several questions about Autoconf come up occasionally. Here some of them +are addressed. + + + + +

    Distributing @command{configure} Scripts

    + + +
    +What are the restrictions on distributing @command{configure}
    +scripts that Autoconf generates?  How does that affect my
    +programs that use them?
    +
    + +

    +There are no restrictions on how the configuration scripts that Autoconf +produces may be distributed or used. In Autoconf version 1, they were +covered by the GNU General Public License. We still encourage +software authors to distribute their work under terms like those of the +GPL, but doing so is not required to use Autoconf. + + +

    +Of the other files that might be used with @command{configure}, +`config.h.in' is under whatever copyright you use for your +`configure.ac'. `config.sub' and `config.guess' have an +exception to the GPL when they are used with an Autoconf-generated +@command{configure} script, which permits you to distribute them under the +same terms as the rest of your package. `install-sh' is from the X +Consortium and is not copyrighted. + + + + +

    Why Require GNU M4?

    + + +
    +Why does Autoconf require GNU M4?
    +
    + +

    +Many M4 implementations have hard-coded limitations on the size and +number of macros that Autoconf exceeds. They also lack several +builtin macros that it would be difficult to get along without in a +sophisticated application like Autoconf, including: + + + +

    +m4_builtin
    +m4_indir
    +m4_bpatsubst
    +__file__
    +__line__
    +
    + +

    +Autoconf requires version 1.4 or above of GNU M4 because it uses +frozen state files. + + +

    +Since only software maintainers need to use Autoconf, and since GNU +M4 is simple to configure and install, it seems reasonable to require +GNU M4 to be installed also. Many maintainers of GNU and +other free software already have most of the GNU utilities +installed, since they prefer them. + + + + +

    How Can I Bootstrap?

    + + +
    +If Autoconf requires GNU M4 and GNU M4 has an Autoconf
    +@command{configure} script, how do I bootstrap?  It seems like a chicken
    +and egg problem!
    +
    + +

    +This is a misunderstanding. Although GNU M4 does come with a +@command{configure} script produced by Autoconf, Autoconf is not required +in order to run the script and install GNU M4. Autoconf is only +required if you want to change the M4 @command{configure} script, which few +people have to do (mainly its maintainer). + + + + +

    Why Not Imake?

    + + +
    +Why not use Imake instead of @command{configure} scripts?
    +
    + +

    +Several people have written addressing this question, so I include +adaptations of their explanations here. + + +

    +The following answer is based on one written by Richard Pixley: + + + +

    +

    +Autoconf generated scripts frequently work on machines that it has +never been set up to handle before. That is, it does a good job of +inferring a configuration for a new system. Imake cannot do this. + + +

    +Imake uses a common database of host specific data. For X11, this makes +sense because the distribution is made as a collection of tools, by one +central authority who has control over the database. + + +

    +GNU tools are not released this way. Each GNU tool has a +maintainer; these maintainers are scattered across the world. Using a +common database would be a maintenance nightmare. Autoconf may appear +to be this kind of database, but in fact it is not. Instead of listing +host dependencies, it lists program requirements. + + +

    +If you view the GNU suite as a collection of native tools, then the +problems are similar. But the GNU development tools can be +configured as cross tools in almost any host+target permutation. All of +these configurations can be installed concurrently. They can even be +configured to share host independent files across hosts. Imake doesn't +address these issues. + + +

    +Imake templates are a form of standardization. The GNU coding +standards address the same issues without necessarily imposing the same +restrictions. +

    + +

    +Here is some further explanation, written by Per Bothner: + + + +

    +

    +One of the advantages of Imake is that it easy to generate large +Makefiles using cpp's `#include' and macro mechanisms. +However, cpp is not programmable: it has limited conditional +facilities, and no looping. And cpp cannot inspect its +environment. + + +

    +All of these problems are solved by using sh instead of +cpp. The shell is fully programmable, has macro substitution, +can execute (or source) other shell scripts, and can inspect its +environment. +

    + +

    +Paul Eggert elaborates more: + + + +

    +

    +With Autoconf, installers need not assume that Imake itself is already +installed and working well. This may not seem like much of an advantage +to people who are accustomed to Imake. But on many hosts Imake is not +installed or the default installation is not working well, and requiring +Imake to install a package hinders the acceptance of that package on +those hosts. For example, the Imake template and configuration files +might not be installed properly on a host, or the Imake build procedure +might wrongly assume that all source files are in one big directory +tree, or the Imake configuration might assume one compiler whereas the +package or the installer needs to use another, or there might be a +version mismatch between the Imake expected by the package and the Imake +supported by the host. These problems are much rarer with Autoconf, +where each package comes with its own independent configuration +processor. + + +

    +Also, Imake often suffers from unexpected interactions between +make and the installer's C preprocessor. The fundamental problem +here is that the C preprocessor was designed to preprocess C programs, +not `Makefile's. This is much less of a problem with Autoconf, +which uses the general-purpose preprocessor m4, and where the +package's author (rather than the installer) does the preprocessing in a +standard way. +

    + +

    +Finally, Mark Eichin notes: + + + +

    +

    +Imake isn't all that extensible, either. In order to add new features to +Imake, you need to provide your own project template, and duplicate most +of the features of the existing one. This means that for a sophisticated +project, using the vendor-provided Imake templates fails to provide any +leverage--since they don't cover anything that your own project needs +(unless it is an X11 program). + + +

    +On the other side, though: + + +

    +The one advantage that Imake has over @command{configure}: +`Imakefile's tend to be much shorter (likewise, less redundant) +than `Makefile.in's. There is a fix to this, however--at least +for the Kerberos V5 tree, we've modified things to call in common +`post.in' and `pre.in' `Makefile' fragments for the +entire tree. This means that a lot of common things don't have to be +duplicated, even though they normally are in @command{configure} setups. +

    + + + +

    History of Autoconf

    + +

    +You may be wondering, Why was Autoconf originally written? How did it +get into its present form? (Why does it look like gorilla spit?) If +you're not wondering, then this chapter contains no information useful +to you, and you might as well skip it. If you are wondering, +then let there be light... + + + + +

    Genesis

    + +

    +In June 1991 I was maintaining many of the GNU utilities for the +Free Software Foundation. As they were ported to more platforms and +more programs were added, the number of @option{-D} options that users +had to select in the `Makefile' (around 20) became burdensome. +Especially for me--I had to test each new release on a bunch of +different systems. So I wrote a little shell script to guess some of +the correct settings for the fileutils package, and released it as part +of fileutils 2.0. That @command{configure} script worked well enough that +the next month I adapted it (by hand) to create similar @command{configure} +scripts for several other GNU utilities packages. Brian Berliner +also adapted one of my scripts for his CVS revision control system. + + +

    +Later that summer, I learned that Richard Stallman and Richard Pixley +were developing similar scripts to use in the GNU compiler tools; +so I adapted my @command{configure} scripts to support their evolving +interface: using the file name `Makefile.in' as the templates; +adding `+srcdir', the first option (of many); and creating +`config.status' files. + + + + +

    Exodus

    + +

    +As I got feedback from users, I incorporated many improvements, using +Emacs to search and replace, cut and paste, similar changes in each of +the scripts. As I adapted more GNU utilities packages to use +@command{configure} scripts, updating them all by hand became impractical. +Rich Murphey, the maintainer of the GNU graphics utilities, sent me +mail saying that the @command{configure} scripts were great, and asking if +I had a tool for generating them that I could send him. No, I thought, +but I should! So I started to work out how to generate them. And the +journey from the slavery of hand-written @command{configure} scripts to the +abundance and ease of Autoconf began. + + +

    +Cygnus @command{configure}, which was being developed at around that time, +is table driven; it is meant to deal mainly with a discrete number of +system types with a small number of mainly unguessable features (such as +details of the object file format). The automatic configuration system +that Brian Fox had developed for Bash takes a similar approach. For +general use, it seems to me a hopeless cause to try to maintain an +up-to-date database of which features each variant of each operating +system has. It's easier and more reliable to check for most features on +the fly--especially on hybrid systems that people have hacked on +locally or that have patches from vendors installed. + + +

    +I considered using an architecture similar to that of Cygnus +@command{configure}, where there is a single @command{configure} script that +reads pieces of `configure.in' when run. But I didn't want to have +to distribute all of the feature tests with every package, so I settled +on having a different @command{configure} made from each +`configure.in' by a preprocessor. That approach also offered more +control and flexibility. + + +

    +I looked briefly into using the Metaconfig package, by Larry Wall, +Harlan Stenn, and Raphael Manfredi, but I decided not to for several +reasons. The @command{Configure} scripts it produces are interactive, +which I find quite inconvenient; I didn't like the ways it checked for +some features (such as library functions); I didn't know that it was +still being maintained, and the @command{Configure} scripts I had +seen didn't work on many modern systems (such as System V R4 and NeXT); +it wasn't very flexible in what it could do in response to a feature's +presence or absence; I found it confusing to learn; and it was too big +and complex for my needs (I didn't realize then how much Autoconf would +eventually have to grow). + + +

    +I considered using Perl to generate my style of @command{configure} +scripts, but decided that M4 was better suited to the job of simple +textual substitutions: it gets in the way less, because output is +implicit. Plus, everyone already has it. (Initially I didn't rely on +the GNU extensions to M4.) Also, some of my friends at the +University of Maryland had recently been putting M4 front ends on +several programs, including tvtwm, and I was interested in trying +out a new language. + + + + +

    Leviticus

    + +

    +Since my @command{configure} scripts determine the system's capabilities +automatically, with no interactive user intervention, I decided to call +the program that generates them Autoconfig. But with a version number +tacked on, that name would be too long for old UNIX file systems, +so I shortened it to Autoconf. + + +

    +In the fall of 1991 I called together a group of fellow questers after +the Holy Grail of portability (er, that is, alpha testers) to give me +feedback as I encapsulated pieces of my handwritten scripts in M4 macros +and continued to add features and improve the techniques used in the +checks. Prominent among the testers were Fran@,cois Pinard, who came up +with the idea of making an `autoconf' shell script to run m4 +and check for unresolved macro calls; Richard Pixley, who suggested +running the compiler instead of searching the file system to find +include files and symbols, for more accurate results; Karl Berry, who +got Autoconf to configure TeX and added the macro index to the +documentation; and Ian Lance Taylor, who added support for creating a C +header file as an alternative to putting @option{-D} options in a +`Makefile', so he could use Autoconf for his UUCP package. +The alpha testers cheerfully adjusted their files again and again as the +names and calling conventions of the Autoconf macros changed from +release to release. They all contributed many specific checks, great +ideas, and bug fixes. + + + + +

    Numbers

    + +

    +In July 1992, after months of alpha testing, I released Autoconf 1.0, +and converted many GNU packages to use it. I was surprised by how +positive the reaction to it was. More people started using it than I +could keep track of, including people working on software that wasn't +part of the GNU Project (such as TCL, FSP, and Kerberos V5). +Autoconf continued to improve rapidly, as many people using the +@command{configure} scripts reported problems they encountered. + + +

    +Autoconf turned out to be a good torture test for M4 implementations. +UNIX m4 started to dump core because of the length of the +macros that Autoconf defined, and several bugs showed up in GNU +m4 as well. Eventually, we realized that we needed to use some +features that only GNU M4 has. 4.3BSD m4, in +particular, has an impoverished set of builtin macros; the System V +version is better, but still doesn't provide everything we need. + + +

    +More development occurred as people put Autoconf under more stresses +(and to uses I hadn't anticipated). Karl Berry added checks for X11. +david zuhn contributed C++ support. Fran@,cois Pinard made it diagnose +invalid arguments. Jim Blandy bravely coerced it into configuring +GNU Emacs, laying the groundwork for several later improvements. +Roland McGrath got it to configure the GNU C Library, wrote the +@command{autoheader} script to automate the creation of C header file +templates, and added a @option{--verbose} option to @command{configure}. +Noah Friedman added the @option{--autoconf-dir} option and +AC_MACRODIR environment variable. (He also coined the term +autoconfiscate to mean "adapt a software package to use +Autoconf".) Roland and Noah improved the quoting protection in +AC_DEFINE and fixed many bugs, especially when I got sick of +dealing with portability problems from February through June, 1993. + + + + +

    Deuteronomy

    + +

    +A long wish list for major features had accumulated, and the effect of +several years of patching by various people had left some residual +cruft. In April 1994, while working for Cygnus Support, I began a major +revision of Autoconf. I added most of the features of the Cygnus +@command{configure} that Autoconf had lacked, largely by adapting the +relevant parts of Cygnus @command{configure} with the help of david zuhn +and Ken Raeburn. These features include support for using +`config.sub', `config.guess', @option{--host}, and +@option{--target}; making links to files; and running @command{configure} +scripts in subdirectories. Adding these features enabled Ken to convert +GNU as, and Rob Savoye to convert DejaGNU, to using +Autoconf. + + +

    +I added more features in response to other peoples' requests. Many +people had asked for @command{configure} scripts to share the results of +the checks between runs, because (particularly when configuring a large +source tree, like Cygnus does) they were frustratingly slow. Mike +Haertel suggested adding site-specific initialization scripts. People +distributing software that had to unpack on MS-DOS asked for a way to +override the `.in' extension on the file names, which produced file +names like `config.h.in' containing two dots. Jim Avera did an +extensive examination of the problems with quoting in AC_DEFINE +and AC_SUBST; his insights led to significant improvements. +Richard Stallman asked that compiler output be sent to `config.log' +instead of `/dev/null', to help people debug the Emacs +@command{configure} script. + + +

    +I made some other changes because of my dissatisfaction with the quality +of the program. I made the messages showing results of the checks less +ambiguous, always printing a result. I regularized the names of the +macros and cleaned up coding style inconsistencies. I added some +auxiliary utilities that I had developed to help convert source code +packages to use Autoconf. With the help of Fran@,cois Pinard, I made +the macros not interrupt each others' messages. (That feature revealed +some performance bottlenecks in GNU m4, which he hastily +corrected!) I reorganized the documentation around problems people want +to solve. And I began a test suite, because experience had shown that +Autoconf has a pronounced tendency to regress when we change it. + + +

    +Again, several alpha testers gave invaluable feedback, especially +Fran@,cois Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn, +and Mark Eichin. + + +

    +Finally, version 2.0 was ready. And there was much rejoicing. (And I +have free time again. I think. Yeah, right.) + + + + +

    Copying This Manual

    + + + +

    GNU Free Documentation License

    + +

    + +Version 1.1, March 2000 + + + +

    +Copyright (C) 2000 Free Software Foundation, Inc.
    +59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + + +
      +
    1. + +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document free in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +
    2. + +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, +@acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML} designed +for human modification. Opaque formats include PostScript, +@acronym{PDF}, proprietary formats that can be read and edited only by +proprietary word processors, @acronym{SGML} or @acronym{XML} for which +the @acronym{DTD} and/or processing tools are not generally available, +and the machine-generated @acronym{HTML} produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +
    3. + +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +
    4. + +COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +
    5. + +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + + +
        +
      1. + +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
      2. + +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has less than five). + +
      3. + +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
      4. + +Preserve all the copyright notices of the Document. + +
      5. + +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
      6. + +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
      7. + +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +
      8. + +Include an unaltered copy of this License. + +
      9. + +Preserve the section entitled "History", and its title, and add to +it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section entitled "History" in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
      10. + +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the "History" section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
      11. + +In any section entitled "Acknowledgments" or "Dedications", +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgments +and/or dedications given therein. + +
      12. + +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
      13. + +Delete any section entitled "Endorsements". Such a section +may not be included in the Modified Version. + +
      14. + +Do not retitle any existing section as "Endorsements" +or to conflict in title with any Invariant Section. +
      + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +
    6. + +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgments", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + +
    7. + +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +
    8. + +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + +
    9. + +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + +
    10. + +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +
    11. + +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +
    + + + +

    ADDENDUM: How to use this License for your documents

    + +

    +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + + +

    +  Copyright (C)  year  your name.
    +  Permission is granted to copy, distribute and/or modify this document
    +  under the terms of the GNU Free Documentation License, Version 1.1
    +  or any later version published by the Free Software Foundation;
    +  with the Invariant Sections being list their titles, with the
    +  Front-Cover Texts being list, and with the Back-Cover Texts being list.
    +  A copy of the license is included in the section entitled ``GNU
    +  Free Documentation License''.
    +
    + +

    +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being list"; likewise for Back-Cover Texts. + + +

    +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + + + + +

    Indices

    + + + +

    Environment Variable Index

    + +

    +This is an alphabetical list of the environment variables that Autoconf +checks. + + +

    +Jump to: +c +- +i +- +l +- +n +- +p +- +r +- +s +- +w +

    +

    c

    + +
  • CDPATH +
  • CONFIG_COMMANDS +
  • CONFIG_FILES +
  • CONFIG_HEADERS +
  • CONFIG_LINKS +
  • CONFIG_SHELL +
  • CONFIG_SITE +
  • CONFIG_STATUS +
  • +

    i

    + +
  • IFS +
  • +

    l

    + +
  • LANG +
  • LANGUAGE +
  • LC_ALL +
  • LC_COLLATE +
  • LC_CTYPE +
  • LC_MESSAGES +
  • LC_NUMERIC +
  • LC_TIME +
  • LINENO +
  • +

    n

    + +
  • NULLCMD +
  • +

    p

    + +
  • PATH_SEPARATOR +
  • +

    r

    + +
  • RANDOM +
  • +

    s

    + +
  • SIMPLE_BACKUP_SUFFIX +
  • status +
  • +

    w

    + +
  • WARNINGS, WARNINGS, WARNINGS +
  • + + + + +

    Output Variable Index

    + +

    +This is an alphabetical list of the variables that Autoconf can +substitute into files that it creates, typically one or more +`Makefile's. See section Setting Output Variables, for more information +on how this is done. + + +

    +Jump to: +a +- +b +- +c +- +d +- +e +- +f +- +g +- +h +- +i +- +k +- +l +- +m +- +n +- +o +- +p +- +r +- +s +- +t +- +x +- +y +

    +

    a

    + +
  • abs_builddir +
  • abs_srcdir +
  • abs_top_builddir +
  • abs_top_srcdir +
  • ALLOCA +
  • AWK +
  • +

    b

    + +
  • bindir +
  • build +
  • build_alias +
  • build_cpu +
  • build_os +
  • build_vendor +
  • builddir +
  • +

    c

    + +
  • CC, CC, CC, CC +
  • CFLAGS, CFLAGS +
  • configure_input +
  • CPP +
  • CPPFLAGS +
  • cross_compiling +
  • CXX +
  • CXXCPP +
  • CXXFLAGS, CXXFLAGS +
  • +

    d

    + +
  • datadir +
  • DEFS +
  • +

    e

    + +
  • ECHO_C +
  • ECHO_N +
  • ECHO_T +
  • exec_prefix +
  • EXEEXT, EXEEXT +
  • +

    f

    + +
  • F77 +
  • FFLAGS, FFLAGS +
  • FLIBS +
  • +

    g

    + +
  • GETGROUPS_LIBS +
  • GETLOADAVG_LIBS +
  • +

    h

    + +
  • host +
  • host_alias +
  • host_cpu +
  • host_os +
  • host_vendor +
  • +

    i

    + +
  • includedir +
  • infodir +
  • INSTALL +
  • INSTALL_DATA +
  • INSTALL_PROGRAM +
  • INSTALL_SCRIPT +
  • +

    k

    + +
  • KMEM_GROUP +
  • +

    l

    + +
  • LDFLAGS +
  • LEX +
  • LEX_OUTPUT_ROOT +
  • LEXLIB +
  • libdir +
  • libexecdir +
  • LIBOBJS, LIBOBJS, LIBOBJS, LIBOBJS, LIBOBJS, LIBOBJS +
  • LIBS, LIBS, LIBS, LIBS +
  • LN_S +
  • localstatedir +
  • +

    m

    + +
  • mandir +
  • +

    n

    + +
  • NEED_SETGID +
  • +

    o

    + +
  • OBJEXT, OBJEXT +
  • oldincludedir +
  • +

    p

    + +
  • PACKAGE_BUGREPORT +
  • PACKAGE_NAME +
  • PACKAGE_STRING +
  • PACKAGE_TARNAME +
  • PACKAGE_VERSION +
  • POW_LIB +
  • prefix +
  • program_transform_name +
  • +

    r

    + +
  • RANLIB +
  • +

    s

    + +
  • sbindir +
  • SET_MAKE +
  • sharedstatedir +
  • srcdir +
  • subdirs +
  • sysconfdir +
  • +

    t

    + +
  • target +
  • target_alias +
  • target_cpu +
  • target_os +
  • target_vendor +
  • top_builddir +
  • top_srcdir +
  • +

    x

    + +
  • X_CFLAGS +
  • X_EXTRA_LIBS +
  • X_LIBS +
  • X_PRE_LIBS +
  • +

    y

    + +
  • YACC +
  • + + + + +

    Preprocessor Symbol Index

    + +

    +This is an alphabetical list of the C preprocessor symbols that the +Autoconf macros define. To work with Autoconf, C source code needs to +use these names in #if directives. + + +

    +Jump to: +_ +- +c +- +d +- +f +- +g +- +h +- +i +- +l +- +m +- +n +- +o +- +p +- +r +- +s +- +t +- +u +- +v +- +w +- +x +- +y +

    +

    _

    + +
  • __CHAR_UNSIGNED__ +
  • __PROTOTYPES +
  • _ALL_SOURCE +
  • _FILE_OFFSET_BITS +
  • _LARGE_FILES +
  • _LARGEFILE_SOURCE +
  • _MINIX +
  • _POSIX_1_SOURCE +
  • _POSIX_SOURCE +
  • _POSIX_VERSION +
  • +

    c

    + +
  • C_ALLOCA +
  • C_GETLOADAVG +
  • CLOSEDIR_VOID +
  • const +
  • +

    d

    + +
  • DGUX +
  • DIRENT +
  • +

    f

    + +
  • F77_DUMMY_MAIN +
  • F77_FUNC +
  • F77_FUNC_ +
  • F77_MAIN +
  • F77_NO_MINUS_C_MINUS_O +
  • +

    g

    + +
  • GETGROUPS_T +
  • GETLODAVG_PRIVILEGED +
  • GETPGRP_VOID +
  • gid_t +
  • GWINSZ_IN_SYS_IOCTL +
  • +

    h

    + +
  • HAVE_ALLOCA_H +
  • HAVE_CONFIG_H +
  • HAVE_DECL_STRERROR_R +
  • HAVE_DECL_symbol +
  • HAVE_DIRENT_H +
  • HAVE_DOPRNT +
  • HAVE_function +
  • HAVE_GETMNTENT +
  • HAVE_header +
  • HAVE_LONG_DOUBLE +
  • HAVE_LONG_FILE_NAMES +
  • HAVE_LSTAT_EMPTY_STRING_BUG +
  • HAVE_MMAP +
  • HAVE_NDIR_H +
  • HAVE_OBSTACK +
  • HAVE_RESTARTABLE_SYSCALLS +
  • HAVE_ST_BLKSIZE +
  • HAVE_ST_BLOCKS +
  • HAVE_ST_RDEV +
  • HAVE_STAT_EMPTY_STRING_BUG +
  • HAVE_STRCOLL +
  • HAVE_STRERROR_R +
  • HAVE_STRFTIME +
  • HAVE_STRINGIZE +
  • HAVE_STRNLEN +
  • HAVE_STRUCT_STAT_ST_BLKSIZE +
  • HAVE_STRUCT_STAT_ST_BLOCKS +
  • HAVE_STRUCT_STAT_ST_RDEV +
  • HAVE_SYS_DIR_H +
  • HAVE_SYS_NDIR_H +
  • HAVE_SYS_WAIT_H +
  • HAVE_TM_ZONE +
  • HAVE_TZNAME +
  • HAVE_UTIME_NULL +
  • HAVE_VFORK_H +
  • HAVE_VPRINTF +
  • HAVE_WAIT3 +
  • HAVE_WORKING_FORK +
  • HAVE_WORKING_VFORK +
  • +

    i

    + +
  • inline +
  • INT_16_BITS +
  • +

    l

    + +
  • LONG_64_BITS +
  • LSTAT_FOLLOWS_SLASHED_SYMLINK +
  • +

    m

    + +
  • MAJOR_IN_MKDEV +
  • MAJOR_IN_SYSMACROS +
  • mode_t +
  • +

    n

    + +
  • NDIR +
  • NEED_MEMORY_H +
  • NEED_SETGID +
  • NLIST_NAME_UNION +
  • NLIST_STRUCT +
  • NO_MINUS_C_MINUS_O +
  • +

    o

    + +
  • off_t +
  • +

    p

    + +
  • PACKAGE_BUGREPORT +
  • PACKAGE_NAME +
  • PACKAGE_STRING +
  • PACKAGE_TARNAME +
  • PACKAGE_VERSION +
  • PARAMS +
  • pid_t +
  • PROTOTYPES +
  • +

    r

    + +
  • RETSIGTYPE +
  • +

    s

    + +
  • SELECT_TYPE_ARG1 +
  • SELECT_TYPE_ARG234 +
  • SELECT_TYPE_ARG5 +
  • SETPGRP_VOID +
  • SETVBUF_REVERSED +
  • size_t +
  • STDC_HEADERS +
  • STRERROR_R_CHAR_P +
  • SVR4 +
  • SYS_SIGLIST_DECLARED +
  • SYSDIR +
  • SYSNDIR +
  • +

    t

    + +
  • TIME_WITH_SYS_TIME +
  • TM_IN_SYS_TIME +
  • +

    u

    + +
  • uid_t +
  • UMAX +
  • UMAX4_3 +
  • USG +
  • +

    v

    + +
  • vfork +
  • volatile +
  • +

    w

    + +
  • WORDS_BIGENDIAN +
  • +

    x

    + +
  • X_DISPLAY_MISSING +
  • +

    y

    + +
  • YYTEXT_POINTER +
  • + + + + +

    Autoconf Macro Index

    + +

    +This is an alphabetical list of the Autoconf macros. To make the list +easier to use, the macros are listed without their preceding `AC_'. + + +

    +Jump to: +a +- +b +- +c +- +d +- +e +- +f +- +g +- +h +- +i +- +l +- +m +- +o +- +p +- +r +- +s +- +t +- +u +- +v +- +w +- +x +- +y +

    +

    a

    + +
  • AH_BOTTOM +
  • AH_TEMPLATE +
  • AH_TOP +
  • AH_VERBATIM +
  • AIX +
  • ALLOCA +
  • ARG_ARRAY +
  • ARG_ENABLE +
  • ARG_PROGRAM +
  • ARG_VAR +
  • ARG_WITH +
  • AU_DEFUN +
  • +

    b

    + +
  • BEFORE +
  • BOTTOM +
  • +

    c

    + +
  • C_BIGENDIAN +
  • C_CHAR_UNSIGNED +
  • C_CONST +
  • C_CROSS +
  • C_INLINE +
  • C_LONG_DOUBLE +
  • C_PROTOTYPES +
  • C_STRINGIZE +
  • C_VOLATILE +
  • CACHE_CHECK +
  • CACHE_LOAD +
  • CACHE_SAVE +
  • CACHE_VAL +
  • CANONICAL_BUILD +
  • CANONICAL_HOST +
  • CANONICAL_SYSTEM +
  • CANONICAL_TARGET +
  • CHAR_UNSIGNED +
  • CHECK_DECL +
  • CHECK_DECLS +
  • CHECK_FILE +
  • CHECK_FILES +
  • CHECK_FUNC +
  • CHECK_FUNCS +
  • CHECK_HEADER +
  • CHECK_HEADERS +
  • CHECK_LIB +
  • CHECK_MEMBER +
  • CHECK_MEMBERS +
  • CHECK_PROG +
  • CHECK_PROGS +
  • CHECK_SIZEOF +
  • CHECK_TOOL +
  • CHECK_TOOLS +
  • CHECK_TYPE, CHECK_TYPE +
  • CHECK_TYPES +
  • CHECKING +
  • COMPILE_CHECK +
  • CONFIG_AUX_DIR +
  • CONFIG_COMMANDS +
  • CONFIG_FILES +
  • CONFIG_HEADERS +
  • CONFIG_LINKS +
  • CONFIG_SRCDIR +
  • CONFIG_SUBDIRS +
  • CONST +
  • COPYRIGHT +
  • CROSS_CHECK +
  • CYGWIN +
  • +

    d

    + +
  • DECL_SYS_SIGLIST +
  • DECL_YYTEXT +
  • DEFINE +
  • DEFINE_UNQUOTED +
  • DEFUN, DEFUN +
  • DIAGNOSE +
  • DIR_HEADER +
  • DYNIX_SEQ +
  • +

    e

    + +
  • EGREP_CPP +
  • EGREP_HEADER +
  • EMXOS2 +
  • ENABLE +
  • ERROR +
  • EXEEXT +
  • +

    f

    + +
  • F77_DUMMY_MAIN +
  • F77_FUNC +
  • F77_LIBRARY_LDFLAGS +
  • F77_MAIN +
  • F77_WRAPPERS +
  • FATAL +
  • FIND_X +
  • FIND_XTRA +
  • FUNC_ALLOCA +
  • FUNC_CHECK +
  • FUNC_CHOWN +
  • FUNC_CLOSEDIR_VOID +
  • FUNC_ERROR_AT_LINE +
  • FUNC_FNMATCH +
  • FUNC_FORK +
  • FUNC_FSEEKO +
  • FUNC_GETGROUPS +
  • FUNC_GETLOADAVG +
  • FUNC_GETMNTENT +
  • FUNC_GETPGRP +
  • FUNC_LSTAT +
  • FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK +
  • FUNC_MALLOC +
  • FUNC_MEMCMP +
  • FUNC_MKTIME +
  • FUNC_MMAP +
  • FUNC_OBSTACK +
  • FUNC_SELECT_ARGTYPES +
  • FUNC_SETPGRP +
  • FUNC_SETVBUF_REVERSED +
  • FUNC_STAT +
  • FUNC_STRCOLL +
  • FUNC_STRERROR_R +
  • FUNC_STRFTIME +
  • FUNC_STRNLEN +
  • FUNC_STRTOD +
  • FUNC_UTIME_NULL +
  • FUNC_VPRINTF +
  • FUNC_WAIT3 +
  • +

    g

    + +
  • GCC_TRADITIONAL +
  • GETGROUPS_T +
  • GETLOADAVG +
  • +

    h

    + +
  • HAVE_FUNCS +
  • HAVE_HEADERS +
  • HAVE_LIBRARY +
  • HAVE_POUNDBANG +
  • HEADER_CHECK +
  • HEADER_DIRENT +
  • HEADER_EGREP +
  • HEADER_MAJOR +
  • HEADER_STAT +
  • HEADER_STDC +
  • HEADER_SYS_WAIT +
  • HEADER_TIME +
  • HEADER_TIOCGWINSZ +
  • HELP_STRING +
  • +

    i

    + +
  • INIT, INIT +
  • INLINE +
  • INT_16_BITS +
  • IRIX_SUN +
  • ISC_POSIX +
  • +

    l

    + +
  • LANG_C +
  • LANG_CPLUSPLUS +
  • LANG_FORTRAN77 +
  • LANG_POP +
  • LANG_PUSH +
  • LANG_RESTORE +
  • LANG_SAVE +
  • LIBOBJ +
  • LIBSOURCE +
  • LIBSOURCES +
  • LINK_FILES +
  • LN_S +
  • LONG_64_BITS +
  • LONG_DOUBLE +
  • LONG_FILE_NAMES +
  • +

    m

    + +
  • MAJOR_HEADER +
  • MEMORY_H +
  • MINGW32 +
  • MINIX +
  • MINUS_C_MINUS_O +
  • MMAP +
  • MODE_T +
  • MSG_CHECKING +
  • MSG_ERROR +
  • MSG_NOTICE +
  • MSG_RESULT +
  • MSG_WARN +
  • +

    o

    + +
  • OBJEXT +
  • OBSOLETE +
  • OFF_T +
  • OUTPUT, OUTPUT +
  • OUTPUT_COMMANDS +
  • OUTPUT_COMMANDS_POST +
  • OUTPUT_COMMANDS_PRE +
  • +

    p

    + +
  • PACKAGE_BUGREPORT +
  • PACKAGE_NAME +
  • PACKAGE_STRING +
  • PACKAGE_TARNAME +
  • PACKAGE_VERSION +
  • PATH_PROG +
  • PATH_PROGS +
  • PATH_TOOL +
  • PATH_X +
  • PATH_XTRA +
  • PID_T +
  • PREFIX +
  • PREFIX_DEFAULT +
  • PREFIX_PROGRAM +
  • PREREQ +
  • PROG_AWK +
  • PROG_CC +
  • PROG_CC_C_O +
  • PROG_CC_STDC +
  • PROG_CPP +
  • PROG_CXX +
  • PROG_CXXCPP +
  • PROG_F77_C_O +
  • PROG_FORTRAN +
  • PROG_GCC_TRADITIONAL +
  • PROG_INSTALL +
  • PROG_LEX +
  • PROG_LN_S +
  • PROG_MAKE_SET +
  • PROG_RANLIB +
  • PROG_YACC +
  • PROGRAM_CHECK +
  • PROGRAM_EGREP +
  • PROGRAM_PATH +
  • PROGRAMS_CHECK +
  • PROGRAMS_PATH +
  • +

    r

    + +
  • REMOTE_TAPE +
  • REPLACE_FUNCS +
  • REQUIRE +
  • REQUIRE_CPP +
  • RESTARTABLE_SYSCALLS +
  • RETSIGTYPE +
  • REVISION +
  • RSH +
  • +

    s

    + +
  • SCO_INTL +
  • SEARCH_LIBS +
  • SET_MAKE +
  • SETVBUF_REVERSED +
  • SIZE_T +
  • SIZEOF_TYPE +
  • ST_BLKSIZE +
  • ST_BLOCKS +
  • ST_RDEV +
  • STAT_MACROS_BROKEN, STAT_MACROS_BROKEN +
  • STDC_HEADERS +
  • STRCOLL +
  • STRUCT_ST_BLKSIZE +
  • STRUCT_ST_BLOCKS +
  • STRUCT_ST_RDEV +
  • STRUCT_TIMEZONE +
  • STRUCT_TM +
  • SUBST +
  • SUBST_FILE +
  • SYS_INTERPRETER +
  • SYS_LARGEFILE +
  • SYS_LONG_FILE_NAMES +
  • SYS_POSIX_TERMIOS +
  • SYS_RESTARTABLE_SYSCALLS +
  • SYS_SIGLIST_DECLARED +
  • +

    t

    + +
  • TEMPLATE +
  • TEST_CPP +
  • TEST_PROGRAM +
  • TIME_WITH_SYS_TIME +
  • TIMEZONE +
  • TOP +
  • TRY_COMPILE +
  • TRY_CPP +
  • TRY_LINK +
  • TRY_LINK_FUNC +
  • TRY_RUN +
  • TYPE_GETGROUPS +
  • TYPE_MODE_T +
  • TYPE_OFF_T +
  • TYPE_PID_T +
  • TYPE_SIGNAL +
  • TYPE_SIZE_T +
  • TYPE_UID_T +
  • +

    u

    + +
  • UID_T +
  • UNISTD_H +
  • USG +
  • UTIME_NULL +
  • +

    v

    + +
  • VALIDATE_CACHED_SYSTEM_TUPLE +
  • VERBATIM +
  • VERBOSE +
  • VFORK +
  • VPRINTF +
  • +

    w

    + +
  • WAIT3 +
  • WARN +
  • WARNING +
  • WITH +
  • WORDS_BIGENDIAN +
  • +

    x

    + +
  • XENIX_DIR +
  • +

    y

    + +
  • YYTEXT_POINTER +
  • + + + + +

    M4 Macro Index

    + +

    +This is an alphabetical list of the M4, M4sugar, and M4sh macros. To +make the list easier to use, the macros are listed without their +preceding `m4_' or `AS_'. + + +

    +Jump to: +b +- +d +- +m +- +p +- +q +- +u +

    +

    b

    + +
  • bpatsubst +
  • bregexp +
  • +

    d

    + +
  • defn, defn +
  • DIRNAME +
  • dnl +
  • dquote +
  • +

    m

    + +
  • m4_exit +
  • m4_if +
  • m4_wrap +
  • +

    p

    + +
  • pattern_allow +
  • pattern_forbid +
  • +

    q

    + +
  • quote +
  • +

    u

    + +
  • undefine +
  • + + + + +

    Autotest Macro Index

    + +

    +This is an alphabetical list of the Autotest macros. To make the list +easier to use, the macros are listed without their preceding `AT_'. + + +

    +Jump to: +c +- +d +- +i +- +k +- +s +- +t +

    +

    c

    + +
  • CHECK +
  • CLEANUP +
  • +

    d

    + +
  • DATA +
  • +

    i

    + +
  • INIT +
  • +

    k

    + +
  • KEYWORDS +
  • +

    s

    + +
  • SETUP +
  • +

    t

    + +
  • TESTED +
  • + + + + +

    Program and Function Index

    + +

    +This is an alphabetical list of the programs and functions which +portability is discussed in this document. + + +

    +Jump to: +@ +- +a +- +c +- +e +- +f +- +g +- +l +- +m +- +s +- +u +- +v +

    +

    @

    + +
  • @command{!} +
  • @command{.} +
  • @command{/usr/xpg4/bin/sh} on Solaris +
  • @command{:} +
  • @command{awk} +
  • @command{break} +
  • @command{case} +
  • @command{cat} +
  • @command{cmp} +
  • @command{cp} +
  • @command{date} +
  • @command{diff} +
  • @command{dirname} +
  • @command{echo} +
  • @command{egrep} +
  • @command{exit} +
  • @command{export} +
  • @command{expr}, @command{expr} +
  • @command{expr} (`|') +
  • @command{false} +
  • @command{for} +
  • @command{grep} +
  • @command{if} +
  • @command{ln} +
  • @command{mv} +
  • @command{sed} +
  • @command{sed} (`t') +
  • @command{set} +
  • @command{shift} +
  • @command{source} +
  • @command{test} +
  • @command{touch} +
  • @command{trap} +
  • @command{true} +
  • @command{unset} +
  • +

    a

    + +
  • alloca +
  • +

    c

    + +
  • chown +
  • closedir +
  • +

    e

    + +
  • error_at_line +
  • +

    f

    + +
  • fnmatch +
  • fork +
  • fseeko +
  • +

    g

    + +
  • getgroups +
  • getloadavg +
  • getmntent +
  • getpgid +
  • getpgrp +
  • +

    l

    + +
  • lstat, lstat +
  • +

    m

    + +
  • malloc +
  • memcmp +
  • mktime +
  • mmap +
  • +

    s

    + +
  • select +
  • setpgrp +
  • setvbuf +
  • snprintf +
  • sprintf +
  • sscanf +
  • stat +
  • strcoll +
  • strerror_r +
  • strftime +
  • strnlen, strnlen +
  • strtod +
  • +

    u

    + +
  • unlink +
  • utime +
  • +

    v

    + +
  • va_copy +
  • va_list +
  • vfork +
  • vprintf +
  • vsnprintf +
  • vsprintf +
  • + + + + +

    Concept Index

    + +

    +This is an alphabetical list of the files, tools, and concepts +introduced in this document. + + +

    +Jump to: +" +- +$ +- +@ +- +` +- +a +- +b +- +c +- +d +- +e +- +f +- +h +- +i +- +l +- +m +- +o +- +p +- +q +- +r +- +s +- +t +- +u +- +v +- +z +

    +

    "

    + +
  • `"$@"' +
  • +

    $

    + +
  • $(commands) +
  • ${var:-value} +
  • ${var=expanded-value} +
  • ${var=literal} +
  • +

    @

    + +
  • `@%:@' +
  • `@&t@' +
  • `@:>@' +
  • `@<:@' +
  • @command{autoconf} +
  • @command{autoheader} +
  • @command{autoreconf} +
  • @command{autoscan} +
  • @command{autoupdate} +
  • @command{config.status} +
  • @command{config.sub} +
  • @command{configure}, @command{configure} +
  • @command{ifnames} +
  • @command{testsuite}, @command{testsuite} +
  • `@S|@' +
  • +

    `

    + +
  • `commands` +
  • +

    a

    + +
  • `acconfig.h' +
  • `aclocal.m4' +
  • Ash +
  • Autom4te Library +
  • `autom4te.cache' +
  • `autom4te.cfg' +
  • Automake +
  • Autotest +
  • AUTOTEST_PATH +
  • +

    b

    + +
  • Back trace, Back trace +
  • Bash +
  • Bash 2.05 and later +
  • +

    c

    + +
  • Cache +
  • Cache variable +
  • Cache, enabling +
  • Command Substitution +
  • `config.h' +
  • `config.h.bot' +
  • `config.h.in' +
  • `config.h.top' +
  • Configuration Header +
  • Configuration Header Template +
  • `configure.ac' +
  • `configure.in' +
  • Copyright Notice +
  • +

    d

    + +
  • Declaration, checking +
  • dnl, dnl +
  • +

    e

    + +
  • Endianness +
  • +

    f

    + +
  • FDL, GNU Free Documentation License +
  • File, checking +
  • Function, checking +
  • +

    h

    + +
  • Header, checking +
  • +

    i

    + +
  • Includes, default +
  • Instantiation +
  • +

    l

    + +
  • Language +
  • Library, checking +
  • Libtool +
  • Links +
  • +

    m

    + +
  • M4sugar +
  • Macro invocation stack, Macro invocation stack +
  • Messages, from @command{autoconf} +
  • Messages, from @command{configure} +
  • Moving open files +
  • +

    o

    + +
  • obstack +
  • +

    p

    + +
  • `package.m4' +
  • POSIX termios headers +
  • Previous Variable +
  • Programs, checking +
  • +

    q

    + +
  • QNX 4.25 +
  • quadrigraphs +
  • quotation, quotation +
  • +

    r

    + +
  • Revision +
  • +

    s

    + +
  • Structure, checking +
  • Symbolic links +
  • +

    t

    + +
  • termios POSIX headers +
  • test group +
  • +

    u

    + +
  • undefined macro: _m4_divert_diversion +
  • +

    v

    + +
  • Variable, Precious +
  • Version +
  • VPATH +
  • +

    z

    + +
  • Zsh +
  • + + +


    +This document was generated on 10 July 2002 using +texi2html 1.56k. + + Index: ossp-adm/autotools/bison.html RCS File: /v/ossp/cvs/ossp-adm/autotools/bison.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/bison.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/bison.html' 2>/dev/null --- ossp-adm/autotools/bison.html +++ - 2025-04-19 11:54:39.047489845 +0200 @@ -0,0 +1,7449 @@ + + + + +Bison 1.30 + + +

    Bison

    +

    The YACC-compatible Parser Generator

    +

    20 September 2001, Bison Version 1.30

    +
    by Charles Donnelly and Richard Stallman
    +

    +


    + + +

    Introduction

    +

    + + + +

    +Bison is a general-purpose parser generator that converts a +grammar description for an LALR(1) context-free grammar into a C +program to parse that grammar. Once you are proficient with Bison, +you may use it to develop a wide range of language parsers, from those +used in simple desk calculators to complex programming languages. + + +

    +Bison is upward compatible with Yacc: all properly-written Yacc grammars +ought to work with Bison with no change. Anyone familiar with Yacc +should be able to use Bison with little trouble. You need to be fluent in +C programming in order to use Bison or to understand this manual. + + +

    +We begin with tutorial chapters that explain the basic concepts of using +Bison and show three explained examples, each building on the last. If you +don't know Bison or Yacc, start by reading these chapters. Reference +chapters follow which describe specific aspects of Bison in detail. + + +

    +Bison was written primarily by Robert Corbett; Richard Stallman made it +Yacc-compatible. Wilfred Hansen of Carnegie Mellon University added +multi-character string literals and other features. + + +

    +This edition corresponds to version 1.30 of Bison. + + + + +

    Conditions for Using Bison

    + +

    +As of Bison version 1.24, we have changed the distribution terms for +yyparse to permit using Bison's output in nonfree programs. +Formerly, Bison parsers could be used only in programs that were free +software. + + +

    +The other GNU programming tools, such as the GNU C compiler, have never +had such a requirement. They could always be used for nonfree +software. The reason Bison was different was not due to a special +policy decision; it resulted from applying the usual General Public +License to all of the Bison source code. + + +

    +The output of the Bison utility--the Bison parser file--contains a +verbatim copy of a sizable piece of Bison, which is the code for the +yyparse function. (The actions from your grammar are inserted +into this function at one point, but the rest of the function is not +changed.) When we applied the GPL terms to the code for yyparse, +the effect was to restrict the use of Bison output to free software. + + +

    +We didn't change the terms because of sympathy for people who want to +make software proprietary. Software should be free. But we +concluded that limiting Bison's use to free software was doing little to +encourage people to make other software free. So we decided to make the +practical conditions for using Bison match the practical conditions for +using the other GNU tools. + + + + +

    GNU GENERAL PUBLIC LICENSE

    +

    +Version 2, June 1991 + + + +

    +Copyright (C) 1989, 1991 Free Software Foundation, Inc.
    +59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + + + +

    Preamble

    + +

    + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + +

    + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + +

    + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + +

    + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + +

    + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + +

    + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + +

    + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + +

    + The precise terms and conditions for copying, distribution and +modification follow. + + + + +

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    + + +
      +
    1. + +This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +
    2. + +You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +
    3. + +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + +
        +
      1. + +You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +
      2. + +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +
      3. + +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) +
      + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +
    4. + +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + +
        +
      1. + +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +
      2. + +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +
      3. + +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) +
      + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +
    5. + +You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +
    6. + +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +
    7. + +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +
    8. + +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +
    9. + +If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +
    10. + +The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +
    11. + +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + + +

      NO WARRANTY + +

    12. + +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +
    13. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +
    + + +

    END OF TERMS AND CONDITIONS

    + + + +

    Appendix: How to Apply These Terms to Your New Programs

    + +

    + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + +

    + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + +

    +one line to give the program's name and a brief idea of what it does.
    +Copyright (C) yyyy  name of author
    +
    +This program is free software; you can redistribute it and/or modify
    +it under the terms of the GNU General Public License as published by
    +the Free Software Foundation; either version 2 of the License, or
    +(at your option) any later version.
    +
    +This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRANTY; without even the implied warranty of
    +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +GNU General Public License for more details.
    +
    +You should have received a copy of the GNU General Public License
    +along with this program; if not, write to the Free Software
    +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    +
    + +

    +Also add information on how to contact you by electronic and paper mail. + + +

    +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + + +

    +Gnomovision version 69, Copyright (C) 19yy name of author
    +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +This is free software, and you are welcome to redistribute it
    +under certain conditions; type `show c' for details.
    +
    + +

    +The hypothetical commands `show w' and `show c' should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and +`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + + +

    +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + + +

    +Yoyodyne, Inc., hereby disclaims all copyright interest in the program
    +`Gnomovision' (which makes passes at compilers) written by James Hacker.
    +
    +signature of Ty Coon, 1 April 1989
    +Ty Coon, President of Vice
    +
    + +

    +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + + + +

    The Concepts of Bison

    + +

    +This chapter introduces many of the basic concepts without which the +details of Bison will not make sense. If you do not already know how to +use Bison or Yacc, we suggest you start by reading this chapter carefully. + + + + +

    Languages and Context-Free Grammars

    + +

    + + +In order for Bison to parse a language, it must be described by a +context-free grammar. This means that you specify one or more +syntactic groupings and give rules for constructing them from their +parts. For example, in the C language, one kind of grouping is called an +`expression'. One rule for making an expression might be, "An expression +can be made of a minus sign and another expression". Another would be, +"An expression can be an integer". As you can see, rules are often +recursive, but there must be at least one rule which leads out of the +recursion. + + +

    + + +The most common formal system for presenting such rules for humans to read +is Backus-Naur Form or "BNF", which was developed in order to +specify the language Algol 60. Any grammar expressed in BNF is a +context-free grammar. The input to Bison is essentially machine-readable +BNF. + + +

    +Not all context-free languages can be handled by Bison, only those +that are LALR(1). In brief, this means that it must be possible to +tell how to parse any portion of an input string with just a single +token of look-ahead. Strictly speaking, that is a description of an +LR(1) grammar, and LALR(1) involves additional restrictions that are +hard to explain simply; but it is rare in actual practice to find an +LR(1) grammar that fails to be LALR(1). See section Mysterious Reduce/Reduce Conflicts, for more information on this. + + +

    + + + + +In the formal grammatical rules for a language, each kind of syntactic unit +or grouping is named by a symbol. Those which are built by grouping +smaller constructs according to grammatical rules are called +nonterminal symbols; those which can't be subdivided are called +terminal symbols or token types. We call a piece of input +corresponding to a single terminal symbol a token, and a piece +corresponding to a single nonterminal symbol a grouping. + +

    +We can use the C language as an example of what symbols, terminal and +nonterminal, mean. The tokens of C are identifiers, constants (numeric and +string), and the various keywords, arithmetic operators and punctuation +marks. So the terminal symbols of a grammar for C include `identifier', +`number', `string', plus one symbol for each keyword, operator or +punctuation mark: `if', `return', `const', `static', `int', `char', +`plus-sign', `open-brace', `close-brace', `comma' and many more. (These +tokens can be subdivided into characters, but that is a matter of +lexicography, not grammar.) + + +

    +Here is a simple C function subdivided into tokens: + + + +

    +int             /* keyword `int' */
    +square (x)      /* identifier, open-paren, */
    +                /* identifier, close-paren */
    +     int x;     /* keyword `int', identifier, semicolon */
    +{               /* open-brace */
    +  return x * x; /* keyword `return', identifier, */
    +                /* asterisk, identifier, semicolon */
    +}               /* close-brace */
    +
    + +

    +The syntactic groupings of C include the expression, the statement, the +declaration, and the function definition. These are represented in the +grammar of C by nonterminal symbols `expression', `statement', +`declaration' and `function definition'. The full grammar uses dozens of +additional language constructs, each with its own nonterminal symbol, in +order to express the meanings of these four. The example above is a +function definition; it contains one declaration, and one statement. In +the statement, each `x' is an expression and so is `x * x'. + + +

    +Each nonterminal symbol must have grammatical rules showing how it is made +out of simpler constructs. For example, one kind of C statement is the +return statement; this would be described with a grammar rule which +reads informally as follows: + + + +

    +

    +A `statement' can be made of a `return' keyword, an `expression' and a +`semicolon'. +

    + +

    +There would be many other rules for `statement', one for each kind of +statement in C. + + +

    + +One nonterminal symbol must be distinguished as the special one which +defines a complete utterance in the language. It is called the start +symbol. In a compiler, this means a complete input program. In the C +language, the nonterminal symbol `sequence of definitions and declarations' +plays this role. + + +

    +For example, `1 + 2' is a valid C expression--a valid part of a C +program--but it is not valid as an entire C program. In the +context-free grammar of C, this follows from the fact that `expression' is +not the start symbol. + + +

    +The Bison parser reads a sequence of tokens as its input, and groups the +tokens using the grammar rules. If the input is valid, the end result is +that the entire token sequence reduces to a single grouping whose symbol is +the grammar's start symbol. If we use a grammar for C, the entire input +must be a `sequence of definitions and declarations'. If not, the parser +reports a syntax error. + + + + +

    From Formal Rules to Bison Input

    +

    + + + + + +

    +A formal grammar is a mathematical construct. To define the language +for Bison, you must write a file expressing the grammar in Bison syntax: +a Bison grammar file. See section Bison Grammar Files. + + +

    +A nonterminal symbol in the formal grammar is represented in Bison input +as an identifier, like an identifier in C. By convention, it should be +in lower case, such as expr, stmt or declaration. + + +

    +The Bison representation for a terminal symbol is also called a token +type. Token types as well can be represented as C-like identifiers. By +convention, these identifiers should be upper case to distinguish them from +nonterminals: for example, INTEGER, IDENTIFIER, IF or +RETURN. A terminal symbol that stands for a particular keyword in +the language should be named after that keyword converted to upper case. +The terminal symbol error is reserved for error recovery. +See section Symbols, Terminal and Nonterminal. + + +

    +A terminal symbol can also be represented as a character literal, just like +a C character constant. You should do this whenever a token is just a +single character (parenthesis, plus-sign, etc.): use that same character in +a literal as the terminal symbol for that token. + + +

    +A third way to represent a terminal symbol is with a C string constant +containing several characters. See section Symbols, Terminal and Nonterminal, for more information. + + +

    +The grammar rules also have an expression in Bison syntax. For example, +here is the Bison rule for a C return statement. The semicolon in +quotes is a literal character token, representing part of the C syntax for +the statement; the naked semicolon, and the colon, are Bison punctuation +used in every rule. + + + +

    +stmt:   RETURN expr ';'
    +        ;
    +
    + +

    +See section Syntax of Grammar Rules. + + + + +

    Semantic Values

    +

    + + + + +

    +A formal grammar selects tokens only by their classifications: for example, +if a rule mentions the terminal symbol `integer constant', it means that +any integer constant is grammatically valid in that position. The +precise value of the constant is irrelevant to how to parse the input: if +`x+4' is grammatical then `x+1' or `x+3989' is equally +grammatical. + +

    +But the precise value is very important for what the input means once it is +parsed. A compiler is useless if it fails to distinguish between 4, 1 and +3989 as constants in the program! Therefore, each token in a Bison grammar +has both a token type and a semantic value. See section Defining Language Semantics, +for details. + + +

    +The token type is a terminal symbol defined in the grammar, such as +INTEGER, IDENTIFIER or ','. It tells everything +you need to know to decide where the token may validly appear and how to +group it with other tokens. The grammar rules know nothing about tokens +except their types. + +

    +The semantic value has all the rest of the information about the +meaning of the token, such as the value of an integer, or the name of an +identifier. (A token such as ',' which is just punctuation doesn't +need to have any semantic value.) + + +

    +For example, an input token might be classified as token type +INTEGER and have the semantic value 4. Another input token might +have the same token type INTEGER but value 3989. When a grammar +rule says that INTEGER is allowed, either of these tokens is +acceptable because each is an INTEGER. When the parser accepts the +token, it keeps track of the token's semantic value. + + +

    +Each grouping can also have a semantic value as well as its nonterminal +symbol. For example, in a calculator, an expression typically has a +semantic value that is a number. In a compiler for a programming +language, an expression typically has a semantic value that is a tree +structure describing the meaning of the expression. + + + + +

    Semantic Actions

    +

    + + + + +

    +In order to be useful, a program must do more than parse input; it must +also produce some output based on the input. In a Bison grammar, a grammar +rule can have an action made up of C statements. Each time the +parser recognizes a match for that rule, the action is executed. +See section Actions. + + +

    +Most of the time, the purpose of an action is to compute the semantic value +of the whole construct from the semantic values of its parts. For example, +suppose we have a rule which says an expression can be the sum of two +expressions. When the parser recognizes such a sum, each of the +subexpressions has a semantic value which describes how it was built up. +The action for this rule should create a similar sort of value for the +newly recognized larger expression. + + +

    +For example, here is a rule that says an expression can be the sum of +two subexpressions: + + + +

    +expr: expr '+' expr   { $$ = $1 + $3; }
    +        ;
    +
    + +

    +The action says how to produce the semantic value of the sum expression +from the values of the two subexpressions. + + + + +

    Locations

    +

    + + + + + +

    +Many applications, like interpreters or compilers, have to produce verbose +and useful error messages. To achieve this, one must be able to keep track of +the textual position, or location, of each syntactic construct. +Bison provides a mechanism for handling these locations. + + +

    +Each token has a semantic value. In a similar fashion, each token has an +associated location, but the type of locations is the same for all tokens and +groupings. Moreover, the output parser is equipped with a default data +structure for storing locations (see section Tracking Locations, for more details). + + +

    +Like semantic values, locations can be reached in actions using a dedicated +set of constructs. In the example above, the location of the whole grouping +is @$, while the locations of the subexpressions are @1 and +@3. + + +

    +When a rule is matched, a default action is used to compute the semantic value +of its left hand side (see section Actions). In the same way, another default +action is used for locations. However, the action for locations is general +enough for most cases, meaning there is usually no need to describe for each +rule how @$ should be formed. When building a new location for a given +grouping, the default behavior of the output parser is to take the beginning +of the first symbol, and the end of the last symbol. + + + + +

    Bison Output: the Parser File

    +

    + + + + + + +

    +When you run Bison, you give it a Bison grammar file as input. The output +is a C source file that parses the language described by the grammar. +This file is called a Bison parser. Keep in mind that the Bison +utility and the Bison parser are two distinct programs: the Bison utility +is a program whose output is the Bison parser that becomes part of your +program. + + +

    +The job of the Bison parser is to group tokens into groupings according to +the grammar rules--for example, to build identifiers and operators into +expressions. As it does this, it runs the actions for the grammar rules it +uses. + + +

    +The tokens come from a function called the lexical analyzer that you +must supply in some fashion (such as by writing it in C). The Bison parser +calls the lexical analyzer each time it wants a new token. It doesn't know +what is "inside" the tokens (though their semantic values may reflect +this). Typically the lexical analyzer makes the tokens by parsing +characters of text, but Bison does not depend on this. See section The Lexical Analyzer Function yylex. + + +

    +The Bison parser file is C code which defines a function named +yyparse which implements that grammar. This function does not make +a complete C program: you must supply some additional functions. One is +the lexical analyzer. Another is an error-reporting function which the +parser calls to report an error. In addition, a complete C program must +start with a function called main; you have to provide this, and +arrange for it to call yyparse or the parser will never run. +See section Parser C-Language Interface. + + +

    +Aside from the token type names and the symbols in the actions you +write, all variable and function names used in the Bison parser file +begin with `yy' or `YY'. This includes interface functions +such as the lexical analyzer function yylex, the error reporting +function yyerror and the parser function yyparse itself. +This also includes numerous identifiers used for internal purposes. +Therefore, you should avoid using C identifiers starting with `yy' +or `YY' in the Bison grammar file except for the ones defined in +this manual. + + + + +

    Stages in Using Bison

    +

    + + + + +

    +The actual language-design process using Bison, from grammar specification +to a working compiler or interpreter, has these parts: + + + +

      +
    1. + +Formally specify the grammar in a form recognized by Bison +(see section Bison Grammar Files). For each grammatical rule in the language, +describe the action that is to be taken when an instance of that rule +is recognized. The action is described by a sequence of C statements. + +
    2. + +Write a lexical analyzer to process input and pass tokens to the +parser. The lexical analyzer may be written by hand in C +(see section The Lexical Analyzer Function yylex). It could also be produced using Lex, but the use +of Lex is not discussed in this manual. + +
    3. + +Write a controlling function that calls the Bison-produced parser. + +
    4. + +Write error-reporting routines. +
    + +

    +To turn this source code as written into a runnable program, you +must follow these steps: + + + +

      +
    1. + +Run Bison on the grammar to produce the parser. + +
    2. + +Compile the code output by Bison, as well as any other source files. + +
    3. + +Link the object files to produce the finished product. +
    + + + +

    The Overall Layout of a Bison Grammar

    +

    + + + + + + +

    +The input file for the Bison utility is a Bison grammar file. The +general form of a Bison grammar file is as follows: + + + +

    +%{
    +C declarations
    +%}
    +
    +Bison declarations
    +
    +%%
    +Grammar rules
    +%%
    +Additional C code
    +
    + +

    +The `%%', `%{' and `%}' are punctuation that appears +in every Bison grammar file to separate the sections. + + +

    +The C declarations may define types and variables used in the actions. +You can also use preprocessor commands to define macros used there, and use +#include to include header files that do any of these things. + + +

    +The Bison declarations declare the names of the terminal and nonterminal +symbols, and may also describe operator precedence and the data types of +semantic values of various symbols. + + +

    +The grammar rules define how to construct each nonterminal symbol from its +parts. + + +

    +The additional C code can contain any C code you want to use. Often the +definition of the lexical analyzer yylex goes here, plus subroutines +called by the actions in the grammar rules. In a simple program, all the +rest of the program can go here. + + + + +

    Examples

    +

    + + + + +

    +Now we show and explain three sample programs written using Bison: a +reverse polish notation calculator, an algebraic (infix) notation +calculator, and a multi-function calculator. All three have been tested +under BSD Unix 4.3; each produces a usable, though limited, interactive +desk-top calculator. + + +

    +These examples are simple, but Bison grammars for real programming +languages are written the same way. + + + + +

    Reverse Polish Notation Calculator

    +

    + + + + + + +

    +The first example is that of a simple double-precision reverse polish +notation calculator (a calculator using postfix operators). This example +provides a good starting point, since operator precedence is not an issue. +The second example will illustrate how operator precedence is handled. + + +

    +The source code for this calculator is named `rpcalc.y'. The +`.y' extension is a convention used for Bison input files. + + + + +

    Declarations for rpcalc

    + +

    +Here are the C and Bison declarations for the reverse polish notation +calculator. As in C, comments are placed between `/*...*/'. + + + +

    +/* Reverse polish notation calculator. */
    +
    +%{
    +#define YYSTYPE double
    +#include <math.h>
    +%}
    +
    +%token NUM
    +
    +%% /* Grammar rules and actions follow */
    +
    + +

    +The C declarations section (see section The C Declarations Section) contains two +preprocessor directives. + + +

    +The #define directive defines the macro YYSTYPE, thus +specifying the C data type for semantic values of both tokens and groupings +(see section Data Types of Semantic Values). The Bison parser will use whatever type +YYSTYPE is defined as; if you don't define it, int is the +default. Because we specify double, each token and each expression +has an associated value, which is a floating point number. + + +

    +The #include directive is used to declare the exponentiation +function pow. + + +

    +The second section, Bison declarations, provides information to Bison about +the token types (see section The Bison Declarations Section). Each terminal symbol that is +not a single-character literal must be declared here. (Single-character +literals normally don't need to be declared.) In this example, all the +arithmetic operators are designated by single-character literals, so the +only terminal symbol that needs to be declared is NUM, the token +type for numeric constants. + + + + +

    Grammar Rules for rpcalc

    + +

    +Here are the grammar rules for the reverse polish notation calculator. + + + +

    +input:    /* empty */
    +        | input line
    +;
    +
    +line:     '\n'
    +        | exp '\n'  { printf ("\t%.10g\n", $1); }
    +;
    +
    +exp:      NUM             { $$ = $1;         }
    +        | exp exp '+'     { $$ = $1 + $2;    }
    +        | exp exp '-'     { $$ = $1 - $2;    }
    +        | exp exp '*'     { $$ = $1 * $2;    }
    +        | exp exp '/'     { $$ = $1 / $2;    }
    +      /* Exponentiation */
    +        | exp exp '^'     { $$ = pow ($1, $2); }
    +      /* Unary minus    */
    +        | exp 'n'         { $$ = -$1;        }
    +;
    +%%
    +
    + +

    +The groupings of the rpcalc "language" defined here are the expression +(given the name exp), the line of input (line), and the +complete input transcript (input). Each of these nonterminal +symbols has several alternate rules, joined by the `|' punctuator +which is read as "or". The following sections explain what these rules +mean. + + +

    +The semantics of the language is determined by the actions taken when a +grouping is recognized. The actions are the C code that appears inside +braces. See section Actions. + + +

    +You must specify these actions in C, but Bison provides the means for +passing semantic values between the rules. In each action, the +pseudo-variable $$ stands for the semantic value for the grouping +that the rule is going to construct. Assigning a value to $$ is the +main job of most actions. The semantic values of the components of the +rule are referred to as $1, $2, and so on. + + + + +

    Explanation of input

    + +

    +Consider the definition of input: + + + +

    +input:    /* empty */
    +        | input line
    +;
    +
    + +

    +This definition reads as follows: "A complete input is either an empty +string, or a complete input followed by an input line". Notice that +"complete input" is defined in terms of itself. This definition is said +to be left recursive since input appears always as the +leftmost symbol in the sequence. See section Recursive Rules. + + +

    +The first alternative is empty because there are no symbols between the +colon and the first `|'; this means that input can match an +empty string of input (no tokens). We write the rules this way because it +is legitimate to type Ctrl-d right after you start the calculator. +It's conventional to put an empty alternative first and write the comment +`/* empty */' in it. + + +

    +The second alternate rule (input line) handles all nontrivial input. +It means, "After reading any number of lines, read one more line if +possible." The left recursion makes this rule into a loop. Since the +first alternative matches empty input, the loop can be executed zero or +more times. + + +

    +The parser function yyparse continues to process input until a +grammatical error is seen or the lexical analyzer says there are no more +input tokens; we will arrange for the latter to happen at end of file. + + + + +

    Explanation of line

    + +

    +Now consider the definition of line: + + + +

    +line:     '\n'
    +        | exp '\n'  { printf ("\t%.10g\n", $1); }
    +;
    +
    + +

    +The first alternative is a token which is a newline character; this means +that rpcalc accepts a blank line (and ignores it, since there is no +action). The second alternative is an expression followed by a newline. +This is the alternative that makes rpcalc useful. The semantic value of +the exp grouping is the value of $1 because the exp in +question is the first symbol in the alternative. The action prints this +value, which is the result of the computation the user asked for. + + +

    +This action is unusual because it does not assign a value to $$. As +a consequence, the semantic value associated with the line is +uninitialized (its value will be unpredictable). This would be a bug if +that value were ever used, but we don't use it: once rpcalc has printed the +value of the user's input line, that value is no longer needed. + + + + +

    Explanation of expr

    + +

    +The exp grouping has several rules, one for each kind of expression. +The first rule handles the simplest expressions: those that are just numbers. +The second handles an addition-expression, which looks like two expressions +followed by a plus-sign. The third handles subtraction, and so on. + + + +

    +exp:      NUM
    +        | exp exp '+'     { $$ = $1 + $2;    }
    +        | exp exp '-'     { $$ = $1 - $2;    }
    +        ...
    +        ;
    +
    + +

    +We have used `|' to join all the rules for exp, but we could +equally well have written them separately: + + + +

    +exp:      NUM ;
    +exp:      exp exp '+'     { $$ = $1 + $2;    } ;
    +exp:      exp exp '-'     { $$ = $1 - $2;    } ;
    +        ...
    +
    + +

    +Most of the rules have actions that compute the value of the expression in +terms of the value of its parts. For example, in the rule for addition, +$1 refers to the first component exp and $2 refers to +the second one. The third component, '+', has no meaningful +associated semantic value, but if it had one you could refer to it as +$3. When yyparse recognizes a sum expression using this +rule, the sum of the two subexpressions' values is produced as the value of +the entire expression. See section Actions. + + +

    +You don't have to give an action for every rule. When a rule has no +action, Bison by default copies the value of $1 into $$. +This is what happens in the first rule (the one that uses NUM). + + +

    +The formatting shown here is the recommended convention, but Bison does +not require it. You can add or change whitespace as much as you wish. +For example, this: + + + +

    +exp   : NUM | exp exp '+' {$$ = $1 + $2; } | ...
    +
    + +

    +means the same thing as this: + + + +

    +exp:      NUM
    +        | exp exp '+'    { $$ = $1 + $2; }
    +        | ...
    +
    + +

    +The latter, however, is much more readable. + + + + +

    The rpcalc Lexical Analyzer

    +

    + + + + +

    +The lexical analyzer's job is low-level parsing: converting characters or +sequences of characters into tokens. The Bison parser gets its tokens by +calling the lexical analyzer. See section The Lexical Analyzer Function yylex. + + +

    +Only a simple lexical analyzer is needed for the RPN calculator. This +lexical analyzer skips blanks and tabs, then reads in numbers as +double and returns them as NUM tokens. Any other character +that isn't part of a number is a separate token. Note that the token-code +for such a single-character token is the character itself. + + +

    +The return value of the lexical analyzer function is a numeric code which +represents a token type. The same text used in Bison rules to stand for +this token type is also a C expression for the numeric code for the type. +This works in two ways. If the token type is a character literal, then its +numeric code is the ASCII code for that character; you can use the same +character literal in the lexical analyzer to express the number. If the +token type is an identifier, that identifier is defined by Bison as a C +macro whose definition is the appropriate number. In this example, +therefore, NUM becomes a macro for yylex to use. + + +

    +The semantic value of the token (if it has one) is stored into the global +variable yylval, which is where the Bison parser will look for it. +(The C data type of yylval is YYSTYPE, which was defined +at the beginning of the grammar; see section Declarations for rpcalc.) + + +

    +A token type code of zero is returned if the end-of-file is encountered. +(Bison recognizes any nonpositive value as indicating the end of the +input.) + + +

    +Here is the code for the lexical analyzer: + + + +

    +/* Lexical analyzer returns a double floating point
    +   number on the stack and the token NUM, or the ASCII
    +   character read if not a number.  Skips all blanks
    +   and tabs, returns 0 for EOF. */
    +
    +#include <ctype.h>
    +
    +int
    +yylex (void)
    +{
    +  int c;
    +
    +  /* skip white space  */
    +  while ((c = getchar ()) == ' ' || c == '\t')
    +    ;
    +  /* process numbers   */
    +  if (c == '.' || isdigit (c))
    +    {
    +      ungetc (c, stdin);
    +      scanf ("%lf", &yylval);
    +      return NUM;
    +    }
    +  /* return end-of-file  */
    +  if (c == EOF)
    +    return 0;
    +  /* return single chars */
    +  return c;
    +}
    +
    + + + +

    The Controlling Function

    +

    + + + + +

    +In keeping with the spirit of this example, the controlling function is +kept to the bare minimum. The only requirement is that it call +yyparse to start the process of parsing. + + + +

    +int
    +main (void)
    +{
    +  return yyparse ();
    +}
    +
    + + + +

    The Error Reporting Routine

    +

    + + + +

    +When yyparse detects a syntax error, it calls the error reporting +function yyerror to print an error message (usually but not +always "parse error"). It is up to the programmer to supply +yyerror (see section Parser C-Language Interface), so +here is the definition we will use: + + + +

    +#include <stdio.h>
    +
    +void
    +yyerror (const char *s)  /* Called by yyparse on error */
    +{
    +  printf ("%s\n", s);
    +}
    +
    + +

    +After yyerror returns, the Bison parser may recover from the error +and continue parsing if the grammar contains a suitable error rule +(see section Error Recovery). Otherwise, yyparse returns nonzero. We +have not written any error rules in this example, so any invalid input will +cause the calculator program to exit. This is not clean behavior for a +real calculator, but it is adequate for the first example. + + + + +

    Running Bison to Make the Parser

    +

    + + + +

    +Before running Bison to produce a parser, we need to decide how to +arrange all the source code in one or more source files. For such a +simple example, the easiest thing is to put everything in one file. The +definitions of yylex, yyerror and main go at the +end, in the "additional C code" section of the file (see section The Overall Layout of a Bison Grammar). + + +

    +For a large project, you would probably have several source files, and use +make to arrange to recompile them. + + +

    +With all the source in a single file, you use the following command to +convert it into a parser file: + + + +

    +bison file_name.y
    +
    + +

    +In this example the file was called `rpcalc.y' (for "Reverse Polish +CALCulator"). Bison produces a file named `file_name.tab.c', +removing the `.y' from the original file name. The file output by +Bison contains the source code for yyparse. The additional +functions in the input file (yylex, yyerror and main) +are copied verbatim to the output. + + + + +

    Compiling the Parser File

    +

    + + + +

    +Here is how to compile and run the parser file: + + + +

    +# List files in current directory.
    +% ls
    +rpcalc.tab.c  rpcalc.y
    +
    +# Compile the Bison parser.
    +# `-lm' tells compiler to search math library for pow.
    +% cc rpcalc.tab.c -lm -o rpcalc
    +
    +# List files again.
    +% ls
    +rpcalc  rpcalc.tab.c  rpcalc.y
    +
    + +

    +The file `rpcalc' now contains the executable code. Here is an +example session using rpcalc. + + + +

    +% rpcalc
    +4 9 +
    +13
    +3 7 + 3 4 5 *+-
    +-13
    +3 7 + 3 4 5 * + - n              Note the unary minus, `n'
    +13
    +5 6 / 4 n +
    +-3.166666667
    +3 4 ^                            Exponentiation
    +81
    +^D                               End-of-file indicator
    +%
    +
    + + + +

    Infix Notation Calculator: calc

    +

    + + + + + +

    +We now modify rpcalc to handle infix operators instead of postfix. Infix +notation involves the concept of operator precedence and the need for +parentheses nested to arbitrary depth. Here is the Bison code for +`calc.y', an infix desk-top calculator. + + + +

    +/* Infix notation calculator--calc */
    +
    +%{
    +#define YYSTYPE double
    +#include <math.h>
    +%}
    +
    +/* BISON Declarations */
    +%token NUM
    +%left '-' '+'
    +%left '*' '/'
    +%left NEG     /* negation--unary minus */
    +%right '^'    /* exponentiation        */
    +
    +/* Grammar follows */
    +%%
    +input:    /* empty string */
    +        | input line
    +;
    +
    +line:     '\n'
    +        | exp '\n'  { printf ("\t%.10g\n", $1); }
    +;
    +
    +exp:      NUM                { $$ = $1;         }
    +        | exp '+' exp        { $$ = $1 + $3;    }
    +        | exp '-' exp        { $$ = $1 - $3;    }
    +        | exp '*' exp        { $$ = $1 * $3;    }
    +        | exp '/' exp        { $$ = $1 / $3;    }
    +        | '-' exp  %prec NEG { $$ = -$2;        }
    +        | exp '^' exp        { $$ = pow ($1, $3); }
    +        | '(' exp ')'        { $$ = $2;         }
    +;
    +%%
    +
    + +

    +The functions yylex, yyerror and main can be the +same as before. + + +

    +There are two important new features shown in this code. + + +

    +In the second section (Bison declarations), %left declares token +types and says they are left-associative operators. The declarations +%left and %right (right associativity) take the place of +%token which is used to declare a token type name without +associativity. (These tokens are single-character literals, which +ordinarily don't need to be declared. We declare them here to specify +the associativity.) + + +

    +Operator precedence is determined by the line ordering of the +declarations; the higher the line number of the declaration (lower on +the page or screen), the higher the precedence. Hence, exponentiation +has the highest precedence, unary minus (NEG) is next, followed +by `*' and `/', and so on. See section Operator Precedence. + + +

    +The other important new feature is the %prec in the grammar section +for the unary minus operator. The %prec simply instructs Bison that +the rule `| '-' exp' has the same precedence as NEG---in this +case the next-to-highest. See section Context-Dependent Precedence. + + +

    +Here is a sample run of `calc.y': + + + +

    +% calc
    +4 + 4.5 - (34/(8*3+-3))
    +6.880952381
    +-56 + 2
    +-54
    +3 ^ 2
    +9
    +
    + + + +

    Simple Error Recovery

    +

    + + + +

    +Up to this point, this manual has not addressed the issue of error +recovery---how to continue parsing after the parser detects a syntax +error. All we have handled is error reporting with yyerror. +Recall that by default yyparse returns after calling +yyerror. This means that an erroneous input line causes the +calculator program to exit. Now we show how to rectify this deficiency. + + +

    +The Bison language itself includes the reserved word error, which +may be included in the grammar rules. In the example below it has +been added to one of the alternatives for line: + + + +

    +line:     '\n'
    +        | exp '\n'   { printf ("\t%.10g\n", $1); }
    +        | error '\n' { yyerrok;                  }
    +;
    +
    + +

    +This addition to the grammar allows for simple error recovery in the +event of a parse error. If an expression that cannot be evaluated is +read, the error will be recognized by the third rule for line, +and parsing will continue. (The yyerror function is still called +upon to print its message as well.) The action executes the statement +yyerrok, a macro defined automatically by Bison; its meaning is +that error recovery is complete (see section Error Recovery). Note the +difference between yyerrok and yyerror; neither one is a +misprint. + +

    +This form of error recovery deals with syntax errors. There are other +kinds of errors; for example, division by zero, which raises an exception +signal that is normally fatal. A real calculator program must handle this +signal and use longjmp to return to main and resume parsing +input lines; it would also have to discard the rest of the current line of +input. We won't discuss this issue further because it is not specific to +Bison programs. + + + + +

    Location Tracking Calculator: ltcalc

    +

    + + + + + +

    +This example extends the infix notation calculator with location tracking. +This feature will be used to improve error reporting, and provide better +error messages. + + +

    +For the sake of clarity, we will switch for this example to an integer +calculator, since most of the work needed to use locations will be done +in the lexical analyser. + + + + +

    Declarations for ltcalc

    + +

    +The C and Bison declarations for the location tracking calculator are the same +as the declarations for the infix notation calculator. + + + +

    +/* Location tracking calculator.  */
    +
    +%{
    +#define YYSTYPE int
    +#include <math.h>
    +%}
    +
    +/* Bison declarations.  */
    +%token NUM
    +
    +%left '-' '+'
    +%left '*' '/'
    +%left NEG
    +%right '^'
    +
    +%% /* Grammar follows */
    +
    + +

    +In the code above, there are no declarations specific to locations. Defining +a data type for storing locations is not needed: we will use the type provided +by default (see section Data Type of Locations), which is a four +member structure with the following integer fields: first_line, +first_column, last_line and last_column. + + + + +

    Grammar Rules for ltcalc

    + +

    +Whether you choose to handle locations or not has no effect on the syntax of +your language. Therefore, grammar rules for this example will be very close to +those of the previous example: we will only modify them to benefit from the new +informations we will have. + + +

    +Here, we will use locations to report divisions by zero, and locate the wrong +expressions or subexpressions. + + + +

    +input   : /* empty */
    +        | input line
    +;
    +
    +line    : '\n'
    +        | exp '\n' { printf ("%d\n", $1); }
    +;
    +
    +exp     : NUM           { $$ = $1; }
    +        | exp '+' exp   { $$ = $1 + $3; }
    +        | exp '-' exp   { $$ = $1 - $3; }
    +        | exp '*' exp   { $$ = $1 * $3; }
    +        | exp '/' exp
    +            {
    +              if ($3)
    +                $$ = $1 / $3;
    +              else
    +                {
    +                  $$ = 1;
    +                  printf("Division by zero, l%d,c%d-l%d,c%d",
    +                         @3.first_line, @3.first_column,
    +                         @3.last_line, @3.last_column);
    +                }
    +            }
    +        | '-' exp %preg NEG     { $$ = -$2; }
    +        | exp '^' exp           { $$ = pow ($1, $3); }
    +        | '(' exp ')'           { $$ = $2; }
    +
    + +

    +This code shows how to reach locations inside of semantic actions, by +using the pseudo-variables @n for rule components, and the +pseudo-variable @$ for groupings. + + +

    +In this example, we never assign a value to @$, because the +output parser can do this automatically. By default, before executing +the C code of each action, @$ is set to range from the beginning +of @1 to the end of @n, for a rule with n +components. + + +

    +Of course, this behavior can be redefined (see section Default Action for Locations), and for very specific rules, +@$ can be computed by hand. + + + + +

    The ltcalc Lexical Analyzer.

    + +

    +Until now, we relied on Bison's defaults to enable location tracking. The next +step is to rewrite the lexical analyser, and make it able to feed the parser +with locations of tokens, as he already does for semantic values. + + +

    +To do so, we must take into account every single character of the input text, +to avoid the computed locations of being fuzzy or wrong: + + + +

    +int
    +yylex (void)
    +{
    +  int c;
    +
    +  /* skip white space */
    +  while ((c = getchar ()) == ' ' || c == '\t')
    +    ++yylloc.last_column;
    +
    +  /* step */
    +  yylloc.first_line = yylloc.last_line;
    +  yylloc.first_column = yylloc.last_column;
    +
    +  /* process numbers */
    +  if (isdigit (c))
    +    {
    +      yylval = c - '0';
    +      ++yylloc.last_column;
    +      while (isdigit (c = getchar ()))
    +        {
    +          ++yylloc.last_column;
    +          yylval = yylval * 10 + c - '0';
    +        }
    +      ungetc (c, stdin);
    +      return NUM;
    +    }
    +
    +  /* return end-of-file */
    +  if (c == EOF)
    +    return 0;
    +
    +  /* return single chars and update location */
    +  if (c == '\n')
    +    {
    +      ++yylloc.last_line;
    +      yylloc.last_column = 0;
    +    }
    +  else
    +    ++yylloc.last_column;
    +  return c;
    +}
    +
    + +

    +Basically, the lexical analyzer does the same processing as before: it skips +blanks and tabs, and reads numbers or single-character tokens. In addition +to this, it updates the yylloc global variable (of type YYLTYPE), +where the location of tokens is stored. + + +

    +Now, each time this function returns a token, the parser has it's number as +well as it's semantic value, and it's position in the text. The last needed +change is to initialize yylloc, for example in the controlling +function: + + + +

    +int
    +main (void)
    +{
    +  yylloc.first_line = yylloc.last_line = 1;
    +  yylloc.first_column = yylloc.last_column = 0;
    +  return yyparse ();
    +}
    +
    + +

    +Remember that computing locations is not a matter of syntax. Every character +must be associated to a location update, whether it is in valid input, in +comments, in literal strings, and so on... + + + + +

    Multi-Function Calculator: mfcalc

    +

    + + + + + +

    +Now that the basics of Bison have been discussed, it is time to move on to +a more advanced problem. The above calculators provided only five +functions, `+', `-', `*', `/' and `^'. It would +be nice to have a calculator that provides other mathematical functions such +as sin, cos, etc. + + +

    +It is easy to add new operators to the infix calculator as long as they are +only single-character literals. The lexical analyzer yylex passes +back all nonnumber characters as tokens, so new grammar rules suffice for +adding a new operator. But we want something more flexible: built-in +functions whose syntax has this form: + + + +

    +function_name (argument)
    +
    + +

    +At the same time, we will add memory to the calculator, by allowing you +to create named variables, store values in them, and use them later. +Here is a sample session with the multi-function calculator: + + + +

    +% mfcalc
    +pi = 3.141592653589
    +3.1415926536
    +sin(pi)
    +0.0000000000
    +alpha = beta1 = 2.3
    +2.3000000000
    +alpha
    +2.3000000000
    +ln(alpha)
    +0.8329091229
    +exp(ln(beta1))
    +2.3000000000
    +%
    +
    + +

    +Note that multiple assignment and nested function calls are permitted. + + + + +

    Declarations for mfcalc

    + +

    +Here are the C and Bison declarations for the multi-function calculator. + + + +

    +%{
    +#include <math.h>  /* For math functions, cos(), sin(), etc. */
    +#include "calc.h"  /* Contains definition of `symrec'        */
    +%}
    +%union {
    +double     val;  /* For returning numbers.                   */
    +symrec  *tptr;   /* For returning symbol-table pointers      */
    +}
    +
    +%token <val>  NUM        /* Simple double precision number   */
    +%token <tptr> VAR FNCT   /* Variable and Function            */
    +%type  <val>  exp
    +
    +%right '='
    +%left '-' '+'
    +%left '*' '/'
    +%left NEG     /* Negation--unary minus */
    +%right '^'    /* Exponentiation        */
    +
    +/* Grammar follows */
    +
    +%%
    +
    + +

    +The above grammar introduces only two new features of the Bison language. +These features allow semantic values to have various data types +(see section More Than One Value Type). + + +

    +The %union declaration specifies the entire list of possible types; +this is instead of defining YYSTYPE. The allowable types are now +double-floats (for exp and NUM) and pointers to entries in +the symbol table. See section The Collection of Value Types. + + +

    +Since values can now have various types, it is necessary to associate a +type with each grammar symbol whose semantic value is used. These symbols +are NUM, VAR, FNCT, and exp. Their +declarations are augmented with information about their data type (placed +between angle brackets). + + +

    +The Bison construct %type is used for declaring nonterminal symbols, +just as %token is used for declaring token types. We have not used +%type before because nonterminal symbols are normally declared +implicitly by the rules that define them. But exp must be declared +explicitly so we can specify its value type. See section Nonterminal Symbols. + + + + +

    Grammar Rules for mfcalc

    + +

    +Here are the grammar rules for the multi-function calculator. +Most of them are copied directly from calc; three rules, +those which mention VAR or FNCT, are new. + + + +

    +input:   /* empty */
    +        | input line
    +;
    +
    +line:
    +          '\n'
    +        | exp '\n'   { printf ("\t%.10g\n", $1); }
    +        | error '\n' { yyerrok;                  }
    +;
    +
    +exp:      NUM                { $$ = $1;                         }
    +        | VAR                { $$ = $1->value.var;              }
    +        | VAR '=' exp        { $$ = $3; $1->value.var = $3;     }
    +        | FNCT '(' exp ')'   { $$ = (*($1->value.fnctptr))($3); }
    +        | exp '+' exp        { $$ = $1 + $3;                    }
    +        | exp '-' exp        { $$ = $1 - $3;                    }
    +        | exp '*' exp        { $$ = $1 * $3;                    }
    +        | exp '/' exp        { $$ = $1 / $3;                    }
    +        | '-' exp  %prec NEG { $$ = -$2;                        }
    +        | exp '^' exp        { $$ = pow ($1, $3);               }
    +        | '(' exp ')'        { $$ = $2;                         }
    +;
    +/* End of grammar */
    +%%
    +
    + + + +

    The mfcalc Symbol Table

    +

    + + + +

    +The multi-function calculator requires a symbol table to keep track of the +names and meanings of variables and functions. This doesn't affect the +grammar rules (except for the actions) or the Bison declarations, but it +requires some additional C functions for support. + + +

    +The symbol table itself consists of a linked list of records. Its +definition, which is kept in the header `calc.h', is as follows. It +provides for either functions or variables to be placed in the table. + + + +

    +/* Fonctions type.                                   */
    +typedef double (*func_t) (double);
    +
    +/* Data type for links in the chain of symbols.      */
    +struct symrec
    +{
    +  char *name;  /* name of symbol                     */
    +  int type;    /* type of symbol: either VAR or FNCT */
    +  union
    +  {
    +    double var;                  /* value of a VAR   */
    +    func_t fnctptr;              /* value of a FNCT  */
    +  } value;
    +  struct symrec *next;    /* link field              */
    +};
    +
    +typedef struct symrec symrec;
    +
    +/* The symbol table: a chain of `struct symrec'.     */
    +extern symrec *sym_table;
    +
    +symrec *putsym (const char *, func_t);
    +symrec *getsym (const char *);
    +
    + +

    +The new version of main includes a call to init_table, a +function that initializes the symbol table. Here it is, and +init_table as well: + + + +

    +#include <stdio.h>
    +
    +int
    +main (void)
    +{
    +  init_table ();
    +  return yyparse ();
    +}
    +
    +void
    +yyerror (const char *s)  /* Called by yyparse on error */
    +{
    +  printf ("%s\n", s);
    +}
    +
    +struct init
    +{
    +  char *fname;
    +  double (*fnct)(double);
    +};
    +
    +struct init arith_fncts[] =
    +{
    +  "sin",  sin,
    +  "cos",  cos,
    +  "atan", atan,
    +  "ln",   log,
    +  "exp",  exp,
    +  "sqrt", sqrt,
    +  0, 0
    +};
    +
    +/* The symbol table: a chain of `struct symrec'.  */
    +symrec *sym_table = (symrec *) 0;
    +
    +/* Put arithmetic functions in table. */
    +void
    +init_table (void)
    +{
    +  int i;
    +  symrec *ptr;
    +  for (i = 0; arith_fncts[i].fname != 0; i++)
    +    {
    +      ptr = putsym (arith_fncts[i].fname, FNCT);
    +      ptr->value.fnctptr = arith_fncts[i].fnct;
    +    }
    +}
    +
    + +

    +By simply editing the initialization list and adding the necessary include +files, you can add additional functions to the calculator. + + +

    +Two important functions allow look-up and installation of symbols in the +symbol table. The function putsym is passed a name and the type +(VAR or FNCT) of the object to be installed. The object is +linked to the front of the list, and a pointer to the object is returned. +The function getsym is passed the name of the symbol to look up. If +found, a pointer to that symbol is returned; otherwise zero is returned. + + + +

    +symrec *
    +putsym (char *sym_name, int sym_type)
    +{
    +  symrec *ptr;
    +  ptr = (symrec *) malloc (sizeof (symrec));
    +  ptr->name = (char *) malloc (strlen (sym_name) + 1);
    +  strcpy (ptr->name,sym_name);
    +  ptr->type = sym_type;
    +  ptr->value.var = 0; /* set value to 0 even if fctn.  */
    +  ptr->next = (struct symrec *)sym_table;
    +  sym_table = ptr;
    +  return ptr;
    +}
    +
    +symrec *
    +getsym (const char *sym_name)
    +{
    +  symrec *ptr;
    +  for (ptr = sym_table; ptr != (symrec *) 0;
    +       ptr = (symrec *)ptr->next)
    +    if (strcmp (ptr->name,sym_name) == 0)
    +      return ptr;
    +  return 0;
    +}
    +
    + +

    +The function yylex must now recognize variables, numeric values, and +the single-character arithmetic operators. Strings of alphanumeric +characters with a leading non-digit are recognized as either variables or +functions depending on what the symbol table says about them. + + +

    +The string is passed to getsym for look up in the symbol table. If +the name appears in the table, a pointer to its location and its type +(VAR or FNCT) is returned to yyparse. If it is not +already in the table, then it is installed as a VAR using +putsym. Again, a pointer and its type (which must be VAR) is +returned to yyparse. + +

    +No change is needed in the handling of numeric values and arithmetic +operators in yylex. + + + +

    +#include <ctype.h>
    +
    +int
    +yylex (void)
    +{
    +  int c;
    +
    +  /* Ignore whitespace, get first nonwhite character.  */
    +  while ((c = getchar ()) == ' ' || c == '\t');
    +
    +  if (c == EOF)
    +    return 0;
    +
    +  /* Char starts a number => parse the number.         */
    +  if (c == '.' || isdigit (c))
    +    {
    +      ungetc (c, stdin);
    +      scanf ("%lf", &yylval.val);
    +      return NUM;
    +    }
    +
    +  /* Char starts an identifier => read the name.       */
    +  if (isalpha (c))
    +    {
    +      symrec *s;
    +      static char *symbuf = 0;
    +      static int length = 0;
    +      int i;
    +
    +      /* Initially make the buffer long enough
    +         for a 40-character symbol name.  */
    +      if (length == 0)
    +        length = 40, symbuf = (char *)malloc (length + 1);
    +
    +      i = 0;
    +      do
    +        {
    +          /* If buffer is full, make it bigger.        */
    +          if (i == length)
    +            {
    +              length *= 2;
    +              symbuf = (char *)realloc (symbuf, length + 1);
    +            }
    +          /* Add this character to the buffer.         */
    +          symbuf[i++] = c;
    +          /* Get another character.                    */
    +          c = getchar ();
    +        }
    +      while (c != EOF && isalnum (c));
    +
    +      ungetc (c, stdin);
    +      symbuf[i] = '\0';
    +
    +      s = getsym (symbuf);
    +      if (s == 0)
    +        s = putsym (symbuf, VAR);
    +      yylval.tptr = s;
    +      return s->type;
    +    }
    +
    +  /* Any other character is a token by itself.        */
    +  return c;
    +}
    +
    + +

    +This program is both powerful and flexible. You may easily add new +functions, and it is a simple job to modify this code to install predefined +variables such as pi or e as well. + + + + +

    Exercises

    +

    + + + + +

      +
    1. + +Add some new functions from `math.h' to the initialization list. + +
    2. + +Add another array that contains constants and their values. Then +modify init_table to add these constants to the symbol table. +It will be easiest to give the constants type VAR. + +
    3. + +Make the program report an error if the user refers to an +uninitialized variable in any way except to store a value in it. +
    + + + +

    Bison Grammar Files

    + +

    +Bison takes as input a context-free grammar specification and produces a +C-language function that recognizes correct instances of the grammar. + + +

    +The Bison grammar input file conventionally has a name ending in `.y'. +See section Invoking Bison. + + + + +

    Outline of a Bison Grammar

    + +

    +A Bison grammar file has four main sections, shown here with the +appropriate delimiters: + + + +

    +%{
    +C declarations
    +%}
    +
    +Bison declarations
    +
    +%%
    +Grammar rules
    +%%
    +
    +Additional C code
    +
    + +

    +Comments enclosed in `/* ... */' may appear in any of the sections. + + + + +

    The C Declarations Section

    +

    + + + + +

    +The C declarations section contains macro definitions and +declarations of functions and variables that are used in the actions in the +grammar rules. These are copied to the beginning of the parser file so +that they precede the definition of yyparse. You can use +`#include' to get the declarations from a header file. If you don't +need any C declarations, you may omit the `%{' and `%}' +delimiters that bracket this section. + + + + +

    The Bison Declarations Section

    +

    + + + + +

    +The Bison declarations section contains declarations that define +terminal and nonterminal symbols, specify precedence, and so on. +In some simple grammars you may not need any declarations. +See section Bison Declarations. + + + + +

    The Grammar Rules Section

    +

    + + + + +

    +The grammar rules section contains one or more Bison grammar +rules, and nothing else. See section Syntax of Grammar Rules. + + +

    +There must always be at least one grammar rule, and the first +`%%' (which precedes the grammar rules) may never be omitted even +if it is the first thing in the file. + + + + +

    The Additional C Code Section

    +

    + + + + +

    +The additional C code section is copied verbatim to the end of the +parser file, just as the C declarations section is copied to the +beginning. This is the most convenient place to put anything that you +want to have in the parser file but which need not come before the +definition of yyparse. For example, the definitions of +yylex and yyerror often go here. See section Parser C-Language Interface. + + +

    +If the last section is empty, you may omit the `%%' that separates it +from the grammar rules. + + +

    +The Bison parser itself contains many static variables whose names start +with `yy' and many macros whose names start with `YY'. It is a +good idea to avoid using any such names (except those documented in this +manual) in the additional C code section of the grammar file. + + + + +

    Symbols, Terminal and Nonterminal

    +

    + + + + + + +

    +Symbols in Bison grammars represent the grammatical classifications +of the language. + + +

    +A terminal symbol (also known as a token type) represents a +class of syntactically equivalent tokens. You use the symbol in grammar +rules to mean that a token in that class is allowed. The symbol is +represented in the Bison parser by a numeric code, and the yylex +function returns a token type code to indicate what kind of token has been +read. You don't need to know what the code value is; you can use the +symbol to stand for it. + + +

    +A nonterminal symbol stands for a class of syntactically equivalent +groupings. The symbol name is used in writing grammar rules. By convention, +it should be all lower case. + + +

    +Symbol names can contain letters, digits (not at the beginning), +underscores and periods. Periods make sense only in nonterminals. + + +

    +There are three ways of writing terminal symbols in the grammar: + + + +

    + +

    +How you choose to write a terminal symbol has no effect on its +grammatical meaning. That depends only on where it appears in rules and +on when the parser function returns that symbol. + + +

    +The value returned by yylex is always one of the terminal symbols +(or 0 for end-of-input). Whichever way you write the token type in the +grammar rules, you write it the same way in the definition of yylex. +The numeric code for a character token type is simply the ASCII code for +the character, so yylex can use the identical character constant to +generate the requisite code. Each named token type becomes a C macro in +the parser file, so yylex can use the name to stand for the code. +(This is why periods don't make sense in terminal symbols.) +See section Calling Convention for yylex. + + +

    +If yylex is defined in a separate file, you need to arrange for the +token-type macro definitions to be available there. Use the `-d' +option when you run Bison, so that it will write these macro definitions +into a separate header file `name.tab.h' which you can include +in the other source files that need it. See section Invoking Bison. + + +

    +The symbol error is a terminal symbol reserved for error recovery +(see section Error Recovery); you shouldn't use it for any other purpose. +In particular, yylex should never return this value. + + + + +

    Syntax of Grammar Rules

    +

    + + + + + +

    +A Bison grammar rule has the following general form: + + + +

    +result: components...
    +        ;
    +
    + +

    +where result is the nonterminal symbol that this rule describes, +and components are various terminal and nonterminal symbols that +are put together by this rule (see section Symbols, Terminal and Nonterminal). + + +

    +For example, + + + +

    +exp:      exp '+' exp
    +        ;
    +
    + +

    +says that two groupings of type exp, with a `+' token in between, +can be combined into a larger grouping of type exp. + + +

    +Whitespace in rules is significant only to separate symbols. You can add +extra whitespace as you wish. + + +

    +Scattered among the components can be actions that determine +the semantics of the rule. An action looks like this: + + + +

    +{C statements}
    +
    + +

    +Usually there is only one action and it follows the components. +See section Actions. + + +

    + +Multiple rules for the same result can be written separately or can +be joined with the vertical-bar character `|' as follows: + + + +

    +result:    rule1-components...
    +        | rule2-components...
    +        ...
    +        ;
    +
    + +

    +They are still considered distinct rules even when joined in this way. + + +

    +If components in a rule is empty, it means that result can +match the empty string. For example, here is how to define a +comma-separated sequence of zero or more exp groupings: + + + +

    +expseq:   /* empty */
    +        | expseq1
    +        ;
    +
    +expseq1:  exp
    +        | expseq1 ',' exp
    +        ;
    +
    + +

    +It is customary to write a comment `/* empty */' in each rule +with no components. + + + + +

    Recursive Rules

    +

    + + + +

    +A rule is called recursive when its result nonterminal appears +also on its right hand side. Nearly all Bison grammars need to use +recursion, because that is the only way to define a sequence of any number +of a particular thing. Consider this recursive definition of a +comma-separated sequence of one or more expressions: + + + +

    +expseq1:  exp
    +        | expseq1 ',' exp
    +        ;
    +
    + +

    + + +Since the recursive use of expseq1 is the leftmost symbol in the +right hand side, we call this left recursion. By contrast, here +the same construct is defined using right recursion: + + + +

    +expseq1:  exp
    +        | exp ',' expseq1
    +        ;
    +
    + +

    +Any kind of sequence can be defined using either left recursion or +right recursion, but you should always use left recursion, because it +can parse a sequence of any number of elements with bounded stack +space. Right recursion uses up space on the Bison stack in proportion +to the number of elements in the sequence, because all the elements +must be shifted onto the stack before the rule can be applied even +once. See section The Bison Parser Algorithm, for +further explanation of this. + + +

    + +Indirect or mutual recursion occurs when the result of the +rule does not appear directly on its right hand side, but does appear +in rules for other nonterminals which do appear on its right hand +side. + + +

    +For example: + + + +

    +expr:     primary
    +        | primary '+' primary
    +        ;
    +
    +primary:  constant
    +        | '(' expr ')'
    +        ;
    +
    + +

    +defines two mutually-recursive nonterminals, since each refers to the +other. + + + + +

    Defining Language Semantics

    +

    + + + + +

    +The grammar rules for a language determine only the syntax. The semantics +are determined by the semantic values associated with various tokens and +groupings, and by the actions taken when various groupings are recognized. + + +

    +For example, the calculator calculates properly because the value +associated with each expression is the proper number; it adds properly +because the action for the grouping `x + y' is to add +the numbers associated with x and y. + + + + +

    Data Types of Semantic Values

    +

    + + + + + + +

    +In a simple program it may be sufficient to use the same data type for +the semantic values of all language constructs. This was true in the +RPN and infix calculator examples (see section Reverse Polish Notation Calculator). + + +

    +Bison's default is to use type int for all semantic values. To +specify some other type, define YYSTYPE as a macro, like this: + + + +

    +#define YYSTYPE double
    +
    + +

    +This macro definition must go in the C declarations section of the grammar +file (see section Outline of a Bison Grammar). + + + + +

    More Than One Value Type

    + +

    +In most programs, you will need different data types for different kinds +of tokens and groupings. For example, a numeric constant may need type +int or long, while a string constant needs type char *, +and an identifier might need a pointer to an entry in the symbol table. + + +

    +To use more than one data type for semantic values in one parser, Bison +requires you to do two things: + + + +

    + + + +

    Actions

    +

    + + + + + +

    +An action accompanies a syntactic rule and contains C code to be executed +each time an instance of that rule is recognized. The task of most actions +is to compute a semantic value for the grouping built by the rule from the +semantic values associated with tokens or smaller groupings. + + +

    +An action consists of C statements surrounded by braces, much like a +compound statement in C. It can be placed at any position in the rule; it +is executed at that position. Most rules have just one action at the end +of the rule, following all the components. Actions in the middle of a rule +are tricky and used only for special purposes (see section Actions in Mid-Rule). + + +

    +The C code in an action can refer to the semantic values of the components +matched by the rule with the construct $n, which stands for +the value of the nth component. The semantic value for the grouping +being constructed is $$. (Bison translates both of these constructs +into array element references when it copies the actions into the parser +file.) + + +

    +Here is a typical example: + + + +

    +exp:    ...
    +        | exp '+' exp
    +            { $$ = $1 + $3; }
    +
    + +

    +This rule constructs an exp from two smaller exp groupings +connected by a plus-sign token. In the action, $1 and $3 +refer to the semantic values of the two component exp groupings, +which are the first and third symbols on the right hand side of the rule. +The sum is stored into $$ so that it becomes the semantic value of +the addition-expression just recognized by the rule. If there were a +useful semantic value associated with the `+' token, it could be +referred to as $2. + +

    + +If you don't specify an action for a rule, Bison supplies a default: +$$ = $1. Thus, the value of the first symbol in the rule becomes +the value of the whole rule. Of course, the default rule is valid only +if the two data types match. There is no meaningful default action for +an empty rule; every empty rule must have an explicit action unless the +rule's value does not matter. + + +

    +$n with n zero or negative is allowed for reference +to tokens and groupings on the stack before those that match the +current rule. This is a very risky practice, and to use it reliably +you must be certain of the context in which the rule is applied. Here +is a case in which you can use this reliably: + + + +

    +foo:      expr bar '+' expr  { ... }
    +        | expr bar '-' expr  { ... }
    +        ;
    +
    +bar:      /* empty */
    +        { previous_expr = $0; }
    +        ;
    +
    + +

    +As long as bar is used only in the fashion shown here, $0 +always refers to the expr which precedes bar in the +definition of foo. + + + + +

    Data Types of Values in Actions

    +

    + + + + +

    +If you have chosen a single data type for semantic values, the $$ +and $n constructs always have that data type. + + +

    +If you have used %union to specify a variety of data types, then you +must declare a choice among these types for each terminal or nonterminal +symbol that can have a semantic value. Then each time you use $$ or +$n, its data type is determined by which symbol it refers to +in the rule. In this example, + + +

    +exp:    ...
    +        | exp '+' exp
    +            { $$ = $1 + $3; }
    +
    + +

    +$1 and $3 refer to instances of exp, so they all +have the data type declared for the nonterminal symbol exp. If +$2 were used, it would have the data type declared for the +terminal symbol '+', whatever that might be. + +

    +Alternatively, you can specify the data type when you refer to the value, +by inserting `<type>' after the `$' at the beginning of the +reference. For example, if you have defined types as shown here: + + + +

    +%union {
    +  int itype;
    +  double dtype;
    +}
    +
    + +

    +then you can write $<itype>1 to refer to the first subunit of the +rule as an integer, or $<dtype>1 to refer to it as a double. + + + + +

    Actions in Mid-Rule

    +

    + + + + +

    +Occasionally it is useful to put an action in the middle of a rule. +These actions are written just like usual end-of-rule actions, but they +are executed before the parser even recognizes the following components. + + +

    +A mid-rule action may refer to the components preceding it using +$n, but it may not refer to subsequent components because +it is run before they are parsed. + + +

    +The mid-rule action itself counts as one of the components of the rule. +This makes a difference when there is another action later in the same rule +(and usually there is another at the end): you have to count the actions +along with the symbols when working out which number n to use in +$n. + + +

    +The mid-rule action can also have a semantic value. The action can set +its value with an assignment to $$, and actions later in the rule +can refer to the value using $n. Since there is no symbol +to name the action, there is no way to declare a data type for the value +in advance, so you must use the `$<...>n' construct to +specify a data type each time you refer to this value. + + +

    +There is no way to set the value of the entire rule with a mid-rule +action, because assignments to $$ do not have that effect. The +only way to set the value for the entire rule is with an ordinary action +at the end of the rule. + + +

    +Here is an example from a hypothetical compiler, handling a let +statement that looks like `let (variable) statement' and +serves to create a variable named variable temporarily for the +duration of statement. To parse this construct, we must put +variable into the symbol table while statement is parsed, then +remove it afterward. Here is how it is done: + + + +

    +stmt:   LET '(' var ')'
    +                { $<context>$ = push_context ();
    +                  declare_variable ($3); }
    +        stmt    { $$ = $6;
    +                  pop_context ($<context>5); }
    +
    + +

    +As soon as `let (variable)' has been recognized, the first +action is run. It saves a copy of the current semantic context (the +list of accessible variables) as its semantic value, using alternative +context in the data-type union. Then it calls +declare_variable to add the new variable to that list. Once the +first action is finished, the embedded statement stmt can be +parsed. Note that the mid-rule action is component number 5, so the +`stmt' is component number 6. + + +

    +After the embedded statement is parsed, its semantic value becomes the +value of the entire let-statement. Then the semantic value from the +earlier action is used to restore the prior list of variables. This +removes the temporary let-variable from the list so that it won't +appear to exist while the rest of the program is parsed. + + +

    +Taking action before a rule is completely recognized often leads to +conflicts since the parser must commit to a parse in order to execute the +action. For example, the following two rules, without mid-rule actions, +can coexist in a working parser because the parser can shift the open-brace +token and look at what follows before deciding whether there is a +declaration or not: + + + +

    +compound: '{' declarations statements '}'
    +        | '{' statements '}'
    +        ;
    +
    + +

    +But when we add a mid-rule action as follows, the rules become nonfunctional: + + + +

    +compound: { prepare_for_local_variables (); }
    +          '{' declarations statements '}'
    +        | '{' statements '}'
    +        ;
    +
    + +

    +Now the parser is forced to decide whether to run the mid-rule action +when it has read no farther than the open-brace. In other words, it +must commit to using one rule or the other, without sufficient +information to do it correctly. (The open-brace token is what is called +the look-ahead token at this time, since the parser is still +deciding what to do about it. See section Look-Ahead Tokens.) + + +

    +You might think that you could correct the problem by putting identical +actions into the two rules, like this: + + + +

    +compound: { prepare_for_local_variables (); }
    +          '{' declarations statements '}'
    +        | { prepare_for_local_variables (); }
    +          '{' statements '}'
    +        ;
    +
    + +

    +But this does not help, because Bison does not realize that the two actions +are identical. (Bison never tries to understand the C code in an action.) + + +

    +If the grammar is such that a declaration can be distinguished from a +statement by the first token (which is true in C), then one solution which +does work is to put the action after the open-brace, like this: + + + +

    +compound: '{' { prepare_for_local_variables (); }
    +          declarations statements '}'
    +        | '{' statements '}'
    +        ;
    +
    + +

    +Now the first token of the following declaration or statement, +which would in any case tell Bison which rule to use, can still do so. + + +

    +Another solution is to bury the action inside a nonterminal symbol which +serves as a subroutine: + + + +

    +subroutine: /* empty */
    +          { prepare_for_local_variables (); }
    +        ;
    +
    +compound: subroutine
    +          '{' declarations statements '}'
    +        | subroutine
    +          '{' statements '}'
    +        ;
    +
    + +

    +Now Bison can execute the action in the rule for subroutine without +deciding which rule for compound it will eventually use. Note that +the action is now at the end of its rule. Any mid-rule action can be +converted to an end-of-rule action in this way, and this is what Bison +actually does to implement mid-rule actions. + + + + +

    Tracking Locations

    +

    + + + + + +

    +Though grammar rules and semantic actions are enough to write a fully +functional parser, it can be useful to process some additionnal informations, +especially symbol locations. + + +

    +The way locations are handled is defined by providing a data type, and actions +to take when rules are matched. + + + + +

    Data Type of Locations

    +

    + + + + +

    +Defining a data type for locations is much simpler than for semantic values, +since all tokens and groupings always use the same type. + + +

    +The type of locations is specified by defining a macro called YYLTYPE. +When YYLTYPE is not defined, Bison uses a default structure type with +four members: + + + +

    +struct
    +{
    +  int first_line;
    +  int first_column;
    +  int last_line;
    +  int last_column;
    +}
    +
    + + + +

    Actions and Locations

    +

    + + + + + + +

    +Actions are not only useful for defining language semantics, but also for +describing the behavior of the output parser with locations. + + +

    +The most obvious way for building locations of syntactic groupings is very +similar to the way semantic values are computed. In a given rule, several +constructs can be used to access the locations of the elements being matched. +The location of the nth component of the right hand side is +@n, while the location of the left hand side grouping is +@$. + + +

    +Here is a basic example using the default data type for locations: + + + +

    +exp:    ...
    +        | exp '/' exp
    +            {
    +              @$.first_column = @1.first_column;
    +              @$.first_line = @1.first_line;
    +              @$.last_column = @3.last_column;
    +              @$.last_line = @3.last_line;
    +              if ($3)
    +                $$ = $1 / $3;
    +              else
    +                {
    +                  $$ = 1;
    +                  printf("Division by zero, l%d,c%d-l%d,c%d",
    +                         @3.first_line, @3.first_column,
    +                         @3.last_line, @3.last_column);
    +                }
    +            }
    +
    + +

    +As for semantic values, there is a default action for locations that is +run each time a rule is matched. It sets the beginning of @$ to the +beginning of the first symbol, and the end of @$ to the end of the +last symbol. + + +

    +With this default action, the location tracking can be fully automatic. The +example above simply rewrites this way: + + + +

    +exp:    ...
    +        | exp '/' exp
    +            {
    +              if ($3)
    +                $$ = $1 / $3;
    +              else
    +                {
    +                  $$ = 1;
    +                  printf("Division by zero, l%d,c%d-l%d,c%d",
    +                         @3.first_line, @3.first_column,
    +                         @3.last_line, @3.last_column);
    +                }
    +            }
    +
    + + + +

    Default Action for Locations

    +

    + + + +

    +Actually, actions are not the best place to compute locations. Since locations +are much more general than semantic values, there is room in the output parser +to redefine the default action to take for each rule. The +YYLLOC_DEFAULT macro is called each time a rule is matched, before the +associated action is run. + + +

    +Most of the time, this macro is general enough to suppress location +dedicated code from semantic actions. + + +

    +The YYLLOC_DEFAULT macro takes three parameters. The first one is +the location of the grouping (the result of the computation). The second one +is an array holding locations of all right hand side elements of the rule +being matched. The last one is the size of the right hand side rule. + + +

    +By default, it is defined this way: + + + +

    +#define YYLLOC_DEFAULT(Current, Rhs, N)         \
    +  Current.last_line   = Rhs[N].last_line;       \
    +  Current.last_column = Rhs[N].last_column;
    +
    + +

    +When defining YYLLOC_DEFAULT, you should consider that: + + + +

    + + + +

    Bison Declarations

    +

    + + + + +

    +The Bison declarations section of a Bison grammar defines the symbols +used in formulating the grammar and the data types of semantic values. +See section Symbols, Terminal and Nonterminal. + + +

    +All token type names (but not single-character literal tokens such as +'+' and '*') must be declared. Nonterminal symbols must be +declared if you need to specify which data type to use for the semantic +value (see section More Than One Value Type). + + +

    +The first rule in the file also specifies the start symbol, by default. +If you want some other symbol to be the start symbol, you must declare +it explicitly (see section Languages and Context-Free Grammars). + + + + +

    Token Type Names

    +

    + + + + + + +

    +The basic way to declare a token type name (terminal symbol) is as follows: + + + +

    +%token name
    +
    + +

    +Bison will convert this into a #define directive in +the parser, so that the function yylex (if it is in this file) +can use the name name to stand for this token type's code. + + +

    +Alternatively, you can use %left, %right, or +%nonassoc instead of %token, if you wish to specify +associativity and precedence. See section Operator Precedence. + + +

    +You can explicitly specify the numeric code for a token type by appending +an integer value in the field immediately following the token name: + + + +

    +%token NUM 300
    +
    + +

    +It is generally best, however, to let Bison choose the numeric codes for +all token types. Bison will automatically select codes that don't conflict +with each other or with ASCII characters. + + +

    +In the event that the stack type is a union, you must augment the +%token or other token declaration to include the data type +alternative delimited by angle-brackets (see section More Than One Value Type). + + +

    +For example: + + + +

    +%union {              /* define stack type */
    +  double val;
    +  symrec *tptr;
    +}
    +%token <val> NUM      /* define token NUM and its type */
    +
    + +

    +You can associate a literal string token with a token type name by +writing the literal string at the end of a %token +declaration which declares the name. For example: + + + +

    +%token arrow "=>"
    +
    + +

    +For example, a grammar for the C language might specify these names with +equivalent literal string tokens: + + + +

    +%token  <operator>  OR      "||"
    +%token  <operator>  LE 134  "<="
    +%left  OR  "<="
    +
    + +

    +Once you equate the literal string and the token name, you can use them +interchangeably in further declarations or the grammar rules. The +yylex function can use the token name or the literal string to +obtain the token type code number (see section Calling Convention for yylex). + + + + +

    Operator Precedence

    +

    + + + + + +

    +Use the %left, %right or %nonassoc declaration to +declare a token and specify its precedence and associativity, all at +once. These are called precedence declarations. +See section Operator Precedence, for general information on operator precedence. + + +

    +The syntax of a precedence declaration is the same as that of +%token: either + + + +

    +%left symbols...
    +
    + +

    +or + + + +

    +%left <type> symbols...
    +
    + +

    +And indeed any of these declarations serves the purposes of %token. +But in addition, they specify the associativity and relative precedence for +all the symbols: + + + +

    + + + +

    The Collection of Value Types

    +

    + + + + + +

    +The %union declaration specifies the entire collection of possible +data types for semantic values. The keyword %union is followed by a +pair of braces containing the same thing that goes inside a union in +C. + + +

    +For example: + + + +

    +%union {
    +  double val;
    +  symrec *tptr;
    +}
    +
    + +

    +This says that the two alternative types are double and symrec +*. They are given names val and tptr; these names are used +in the %token and %type declarations to pick one of the types +for a terminal or nonterminal symbol (see section Nonterminal Symbols). + + +

    +Note that, unlike making a union declaration in C, you do not write +a semicolon after the closing brace. + + + + +

    Nonterminal Symbols

    +

    + + + + + +

    +When you use %union to specify multiple value types, you must +declare the value type of each nonterminal symbol for which values are +used. This is done with a %type declaration, like this: + + + +

    +%type <type> nonterminal...
    +
    + +

    +Here nonterminal is the name of a nonterminal symbol, and type +is the name given in the %union to the alternative that you want +(see section The Collection of Value Types). You can give any number of nonterminal symbols in +the same %type declaration, if they have the same value type. Use +spaces to separate the symbol names. + + +

    +You can also declare the value type of a terminal symbol. To do this, +use the same <type> construction in a declaration for the +terminal symbol. All kinds of token declarations allow +<type>. + + + + +

    Suppressing Conflict Warnings

    +

    + + + + + + + +

    +Bison normally warns if there are any conflicts in the grammar +(see section Shift/Reduce Conflicts), but most real grammars have harmless shift/reduce +conflicts which are resolved in a predictable way and would be difficult to +eliminate. It is desirable to suppress the warning about these conflicts +unless the number of conflicts changes. You can do this with the +%expect declaration. + + +

    +The declaration looks like this: + + + +

    +%expect n
    +
    + +

    +Here n is a decimal integer. The declaration says there should be no +warning if there are n shift/reduce conflicts and no reduce/reduce +conflicts. The usual warning is given if there are either more or fewer +conflicts, or if there are any reduce/reduce conflicts. + + +

    +In general, using %expect involves these steps: + + + +

    + +

    +Now Bison will stop annoying you about the conflicts you have checked, but +it will warn you again if changes in the grammar result in additional +conflicts. + + + + +

    The Start-Symbol

    +

    + + + + + + +

    +Bison assumes by default that the start symbol for the grammar is the first +nonterminal specified in the grammar specification section. The programmer +may override this restriction with the %start declaration as follows: + + + +

    +%start symbol
    +
    + + + +

    A Pure (Reentrant) Parser

    +

    + + + + + +

    +A reentrant program is one which does not alter in the course of +execution; in other words, it consists entirely of pure (read-only) +code. Reentrancy is important whenever asynchronous execution is possible; +for example, a non-reentrant program may not be safe to call from a signal +handler. In systems with multiple threads of control, a non-reentrant +program must be called only within interlocks. + + +

    +Normally, Bison generates a parser which is not reentrant. This is +suitable for most uses, and it permits compatibility with YACC. (The +standard YACC interfaces are inherently nonreentrant, because they use +statically allocated variables for communication with yylex, +including yylval and yylloc.) + + +

    +Alternatively, you can generate a pure, reentrant parser. The Bison +declaration %pure_parser says that you want the parser to be +reentrant. It looks like this: + + + +

    +%pure_parser
    +
    + +

    +The result is that the communication variables yylval and +yylloc become local variables in yyparse, and a different +calling convention is used for the lexical analyzer function +yylex. See section Calling Conventions for Pure Parsers, for the details of this. The variable yynerrs also +becomes local in yyparse (see section The Error Reporting Function yyerror). The convention for calling +yyparse itself is unchanged. + + +

    +Whether the parser is pure has nothing to do with the grammar rules. +You can generate either a pure parser or a nonreentrant parser from any +valid grammar. + + + + +

    Bison Declaration Summary

    +

    + + + + + +

    +Here is a summary of all Bison declarations: + + +

    + +
    %union +
    +Declare the collection of data types that semantic values may have +(see section The Collection of Value Types). + +
    %token +
    +Declare a terminal symbol (token type name) with no precedence +or associativity specified (see section Token Type Names). + +
    %right +
    +Declare a terminal symbol (token type name) that is right-associative +(see section Operator Precedence). + +
    %left +
    +Declare a terminal symbol (token type name) that is left-associative +(see section Operator Precedence). + +
    %nonassoc +
    +Declare a terminal symbol (token type name) that is nonassociative +(using it in a way that would be associative is a syntax error) +(see section Operator Precedence). + +
    %type +
    +Declare the type of semantic values for a nonterminal symbol +(see section Nonterminal Symbols). + +
    %start +
    +Specify the grammar's start symbol (see section The Start-Symbol). + +
    %expect +
    +Declare the expected number of shift-reduce conflicts +(see section Suppressing Conflict Warnings). + +
    %yacc +
    +
    %fixed_output_files +
    +Pretend the option @option{--yacc} was given, i.e., imitate Yacc, +including its naming conventions. See section Bison Options, for more. + +
    %locations +
    +Generate the code processing the locations (see section Special Features for Use in Actions). This mode is enabled as soon as +the grammar uses the special `@n' tokens, but if your +grammar does not use it, using `%locations' allows for more +accurate parse error messages. + +
    %pure_parser +
    +Request a pure (reentrant) parser program (see section A Pure (Reentrant) Parser). + +
    %no_parser +
    +Do not include any C code in the parser file; generate tables only. The +parser file contains just #define directives and static variable +declarations. + +This option also tells Bison to write the C code for the grammar actions +into a file named `filename.act', in the form of a +brace-surrounded body fit for a switch statement. + +
    %no_lines +
    +Don't generate any #line preprocessor commands in the parser +file. Ordinarily Bison writes these commands in the parser file so that +the C compiler and debuggers will associate errors and object code with +your source file (the grammar file). This directive causes them to +associate errors with the parser file, treating it an independent source +file in its own right. + +
    %debug +
    +Output a definition of the macro YYDEBUG into the parser file, so +that the debugging facilities are compiled. See section Debugging Your Parser. + +
    %defines +
    +Write an extra output file containing macro definitions for the token +type names defined in the grammar and the semantic value type +YYSTYPE, as well as a few extern variable declarations. + +If the parser output file is named `name.c' then this file +is named `name.h'. +This output file is essential if you wish to put the definition of +yylex in a separate source file, because yylex needs to +be able to refer to token type codes and the variable +yylval. See section Semantic Values of Tokens. +
    %verbose +
    +Write an extra output file containing verbose descriptions of the +parser states and what is done for each type of look-ahead token in +that state. + +This file also describes all the conflicts, both those resolved by +operator precedence and the unresolved ones. + +The file's name is made by removing `.tab.c' or `.c' from +the parser output file name, and adding `.output' instead. +Therefore, if the input file is `foo.y', then the parser file is +called `foo.tab.c' by default. As a consequence, the verbose +output file is called `foo.output'. +
    %token_table +
    +Generate an array of token names in the parser file. The name of the +array is yytname; yytname[i] is the name of the +token whose internal Bison token code number is i. The first three +elements of yytname are always "$", "error", and +"$illegal"; after these come the symbols defined in the grammar +file. + +For single-character literal tokens and literal string tokens, the name +in the table includes the single-quote or double-quote characters: for +example, "'+'" is a single-character literal and "\"<=\"" +is a literal string token. All the characters of the literal string +token appear verbatim in the string found in the table; even +double-quote characters are not escaped. For example, if the token +consists of three characters `*"*', its string in yytname +contains `"*"*"'. (In C, that would be written as +"\"*\"*\""). + +When you specify %token_table, Bison also generates macro +definitions for macros YYNTOKENS, YYNNTS, and +YYNRULES, and YYNSTATES: + +
    + +
    YYNTOKENS +
    +The highest token number, plus one. +
    YYNNTS +
    +The number of nonterminal symbols. +
    YYNRULES +
    +The number of grammar rules, +
    YYNSTATES +
    +The number of parser states (see section Parser States). +
    +
    + + + +

    Multiple Parsers in the Same Program

    + +

    +Most programs that use Bison parse only one language and therefore contain +only one Bison parser. But what if you want to parse more than one +language with the same program? Then you need to avoid a name conflict +between different definitions of yyparse, yylval, and so on. + + +

    +The easy way to do this is to use the option `-p prefix' +(see section Invoking Bison). This renames the interface functions and +variables of the Bison parser to start with prefix instead of +`yy'. You can use this to give each parser distinct names that do +not conflict. + + +

    +The precise list of symbols renamed is yyparse, yylex, +yyerror, yynerrs, yylval, yychar and +yydebug. For example, if you use `-p c', the names become +cparse, clex, and so on. + + +

    +All the other variables and macros associated with Bison are not +renamed. These others are not global; there is no conflict if the same +name is used in different parsers. For example, YYSTYPE is not +renamed, but defining this in different ways in different parsers causes +no trouble (see section Data Types of Semantic Values). + + +

    +The `-p' option works by adding macro definitions to the beginning +of the parser source file, defining yyparse as +prefixparse, and so on. This effectively substitutes one +name for the other in the entire parser file. + + + + +

    Parser C-Language Interface

    +

    + + + + +

    +The Bison parser is actually a C function named yyparse. Here we +describe the interface conventions of yyparse and the other +functions that it needs to use. + + +

    +Keep in mind that the parser uses many C identifiers starting with +`yy' and `YY' for internal purposes. If you use such an +identifier (aside from those in this manual) in an action or in additional +C code in the grammar file, you are likely to run into trouble. + + + + +

    The Parser Function yyparse

    +

    + + + +

    +You call the function yyparse to cause parsing to occur. This +function reads tokens, executes actions, and ultimately returns when it +encounters end-of-input or an unrecoverable syntax error. You can also +write an action which directs yyparse to return immediately +without reading further. + + +

    +The value returned by yyparse is 0 if parsing was successful (return +is due to end-of-input). + + +

    +The value is 1 if parsing failed (return is due to a syntax error). + + +

    +In an action, you can cause immediate return from yyparse by using +these macros: + + +

    + +
    YYACCEPT +
    + +Return immediately with value 0 (to report success). + +
    YYABORT +
    + +Return immediately with value 1 (to report failure). +
    + + + +

    The Lexical Analyzer Function yylex

    +

    + + + + +

    +The lexical analyzer function, yylex, recognizes tokens from +the input stream and returns them to the parser. Bison does not create +this function automatically; you must write it so that yyparse can +call it. The function is sometimes referred to as a lexical scanner. + + +

    +In simple programs, yylex is often defined at the end of the Bison +grammar file. If yylex is defined in a separate source file, you +need to arrange for the token-type macro definitions to be available there. +To do this, use the `-d' option when you run Bison, so that it will +write these macro definitions into a separate header file +`name.tab.h' which you can include in the other source files +that need it. See section Invoking Bison. + + + +

    Calling Convention for yylex

    + +

    +The value that yylex returns must be the numeric code for the type +of token it has just found, or 0 for end-of-input. + + +

    +When a token is referred to in the grammar rules by a name, that name +in the parser file becomes a C macro whose definition is the proper +numeric code for that token type. So yylex can use the name +to indicate that type. See section Symbols, Terminal and Nonterminal. + + +

    +When a token is referred to in the grammar rules by a character literal, +the numeric code for that character is also the code for the token type. +So yylex can simply return that character code. The null character +must not be used this way, because its code is zero and that is what +signifies end-of-input. + + +

    +Here is an example showing these things: + + + +

    +int
    +yylex (void)
    +{
    +  ...
    +  if (c == EOF)     /* Detect end of file. */
    +    return 0;
    +  ...
    +  if (c == '+' || c == '-')
    +    return c;      /* Assume token type for `+' is '+'. */
    +  ...
    +  return INT;      /* Return the type of the token. */
    +  ...
    +}
    +
    + +

    +This interface has been designed so that the output from the lex +utility can be used without change as the definition of yylex. + + +

    +If the grammar uses literal string tokens, there are two ways that +yylex can determine the token type codes for them: + + + +

    + + + +

    Semantic Values of Tokens

    + +

    + +In an ordinary (non-reentrant) parser, the semantic value of the token must +be stored into the global variable yylval. When you are using +just one data type for semantic values, yylval has that type. +Thus, if the type is int (the default), you might write this in +yylex: + + + +

    +  ...
    +  yylval = value;  /* Put value onto Bison stack. */
    +  return INT;      /* Return the type of the token. */
    +  ...
    +
    + +

    +When you are using multiple data types, yylval's type is a union +made from the %union declaration (see section The Collection of Value Types). So when +you store a token's value, you must use the proper member of the union. +If the %union declaration looks like this: + + + +

    +%union {
    +  int intval;
    +  double val;
    +  symrec *tptr;
    +}
    +
    + +

    +then the code in yylex might look like this: + + + +

    +  ...
    +  yylval.intval = value; /* Put value onto Bison stack. */
    +  return INT;          /* Return the type of the token. */
    +  ...
    +
    + + + +

    Textual Positions of Tokens

    + +

    + +If you are using the `@n'-feature (see section Tracking Locations) in actions to keep track of the +textual locations of tokens and groupings, then you must provide this +information in yylex. The function yyparse expects to +find the textual location of a token just parsed in the global variable +yylloc. So yylex must store the proper data in that +variable. + + +

    +By default, the value of yylloc is a structure and you need only +initialize the members that are going to be used by the actions. The +four members are called first_line, first_column, +last_line and last_column. Note that the use of this +feature makes the parser noticeably slower. + + +

    + +The data type of yylloc has the name YYLTYPE. + + + + +

    Calling Conventions for Pure Parsers

    + +

    +When you use the Bison declaration %pure_parser to request a +pure, reentrant parser, the global communication variables yylval +and yylloc cannot be used. (See section A Pure (Reentrant) Parser.) In such parsers the two global variables are replaced by +pointers passed as arguments to yylex. You must declare them as +shown here, and pass the information back by storing it through those +pointers. + + + +

    +int
    +yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
    +{
    +  ...
    +  *lvalp = value;  /* Put value onto Bison stack.  */
    +  return INT;      /* Return the type of the token.  */
    +  ...
    +}
    +
    + +

    +If the grammar file does not use the `@' constructs to refer to +textual positions, then the type YYLTYPE will not be defined. In +this case, omit the second argument; yylex will be called with +only one argument. + + +

    + +If you use a reentrant parser, you can optionally pass additional +parameter information to it in a reentrant way. To do so, define the +macro YYPARSE_PARAM as a variable name. This modifies the +yyparse function to accept one argument, of type void *, +with that name. + + +

    +When you call yyparse, pass the address of an object, casting the +address to void *. The grammar actions can refer to the contents +of the object by casting the pointer value back to its proper type and +then dereferencing it. Here's an example. Write this in the parser: + + + +

    +%{
    +struct parser_control
    +{
    +  int nastiness;
    +  int randomness;
    +};
    +
    +#define YYPARSE_PARAM parm
    +%}
    +
    + +

    +Then call the parser like this: + + + +

    +struct parser_control
    +{
    +  int nastiness;
    +  int randomness;
    +};
    +
    +...
    +
    +{
    +  struct parser_control foo;
    +  ...  /* Store proper data in foo.  */
    +  value = yyparse ((void *) &foo);
    +  ...
    +}
    +
    + +

    +In the grammar actions, use expressions like this to refer to the data: + + + +

    +((struct parser_control *) parm)->randomness
    +
    + +

    + +If you wish to pass the additional parameter data to yylex, +define the macro YYLEX_PARAM just like YYPARSE_PARAM, as +shown here: + + + +

    +%{
    +struct parser_control
    +{
    +  int nastiness;
    +  int randomness;
    +};
    +
    +#define YYPARSE_PARAM parm
    +#define YYLEX_PARAM parm
    +%}
    +
    + +

    +You should then define yylex to accept one additional +argument--the value of parm. (This makes either two or three +arguments in total, depending on whether an argument of type +YYLTYPE is passed.) You can declare the argument as a pointer to +the proper object type, or you can declare it as void * and +access the contents as shown above. + + +

    +You can use `%pure_parser' to request a reentrant parser without +also using YYPARSE_PARAM. Then you should call yyparse +with no arguments, as usual. + + + + +

    The Error Reporting Function yyerror

    +

    + + + + + + +

    +The Bison parser detects a parse error or syntax error +whenever it reads a token which cannot satisfy any syntax rule. An +action in the grammar can also explicitly proclaim an error, using the +macro YYERROR (see section Special Features for Use in Actions). + + +

    +The Bison parser expects to report the error by calling an error +reporting function named yyerror, which you must supply. It is +called by yyparse whenever a syntax error is found, and it +receives one argument. For a parse error, the string is normally +"parse error". + + +

    + +If you define the macro YYERROR_VERBOSE in the Bison declarations +section (see section The Bison Declarations Section), +then Bison provides a more verbose and specific error message string +instead of just plain "parse error". It doesn't matter what +definition you use for YYERROR_VERBOSE, just whether you define +it. + + +

    +The parser can detect one other kind of error: stack overflow. This +happens when the input contains constructions that are very deeply +nested. It isn't likely you will encounter this, since the Bison +parser extends its stack automatically up to a very large limit. But +if overflow happens, yyparse calls yyerror in the usual +fashion, except that the argument string is "parser stack +overflow". + + +

    +The following definition suffices in simple programs: + + + +

    +void
    +yyerror (char *s)
    +{
    +  fprintf (stderr, "%s\n", s);
    +}
    +
    + +

    +After yyerror returns to yyparse, the latter will attempt +error recovery if you have written suitable error recovery grammar rules +(see section Error Recovery). If recovery is impossible, yyparse will +immediately return 1. + + +

    + +The variable yynerrs contains the number of syntax errors +encountered so far. Normally this variable is global; but if you +request a pure parser (see section A Pure (Reentrant) Parser) then it is a local variable +which only the actions can access. + + + + +

    Special Features for Use in Actions

    +

    + + + + +

    +Here is a table of Bison constructs, variables and macros that +are useful in actions. + + +

    + +
    `$$' +
    +Acts like a variable that contains the semantic value for the +grouping made by the current rule. See section Actions. + +
    `$n' +
    +Acts like a variable that contains the semantic value for the +nth component of the current rule. See section Actions. + +
    `$<typealt>$' +
    +Like $$ but specifies alternative typealt in the union +specified by the %union declaration. See section Data Types of Values in Actions. + +
    `$<typealt>n' +
    +Like $n but specifies alternative typealt in the +union specified by the %union declaration. +See section Data Types of Values in Actions. +
    `YYABORT;' +
    +Return immediately from yyparse, indicating failure. +See section The Parser Function yyparse. + +
    `YYACCEPT;' +
    +Return immediately from yyparse, indicating success. +See section The Parser Function yyparse. + +
    `YYBACKUP (token, value);' +
    + +Unshift a token. This macro is allowed only for rules that reduce +a single value, and only when there is no look-ahead token. +It installs a look-ahead token with token type token and +semantic value value; then it discards the value that was +going to be reduced by this rule. + +If the macro is used when it is not valid, such as when there is +a look-ahead token already, then it reports a syntax error with +a message `cannot back up' and performs ordinary error +recovery. + +In either case, the rest of the action is not executed. + +
    `YYEMPTY' +
    + +Value stored in yychar when there is no look-ahead token. + +
    `YYERROR;' +
    + +Cause an immediate syntax error. This statement initiates error +recovery just as if the parser itself had detected an error; however, it +does not call yyerror, and does not print any message. If you +want to print an error message, call yyerror explicitly before +the `YYERROR;' statement. See section Error Recovery. + +
    `YYRECOVERING' +
    +This macro stands for an expression that has the value 1 when the parser +is recovering from a syntax error, and 0 the rest of the time. +See section Error Recovery. + +
    `yychar' +
    +Variable containing the current look-ahead token. (In a pure parser, +this is actually a local variable within yyparse.) When there is +no look-ahead token, the value YYEMPTY is stored in the variable. +See section Look-Ahead Tokens. + +
    `yyclearin;' +
    +Discard the current look-ahead token. This is useful primarily in +error rules. See section Error Recovery. + +
    `yyerrok;' +
    +Resume generating error messages immediately for subsequent syntax +errors. This is useful primarily in error rules. +See section Error Recovery. + +
    `@$' +
    + +Acts like a structure variable containing information on the textual position +of the grouping made by the current rule. See section Tracking Locations. + +
    `@n' +
    + +Acts like a structure variable containing information on the textual position +of the nth component of the current rule. See section Tracking Locations. + +
    + + + +

    The Bison Parser Algorithm

    +

    + + + + + + + + +

    +As Bison reads tokens, it pushes them onto a stack along with their +semantic values. The stack is called the parser stack. Pushing a +token is traditionally called shifting. + + +

    +For example, suppose the infix calculator has read `1 + 5 *', with a +`3' to come. The stack will have four elements, one for each token +that was shifted. + + +

    +But the stack does not always have an element for each token read. When +the last n tokens and groupings shifted match the components of a +grammar rule, they can be combined according to that rule. This is called +reduction. Those tokens and groupings are replaced on the stack by a +single grouping whose symbol is the result (left hand side) of that rule. +Running the rule's action is part of the process of reduction, because this +is what computes the semantic value of the resulting grouping. + + +

    +For example, if the infix calculator's parser stack contains this: + + + +

    +1 + 5 * 3
    +
    + +

    +and the next input token is a newline character, then the last three +elements can be reduced to 15 via the rule: + + + +

    +expr: expr '*' expr;
    +
    + +

    +Then the stack contains just these three elements: + + + +

    +1 + 15
    +
    + +

    +At this point, another reduction can be made, resulting in the single value +16. Then the newline token can be shifted. + + +

    +The parser tries, by shifts and reductions, to reduce the entire input down +to a single grouping whose symbol is the grammar's start-symbol +(see section Languages and Context-Free Grammars). + + +

    +This kind of parser is known in the literature as a bottom-up parser. + + + + +

    Look-Ahead Tokens

    +

    + + + +

    +The Bison parser does not always reduce immediately as soon as the +last n tokens and groupings match a rule. This is because such a +simple strategy is inadequate to handle most languages. Instead, when a +reduction is possible, the parser sometimes "looks ahead" at the next +token in order to decide what to do. + + +

    +When a token is read, it is not immediately shifted; first it becomes the +look-ahead token, which is not on the stack. Now the parser can +perform one or more reductions of tokens and groupings on the stack, while +the look-ahead token remains off to the side. When no more reductions +should take place, the look-ahead token is shifted onto the stack. This +does not mean that all possible reductions have been done; depending on the +token type of the look-ahead token, some rules may choose to delay their +application. + + +

    +Here is a simple case where look-ahead is needed. These three rules define +expressions which contain binary addition operators and postfix unary +factorial operators (`!'), and allow parentheses for grouping. + + + +

    +expr:     term '+' expr
    +        | term
    +        ;
    +
    +term:     '(' expr ')'
    +        | term '!'
    +        | NUMBER
    +        ;
    +
    + +

    +Suppose that the tokens `1 + 2' have been read and shifted; what +should be done? If the following token is `)', then the first three +tokens must be reduced to form an expr. This is the only valid +course, because shifting the `)' would produce a sequence of symbols +term ')', and no rule allows this. + + +

    +If the following token is `!', then it must be shifted immediately so +that `2 !' can be reduced to make a term. If instead the +parser were to reduce before shifting, `1 + 2' would become an +expr. It would then be impossible to shift the `!' because +doing so would produce on the stack the sequence of symbols expr +'!'. No rule allows that sequence. + + +

    + +The current look-ahead token is stored in the variable yychar. +See section Special Features for Use in Actions. + + + + +

    Shift/Reduce Conflicts

    +

    + + + + + + +

    +Suppose we are parsing a language which has if-then and if-then-else +statements, with a pair of rules like this: + + + +

    +if_stmt:
    +          IF expr THEN stmt
    +        | IF expr THEN stmt ELSE stmt
    +        ;
    +
    + +

    +Here we assume that IF, THEN and ELSE are +terminal symbols for specific keyword tokens. + + +

    +When the ELSE token is read and becomes the look-ahead token, the +contents of the stack (assuming the input is valid) are just right for +reduction by the first rule. But it is also legitimate to shift the +ELSE, because that would lead to eventual reduction by the second +rule. + + +

    +This situation, where either a shift or a reduction would be valid, is +called a shift/reduce conflict. Bison is designed to resolve +these conflicts by choosing to shift, unless otherwise directed by +operator precedence declarations. To see the reason for this, let's +contrast it with the other alternative. + + +

    +Since the parser prefers to shift the ELSE, the result is to attach +the else-clause to the innermost if-statement, making these two inputs +equivalent: + + + +

    +if x then if y then win (); else lose;
    +
    +if x then do; if y then win (); else lose; end;
    +
    + +

    +But if the parser chose to reduce when possible rather than shift, the +result would be to attach the else-clause to the outermost if-statement, +making these two inputs equivalent: + + + +

    +if x then if y then win (); else lose;
    +
    +if x then do; if y then win (); end; else lose;
    +
    + +

    +The conflict exists because the grammar as written is ambiguous: either +parsing of the simple nested if-statement is legitimate. The established +convention is that these ambiguities are resolved by attaching the +else-clause to the innermost if-statement; this is what Bison accomplishes +by choosing to shift rather than reduce. (It would ideally be cleaner to +write an unambiguous grammar, but that is very hard to do in this case.) +This particular ambiguity was first encountered in the specifications of +Algol 60 and is called the "dangling else" ambiguity. + + +

    +To avoid warnings from Bison about predictable, legitimate shift/reduce +conflicts, use the %expect n declaration. There will be no +warning as long as the number of shift/reduce conflicts is exactly n. +See section Suppressing Conflict Warnings. + + +

    +The definition of if_stmt above is solely to blame for the +conflict, but the conflict does not actually appear without additional +rules. Here is a complete Bison input file that actually manifests the +conflict: + + + +

    +%token IF THEN ELSE variable
    +%%
    +stmt:     expr
    +        | if_stmt
    +        ;
    +
    +if_stmt:
    +          IF expr THEN stmt
    +        | IF expr THEN stmt ELSE stmt
    +        ;
    +
    +expr:     variable
    +        ;
    +
    + + + +

    Operator Precedence

    +

    + + + + +

    +Another situation where shift/reduce conflicts appear is in arithmetic +expressions. Here shifting is not always the preferred resolution; the +Bison declarations for operator precedence allow you to specify when to +shift and when to reduce. + + + + +

    When Precedence is Needed

    + +

    +Consider the following ambiguous grammar fragment (ambiguous because the +input `1 - 2 * 3' can be parsed in two different ways): + + + +

    +expr:     expr '-' expr
    +        | expr '*' expr
    +        | expr '<' expr
    +        | '(' expr ')'
    +        ...
    +        ;
    +
    + +

    +Suppose the parser has seen the tokens `1', `-' and `2'; +should it reduce them via the rule for the subtraction operator? It +depends on the next token. Of course, if the next token is `)', we +must reduce; shifting is invalid because no single rule can reduce the +token sequence `- 2 )' or anything starting with that. But if +the next token is `*' or `<', we have a choice: either +shifting or reduction would allow the parse to complete, but with +different results. + + +

    +To decide which one Bison should do, we must consider the results. If +the next operator token op is shifted, then it must be reduced +first in order to permit another opportunity to reduce the difference. +The result is (in effect) `1 - (2 op 3)'. On the other +hand, if the subtraction is reduced before shifting op, the result +is `(1 - 2) op 3'. Clearly, then, the choice of shift or +reduce should depend on the relative precedence of the operators +`-' and op: `*' should be shifted first, but not +`<'. + + +

    + +What about input such as `1 - 2 - 5'; should this be +`(1 - 2) - 5' or should it be `1 - (2 - 5)'? For most +operators we prefer the former, which is called left association. +The latter alternative, right association, is desirable for +assignment operators. The choice of left or right association is a +matter of whether the parser chooses to shift or reduce when the stack +contains `1 - 2' and the look-ahead token is `-': shifting +makes right-associativity. + + + + +

    Specifying Operator Precedence

    +

    + + + + + +

    +Bison allows you to specify these choices with the operator precedence +declarations %left and %right. Each such declaration +contains a list of tokens, which are operators whose precedence and +associativity is being declared. The %left declaration makes all +those operators left-associative and the %right declaration makes +them right-associative. A third alternative is %nonassoc, which +declares that it is a syntax error to find the same operator twice "in a +row". + + +

    +The relative precedence of different operators is controlled by the +order in which they are declared. The first %left or +%right declaration in the file declares the operators whose +precedence is lowest, the next such declaration declares the operators +whose precedence is a little higher, and so on. + + + + +

    Precedence Examples

    + +

    +In our example, we would want the following declarations: + + + +

    +%left '<'
    +%left '-'
    +%left '*'
    +
    + +

    +In a more complete example, which supports other operators as well, we +would declare them in groups of equal precedence. For example, '+' is +declared with '-': + + + +

    +%left '<' '>' '=' NE LE GE
    +%left '+' '-'
    +%left '*' '/'
    +
    + +

    +(Here NE and so on stand for the operators for "not equal" +and so on. We assume that these tokens are more than one character long +and therefore are represented by names, not character literals.) + + + + +

    How Precedence Works

    + +

    +The first effect of the precedence declarations is to assign precedence +levels to the terminal symbols declared. The second effect is to assign +precedence levels to certain rules: each rule gets its precedence from the +last terminal symbol mentioned in the components. (You can also specify +explicitly the precedence of a rule. See section Context-Dependent Precedence.) + + +

    +Finally, the resolution of conflicts works by comparing the +precedence of the rule being considered with that of the +look-ahead token. If the token's precedence is higher, the +choice is to shift. If the rule's precedence is higher, the +choice is to reduce. If they have equal precedence, the choice +is made based on the associativity of that precedence level. The +verbose output file made by `-v' (see section Invoking Bison) says +how each conflict was resolved. + + +

    +Not all rules and not all tokens have precedence. If either the rule or +the look-ahead token has no precedence, then the default is to shift. + + + + +

    Context-Dependent Precedence

    +

    + + + + + + + +

    +Often the precedence of an operator depends on the context. This sounds +outlandish at first, but it is really very common. For example, a minus +sign typically has a very high precedence as a unary operator, and a +somewhat lower precedence (lower than multiplication) as a binary operator. + + +

    +The Bison precedence declarations, %left, %right and +%nonassoc, can only be used once for a given token; so a token has +only one precedence declared in this way. For context-dependent +precedence, you need to use an additional mechanism: the %prec +modifier for rules. + +

    +The %prec modifier declares the precedence of a particular rule by +specifying a terminal symbol whose precedence should be used for that rule. +It's not necessary for that symbol to appear otherwise in the rule. The +modifier's syntax is: + + + +

    +%prec terminal-symbol
    +
    + +

    +and it is written after the components of the rule. Its effect is to +assign the rule the precedence of terminal-symbol, overriding +the precedence that would be deduced for it in the ordinary way. The +altered rule precedence then affects how conflicts involving that rule +are resolved (see section Operator Precedence). + + +

    +Here is how %prec solves the problem of unary minus. First, declare +a precedence for a fictitious terminal symbol named UMINUS. There +are no tokens of this type, but the symbol serves to stand for its +precedence: + + + +

    +...
    +%left '+' '-'
    +%left '*'
    +%left UMINUS
    +
    + +

    +Now the precedence of UMINUS can be used in specific rules: + + + +

    +exp:    ...
    +        | exp '-' exp
    +        ...
    +        | '-' exp %prec UMINUS
    +
    + + + +

    Parser States

    +

    + + + + + +

    +The function yyparse is implemented using a finite-state machine. +The values pushed on the parser stack are not simply token type codes; they +represent the entire sequence of terminal and nonterminal symbols at or +near the top of the stack. The current state collects all the information +about previous input which is relevant to deciding what to do next. + + +

    +Each time a look-ahead token is read, the current parser state together +with the type of look-ahead token are looked up in a table. This table +entry can say, "Shift the look-ahead token." In this case, it also +specifies the new parser state, which is pushed onto the top of the +parser stack. Or it can say, "Reduce using rule number n." +This means that a certain number of tokens or groupings are taken off +the top of the stack, and replaced by one grouping. In other words, +that number of states are popped from the stack, and one new state is +pushed. + + +

    +There is one other alternative: the table can say that the look-ahead token +is erroneous in the current state. This causes error processing to begin +(see section Error Recovery). + + + + +

    Reduce/Reduce Conflicts

    +

    + + + + +

    +A reduce/reduce conflict occurs if there are two or more rules that apply +to the same sequence of input. This usually indicates a serious error +in the grammar. + + +

    +For example, here is an erroneous attempt to define a sequence +of zero or more word groupings. + + + +

    +sequence: /* empty */
    +                { printf ("empty sequence\n"); }
    +        | maybeword
    +        | sequence word
    +                { printf ("added word %s\n", $2); }
    +        ;
    +
    +maybeword: /* empty */
    +                { printf ("empty maybeword\n"); }
    +        | word
    +                { printf ("single word %s\n", $1); }
    +        ;
    +
    + +

    +The error is an ambiguity: there is more than one way to parse a single +word into a sequence. It could be reduced to a +maybeword and then into a sequence via the second rule. +Alternatively, nothing-at-all could be reduced into a sequence +via the first rule, and this could be combined with the word +using the third rule for sequence. + + +

    +There is also more than one way to reduce nothing-at-all into a +sequence. This can be done directly via the first rule, +or indirectly via maybeword and then the second rule. + + +

    +You might think that this is a distinction without a difference, because it +does not change whether any particular input is valid or not. But it does +affect which actions are run. One parsing order runs the second rule's +action; the other runs the first rule's action and the third rule's action. +In this example, the output of the program changes. + + +

    +Bison resolves a reduce/reduce conflict by choosing to use the rule that +appears first in the grammar, but it is very risky to rely on this. Every +reduce/reduce conflict must be studied and usually eliminated. Here is the +proper way to define sequence: + + + +

    +sequence: /* empty */
    +                { printf ("empty sequence\n"); }
    +        | sequence word
    +                { printf ("added word %s\n", $2); }
    +        ;
    +
    + +

    +Here is another common error that yields a reduce/reduce conflict: + + + +

    +sequence: /* empty */
    +        | sequence words
    +        | sequence redirects
    +        ;
    +
    +words:    /* empty */
    +        | words word
    +        ;
    +
    +redirects:/* empty */
    +        | redirects redirect
    +        ;
    +
    + +

    +The intention here is to define a sequence which can contain either +word or redirect groupings. The individual definitions of +sequence, words and redirects are error-free, but the +three together make a subtle ambiguity: even an empty input can be parsed +in infinitely many ways! + + +

    +Consider: nothing-at-all could be a words. Or it could be two +words in a row, or three, or any number. It could equally well be a +redirects, or two, or any number. Or it could be a words +followed by three redirects and another words. And so on. + + +

    +Here are two ways to correct these rules. First, to make it a single level +of sequence: + + + +

    +sequence: /* empty */
    +        | sequence word
    +        | sequence redirect
    +        ;
    +
    + +

    +Second, to prevent either a words or a redirects +from being empty: + + + +

    +sequence: /* empty */
    +        | sequence words
    +        | sequence redirects
    +        ;
    +
    +words:    word
    +        | words word
    +        ;
    +
    +redirects:redirect
    +        | redirects redirect
    +        ;
    +
    + + + +

    Mysterious Reduce/Reduce Conflicts

    + +

    +Sometimes reduce/reduce conflicts can occur that don't look warranted. +Here is an example: + + + +

    +%token ID
    +
    +%%
    +def:    param_spec return_spec ','
    +        ;
    +param_spec:
    +             type
    +        |    name_list ':' type
    +        ;
    +return_spec:
    +             type
    +        |    name ':' type
    +        ;
    +type:        ID
    +        ;
    +name:        ID
    +        ;
    +name_list:
    +             name
    +        |    name ',' name_list
    +        ;
    +
    + +

    +It would seem that this grammar can be parsed with only a single token +of look-ahead: when a param_spec is being read, an ID is +a name if a comma or colon follows, or a type if another +ID follows. In other words, this grammar is LR(1). + + +

    + + +However, Bison, like most parser generators, cannot actually handle all +LR(1) grammars. In this grammar, two contexts, that after an ID +at the beginning of a param_spec and likewise at the beginning of +a return_spec, are similar enough that Bison assumes they are the +same. They appear similar because the same set of rules would be +active--the rule for reducing to a name and that for reducing to +a type. Bison is unable to determine at that stage of processing +that the rules would require different look-ahead tokens in the two +contexts, so it makes a single parser state for them both. Combining +the two contexts causes a conflict later. In parser terminology, this +occurrence means that the grammar is not LALR(1). + + +

    +In general, it is better to fix deficiencies than to document them. But +this particular deficiency is intrinsically hard to fix; parser +generators that can handle LR(1) grammars are hard to write and tend to +produce parsers that are very large. In practice, Bison is more useful +as it is now. + + +

    +When the problem arises, you can often fix it by identifying the two +parser states that are being confused, and adding something to make them +look distinct. In the above example, adding one rule to +return_spec as follows makes the problem go away: + + + +

    +%token BOGUS
    +...
    +%%
    +...
    +return_spec:
    +             type
    +        |    name ':' type
    +        /* This rule is never used.  */
    +        |    ID BOGUS
    +        ;
    +
    + +

    +This corrects the problem because it introduces the possibility of an +additional active rule in the context after the ID at the beginning of +return_spec. This rule is not active in the corresponding context +in a param_spec, so the two contexts receive distinct parser states. +As long as the token BOGUS is never generated by yylex, +the added rule cannot alter the way actual input is parsed. + + +

    +In this particular example, there is another way to solve the problem: +rewrite the rule for return_spec to use ID directly +instead of via name. This also causes the two confusing +contexts to have different sets of active rules, because the one for +return_spec activates the altered rule for return_spec +rather than the one for name. + + + +

    +param_spec:
    +             type
    +        |    name_list ':' type
    +        ;
    +return_spec:
    +             type
    +        |    ID ':' type
    +        ;
    +
    + + + +

    Stack Overflow, and How to Avoid It

    +

    + + + + + +

    +The Bison parser stack can overflow if too many tokens are shifted and +not reduced. When this happens, the parser function yyparse +returns a nonzero value, pausing only to call yyerror to report +the overflow. + + +

    + +By defining the macro YYMAXDEPTH, you can control how deep the +parser stack can become before a stack overflow occurs. Define the +macro with a value that is an integer. This value is the maximum number +of tokens that can be shifted (and not reduced) before overflow. +It must be a constant expression whose value is known at compile time. + + +

    +The stack space allowed is not necessarily allocated. If you specify a +large value for YYMAXDEPTH, the parser actually allocates a small +stack at first, and then makes it bigger by stages as needed. This +increasing allocation happens automatically and silently. Therefore, +you do not need to make YYMAXDEPTH painfully small merely to save +space for ordinary inputs that do not need much stack. + + +

    + +The default value of YYMAXDEPTH, if you do not define it, is +10000. + + +

    + +You can control how much stack is allocated initially by defining the +macro YYINITDEPTH. This value too must be a compile-time +constant integer. The default is 200. + + + + +

    Error Recovery

    +

    + + + + +

    +It is not usually acceptable to have a program terminate on a parse +error. For example, a compiler should recover sufficiently to parse the +rest of the input file and check it for errors; a calculator should accept +another expression. + + +

    +In a simple interactive command parser where each input is one line, it may +be sufficient to allow yyparse to return 1 on error and have the +caller ignore the rest of the input line when that happens (and then call +yyparse again). But this is inadequate for a compiler, because it +forgets all the syntactic context leading up to the error. A syntax error +deep within a function in the compiler input should not cause the compiler +to treat the following line like the beginning of a source file. + + +

    + +You can define how to recover from a syntax error by writing rules to +recognize the special token error. This is a terminal symbol that +is always defined (you need not declare it) and reserved for error +handling. The Bison parser generates an error token whenever a +syntax error happens; if you have provided a rule to recognize this token +in the current context, the parse can continue. + + +

    +For example: + + + +

    +stmnts:  /* empty string */
    +        | stmnts '\n'
    +        | stmnts exp '\n'
    +        | stmnts error '\n'
    +
    + +

    +The fourth rule in this example says that an error followed by a newline +makes a valid addition to any stmnts. + + +

    +What happens if a syntax error occurs in the middle of an exp? The +error recovery rule, interpreted strictly, applies to the precise sequence +of a stmnts, an error and a newline. If an error occurs in +the middle of an exp, there will probably be some additional tokens +and subexpressions on the stack after the last stmnts, and there +will be tokens to read before the next newline. So the rule is not +applicable in the ordinary way. + + +

    +But Bison can force the situation to fit the rule, by discarding part of +the semantic context and part of the input. First it discards states and +objects from the stack until it gets back to a state in which the +error token is acceptable. (This means that the subexpressions +already parsed are discarded, back to the last complete stmnts.) At +this point the error token can be shifted. Then, if the old +look-ahead token is not acceptable to be shifted next, the parser reads +tokens and discards them until it finds a token which is acceptable. In +this example, Bison reads and discards input until the next newline +so that the fourth rule can apply. + + +

    +The choice of error rules in the grammar is a choice of strategies for +error recovery. A simple and useful strategy is simply to skip the rest of +the current input line or current statement if an error is detected: + + + +

    +stmnt: error ';'  /* on error, skip until ';' is read */
    +
    + +

    +It is also useful to recover to the matching close-delimiter of an +opening-delimiter that has already been parsed. Otherwise the +close-delimiter will probably appear to be unmatched, and generate another, +spurious error message: + + + +

    +primary:  '(' expr ')'
    +        | '(' error ')'
    +        ...
    +        ;
    +
    + +

    +Error recovery strategies are necessarily guesses. When they guess wrong, +one syntax error often leads to another. In the above example, the error +recovery rule guesses that an error is due to bad input within one +stmnt. Suppose that instead a spurious semicolon is inserted in the +middle of a valid stmnt. After the error recovery rule recovers +from the first error, another syntax error will be found straightaway, +since the text following the spurious semicolon is also an invalid +stmnt. + + +

    +To prevent an outpouring of error messages, the parser will output no error +message for another syntax error that happens shortly after the first; only +after three consecutive input tokens have been successfully shifted will +error messages resume. + + +

    +Note that rules which accept the error token may have actions, just +as any other rules can. + + +

    + +You can make error messages resume immediately by using the macro +yyerrok in an action. If you do this in the error rule's action, no +error messages will be suppressed. This macro requires no arguments; +`yyerrok;' is a valid C statement. + + +

    + +The previous look-ahead token is reanalyzed immediately after an error. If +this is unacceptable, then the macro yyclearin may be used to clear +this token. Write the statement `yyclearin;' in the error rule's +action. + + +

    +For example, suppose that on a parse error, an error handling routine is +called that advances the input stream to some point where parsing should +once again commence. The next symbol returned by the lexical scanner is +probably correct. The previous look-ahead token ought to be discarded +with `yyclearin;'. + + +

    + +The macro YYRECOVERING stands for an expression that has the +value 1 when the parser is recovering from a syntax error, and 0 the +rest of the time. A value of 1 indicates that error messages are +currently suppressed for new syntax errors. + + + + +

    Handling Context Dependencies

    + +

    +The Bison paradigm is to parse tokens first, then group them into larger +syntactic units. In many languages, the meaning of a token is affected by +its context. Although this violates the Bison paradigm, certain techniques +(known as kludges) may enable you to write Bison parsers for such +languages. + + +

    +(Actually, "kludge" means any technique that gets its job done but is +neither clean nor robust.) + + + + +

    Semantic Info in Token Types

    + +

    +The C language has a context dependency: the way an identifier is used +depends on what its current meaning is. For example, consider this: + + + +

    +foo (x);
    +
    + +

    +This looks like a function call statement, but if foo is a typedef +name, then this is actually a declaration of x. How can a Bison +parser for C decide how to parse this input? + + +

    +The method used in GNU C is to have two different token types, +IDENTIFIER and TYPENAME. When yylex finds an +identifier, it looks up the current declaration of the identifier in order +to decide which token type to return: TYPENAME if the identifier is +declared as a typedef, IDENTIFIER otherwise. + + +

    +The grammar rules can then express the context dependency by the choice of +token type to recognize. IDENTIFIER is accepted as an expression, +but TYPENAME is not. TYPENAME can start a declaration, but +IDENTIFIER cannot. In contexts where the meaning of the identifier +is not significant, such as in declarations that can shadow a +typedef name, either TYPENAME or IDENTIFIER is +accepted--there is one rule for each of the two token types. + + +

    +This technique is simple to use if the decision of which kinds of +identifiers to allow is made at a place close to where the identifier is +parsed. But in C this is not always so: C allows a declaration to +redeclare a typedef name provided an explicit type has been specified +earlier: + + + +

    +typedef int foo, bar, lose;
    +static foo (bar);        /* redeclare bar as static variable */
    +static int foo (lose);   /* redeclare foo as function */
    +
    + +

    +Unfortunately, the name being declared is separated from the declaration +construct itself by a complicated syntactic structure--the "declarator". + + +

    +As a result, part of the Bison parser for C needs to be duplicated, with +all the nonterminal names changed: once for parsing a declaration in +which a typedef name can be redefined, and once for parsing a +declaration in which that can't be done. Here is a part of the +duplication, with actions omitted for brevity: + + + +

    +initdcl:
    +          declarator maybeasm '='
    +          init
    +        | declarator maybeasm
    +        ;
    +
    +notype_initdcl:
    +          notype_declarator maybeasm '='
    +          init
    +        | notype_declarator maybeasm
    +        ;
    +
    + +

    +Here initdcl can redeclare a typedef name, but notype_initdcl +cannot. The distinction between declarator and +notype_declarator is the same sort of thing. + + +

    +There is some similarity between this technique and a lexical tie-in +(described next), in that information which alters the lexical analysis is +changed during parsing by other parts of the program. The difference is +here the information is global, and is used for other purposes in the +program. A true lexical tie-in has a special-purpose flag controlled by +the syntactic context. + + + + +

    Lexical Tie-ins

    +

    + + + +

    +One way to handle context-dependency is the lexical tie-in: a flag +which is set by Bison actions, whose purpose is to alter the way tokens are +parsed. + + +

    +For example, suppose we have a language vaguely like C, but with a special +construct `hex (hex-expr)'. After the keyword hex comes +an expression in parentheses in which all integers are hexadecimal. In +particular, the token `a1b' must be treated as an integer rather than +as an identifier if it appears in that context. Here is how you can do it: + + + +

    +%{
    +int hexflag;
    +%}
    +%%
    +...
    +expr:   IDENTIFIER
    +        | constant
    +        | HEX '('
    +                { hexflag = 1; }
    +          expr ')'
    +                { hexflag = 0;
    +                   $$ = $4; }
    +        | expr '+' expr
    +                { $$ = make_sum ($1, $3); }
    +        ...
    +        ;
    +
    +constant:
    +          INTEGER
    +        | STRING
    +        ;
    +
    + +

    +Here we assume that yylex looks at the value of hexflag; when +it is nonzero, all integers are parsed in hexadecimal, and tokens starting +with letters are parsed as integers if possible. + + +

    +The declaration of hexflag shown in the C declarations section of +the parser file is needed to make it accessible to the actions +(see section The C Declarations Section). You must also write the code in yylex +to obey the flag. + + + + +

    Lexical Tie-ins and Error Recovery

    + +

    +Lexical tie-ins make strict demands on any error recovery rules you have. +See section Error Recovery. + + +

    +The reason for this is that the purpose of an error recovery rule is to +abort the parsing of one construct and resume in some larger construct. +For example, in C-like languages, a typical error recovery rule is to skip +tokens until the next semicolon, and then start a new statement, like this: + + + +

    +stmt:   expr ';'
    +        | IF '(' expr ')' stmt { ... }
    +        ...
    +        error ';'
    +                { hexflag = 0; }
    +        ;
    +
    + +

    +If there is a syntax error in the middle of a `hex (expr)' +construct, this error rule will apply, and then the action for the +completed `hex (expr)' will never run. So hexflag would +remain set for the entire rest of the input, or until the next hex +keyword, causing identifiers to be misinterpreted as integers. + + +

    +To avoid this problem the error recovery rule itself clears hexflag. + + +

    +There may also be an error recovery rule that works within expressions. +For example, there could be a rule which applies within parentheses +and skips to the close-parenthesis: + + + +

    +expr:   ...
    +        | '(' expr ')'
    +                { $$ = $2; }
    +        | '(' error ')'
    +        ...
    +
    + +

    +If this rule acts within the hex construct, it is not going to abort +that construct (since it applies to an inner level of parentheses within +the construct). Therefore, it should not clear the flag: the rest of +the hex construct should be parsed with the flag still in effect. + + +

    +What if there is an error recovery rule which might abort out of the +hex construct or might not, depending on circumstances? There is no +way you can write the action to determine whether a hex construct is +being aborted or not. So if you are using a lexical tie-in, you had better +make sure your error recovery rules are not of this kind. Each rule must +be such that you can be sure that it always will, or always won't, have to +clear the flag. + + + + +

    Debugging Your Parser

    +

    + + + + + + +

    +If a Bison grammar compiles properly but doesn't do what you want when it +runs, the yydebug parser-trace feature can help you figure out why. + + +

    +To enable compilation of trace facilities, you must define the macro +YYDEBUG when you compile the parser. You could use +`-DYYDEBUG=1' as a compiler option or you could put `#define +YYDEBUG 1' in the C declarations section of the grammar file +(see section The C Declarations Section). Alternatively, use the `-t' option when +you run Bison (see section Invoking Bison). We always define YYDEBUG so that +debugging is always possible. + + +

    +The trace facility uses stderr, so you must add #include +<stdio.h> to the C declarations section unless it is already there. + + +

    +Once you have compiled the program with trace facilities, the way to +request a trace is to store a nonzero value in the variable yydebug. +You can do this by making the C code do it (in main, perhaps), or +you can alter the value with a C debugger. + + +

    +Each step taken by the parser when yydebug is nonzero produces a +line or two of trace information, written on stderr. The trace +messages tell you these things: + + + +

    + +

    +To make sense of this information, it helps to refer to the listing file +produced by the Bison `-v' option (see section Invoking Bison). This file +shows the meaning of each state in terms of positions in various rules, and +also what each state will do with each possible input token. As you read +the successive trace messages, you can see that the parser is functioning +according to its specification in the listing file. Eventually you will +arrive at the place where something undesirable happens, and you will see +which parts of the grammar are to blame. + + +

    +The parser file is a C program and you can use C debuggers on it, but it's +not easy to interpret what it is doing. The parser function is a +finite-state machine interpreter, and aside from the actions it executes +the same code over and over. Only the values of variables show where in +the grammar it is working. + + +

    + +The debugging information normally gives the token type of each token +read, but not its semantic value. You can optionally define a macro +named YYPRINT to provide a way to print the value. If you define +YYPRINT, it should take three arguments. The parser will pass a +standard I/O stream, the numeric code for the token type, and the token +value (from yylval). + + +

    +Here is an example of YYPRINT suitable for the multi-function +calculator (see section Declarations for mfcalc): + + + +

    +#define YYPRINT(file, type, value)   yyprint (file, type, value)
    +
    +static void
    +yyprint (FILE *file, int type, YYSTYPE value)
    +{
    +  if (type == VAR)
    +    fprintf (file, " %s", value.tptr->name);
    +  else if (type == NUM)
    +    fprintf (file, " %d", value.val);
    +}
    +
    + + + +

    Invoking Bison

    +

    + + + + + +

    +The usual way to invoke Bison is as follows: + + + +

    +bison infile
    +
    + +

    +Here infile is the grammar file name, which usually ends in +`.y'. The parser file's name is made by replacing the `.y' +with `.tab.c'. Thus, the `bison foo.y' filename yields +`foo.tab.c', and the `bison hack/foo.y' filename yields +`hack/foo.tab.c'. It's is also possible, in case you are writting +C++ code instead of C in your grammar file, to name it `foo.ypp' +or `foo.y++'. Then, the output files will take an extention like +the given one as input (repectively `foo.tab.cpp' and `foo.tab.c++'). +This feature takes effect with all options that manipulate filenames like +`-o' or `-d'. + + +

    +For example : + + + +

    +bison -d infile.yxx
    +
    + +

    +will produce `infile.tab.cxx' and `infile.tab.hxx'. and + + + +

    +bison -d infile.y -o output.c++
    +
    + +

    +will produce `output.c++' and `outfile.h++'. + + + + +

    Bison Options

    + +

    +Bison supports both traditional single-letter options and mnemonic long +option names. Long option names are indicated with `--' instead of +`-'. Abbreviations for option names are allowed as long as they +are unique. When a long option takes an argument, like +`--file-prefix', connect the option name and the argument with +`='. + + +

    +Here is a list of options that can be used with Bison, alphabetized by +short option. It is followed by a cross key alphabetized by long +option. + + +

    +Operations modes: +

    + +
    @option{-h} +
    +
    @option{--help} +
    +Print a summary of the command-line options to Bison and exit. + +
    @option{-V} +
    +
    @option{--version} +
    +Print the version number of Bison and exit. + +
    @option{-y} +
    +
    @option{--yacc} +
    +
    @option{--fixed-output-files} +
    +Equivalent to `-o y.tab.c'; the parser output file is called +`y.tab.c', and the other outputs are called `y.output' and +`y.tab.h'. The purpose of this option is to imitate Yacc's output +file name conventions. Thus, the following shell script can substitute +for Yacc: + +
    +bison -y $*
    +
    + +
    + +

    +Tuning the parser: + + +

    + +
    @option{-S file} +
    +
    @option{--skeleton=file} +
    +Specify the skeleton to use. You probably don't need this option unless +you are developing Bison. + +
    @option{-t} +
    +
    @option{--debug} +
    +Output a definition of the macro YYDEBUG into the parser file, so +that the debugging facilities are compiled. See section Debugging Your Parser. + +
    @option{--locations} +
    +Pretend that %locactions was specified. See section Bison Declaration Summary. + +
    @option{-p prefix} +
    +
    @option{--name-prefix=prefix} +
    +Rename the external symbols used in the parser so that they start with +prefix instead of `yy'. The precise list of symbols renamed +is yyparse, yylex, yyerror, yynerrs, +yylval, yychar and yydebug. + +For example, if you use `-p c', the names become cparse, +clex, and so on. + +See section Multiple Parsers in the Same Program. + +
    @option{-l} +
    +
    @option{--no-lines} +
    +Don't put any #line preprocessor commands in the parser file. +Ordinarily Bison puts them in the parser file so that the C compiler +and debuggers will associate errors with your source file, the +grammar file. This option causes them to associate errors with the +parser file, treating it as an independent source file in its own right. + +
    @option{-n} +
    +
    @option{--no-parser} +
    +Pretend that %no_parser was specified. See section Bison Declaration Summary. + +
    @option{-k} +
    +
    @option{--token-table} +
    +Pretend that %token_table was specified. See section Bison Declaration Summary. +
    + +

    +Adjust the output: + + +

    + +
    @option{-d} +
    +Pretend that %verbose was specified, i.e., write an extra output +file containing macro definitions for the token type names defined in +the grammar and the semantic value type YYSTYPE, as well as a few +extern variable declarations. See section Bison Declaration Summary. + +
    @option{--defines=defines-file} +
    +The behaviour of --defines is the same than `-d'. The only +difference is that it has an optionnal argument which is the name of +the output filename. + +
    @option{-b file-prefix} +
    +
    @option{--file-prefix=prefix} +
    +Specify a prefix to use for all Bison output file names. The names are +chosen as if the input file were named `prefix.c'. + +
    @option{-v} +
    +
    @option{--verbose} +
    +Pretend that %verbose was specified, i.e, write an extra output +file containing verbose descriptions of the grammar and +parser. See section Bison Declaration Summary, for more. + +
    @option{-o outfile} +
    +
    @option{--output-file=outfile} +
    +Specify the name outfile for the parser file. + +The other output files' names are constructed from outfile +as described under the `-v' and `-d' options. + +
    @option{-g} +
    +Output a VCG definition of the LALR(1) grammar automaton computed by +Bison. If the grammar file is `foo.y', the VCG output file will +be `foo.vcg'. + +
    @option{--graph=graph-file} +
    +The behaviour of --graph is the same than `-g'. The only +difference is that it has an optionnal argument which is the name of +the output graph filename. +
    + + + +

    Environment Variables

    +

    + + + + + +

    +Here is a list of environment variables which affect the way Bison +runs. + + +

    + +
    `BISON_SIMPLE' +
    +
    `BISON_HAIRY' +
    +Much of the parser generated by Bison is copied verbatim from a file +called `bison.simple'. If Bison cannot find that file, or if you +would like to direct Bison to use a different copy, setting the +environment variable BISON_SIMPLE to the path of the file will +cause Bison to use that copy instead. + +When the `%semantic_parser' declaration is used, Bison copies from +a file called `bison.hairy' instead. The location of this file can +also be specified or overridden in a similar fashion, with the +BISON_HAIRY environment variable. + +
    + + + +

    Option Cross Key

    + +

    +Here is a list of options, alphabetized by long option, to help you find +the corresponding short option. + + + + +

    Invoking Bison under VMS

    +

    + + + + +

    +The command line syntax for Bison on VMS is a variant of the usual +Bison command syntax--adapted to fit VMS conventions. + + +

    +To find the VMS equivalent for any Bison option, start with the long +option, and substitute a `/' for the leading `--', and +substitute a `_' for each `-' in the name of the long option. +For example, the following invocation under VMS: + + + +

    +bison /debug/name_prefix=bar foo.y
    +
    + +

    +is equivalent to the following command under POSIX. + + + +

    +bison --debug --name-prefix=bar foo.y
    +
    + +

    +The VMS file system does not permit filenames such as +`foo.tab.c'. In the above example, the output file +would instead be named `foo_tab.c'. + + + + +

    Bison Symbols

    +

    + + + + +

    + +
    error +
    +A token name reserved for error recovery. This token may be used in +grammar rules so as to allow the Bison parser to recognize an error in +the grammar without halting the process. In effect, a sentence +containing an error may be recognized as valid. On a parse error, the +token error becomes the current look-ahead token. Actions +corresponding to error are then executed, and the look-ahead +token is reset to the token that originally caused the violation. +See section Error Recovery. + +
    YYABORT +
    +Macro to pretend that an unrecoverable syntax error has occurred, by +making yyparse return 1 immediately. The error reporting +function yyerror is not called. See section The Parser Function yyparse. + +
    YYACCEPT +
    +Macro to pretend that a complete utterance of the language has been +read, by making yyparse return 0 immediately. +See section The Parser Function yyparse. + +
    YYBACKUP +
    +Macro to discard a value from the parser stack and fake a look-ahead +token. See section Special Features for Use in Actions. + +
    YYERROR +
    +Macro to pretend that a syntax error has just been detected: call +yyerror and then perform normal error recovery if possible +(see section Error Recovery), or (if recovery is impossible) make +yyparse return 1. See section Error Recovery. + +
    YYERROR_VERBOSE +
    +Macro that you define with #define in the Bison declarations +section to request verbose, specific error message strings when +yyerror is called. + +
    YYINITDEPTH +
    +Macro for specifying the initial size of the parser stack. +See section Stack Overflow, and How to Avoid It. + +
    YYLEX_PARAM +
    +Macro for specifying an extra argument (or list of extra arguments) for +yyparse to pass to yylex. See section Calling Conventions for Pure Parsers. + +
    YYLTYPE +
    +Macro for the data type of yylloc; a structure with four +members. See section Data Type of Locations. + +
    yyltype +
    +Default value for YYLTYPE. + +
    YYMAXDEPTH +
    +Macro for specifying the maximum size of the parser stack. +See section Stack Overflow, and How to Avoid It. + +
    YYPARSE_PARAM +
    +Macro for specifying the name of a parameter that yyparse should +accept. See section Calling Conventions for Pure Parsers. + +
    YYRECOVERING +
    +Macro whose value indicates whether the parser is recovering from a +syntax error. See section Special Features for Use in Actions. + +
    YYSTACK_USE_ALLOCA +
    +Macro used to control the use of alloca. If defined to `0', +the parser will not use alloca but malloc when trying to +grow its internal stacks. Do not define YYSTACK_USE_ALLOCA +to anything else. + +
    YYSTYPE +
    +Macro for the data type of semantic values; int by default. +See section Data Types of Semantic Values. + +
    yychar +
    +External integer variable that contains the integer value of the current +look-ahead token. (In a pure parser, it is a local variable within +yyparse.) Error-recovery rule actions may examine this variable. +See section Special Features for Use in Actions. + +
    yyclearin +
    +Macro used in error-recovery rule actions. It clears the previous +look-ahead token. See section Error Recovery. + +
    yydebug +
    +External integer variable set to zero by default. If yydebug +is given a nonzero value, the parser will output information on input +symbols and parser action. See section Debugging Your Parser. + +
    yyerrok +
    +Macro to cause parser to recover immediately to its normal mode +after a parse error. See section Error Recovery. + +
    yyerror +
    +User-supplied function to be called by yyparse on error. The +function receives one argument, a pointer to a character string +containing an error message. See section The Error Reporting Function yyerror. + +
    yylex +
    +User-supplied lexical analyzer function, called with no arguments +to get the next token. See section The Lexical Analyzer Function yylex. + +
    yylval +
    +External variable in which yylex should place the semantic +value associated with a token. (In a pure parser, it is a local +variable within yyparse, and its address is passed to +yylex.) See section Semantic Values of Tokens. + +
    yylloc +
    +External variable in which yylex should place the line and column +numbers associated with a token. (In a pure parser, it is a local +variable within yyparse, and its address is passed to +yylex.) You can ignore this variable if you don't use the +`@' feature in the grammar actions. See section Textual Positions of Tokens. + +
    yynerrs +
    +Global variable which Bison increments each time there is a parse error. +(In a pure parser, it is a local variable within yyparse.) +See section The Error Reporting Function yyerror. + +
    yyparse +
    +The parser function produced by Bison; call this function to start +parsing. See section The Parser Function yyparse. + +
    %debug +
    +Equip the parser for debugging. See section Bison Declaration Summary. + +
    %defines +
    +Bison declaration to create a header file meant for the scanner. +See section Bison Declaration Summary. + +
    %left +
    +Bison declaration to assign left associativity to token(s). +See section Operator Precedence. + +
    %no_lines +
    +Bison declaration to avoid generating #line directives in the +parser file. See section Bison Declaration Summary. + +
    %nonassoc +
    +Bison declaration to assign non-associativity to token(s). +See section Operator Precedence. + +
    %prec +
    +Bison declaration to assign a precedence to a specific rule. +See section Context-Dependent Precedence. + +
    %pure_parser +
    +Bison declaration to request a pure (reentrant) parser. +See section A Pure (Reentrant) Parser. + +
    %right +
    +Bison declaration to assign right associativity to token(s). +See section Operator Precedence. + +
    %start +
    +Bison declaration to specify the start symbol. See section The Start-Symbol. + +
    %token +
    +Bison declaration to declare token(s) without specifying precedence. +See section Token Type Names. + +
    %token_table +
    +Bison declaration to include a token name table in the parser file. +See section Bison Declaration Summary. + +
    %type +
    +Bison declaration to declare nonterminals. See section Nonterminal Symbols. + +
    %union +
    +Bison declaration to specify several possible data types for semantic +values. See section The Collection of Value Types. +
    + +

    +These are the punctuation and delimiters used in Bison input: + + +

    + +
    `%%' +
    +Delimiter used to separate the grammar rule section from the +Bison declarations section or the additional C code section. +See section The Overall Layout of a Bison Grammar. + +
    `%{ %}' +
    +All code listed between `%{' and `%}' is copied directly to +the output file uninterpreted. Such code forms the "C declarations" +section of the input file. See section Outline of a Bison Grammar. + +
    `/*...*/' +
    +Comment delimiters, as in C. + +
    `:' +
    +Separates a rule's result from its components. See section Syntax of Grammar Rules. + +
    `;' +
    +Terminates a rule. See section Syntax of Grammar Rules. + +
    `|' +
    +Separates alternate rules for the same result nonterminal. +See section Syntax of Grammar Rules. +
    + + + +

    Glossary

    +

    + + + +

    + +
    Backus-Naur Form (BNF) +
    +Formal method of specifying context-free grammars. BNF was first used +in the ALGOL-60 report, 1963. See section Languages and Context-Free Grammars. + +
    Context-free grammars +
    +Grammars specified as rules that can be applied regardless of context. +Thus, if there is a rule which says that an integer can be used as an +expression, integers are allowed anywhere an expression is +permitted. See section Languages and Context-Free Grammars. + +
    Dynamic allocation +
    +Allocation of memory that occurs during execution, rather than at +compile time or on entry to a function. + +
    Empty string +
    +Analogous to the empty set in set theory, the empty string is a +character string of length zero. + +
    Finite-state stack machine +
    +A "machine" that has discrete states in which it is said to exist at +each instant in time. As input to the machine is processed, the +machine moves from state to state as specified by the logic of the +machine. In the case of the parser, the input is the language being +parsed, and the states correspond to various stages in the grammar +rules. See section The Bison Parser Algorithm. + +
    Grouping +
    +A language construct that is (in general) grammatically divisible; +for example, `expression' or `declaration' in C. +See section Languages and Context-Free Grammars. + +
    Infix operator +
    +An arithmetic operator that is placed between the operands on which it +performs some operation. + +
    Input stream +
    +A continuous flow of data between devices or programs. + +
    Language construct +
    +One of the typical usage schemas of the language. For example, one of +the constructs of the C language is the if statement. +See section Languages and Context-Free Grammars. + +
    Left associativity +
    +Operators having left associativity are analyzed from left to right: +`a+b+c' first computes `a+b' and then combines with +`c'. See section Operator Precedence. + +
    Left recursion +
    +A rule whose result symbol is also its first component symbol; for +example, `expseq1 : expseq1 ',' exp;'. See section Recursive Rules. + +
    Left-to-right parsing +
    +Parsing a sentence of a language by analyzing it token by token from +left to right. See section The Bison Parser Algorithm. + +
    Lexical analyzer (scanner) +
    +A function that reads an input stream and returns tokens one by one. +See section The Lexical Analyzer Function yylex. + +
    Lexical tie-in +
    +A flag, set by actions in the grammar rules, which alters the way +tokens are parsed. See section Lexical Tie-ins. + +
    Literal string token +
    +A token which consists of two or more fixed characters. See section Symbols, Terminal and Nonterminal. + +
    Look-ahead token +
    +A token already read but not yet shifted. See section Look-Ahead Tokens. + +
    LALR(1) +
    +The class of context-free grammars that Bison (like most other parser +generators) can handle; a subset of LR(1). See section Mysterious Reduce/Reduce Conflicts. + +
    LR(1) +
    +The class of context-free grammars in which at most one token of +look-ahead is needed to disambiguate the parsing of any piece of input. + +
    Nonterminal symbol +
    +A grammar symbol standing for a grammatical construct that can +be expressed through rules in terms of smaller constructs; in other +words, a construct that is not a token. See section Symbols, Terminal and Nonterminal. + +
    Parse error +
    +An error encountered during parsing of an input stream due to invalid +syntax. See section Error Recovery. + +
    Parser +
    +A function that recognizes valid sentences of a language by analyzing +the syntax structure of a set of tokens passed to it from a lexical +analyzer. + +
    Postfix operator +
    +An arithmetic operator that is placed after the operands upon which it +performs some operation. + +
    Reduction +
    +Replacing a string of nonterminals and/or terminals with a single +nonterminal, according to a grammar rule. See section The Bison Parser Algorithm. + +
    Reentrant +
    +A reentrant subprogram is a subprogram which can be in invoked any +number of times in parallel, without interference between the various +invocations. See section A Pure (Reentrant) Parser. + +
    Reverse polish notation +
    +A language in which all operators are postfix operators. + +
    Right recursion +
    +A rule whose result symbol is also its last component symbol; for +example, `expseq1: exp ',' expseq1;'. See section Recursive Rules. + +
    Semantics +
    +In computer languages, the semantics are specified by the actions +taken for each instance of the language, i.e., the meaning of +each statement. See section Defining Language Semantics. + +
    Shift +
    +A parser is said to shift when it makes the choice of analyzing +further input from the stream rather than reducing immediately some +already-recognized rule. See section The Bison Parser Algorithm. + +
    Single-character literal +
    +A single character that is recognized and interpreted as is. +See section From Formal Rules to Bison Input. + +
    Start symbol +
    +The nonterminal symbol that stands for a complete valid utterance in +the language being parsed. The start symbol is usually listed as the +first nonterminal symbol in a language specification. +See section The Start-Symbol. + +
    Symbol table +
    +A data structure where symbol names and associated data are stored +during parsing to allow for recognition and use of existing +information in repeated uses of a symbol. See section Multi-Function Calculator: mfcalc. + +
    Token +
    +A basic, grammatically indivisible unit of a language. The symbol +that describes a token in the grammar is a terminal symbol. +The input of the Bison parser is a stream of tokens which comes from +the lexical analyzer. See section Symbols, Terminal and Nonterminal. + +
    Terminal symbol +
    +A grammar symbol that has no rules in the grammar and therefore is +grammatically indivisible. The piece of text it represents is a token. +See section Languages and Context-Free Grammars. +
    + + + +

    Copying This Manual

    + + + +

    GNU Free Documentation License

    + +

    + +Version 1.1, March 2000 + + + +

    +Copyright (C) 2000 Free Software Foundation, Inc.
    +59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
    +
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + + +
      +
    1. + +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document free in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +
    2. + +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, +@acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML} designed +for human modification. Opaque formats include PostScript, +@acronym{PDF}, proprietary formats that can be read and edited only by +proprietary word processors, @acronym{SGML} or @acronym{XML} for which +the @acronym{DTD} and/or processing tools are not generally available, +and the machine-generated @acronym{HTML} produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +
    3. + +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +
    4. + +COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +
    5. + +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + + +
        +
      1. + +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
      2. + +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has less than five). + +
      3. + +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
      4. + +Preserve all the copyright notices of the Document. + +
      5. + +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
      6. + +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
      7. + +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +
      8. + +Include an unaltered copy of this License. + +
      9. + +Preserve the section entitled "History", and its title, and add to +it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section entitled "History" in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
      10. + +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the "History" section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
      11. + +In any section entitled "Acknowledgments" or "Dedications", +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgments +and/or dedications given therein. + +
      12. + +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
      13. + +Delete any section entitled "Endorsements". Such a section +may not be included in the Modified Version. + +
      14. + +Do not retitle any existing section as "Endorsements" +or to conflict in title with any Invariant Section. +
      + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +
    6. + +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgments", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + +
    7. + +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +
    8. + +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + +
    9. + +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + +
    10. + +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +
    11. + +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +
    + + + +

    ADDENDUM: How to use this License for your documents

    + +

    +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + + +

    +  Copyright (C)  year  your name.
    +  Permission is granted to copy, distribute and/or modify this document
    +  under the terms of the GNU Free Documentation License, Version 1.1
    +  or any later version published by the Free Software Foundation;
    +  with the Invariant Sections being list their titles, with the
    +  Front-Cover Texts being list, and with the Back-Cover Texts being list.
    +  A copy of the license is included in the section entitled ``GNU
    +  Free Documentation License''.
    +
    + +

    +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being list"; likewise for Back-Cover Texts. + + +

    +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + + + + +

    Index

    + +

    +Jump to: +$ +- +% +- +@ +- +a +- +b +- +c +- +d +- +e +- +f +- +g +- +i +- +l +- +m +- +n +- +o +- +p +- +r +- +s +- +t +- +u +- +v +- +w +- +y +- +| +

    +

    $

    + +
  • $$ +
  • $n +
  • +

    %

    + +
  • %expect +
  • %left +
  • %nonassoc +
  • %prec +
  • %pure_parser +
  • %right +
  • %start +
  • %token +
  • %type +
  • %union +
  • +

    @

    + +
  • @$, @$ +
  • @n, @n +
  • +

    a

    + +
  • action +
  • action data types +
  • action features summary +
  • actions in mid-rule +
  • actions, location +
  • actions, semantic +
  • additional C code section +
  • algorithm of parser +
  • associativity +
  • +

    b

    + +
  • Backus-Naur form +
  • Bison declaration summary +
  • Bison declarations +
  • Bison declarations (introduction) +
  • Bison grammar +
  • Bison invocation +
  • Bison parser +
  • Bison parser algorithm +
  • Bison symbols, table of +
  • Bison utility +
  • BISON_HAIRY +
  • BISON_SIMPLE +
  • BNF +
  • +

    c

    + +
  • C code, section for additional +
  • C declarations section +
  • C-language interface +
  • calc +
  • calculator, infix notation +
  • calculator, location tracking +
  • calculator, multi-function +
  • calculator, simple +
  • character token +
  • compiling the parser +
  • conflicts +
  • conflicts, reduce/reduce +
  • conflicts, suppressing warnings of +
  • context-dependent precedence +
  • context-free grammar +
  • controlling function +
  • +

    d

    + +
  • dangling else +
  • data type of locations +
  • data types in actions +
  • data types of semantic values +
  • debugging +
  • declaration summary +
  • declarations, Bison +
  • declarations, Bison (introduction) +
  • declarations, C +
  • declaring literal string tokens +
  • declaring operator precedence +
  • declaring the start symbol +
  • declaring token type names +
  • declaring value types +
  • declaring value types, nonterminals +
  • default action +
  • default data type +
  • default location type +
  • default stack limit +
  • default start symbol +
  • defining language semantics +
  • +

    e

    + +
  • else, dangling +
  • environment variables +
  • error +
  • error recovery +
  • error recovery, simple +
  • error reporting function +
  • error reporting routine +
  • examples, simple +
  • exercises +
  • +

    f

    + +
  • FDL, GNU Free Documentation License +
  • file format +
  • finite-state machine +
  • formal grammar +
  • format of grammar file +
  • +

    g

    + +
  • glossary +
  • grammar file +
  • grammar rule syntax +
  • grammar rules section +
  • grammar, Bison +
  • grammar, context-free +
  • grouping, syntactic +
  • +

    i

    + +
  • infix notation calculator +
  • interface +
  • introduction +
  • invoking Bison +
  • invoking Bison under VMS +
  • +

    l

    + +
  • LALR(1) +
  • language semantics, defining +
  • layout of Bison grammar +
  • left recursion +
  • lexical analyzer +
  • lexical analyzer, purpose +
  • lexical analyzer, writing +
  • lexical tie-in +
  • literal string token +
  • literal token +
  • location, location +
  • location actions +
  • location tracking calculator +
  • look-ahead token +
  • LR(1) +
  • ltcalc +
  • +

    m

    + +
  • main function in simple example +
  • mfcalc +
  • mid-rule actions +
  • multi-function calculator +
  • multicharacter literal +
  • mutual recursion +
  • +

    n

    + +
  • nonterminal symbol +
  • +

    o

    + +
  • operator precedence +
  • operator precedence, declaring +
  • options for invoking Bison +
  • overflow of parser stack +
  • +

    p

    + +
  • parse error +
  • parser +
  • parser stack +
  • parser stack overflow +
  • parser state +
  • polish notation calculator +
  • position, textual, position, textual +
  • precedence declarations +
  • precedence of operators +
  • precedence, context-dependent +
  • precedence, unary operator +
  • preventing warnings about conflicts +
  • pure parser +
  • +

    r

    + +
  • recovery from errors +
  • recursive rule +
  • reduce/reduce conflict +
  • reduction +
  • reentrant parser +
  • reverse polish notation +
  • right recursion +
  • rpcalc +
  • rule syntax +
  • rules section for grammar +
  • running Bison (introduction) +
  • +

    s

    + +
  • semantic actions +
  • semantic value +
  • semantic value type +
  • shift/reduce conflicts +
  • shifting +
  • simple examples +
  • single-character literal +
  • stack overflow +
  • stack, parser +
  • stages in using Bison +
  • start symbol +
  • start symbol, declaring +
  • state (of parser) +
  • string token +
  • summary, action features +
  • summary, Bison declaration +
  • suppressing conflict warnings +
  • symbol +
  • symbol table example +
  • symbols (abstract) +
  • symbols in Bison, table of +
  • syntactic grouping +
  • syntax error +
  • syntax of grammar rules +
  • +

    t

    + +
  • terminal symbol +
  • textual position, textual position +
  • token +
  • token type +
  • token type names, declaring +
  • tracing the parser +
  • +

    u

    + +
  • unary operator precedence +
  • using Bison +
  • +

    v

    + +
  • value type, semantic +
  • value types, declaring +
  • value types, nonterminals, declaring +
  • value, semantic +
  • VMS +
  • +

    w

    + +
  • warnings, preventing +
  • writing a lexical analyzer +
  • +

    y

    + +
  • YYABORT +
  • YYACCEPT +
  • YYBACKUP +
  • yychar +
  • yyclearin +
  • YYDEBUG +
  • yydebug +
  • YYEMPTY +
  • yyerrok +
  • YYERROR +
  • yyerror +
  • YYERROR_VERBOSE +
  • YYINITDEPTH +
  • yylex +
  • YYLEX_PARAM +
  • yylloc +
  • YYLLOC_DEFAULT +
  • YYLTYPE +
  • yylval +
  • YYMAXDEPTH +
  • yynerrs +
  • yyparse +
  • YYPARSE_PARAM +
  • YYPRINT +
  • YYRECOVERING +
  • +

    |

    + +
  • | +
  • + + +


    +This document was generated on 4 November 2001 using +texi2html 1.56k. + + Index: ossp-adm/autotools/flex.html RCS File: /v/ossp/cvs/ossp-adm/autotools/flex.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/flex.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/flex.html' 2>/dev/null --- ossp-adm/autotools/flex.html +++ - 2025-04-19 11:54:39.055489545 +0200 @@ -0,0 +1,6798 @@ + + + + +The Flex Manual + + +

    The Flex Manual

    +

    +


    + + +

    Introduction

    + +

    + +flex +is a tool for generating +scanners. +A scanner is a program which recognizes lexical patterns in text. +The +flex +program +reads +the given input files, or its standard input if no file names are given, +for a description of a scanner to generate. The description is in +the form of pairs +of regular expressions and C code, called +rules. flex +generates as output a C source file, +`lex.yy.c' by default, +which defines a routine +yylex(). +This file is compiled and linked with the +flex runtime library +library to produce an executable. When the executable is run, +it analyzes its input for occurrences +of the regular expressions. Whenever it finds one, it executes +the corresponding C code. + + + + +

    Some Simple Examples

    + +

    +First some simple examples to get the flavor of how one uses +flex. +The following +flex +input specifies a scanner which whenever it encounters the string +`username' will replace it with the user's login name: + + +

    +@verbatim + %% + username printf( "%s", getlogin() ); + + +

    + +By default, any text not matched by a +flex +scanner +is copied to the output, so the net effect of this scanner is +to copy its input file to its output with each occurrence +of `username' expanded. +In this input, there is just one rule. `username' is the +pattern +and the `printf' is the +action. +The `%%' symbol marks the beginning of the rules. + + +

    +Here's another simple example: + + +

    + + +

    +@verbatim
    +            int num_lines = 0, num_chars = 0;
    +
    +    %%
    +    \n      ++num_lines; ++num_chars;
    +    .       ++num_chars;
    +
    +    %%
    +    main()
    +            {
    +            yylex();
    +            printf( "# of lines = %d, # of chars = %d\n",
    +                    num_lines, num_chars );
    +            }
    +
    + +

    +This scanner counts the number of characters and the number +of lines in its input (it produces no output other than the +final report on the counts). The first line +declares two globals, num_lines and num_chars, which are accessible +both inside +yylex() +and in the +main() +routine declared after the second `%%'. There are two rules, one +which matches a newline (`\n') and increments both the line count and +the character count, and one which matches any character other than +a newline (indicated by the `.' regular expression). + + +

    +A somewhat more complicated example: + + +

    + + +

    +@verbatim
    +    /* scanner for a toy Pascal-like language */
    +
    +    %{
    +    /* need this for the call to atof() below */
    +    #include math.h>
    +    %}
    +
    +    DIGIT    [0-9]
    +    ID       [a-z][a-z0-9]*
    +
    +    %%
    +
    +    {DIGIT}+    {
    +                printf( "An integer: %s (%d)\n", yytext,
    +                        atoi( yytext ) );
    +                }
    +
    +    {DIGIT}+"."{DIGIT}*        {
    +                printf( "A float: %s (%g)\n", yytext,
    +                        atof( yytext ) );
    +                }
    +
    +    if|then|begin|end|procedure|function        {
    +                printf( "A keyword: %s\n", yytext );
    +                }
    +
    +    {ID}        printf( "An identifier: %s\n", yytext );
    +
    +    "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );
    +
    +    "{"[\^{}}\n]*"}"     /* eat up one-line comments */
    +
    +    [ \t\n]+          /* eat up whitespace */
    +
    +    .           printf( "Unrecognized character: %s\n", yytext );
    +
    +    %%
    +
    +    main( argc, argv )
    +    int argc;
    +    char **argv;
    +        {
    +        ++argv, --argc;  /* skip over program name */
    +        if ( argc > 0 )
    +                yyin = fopen( argv[0], "r" );
    +        else
    +                yyin = stdin;
    +        
    +        yylex();
    +        }
    +
    + +

    +This is the beginnings of a simple scanner for a language like +Pascal. It identifies different types of +tokens +and reports on what it has seen. + + +

    +The details of this example will be explained in the following +sections. + + + + +

    Format of the Input File

    + +

    + + + + + +

    +The +flex +input file consists of three sections, separated by a line with just +`%%' +in it: + + +

    + + +

    +@verbatim
    +    definitions
    +    %%
    +    rules
    +    %%
    +    user code
    +
    + + + +

    Format of the Definitions Section

    +

    + + + + + +

    +The +definitions +section contains declarations of simple +name +definitions to simplify the scanner specification, and declarations of +start conditions, +which are explained in a later section. + + +

    + +Name definitions have the form: + + + +

    +@verbatim
    +    name definition
    +
    + +

    +The `name' is a word beginning with a letter or an underscore (`_') +followed by zero or more letters, digits, `_', or `-' (dash). +The definition is taken to begin at the first non-whitespace character +following the name and continuing to the end of the line. +The definition can subsequently be referred to using `{name}', which +will expand to `(definition)'. For example, + + +

    + + +

    +@verbatim
    +    DIGIT    [0-9]
    +    ID       [a-z][a-z0-9]*
    +
    + +

    +Defines `DIGIT' to be a regular expression which matches a +single digit, and +`ID' to be a regular expression which matches a letter +followed by zero-or-more letters-or-digits. +A subsequent reference to + + +

    + + +

    +@verbatim
    +    {DIGIT}+"."{DIGIT}*
    +
    + +

    +is identical to + + + +

    +@verbatim
    +    ([0-9])+"."([0-9])*
    +
    + +

    +and matches one-or-more digits followed by a '.' followed +by zero-or-more digits. + + +

    +An unindented comment (i.e., a line +beginning with `/*') is copied verbatim to the output up +to the next `*/'. + + +

    + + + + +Any +indented +text or text enclosed in +`%{' +and +`%}' +is also copied verbatim to the output (with the %{ and %} symbols removed). +The %{ and %} symbols must appear unindented on lines by themselves. + + + + +

    Format of the Rules Section

    +

    + + + + + +

    +The +rules +section of the +flex +input contains a series of rules of the form: + + + +

    +@verbatim
    +    pattern   action
    +
    + +

    +where the pattern must be unindented and the action must begin +on the same line. + + +

    +See section Patterns, for a further description of patterns and actions. + + +

    +In the rules section, +any indented or %{ %} enclosed text appearing before the +first rule may be used to declare variables +which are local to the scanning routine and (after the declarations) +code which is to be executed whenever the scanning routine is entered. +Other indented or %{ %} text in the rule section is still copied to the output, +but its meaning is not well-defined and it may well cause compile-time +errors (this feature is present for +POSIX +compliance. See section Incompatibilities with Lex and Posix, for other such features). + + +

    +Any +indented +text or text enclosed in +`%{' +and +`%}' +is copied verbatim to the output (with the %{ and %} symbols removed). +The %{ and %} symbols must appear unindented on lines by themselves. + + + + +

    Format of the User Code Section

    +

    + + + + + +

    +The user code section is simply copied to +`lex.yy.c' +verbatim. +It is used for companion routines which call or are called +by the scanner. The presence of this section is optional; +if it is missing, the second +`%%' +in the input file may be skipped, too. + + + + +

    Comments in the Input

    +

    + + + +

    +Flex supports C-style comments, that is, anything between /* and */ is +considered a comment. Whenever flex encounters a comment, it copies +the entire comment verbatim to the generated source code. Comments +may appear just about anywhere, but with the following exceptions: + + + +

    + +

    +If you want to follow a simple rule, then always begin a comment on a new line, +with one or more whitespace characters before the initial `/*'). +This rule will work anywhere in the input file. + + +

    +All the comments in the following example are OK: + + +

    + + + +

    +@verbatim
    +%{
    +/* code block */
    +%}
    +
    +/* Definitions Section */
    +%x STATE_X
    +
    +%%
    +    /* Rules Section */
    +ruleA   /* after regex */ { /* code block */ } /* after code block */
    +        /* Rules Section (indented) */
    +<STATE_X>{
    +ruleC   ECHO;
    +ruleD   ECHO;
    +%{
    +/* code block */
    +%}
    +}
    +%%
    +/* User Code Section */
    +
    +
    + + + +

    Patterns

    +

    + + + +

    +The patterns in the input are written using an extended set of regular +expressions. These are: + + +

    + + +

    + +
    `x' +
    +match the character 'x' + +
    `.' +
    +any character (byte) except newline + + + +
    `[xyz]' +
    +a character class; in this case, the pattern +matches either an 'x', a 'y', or a 'z' + + + +
    `[abj-oZ]' +
    +a "character class" with a range in it; matches +an 'a', a 'b', any letter from 'j' through 'o', +or a 'Z' + + + +
    `[^A-Z]' +
    +a "negated character class", i.e., any character +but those in the class. In this case, any +character EXCEPT an uppercase letter. + +
    `[^A-Z\n]' +
    +any character EXCEPT an uppercase letter or +a newline + +
    `r*' +
    +zero or more r's, where r is any regular expression + +
    `r+' +
    +one or more r's + +
    `r?' +
    +zero or one r's (that is, "an optional r") + +
    `r{2,5}' +
    +anywhere from two to five r's + +
    `r{2,}' +
    +two or more r's + +
    `r{4}' +
    +exactly 4 r's + + +
    `{name}' +
    +the expansion of the `name' definition +(see section Format of the Input File). + + + +
    `"[xyz]\"foo"' +
    +the literal string: `[xyz]"foo' + + +
    `\X' +
    +if X is `a', `b', `f', `n', `r', `t', or `v', +then the ANSI-C interpretation of `\x'. +Otherwise, a literal `X' (used to escape +operators such as `*') + + +
    `\0' +
    +a NUL character (ASCII code 0) + +
    `\123' +
    +the character with octal value 123 + +
    `\x2a' +
    +the character with hexadecimal value 2a + +
    `(r)' +
    +match an r; parentheses are used to override + precedence (see below) + +
    `rs' +
    +the regular expression r followed by the +regular expression s; called concatenation + +
    `r|s' +
    +either an r or an s + + +
    `r/s' +
    +an r but only if it is followed by an s. The +text matched by s is included when determining +whether this rule is the longest match, +but is then returned to the input before +the action is executed. So the action only +sees the text matched by r. This type +of pattern is called trailing context. +(There are some combinations of r/s that flex +cannot match correctly. See section Limitations, +regarding +dangerous trailing context.) + + +
    `^r' +
    +an r, but only at the beginning of a line (i.e., +when just starting to scan, or right after a +newline has been scanned). + + +
    `r$' +
    +an r, but only at the end of a line (i.e., just +before a newline). Equivalent to `r/\n'. + +Note that flex's notion of "newline" is exactly +whatever the C compiler used to compile flex +interprets `\n' as; in particular, on some DOS +systems you must either filter out `\r's in the +input yourself, or explicitly use `r/\r\n' for `r$'. + + +
    `<s>r' +
    +an r, but only in start condition s (see +section Start Conditions for discussion of start conditions). + +
    `<s1,s2,s3>r' +
    +same, but in any of start conditions s1, +s2, or s3. + +
    `<*>r' +
    +an r in any start condition, even an exclusive one. + + +
    `<<EOF>>' +
    +an end-of-file. + +
    `<s1,s2><<EOF>>' +
    +an end-of-file when in start condition s1 or s2 +
    + +

    +Note that inside of a character class, all regular expression operators +lose their special meaning except escape (`\') and the character class +operators, `-', `]]', and, at the beginning of the class, `^'. + + +

    + +The regular expressions listed above are grouped according to +precedence, from highest precedence at the top to lowest at the bottom. +Those grouped together have equal precedence (see special note on the +precedence of the repeat operator, `{}', under the documentation +for the `--posix' POSIX compliance option). For example, + + +

    + + +

    +@verbatim
    +    foo|bar*
    +
    + +

    +is the same as + + + +

    +@verbatim
    +    (foo)|(ba(r*))
    +
    + +

    +since the '*' operator has higher precedence than concatenation, and +concatenation higher than alternation ('|'). This pattern therefore +matches either the string `foo' or the string +`ba' followed by zero-or-more r's. To match `foo' or +zero-or-more repetitions of the string `bar', use: + + + +

    +@verbatim
    +    foo|(bar)*
    +
    + +

    +And to match a sequence of zero or more repetitions of `foo' and +`bar': + + +

    + + +

    +@verbatim
    +    (foo|bar)*
    +
    + +

    + +In addition to characters and ranges of characters, character classes +can also contain character class expressions. These are +expressions enclosed inside `[': and `:]' delimiters (which +themselves must appear between the `[' and `]' of the +character class. Other elements may occur inside the character class, +too). The valid expressions are: + + +

    + + +

    +@verbatim
    +    [:alnum:] [:alpha:] [:blank:]
    +    [:cntrl:] [:digit:] [:graph:]
    +    [:lower:] [:print:] [:punct:]
    +    [:space:] [:upper:] [:xdigit:]
    +
    + +

    +These expressions all designate a set of characters equivalent to +the corresponding standard C +isXXX +function. For example, +`[:alnum:]' +designates those characters for which +isalnum() +returns true - i.e., any alphabetic or numeric character. +Some systems don't provide +isblank(), +so flex defines +`[:blank:]' +as a blank or a tab. + + +

    +For example, the following character classes are all equivalent: + + +

    + + + +

    +@verbatim
    +    [[:alnum:]]
    +    [[:alpha:][:digit:]]
    +    [[:alpha:][0-9]]
    +    [a-zA-Z0-9]
    +
    + +

    + +If your scanner is case-insensitive (the `-i' flag), then +`[:upper:]' and `[:lower:]' are equivalent to +`[:alpha:]'. + + +

    +Some notes on patterns: + + + + + + + +

    + + + +

    How the Input Is Matched

    +

    + + + +

    +When the generated scanner is run, it analyzes its input looking for +strings which match any of its patterns. If it finds more than one +match, it takes the one matching the most text (for trailing context +rules, this includes the length of the trailing part, even though it +will then be returned to the input). If it finds two or more matches of +the same length, the rule listed first in the flex input file is +chosen. + + +

    +Once the match is determined, the text corresponding to the match +(called the token) is made available in the global character +pointer yytext, and its length in the global integer yyleng. +The action corresponding to the matched pattern is then executed +(see section Actions), and then the remaining input is scanned for another +match. + + +

    + +If no match is found, then the +default rule +is executed: the next character in the input is considered matched and +copied to the standard output. Thus, the simplest valid +flex +input is: + + +

    + + +

    +@verbatim
    +    %%
    +
    + +

    +which generates a scanner that simply copies its input (one character +at a time) to its output. + + +

    + + + + + +

    + +Note that yytext can be defined in two different ways: either as a +character pointer or as a character array. You can +control which definition flex uses by including one of the +special directives %pointer or %array in the first +(definitions) section of your flex input. The default is +%pointer, unless you use the `-l' lex compatibility option, +in which case yytext will be an array. The advantage of using +%pointer is substantially faster scanning and no buffer overflow +when matching very large tokens (unless you run out of dynamic memory). +The disadvantage is that you are restricted in how your actions can +modify yytext (see section Actions), and calls to the unput() +function destroys the present contents of yytext, which can be a +considerable porting headache when moving between different lex +versions. + + +

    +The advantage of +%array +is that you can then modify +yytext +to your heart's content, and calls to +unput() +do not destroy +yytext +(see section Actions). Furthermore, existing +lex +programs sometimes access +yytext +externally using declarations of the form: + + + +

    +@verbatim
    +    extern char yytext[];
    +
    + +

    +This definition is erroneous when used with %pointer, but correct +for %array. + + +

    +The %array declaration defines yytext to be an array of +YYLMAX characters, which defaults to a fairly large value. You +can change the size by simply #define'ing YYLMAX to a different +value in the first section of your flex input. As mentioned +above, with %pointer yytext grows dynamically to accommodate +large tokens. While this means your %pointer scanner can +accommodate very large tokens (such as matching entire blocks of +comments), bear in mind that each time the scanner must resize +yytext it also must rescan the entire token from the beginning, so +matching such tokens can prove slow. yytext presently does +not dynamically grow if a call to unput() results in too +much text being pushed back; instead, a run-time error results. + + +

    + +Also note that you cannot use %array with C++ scanner classes +(see section Generating C++ Scanners). + + + + +

    Actions

    +

    + + + +

    +Each pattern in a rule has a corresponding action, which can be any +arbitrary C statement. The pattern ends at the first non-escaped +whitespace character; the remainder of the line is its action. If the +action is empty, then when the pattern is matched the input token +is simply discarded. For example, here is the specification for a program +which deletes all occurrences of `zap me' from its input: + + +

    + + +

    +@verbatim
    +    %%
    +    "zap me"
    +
    + +

    +(It will copy all other characters in the input to the output since +they will be matched by the default rule.) + + +

    +Here is a program which compresses multiple blanks and tabs down to a +single blank, and throws away whitespace found at the end of a line: + + +

    + + + +

    +@verbatim
    +    %%
    +    [ \t]+        putchar( ' ' );
    +    [ \t]+$       /* ignore this token */
    +
    + +

    + + + + + + + +

    +If the action contains a `}', then the action spans till the balancing `}' +is found, and the action may cross multiple lines. +flex +knows about C strings and comments and won't be fooled by braces found +within them, but also allows actions to begin with +`%{' +and will consider the action to be all the text up to the next +`%}' +(regardless of ordinary braces inside the action). + + +

    +An action consisting solely of a vertical bar ('|') means "same as the +action for the next rule". See below for an illustration. + + +

    +Actions can include arbitrary C code, including return statements +to return a value to whatever routine called yylex(). Each time +yylex() is called it continues processing tokens from where it +last left off until it either reaches the end of the file or executes a +return. + + +

    + +Actions are free to modify yytext except for lengthening it +(adding characters to its end--these will overwrite later characters in +the input stream). This however does not apply when using %array +(see section How the Input Is Matched). In that case, yytext may be freely modified in +any way. + + +

    + + +Actions are free to modify +yyleng +except they should not do so if the action also includes use of +yymore() +(see below). + + +

    + + + +

    +There are a number of special directives which can be included within +an action: + + +

    + +
    ECHO +
    + + +copies yytext to the scanner's output. + + +
    BEGIN +
    +followed by the name of a start condition places the scanner in the +corresponding start condition (see below). + + +
    REJECT +
    +directs the scanner to proceed on to the "second best" rule which +matched the input (or a prefix of the input). The rule is chosen as +described above in section How the Input Is Matched, and yytext and yyleng set +up appropriately. It may either be one which matched as much text as +the originally chosen rule but came later in the flex input file, +or one which matched less text. For example, the following will both +count the words in the input and call the routine special() +whenever `frob' is seen: + + + + +
    +@verbatim
    +            int word_count = 0;
    +    %%
    +
    +    frob        special(); REJECT;
    +    [^ \t\n]+   ++word_count;
    +
    + +Without the REJECT, any occurences of `frob' in the input +would not be counted as words, since the scanner normally executes only +one action per token. Multiple uses of REJECT are allowed, each +one finding the next best choice to the currently active rule. For +example, when the following scanner scans the token `abcd', it will +write `abcdabcaba' to the output: + + + +
    +@verbatim
    +    %%
    +    a        |
    +    ab       |
    +    abc      |
    +    abcd     ECHO; REJECT;
    +    .|\n     /* eat up any unmatched character */
    +
    + +(The first three rules share the fourth's action since they use +the special '|' action.) +REJECT +is a particularly expensive feature in terms of scanner performance; +if it is used in +any +of the scanner's actions it will slow down +all +of the scanner's matching. Furthermore, +REJECT +cannot be used with the +`-Cf' +or +`-CF' +options (see section Invoking Flex). + +Note also that unlike the other special actions, REJECT is a +branch. code immediately following it in the action will +not be executed. + + +
    yymore() +
    +tells the scanner that the next time it matches a rule, the +corresponding token should be appended onto the current value of +yytext rather than replacing it. For example, given the input +`mega-kludge' the following will write `mega-mega-kludge' to +the output: + + + + +
    +@verbatim
    +    %%
    +    mega-    ECHO; yymore();
    +    kludge   ECHO;
    +
    + +First `mega-' is matched and echoed to the output. Then `kludge' +is matched, but the previous `mega-' is still hanging around at the +beginning of +yytext +so the +ECHO +for the `kludge' rule will actually write `mega-kludge'. +
    + +

    +Two notes regarding use of yymore(). First, yymore() +depends on the value of yyleng correctly reflecting the size of +the current token, so you must not modify yyleng if you are using +yymore(). Second, the presence of yymore() in the +scanner's action entails a minor performance penalty in the scanner's +matching speed. + + +

    + +yyless(n) returns all but the first n characters of the +current token back to the input stream, where they will be rescanned +when the scanner looks for the next match. yytext and +yyleng are adjusted appropriately (e.g., yyleng will now be +equal to n). For example, on the input `foobar' the +following will write out `foobarbar': + + +

    + + + + +

    +@verbatim
    +    %%
    +    foobar    ECHO; yyless(3);
    +    [a-z]+    ECHO;
    +
    + +

    +An argument of 0 to +yyless() +will cause the entire current input string to be scanned again. Unless you've +changed how the scanner will subsequently process its input (using +BEGIN, +for example), this will result in an endless loop. + + +

    +Note that +yyless() +is a macro and can only be used in the flex input file, not from +other source files. + + +

    + + +unput(c) +puts the character +c +back onto the input stream. It will be the next character scanned. +The following action will take the current token and cause it +to be rescanned enclosed in parentheses. + + +

    + + +

    +@verbatim
    +    {
    +    int i;
    +    /* Copy yytext because unput() trashes yytext */
    +    char *yycopy = strdup( yytext );
    +    unput( ')' );
    +    for ( i = yyleng - 1; i >= 0; --i )
    +        unput( yycopy[i] );
    +    unput( '(' );
    +    free( yycopy );
    +    }
    +
    + +

    +Note that since each unput() puts the given character back at the +beginning of the input stream, pushing back strings must be done +back-to-front. + + +

    + + + + +

    +An important potential problem when using +unput() +is that if you are using +%pointer +(the default), a call to +unput() +destroys +the contents of +yytext, +starting with its rightmost character and devouring one character to +the left with each call. If you need the value of yytext preserved +after a call to +unput() +(as in the above example), +you must either first copy it elsewhere, or build your scanner using +%array +instead (see section How the Input Is Matched). + + +

    + + +Finally, note that you cannot put back `EOF' to attempt to mark the +input stream with an end-of-file. + + +

    + +input() reads the next character from the input stream. For +example, the following is one way to eat up C comments: + + +

    + + + +

    +@verbatim
    +    %%
    +    "/*"        {
    +                register int c;
    +
    +                for ( ; ; )
    +                    {
    +                    while ( (c = input()) != '*' &&
    +                            c != EOF )
    +                        ;    /* eat up text of comment */
    +
    +                    if ( c == '*' )
    +                        {
    +                        while ( (c = input()) == '*' )
    +                            ;
    +                        if ( c == '/' )
    +                            break;    /* found the end */
    +                        }
    +
    +                    if ( c == EOF )
    +                        {
    +                        error( "EOF in comment" );
    +                        break;
    +                        }
    +                    }
    +                }
    +
    + +

    + +(Note that if the scanner is compiled using C++, then +input() is instead referred to as yyinput(), in order to +avoid a name clash with the C++ stream by the name of +input.) + + +

    + +YY_FLUSH_BUFFER() +flushes the scanner's internal buffer +so that the next time the scanner attempts to match a token, it will +first refill the buffer using +YY_INPUT() +(see section The Generated Scanner). This action is a special case +of the more general +yy_flush_buffer() +function, described below (see section Multiple Input Buffers) + + +

    + + + + + + + +

    +yyterminate() +can be used in lieu of a return statement in an action. It terminates +the scanner and returns a 0 to the scanner's caller, indicating "all done". +By default, +yyterminate() +is also called when an end-of-file is encountered. It is a macro and +may be redefined. + + + + +

    The Generated Scanner

    + +

    + +The output of flex is the file `lex.yy.c', which contains +the scanning routine yylex(), a number of tables used by it for +matching tokens, and a number of auxiliary routines and macros. By +default, yylex() is declared as follows: + + + +

    +@verbatim
    +    int yylex()
    +        {
    +        ... various definitions and the actions in here ...
    +        }
    +
    + +

    + +(If your environment supports function prototypes, then it will +be + int yylex( void ).) This definition may be changed by defining +the YY_DECL macro. For example, you could use: + + +

    + + +

    +@verbatim
    +    #define YY_DECL float lexscan( a, b ) float a, b;
    +
    + +

    +to give the scanning routine the name lexscan, returning a float, +and taking two floats as arguments. Note that if you give arguments to +the scanning routine using a K&R-style/non-prototyped function +declaration, you must terminate the definition with a semi-colon (;). + + +

    + +Whenever yylex() is called, it scans tokens from the global input +file `yyin' (which defaults to stdin). It continues until it +either reaches an end-of-file (at which point it returns the value 0) or +one of its actions executes a return statement. + + +

    + +If the scanner reaches an end-of-file, subsequent calls are undefined +unless either `yyin' is pointed at a new input file (in which case +scanning continues from that file), or yyrestart() is called. +yyrestart() takes one argument, a FILE * pointer (which +can be nil, if you've set up YY_INPUT to scan from a source other +than yyin), and initializes `yyin' for scanning from that +file. Essentially there is no difference between just assigning +`yyin' to a new input file or using yyrestart() to do so; +the latter is available for compatibility with previous versions of +flex, and because it can be used to switch input files in the +middle of scanning. It can also be used to throw away the current input +buffer, by calling it with an argument of `yyin'; but it would be +better to use YY_FLUSH_BUFFER (see section Actions). Note that +yyrestart() does not reset the start condition to +INITIAL (see section Start Conditions). + + +

    + +If +yylex() +stops scanning due to executing a +return +statement in one of the actions, the scanner may then be called again and it +will resume scanning where it left off. + + +

    +By default (and for purposes of efficiency), the scanner uses +block-reads rather than simple getc() calls to read characters +from `yyin'. The nature of how it gets its input can be controlled +by defining the YY_INPUT macro. The calling sequence for +YY_INPUT() is YY_INPUT(buf,result,max_size). Its action +is to place up to max_size characters in the character array +buf and return in the integer variable result either the +number of characters read or the constant YY_NULL (0 on Unix +systems) to indicate `EOF'. The default YY_INPUT reads from +the global file-pointer `yyin'. + + +

    + +Here is a sample definition of YY_INPUT (in the definitions +section of the input file): + + +

    + + +

    +@verbatim
    +    %{
    +    #define YY_INPUT(buf,result,max_size) \
    +        { \
    +        int c = getchar(); \
    +        result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
    +        }
    +    %}
    +
    + +

    +This definition will change the input processing to occur +one character at a time. + + +

    + +When the scanner receives an end-of-file indication from YY_INPUT, it +then checks the yywrap() function. If yywrap() returns +false (zero), then it is assumed that the function has gone ahead and +set up `yyin' to point to another input file, and scanning +continues. If it returns true (non-zero), then the scanner terminates, +returning 0 to its caller. Note that in either case, the start +condition remains unchanged; it does not revert to +INITIAL. + + +

    +If you do not supply your own version of yywrap(), then you must +either use %option noyywrap (in which case the scanner behaves as +though yywrap() returned 1), or you must link with `-lfl' to +obtain the default version of the routine, which always returns 1. + + +

    +For scanning from in-memory buffers (e.g., scanning strings), see +@xref{Scanning Strings} +See section Multiple Input Buffers. + + +

    +The scanner writes its +ECHO +output to the +`yyout' +global (default, `stdout'), which may be redefined by the user simply +by assigning it to some other +FILE +pointer. + + + + +

    Start Conditions

    + +

    + +flex +provides a mechanism for conditionally activating rules. Any rule +whose pattern is prefixed with `<sc>' will only be active when +the scanner is in the start condition named sc. For example, + + +

    + + +

    +@verbatim
    +    <STRING>[^"]*        { /* eat up the string body ... */
    +                ...
    +                }
    +
    + +

    +will be active only when the scanner is in the STRING start +condition, and + + +

    + + +

    +@verbatim
    +    <INITIAL,STRING,QUOTE>\.        { /* handle an escape ... */
    +                ...
    +                }
    +
    + +

    +will be active only when the current start condition is either +INITIAL, STRING, or QUOTE. + + +

    + +Start conditions are declared in the definitions (first) section of the +input using unindented lines beginning with either `%s' or +`%x' followed by a list of names. The former declares +inclusive start conditions, the latter exclusive start +conditions. A start condition is activated using the BEGIN +action. Until the next BEGIN action is executed, rules with the +given start condition will be active and rules with other start +conditions will be inactive. If the start condition is inclusive, then +rules with no start conditions at all will also be active. If it is +exclusive, then only rules qualified with the start condition +will be active. A set of rules contingent on the same exclusive start +condition describe a scanner which is independent of any of the other +rules in the flex input. Because of this, exclusive start +conditions make it easy to specify "mini-scanners" which scan portions +of the input that are syntactically different from the rest (e.g., +comments). + + +

    +If the distinction between inclusive and exclusive start conditions +is still a little vague, here's a simple example illustrating the +connection between the two. The set of rules: + + +

    + + +

    +@verbatim
    +    %s example
    +    %%
    +
    +    <example>foo   do_something();
    +
    +    bar            something_else();
    +
    + +

    +is equivalent to + + +

    + + +

    +@verbatim
    +    %x example
    +    %%
    +
    +    <example>foo   do_something();
    +
    +    <INITIAL,example>bar    something_else();
    +
    + +

    +Without the <INITIAL,example> qualifier, the bar pattern in +the second example wouldn't be active (i.e., couldn't match) when in +start condition example. If we just used example> to +qualify bar, though, then it would only be active in +example and not in INITIAL, while in the first example +it's active in both, because in the first example the example +start condition is an inclusive (%s) start condition. + + +

    + +Also note that the special start-condition specifier +<*> +matches every start condition. Thus, the above example could also +have been written: + + +

    + + +

    +@verbatim
    +    %x example
    +    %%
    +
    +    <example>foo   do_something();
    +
    +    <*>bar    something_else();
    +
    + +

    +The default rule (to ECHO any unmatched character) remains active +in start conditions. It is equivalent to: + + +

    + + +

    +@verbatim
    +    <*>.|\n     ECHO;
    +
    + +

    + + + +BEGIN(0) returns to the original state where only the rules with +no start conditions are active. This state can also be referred to as +the start-condition INITIAL, so BEGIN(INITIAL) is +equivalent to BEGIN(0). (The parentheses around the start +condition name are not required but are considered good style.) + + +

    +BEGIN actions can also be given as indented code at the beginning +of the rules section. For example, the following will cause the scanner +to enter the SPECIAL start condition whenever yylex() is +called and the global variable enter_special is true: + + +

    + + +

    +@verbatim
    +            int enter_special;
    +
    +    %x SPECIAL
    +    %%
    +            if ( enter_special )
    +                BEGIN(SPECIAL);
    +
    +    <SPECIAL>blahblahblah
    +    ...more rules follow...
    +
    + +

    +To illustrate the uses of start conditions, here is a scanner which +provides two different interpretations of a string like `123.456'. +By default it will treat it as three tokens, the integer `123', a +dot (`.'), and the integer `456'. But if the string is +preceded earlier in the line by the string `expect-floats' it will +treat it as a single token, the floating-point number `123.456': + + +

    + + +

    +@verbatim
    +    %{
    +    #include <math.h>
    +    %}
    +    %s expect
    +
    +    %%
    +    expect-floats        BEGIN(expect);
    +
    +    <expect>[0-9]+`.'[0-9]+      {
    +                printf( "found a float, = %f\n",
    +                        atof( yytext ) );
    +                }
    +    <expect>\n           {
    +                /* that's the end of the line, so
    +                 * we need another "expect-number"
    +                 * before we'll recognize any more
    +                 * numbers
    +                 */
    +                BEGIN(INITIAL);
    +                }
    +
    +    [0-9]+      {
    +                printf( "found an integer, = %d\n",
    +                        atoi( yytext ) );
    +                }
    +
    +    "."         printf( "found a dot\n" );
    +
    + +

    + +Here is a scanner which recognizes (and discards) C comments while +maintaining a count of the current input line. + + +

    + + +

    +@verbatim
    +    %x comment
    +    %%
    +            int line_num = 1;
    +
    +    "/*"         BEGIN(comment);
    +
    +    <comment>[^*\n]*        /* eat anything that's not a '*' */
    +    <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
    +    <comment>\n             ++line_num;
    +    <comment>"*"+"/"        BEGIN(INITIAL);
    +
    + +

    +This scanner goes to a bit of trouble to match as much +text as possible with each rule. In general, when attempting to write +a high-speed scanner try to match as much possible in each rule, as +it's a big win. + + +

    +Note that start-conditions names are really integer values and +can be stored as such. Thus, the above could be extended in the +following fashion: + + +

    + + + +

    +@verbatim
    +    %x comment foo
    +    %%
    +            int line_num = 1;
    +            int comment_caller;
    +
    +    "/*"         {
    +                 comment_caller = INITIAL;
    +                 BEGIN(comment);
    +                 }
    +
    +    ...
    +
    +    <foo>"/*"    {
    +                 comment_caller = foo;
    +                 BEGIN(comment);
    +                 }
    +
    +    <comment>[^*\n]*        /* eat anything that's not a '*' */
    +    <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
    +    <comment>\n             ++line_num;
    +    <comment>"*"+"/"        BEGIN(comment_caller);
    +
    + +

    + +Furthermore, you can access the current start condition using the +integer-valued YY_START macro. For example, the above +assignments to comment_caller could instead be written + + +

    + + +

    +@verbatim
    +    comment_caller = YY_START;
    +
    + +

    + +Flex provides YYSTATE as an alias for YY_START (since that +is what's used by AT&T lex). + + +

    +Note that start conditions do not have their own name-space; %s's and %x's +declare names in the same fashion as #define's. + + +

    +Finally, here's an example of how to match C-style quoted strings using +exclusive start conditions, including expanded escape sequences (but +not including checking for a string that's too long): + + +

    + + +

    +@verbatim
    +    %x str
    +
    +    %%
    +            char string_buf[MAX_STR_CONST];
    +            char *string_buf_ptr;
    +
    +    \"      string_buf_ptr = string_buf; BEGIN(str);
    +
    +    <str>\"        { /* saw closing quote - all done */
    +            BEGIN(INITIAL);
    +            *string_buf_ptr = '\0';
    +            /* return string constant token type and
    +             * value to parser
    +             */
    +            }
    +
    +    <str>\n        {
    +            /* error - unterminated string constant */
    +            /* generate error message */
    +            }
    +
    +    <str>\\[0-7]{1,3} {
    +            /* octal escape sequence */
    +            int result;
    +
    +            (void) sscanf( yytext + 1, "%o", &result );
    +
    +            if ( result > 0xff )
    +                    /* error, constant is out-of-bounds */
    +
    +            *string_buf_ptr++ = result;
    +            }
    +
    +    <str>\\[0-9]+ {
    +            /* generate error - bad escape sequence; something
    +             * like '\48' or '\0777777'
    +             */
    +            }
    +
    +    <str>\\n  *string_buf_ptr++ = '\n';
    +    <str>\\t  *string_buf_ptr++ = '\t';
    +    <str>\\r  *string_buf_ptr++ = '\r';
    +    <str>\\b  *string_buf_ptr++ = '\b';
    +    <str>\\f  *string_buf_ptr++ = '\f';
    +
    +    <str>\\(.|\n)  *string_buf_ptr++ = yytext[1];
    +
    +    <str>[^\\\n\"]+        {
    +            char *yptr = yytext;
    +
    +            while ( *yptr )
    +                    *string_buf_ptr++ = *yptr++;
    +            }
    +
    + +

    + +Often, such as in some of the examples above, you wind up writing a +whole bunch of rules all preceded by the same start condition(s). Flex +makes this a little easier and cleaner by introducing a notion of start +condition scope. A start condition scope is begun with: + + + +

    +@verbatim
    +    <SCs>{
    +
    + +

    +where SCs is a list of one or more start conditions. Inside the +start condition scope, every rule automatically has the prefix +SCs> applied to it, until a `}' which matches the initial +`{'. So, for example, + + +

    + + +

    +@verbatim
    +    <ESC>{
    +        "\\n"   return '\n';
    +        "\\r"   return '\r';
    +        "\\f"   return '\f';
    +        "\\0"   return '\0';
    +    }
    +
    + +

    +is equivalent to: + + + +

    +@verbatim
    +    <ESC>"\\n"  return '\n';
    +    <ESC>"\\r"  return '\r';
    +    <ESC>"\\f"  return '\f';
    +    <ESC>"\\0"  return '\0';
    +
    + +

    +Start condition scopes may be nested. + + +

    + + + + +

    +The following routines are available for manipulating stacks of start conditions: + + +

    +

    +
    Function: void yy_push_state ( int new_state ) +
    +pushes the current start condition onto the top of the start condition +stack and switches to +new_state +as though you had used +BEGIN new_state +(recall that start condition names are also integers). +
    + + +

    +

    +
    Function: void yy_pop_state () +
    +pops the top of the stack and switches to it via +BEGIN. +
    + + +

    +

    +
    Function: int yy_top_state () +
    +returns the top of the stack without altering the stack's contents. +
    + + +

    + +The start condition stack grows dynamically and so has no built-in size +limitation. If memory is exhausted, program execution aborts. + + +

    +To use start condition stacks, your scanner must include a %option +stack directive (see section Invoking Flex). + + + + +

    Multiple Input Buffers

    + +

    + +Some scanners (such as those which support "include" files) require +reading from several input streams. As flex scanners do a large +amount of buffering, one cannot control where the next input will be +read from by simply writing a YY_INPUT() which is sensitive to +the scanning context. YY_INPUT() is only called when the scanner +reaches the end of its buffer, which may be a long time after scanning a +statement such as an include statement which requires switching +the input source. + + +

    +To negotiate these sorts of problems, flex provides a mechanism +for creating and switching between multiple input buffers. An input +buffer is created by using: + + +

    + +

    +
    Function: YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ) +
    +
    + + +

    +which takes a FILE pointer and a size and creates a buffer +associated with the given file and large enough to hold size +characters (when in doubt, use YY_BUF_SIZE for the size). It +returns a YY_BUFFER_STATE handle, which may then be passed to +other routines (see below). + +The YY_BUFFER_STATE type is a +pointer to an opaque struct yy_buffer_state structure, so you may +safely initialize YY_BUFFER_STATE variables to ((YY_BUFFER_STATE) +0) if you wish, and also refer to the opaque structure in order to +correctly declare input buffers in source files other than that of your +scanner. Note that the FILE pointer in the call to +yy_create_buffer is only used as the value of `yyin' seen by +YY_INPUT. If you redefine YY_INPUT() so it no longer uses +`yyin', then you can safely pass a nil FILE pointer to +yy_create_buffer. You select a particular buffer to scan from +using: + + +

    +

    +
    Function: void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ) +
    +
    + + +

    +The above switches the scanner's input buffer so subsequent tokens will +come from new_buffer. Note that yy_switch_to_buffer() may +be used by yywrap() to set things up for continued scanning, +instead of opening a new file and pointing `yyin' at it. Note also +that switching input sources via either yy_switch_to_buffer() or +yywrap() does not change the start condition. + + +

    + +

    +
    Function: void yy_delete_buffer ( YY_BUFFER_STATE buffer ) +
    +
    + + +

    +is used to reclaim the storage associated with a buffer. (buffer +can be nil, in which case the routine does nothing.) You can also clear +the current contents of a buffer using: + + +

    + + +

    +
    Function: void yy_flush_buffer ( YY_BUFFER_STATE buffer ) +
    +
    + + +

    +This function discards the buffer's contents, +so the next time the scanner attempts to match a token from the +buffer, it will first fill the buffer anew using +YY_INPUT(). + + +

    +

    +
    Function: YY_BUFFER_STATE yy_new_buffer ( FILE *file, int size ) +
    +
    + + +

    +is an alias for yy_create_buffer(), +provided for compatibility with the C++ use of new and +delete for creating and destroying dynamic objects. + + +

    + +Finally, the macro YY_CURRENT_BUFFER macro returns a +YY_BUFFER_STATE handle to the current buffer. + + +

    + +Here is an example of using these features for writing a scanner +which expands include files (the +<<EOF>> +feature is discussed below): + + +

    + + +

    +@verbatim
    +    /* the "incl" state is used for picking up the name
    +     * of an include file
    +     */
    +    %x incl
    +
    +    %{
    +    #define MAX_INCLUDE_DEPTH 10
    +    YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
    +    int include_stack_ptr = 0;
    +    %}
    +
    +    %%
    +    include             BEGIN(incl);
    +
    +    [a-z]+              ECHO;
    +    [^a-z\n]*\n?        ECHO;
    +
    +    <incl>[ \t]*      /* eat the whitespace */
    +    <incl>[^ \t\n]+   { /* got the include file name */
    +            if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
    +                {
    +                fprintf( stderr, "Includes nested too deeply" );
    +                exit( 1 );
    +                }
    +
    +            include_stack[include_stack_ptr++] =
    +                YY_CURRENT_BUFFER;
    +
    +            yyin = fopen( yytext, "r" );
    +
    +            if ( ! yyin )
    +                error( ... );
    +
    +            yy_switch_to_buffer(
    +                yy_create_buffer( yyin, YY_BUF_SIZE ) );
    +
    +            BEGIN(INITIAL);
    +            }
    +
    +    <<EOF>> {
    +            if ( --include_stack_ptr  0 )
    +                {
    +                yyterminate();
    +                }
    +
    +            else
    +                {
    +                yy_delete_buffer( YY_CURRENT_BUFFER );
    +                yy_switch_to_buffer(
    +                     include_stack[include_stack_ptr] );
    +                }
    +            }
    +
    + +

    +@anchor{Scanning Strings} + +The following routines are available for setting up input buffers for +scanning in-memory strings instead of files. All of them create a new +input buffer for scanning the string, and return a corresponding +YY_BUFFER_STATE handle (which you should delete with +yy_delete_buffer() when done with it). They also switch to the +new buffer using yy_switch_to_buffer(), so the next call to +yylex() will start scanning the string. + + +

    +

    +
    Function: YY_BUFFER_STATE yy_scan_string ( const char *str ) +
    +scans a NUL-terminated string. +
    + + +

    +

    +
    Function: YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ) +
    +scans len bytes (including possibly NULs) starting at location +bytes. +
    + + +

    +Note that both of these functions create and scan a copy of the +string or bytes. (This may be desirable, since yylex() modifies +the contents of the buffer it is scanning.) You can avoid the copy by +using: + + +

    + +

    +
    Function: YY_BUFFER_STATE yy_scan_buffer (char *base, yy_size_t size) +
    +which scans in place the buffer starting at base, consisting of +size bytes, the last two bytes of which must be +YY_END_OF_BUFFER_CHAR (ASCII NUL). These last two bytes are not +scanned; thus, scanning consists of base[0] through +base[size-2], inclusive. +
    + + +

    +If you fail to set up base in this manner (i.e., forget the final +two YY_END_OF_BUFFER_CHAR bytes), then yy_scan_buffer() +returns a nil pointer instead of creating a new input buffer. + + +

    +

    +
    Data type: yy_size_t +
    +is an integral type to which you can cast an integer expression +reflecting the size of the buffer. +
    + + + + +

    End-of-File Rules

    + +

    + +The special rule <<EOF>> indicates +actions which are to be taken when an end-of-file is +encountered and yywrap() returns non-zero (i.e., indicates +no further files to process). The action must finish +by doing one of the following things: + + + +

    + +

    +<<EOF>> rules may not be used with other patterns; they may only be +qualified with a list of start conditions. If an unqualified <<EOF>> +rule is given, it applies to all start conditions which do not +already have <<EOF>> actions. To specify an <<EOF>> rule for only the +initial start condition, use: + + + +

    +@verbatim
    +    <INITIAL><<EOF>>
    +
    + +

    +These rules are useful for catching things like unclosed comments. An +example: + + +

    + + +

    +@verbatim
    +    %x quote
    +    %%
    +
    +    ...other rules for dealing with quotes...
    +
    +    <quote><<EOF>>   {
    +             error( "unterminated quote" );
    +             yyterminate();
    +             }
    +   <<EOF>>  {
    +             if ( *++filelist )
    +                 yyin = fopen( *filelist, "r" );
    +             else
    +                yyterminate();
    +             }
    +
    + + + +

    Miscellaneous Macros

    + +

    + +The macro YY_USER_ACTION can be defined to provide an action +which is always executed prior to the matched rule's action. For +example, it could be #define'd to call a routine to convert yytext to +lower-case. When YY_USER_ACTION is invoked, the variable +yy_act gives the number of the matched rule (rules are numbered +starting with 1). Suppose you want to profile how often each of your +rules is matched. The following would do the trick: + + +

    + + +

    +@verbatim
    +    #define YY_USER_ACTION ++ctr[yy_act]
    +
    + +

    + +where ctr is an array to hold the counts for the different rules. +Note that the macro YY_NUM_RULES gives the total number of rules +(including the default rule), even if you use `-s)', so a correct +declaration for ctr is: + + + +

    +@verbatim
    +    int ctr[YY_NUM_RULES];
    +
    + +

    + +The macro YY_USER_INIT may be defined to provide an action which +is always executed before the first scan (and before the scanner's +internal initializations are done). For example, it could be used to +call a routine to read in a data table or open a logging file. + + +

    + +The macro yy_set_interactive(is_interactive) can be used to +control whether the current buffer is considered interactive. An +interactive buffer is processed more slowly, but must be used when the +scanner's input source is indeed interactive to avoid problems due to +waiting to fill buffers (see the discussion of the `-I' flag in +section Invoking Flex). A non-zero value in the macro invocation marks +the buffer as interactive, a zero value as non-interactive. Note that +use of this macro overrides %option always-interactive or +%option never-interactive (see section Invoking Flex). +yy_set_interactive() must be invoked prior to beginning to scan +the buffer that is (or is not) to be considered interactive. + + +

    + + +The macro yy_set_bol(at_bol) can be used to control whether the +current buffer's scanning context for the next token match is done as +though at the beginning of a line. A non-zero macro argument makes +rules anchored with `^' active, while a zero argument makes +`^' rules inactive. + + +

    + + +The macro YY_AT_BOL() returns true if the next token scanned from +the current buffer will have `^' rules active, false otherwise. + + +

    + + +In the generated scanner, the actions are all gathered in one large +switch statement and separated using YY_BREAK, which may be +redefined. By default, it is simply a break, to separate each +rule's action from the following rule's. Redefining YY_BREAK +allows, for example, C++ users to #define YY_BREAK to do nothing (while +being very careful that every rule ends with a break" or a +return!) to avoid suffering from unreachable statement warnings +where because a rule's action ends with return, the +YY_BREAK is inaccessible. + + + + +

    Values Available To the User

    + +

    +This chapter summarizes the various values available to the user in the +rule actions. + + +

    + +
    char *yytext +
    + + +holds the text of the current token. It may be modified but not +lengthened (you cannot append characters to the end). + + + + +If the special directive %array appears in the first section of +the scanner description, then yytext is instead declared +char yytext[YYLMAX], where YYLMAX is a macro definition +that you can redefine in the first section if you don't like the default +value (generally 8KB). Using %array results in somewhat slower +scanners, but the value of yytext becomes immune to calls to +unput(), which potentially destroy its value when yytext is +a character pointer. The opposite of %array is %pointer, +which is the default. + + +You cannot use %array when generating C++ scanner classes (the +`-+' flag). + + +
    int yyleng +
    +holds the length of the current token. + + +
    FILE *yyin +
    +is the file which by default flex reads from. It may be +redefined but doing so only makes sense before scanning begins or after +an EOF has been encountered. Changing it in the midst of scanning will +have unexpected results since flex buffers its input; use +yyrestart() instead. Once scanning terminates because an +end-of-file has been seen, you can assign `yyin' at the new input +file and then call the scanner again to continue scanning. + + +
    void yyrestart( FILE *new_file ) +
    +may be called to point `yyin' at the new input file. The +switch-over to the new file is immediate (any previously buffered-up +input is lost). Note that calling yyrestart() with `yyin' +as an argument thus throws away the current input buffer and continues +scanning the same input file. + + +
    FILE *yyout +
    +is the file to which ECHO actions are done. It can be reassigned +by the user. + + +
    YY_CURRENT_BUFFER +
    +returns a YY_BUFFER_STATE handle to the current buffer. + + +
    YY_START +
    +returns an integer value corresponding to the current start condition. +You can subsequently use this value with BEGIN to return to that +start condition. +
    + + + +

    Interfacing with Yacc

    + +

    + + + +

    + +One of the main uses of flex is as a companion to the yacc +parser-generator. yacc parsers expect to call a routine named +yylex() to find the next input token. The routine is supposed to +return the type of the next token as well as putting any associated +value in the global yylval. To use flex with yacc, +one specifies the `-d' option to yacc to instruct it to +generate the file `y.tab.h' containing definitions of all the +%tokens appearing in the yacc input. This file is then +included in the flex scanner. For example, if one of the tokens +is TOK_NUMBER, part of the scanner might look like: + + +

    + + +

    +@verbatim
    +    %{
    +    #include "y.tab.h"
    +    %}
    +
    +    %%
    +
    +    [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;
    +
    + + + +

    Invoking Flex

    + +

    + + + + + +

    +flex +has the following options. + + +

    + +
    `-b, --backup' +
    +Generate backing-up information to `lex.backup'. This is a list of +scanner states which require backing up and the input characters on +which they do so. By adding rules one can remove backing-up states. If +all backing-up states are eliminated and `-Cf' or -CF +is used, the generated scanner will run faster (see the `--perf-report' flag). +Only users who wish to squeeze every last cycle out of their scanners +need worry about this option. (see section Performance Considerations). + +
    `-c' +
    +is a do-nothing option included for POSIX compliance. + +
    `-d, --debug' +
    +makes the generated scanner run in debug mode. Whenever a pattern +is recognized and the global variable yy_flex_debug is non-zero +(which is the default), the scanner will write to `stderr' a line +of the form: + + +
    +@verbatim
    +    -accepting rule at line 53 ("the matched text")
    +
    + +The line number refers to the location of the rule in the file defining +the scanner (i.e., the file that was fed to flex). Messages are also +generated when the scanner backs up, accepts the default rule, reaches +the end of its input buffer (or encounters a NUL; at this point, the two +look the same as far as the scanner's concerned), or reaches an +end-of-file. + +
    `-f, --full' +
    +specifies +fast scanner. +No table compression is done and stdio is bypassed. +The result is large but fast. This option is equivalent to +`--Cfr' + +
    `-h, -?, --help' +
    +generates a "help" summary of flex's options to `stdout' +and then exits. + +
    `--header=FILE' +
    +instructs flex to write a C header to `FILE'. This file contains +function prototypes, extern variables, and macros used by the scanner. +It is meant to be included in other C files to avoid compiler warnings. +The `--header' option is not compatible with the `--c++' option, +since the C++ scanner provides its own header in `yyFlexLexer.h'. + +
    `-i, --case-insensitive' +
    +instructs flex to generate a case-insensitive scanner. The +case of letters given in the flex input patterns will be ignored, +and tokens in the input will be matched regardless of case. The matched +text given in yytext will have the preserved case (i.e., it will +not be folded). + +
    `-l, --lex-compat' +
    +turns on maximum compatibility with the original AT&T lex +implementation. Note that this does not mean full compatibility. +Use of this option costs a considerable amount of performance, and it +cannot be used with the `--c++', `--full', `--fast', `-Cf', or +`-CF' options. For details on the compatibilities it provides, see +section Incompatibilities with Lex and Posix. This option also results in the name +YY_FLEX_LEX_COMPAT being #define'd in the generated scanner. + +
    `-n' +
    +is another do-nothing option included only for +POSIX compliance. + +
    `-p, --perf-report' +
    +generates a performance report to `stderr'. The report consists of +comments regarding features of the flex input file which will +cause a serious loss of performance in the resulting scanner. If you +give the flag twice, you will also get comments regarding features that +lead to minor performance losses. + +Note that the use of REJECT, %option yylineno, and +variable trailing context (see section Limitations) entails a substantial +performance penalty; use of yymore(), the `^' operator, and +the `--interactive' flag entail minor performance penalties. + +
    `-s, --nodefault' +
    +causes the default rule (that unmatched scanner input is echoed +to `stdout)' to be suppressed. If the scanner encounters input +that does not match any of its rules, it aborts with an error. This +option is useful for finding holes in a scanner's rule set. + +
    `-t, --stdout' +
    +instructs flex to write the scanner it generates to standard +output instead of `lex.yy.c'. + +
    `-v, --verbose' +
    +specifies that flex should write to `stderr' a summary of +statistics regarding the scanner it generates. Most of the statistics +are meaningless to the casual flex user, but the first line +identifies the version of flex (same as reported by `--version'), +and the next line the flags used when generating the scanner, including +those that are on by default. + +
    `-w, --nowarn' +
    +suppresses warning messages. + +
    `-B, --batch' +
    +instructs flex to generate a batch scanner, the opposite of +interactive scanners generated by `--interactive' (see below). In +general, you use `-B' when you are certain that your scanner +will never be used interactively, and you want to squeeze a +little more performance out of it. If your goal is instead to +squeeze out a lot more performance, you should be using the +`-Cf' or `-CF' options, which turn on `--batch' automatically +anyway. + +
    `-F, --fast' +
    +specifies that the fast scanner table representation should be +used (and stdio bypassed). This representation is about as fast +as the full table representation `--full', and for some sets of +patterns will be considerably smaller (and for others, larger). In +general, if the pattern set contains both keywords and a +catch-all, identifier rule, such as in the set: + + +
    +@verbatim
    +    "case"    return TOK_CASE;
    +    "switch"  return TOK_SWITCH;
    +    ...
    +    "default" return TOK_DEFAULT;
    +    [a-z]+    return TOK_ID;
    +
    + +then you're better off using the full table representation. If only +the identifier rule is present and you then use a hash table or some such +to detect the keywords, you're better off using +`--fast'. + +This option is equivalent to `-CFr' (see below). It cannot be used +with `--c++'. + +
    `-I, --interactive' +
    +instructs flex to generate an interactive scanner. An +interactive scanner is one that only looks ahead to decide what token +has been matched if it absolutely must. It turns out that always +looking one extra character ahead, even if the scanner has already seen +enough text to disambiguate the current token, is a bit faster than only +looking ahead when necessary. But scanners that always look ahead give +dreadful interactive performance; for example, when a user types a +newline, it is not recognized as a newline token until they enter +another token, which often means typing in another whole line. + +flex scanners default to interactive unless you use the +`-Cf' or `-CF' table-compression options +(see section Performance Considerations). That's because if you're looking for +high-performance you should be using one of these options, so if you +didn't, flex assumes you'd rather trade off a bit of run-time +performance for intuitive interactive behavior. Note also that you +cannot use `--interactive' in conjunction with `-Cf' or +`-CF'. Thus, this option is not really needed; it is on by default +for all those cases in which it is allowed. + +You can force a scanner to +not +be interactive by using +`--batch' + +
    `-L, --noline' +
    +instructs +flex +not to generate +#line +directives. Without this option, +flex +peppers the generated scanner +with #line directives so error messages in the actions will be correctly +located with respect to either the original +flex +input file (if the errors are due to code in the input file), or +`lex.yy.c' +(if the errors are +flex's +fault -- you should report these sorts of errors to the email address +given in section Reporting Bugs). + +
    `-R, --reentrant' +
    +instructs flex to generate a reentrant C scanner. The generated scanner +may safely be used in a multi-threaded environment. The API for a +reentrant scanner is different than for a non-reentrant scanner +see section Reentrant C Scanners). Because of the API difference between +reentrant and non-reentrant flex scanners, non-reentrant flex +code must be modified before it is suitable for use with this option. +This option is not compatible with the `--c++' option. + +
    `-Rb, --reentrant-bison' +
    +instructs flex to generate a reentrant C scanner that is +meant to be called by a +GNU bison +pure parser. The scanner is the same as the scanner generated by the +`--reentrant' +option, but with minor API changes for +bison +compatibility. In particular, the declaration of +yylex +is modified, and support for +yylval +and +yylloc +is incorporated. See section Reentrant C Scanners with Bison Pure Parsers. + +The options `--reentrant' and `--reentrant-bison' do not affect the performance of +the scanner. + +
    `-T, --trace' +
    +makes flex run in trace mode. It will generate a lot of +messages to `stderr' concerning the form of the input and the +resultant non-deterministic and deterministic finite automata. This +option is mostly for use in maintaining flex. + +
    `-V, --version' +
    +prints the version number to `stdout' and exits. + +
    `-X, --posix' +
    +turns on maximum compatibility with the POSIX 1003.2-1992 definition of +lex. Since flex was originally designed to implement the +POSIX definition of lex this generally involves very few changes +in behavior. At the current writing the known differences between +flex and the POSIX standard are: + + + + +
    `-7, --7bit' +
    +instructs flex to generate a 7-bit scanner, i.e., one which can +only recognize 7-bit characters in its input. The advantage of using +`--7bit' is that the scanner's tables can be up to half the size of +those generated using the `--8bit'. The disadvantage is that such +scanners often hang or crash if their input contains an 8-bit character. + +Note, however, that unless you generate your scanner using the +`-Cf' or `-CF' table compression options, use of `--7bit' +will save only a small amount of table space, and make your scanner +considerably less portable. Flex's default behavior is to +generate an 8-bit scanner unless you use the `-Cf' or `-CF', +in which case flex defaults to generating 7-bit scanners unless +your site was always configured to generate 8-bit scanners (as will +often be the case with non-USA sites). You can tell whether flex +generated a 7-bit or an 8-bit scanner by inspecting the flag summary in +the `--verbose' output as described above. + +Note that if you use `-Cfe' or `-CFe' flex still +defaults to generating an 8-bit scanner, since usually with these +compression options full 8-bit tables are not much more expensive than +7-bit tables. + +
    `-8, --8bit' +
    +instructs flex to generate an 8-bit scanner, i.e., one which can +recognize 8-bit characters. This flag is only needed for scanners +generated using `-Cf' or `-CF', as otherwise flex defaults to +generating an 8-bit scanner anyway. + +See the discussion of +`--7bit' +above for flex's default behavior and the tradeoffs between 7-bit +and 8-bit scanners. + +
    `-+, --c++' +
    +specifies that you want flex to generate a C++ +scanner class. See section Generating C++ Scanners, for +details. + +
    `-C[aefFmr]' +
    +controls the degree of table compression and, more generally, trade-offs +between small scanners and fast scanners. + +
    `-Ca, --align' +
    +("align") instructs flex to trade off larger tables in the +generated scanner for faster performance because the elements of +the tables are better aligned for memory access and computation. On some +RISC architectures, fetching and manipulating longwords is more efficient +than with smaller-sized units such as shortwords. This option can +quadruple the size of the tables used by your scanner. + +
    `-Ce, --ecs' +
    +directs flex to construct equivalence classes, i.e., sets +of characters which have identical lexical properties (for example, if +the only appearance of digits in the flex input is in the +character class "[0-9]" then the digits '0', '1', ..., '9' will all be +put in the same equivalence class). Equivalence classes usually give +dramatic reductions in the final table/object file sizes (typically a +factor of 2-5) and are pretty cheap performance-wise (one array look-up +per character scanned). + +
    `-Cf' +
    +specifies that the full scanner tables should be generated - +flex should not compress the tables by taking advantages of +similar transition functions for different states. + +
    `-CF' +
    +specifies that the alternate fast scanner representation (described +above under the `--fast' flag) should be used. This option cannot be +used with `--c++'. + +
    `-Cm, --meta-ecs' +
    +directs +flex +to construct +meta-equivalence classes, +which are sets of equivalence classes (or characters, if equivalence +classes are not being used) that are commonly used together. Meta-equivalence +classes are often a big win when using compressed tables, but they +have a moderate performance impact (one or two if tests and one +array look-up per character scanned). + +@anchor{Option-Read} +
    `-Cr, --read' +
    +causes the generated scanner to bypass use of the standard I/O +library (stdio) for input. Instead of calling fread() or +getc(), the scanner will use the read() system call, +resulting in a performance gain which varies from system to system, but +in general is probably negligible unless you are also using `-Cf' +or `-CF'. Using `-Cr' can cause strange behavior if, for +example, you read from `yyin' using stdio prior to calling +the scanner (because the scanner will miss whatever text your previous +reads left in the stdio input buffer). `-Cr' has no effect +if you define YY_INPUT() (see section The Generated Scanner). + +
    `-C' +
    +A lone `-C' specifies that the scanner tables should be compressed +but neither equivalence classes nor meta-equivalence classes should be +used. + +The options `-Cf' or `-CF' and `-Cm' do not make sense +together - there is no opportunity for meta-equivalence classes if the +table is not being compressed. Otherwise the options may be freely +mixed, and are cumulative. + +The default setting is `-Cem', which specifies that flex +should generate equivalence classes and meta-equivalence classes. This +setting provides the highest degree of table compression. You can trade +off faster-executing scanners at the cost of larger tables with the +following generally being true: + + +
    +@verbatim
    +    slowest & smallest
    +          -Cem
    +          -Cm
    +          -Ce
    +          -C
    +          -C{f,F}e
    +          -C{f,F}
    +          -C{f,F}a
    +    fastest & largest
    +
    + +Note that scanners with the smallest tables are usually generated and +compiled the quickest, so during development you will usually want to +use the default, maximal compression. + +`-Cfe' is often a good compromise between speed and size for +production scanners. + +
    `-oFILE, --outfile=FILE' +
    +directs flex to write the scanner to the file `FILE' instead of +`lex.yy.c'. If you combine `--outfile' with the `--stdout' option, +then the scanner is written to `stdout' but its #line +directives (see the `-l' option above) refer to the file +`FILE'. + +
    `-PPREFIX, --prefix=PREFIX' +
    +changes the default `yy' prefix used by flex for all +globally-visible variable and function names to instead be +`PREFIX'. For example, `--prefix=foo' changes the name of +yytext to footext. It also changes the name of the default +output file from `lex.yy.c' to `lex.foo.c'. Here are all of +the names affected: + + +
    +@verbatim
    +    yy_create_buffer
    +    yy_delete_buffer
    +    yy_flex_debug
    +    yy_init_buffer
    +    yy_flush_buffer
    +    yy_load_buffer_state
    +    yy_switch_to_buffer
    +    yyin
    +    yyleng
    +    yylex
    +    yylineno
    +    yyout
    +    yyrestart
    +    yytext
    +    yywrap
    +
    + +(If you are using a C++ scanner, then only yywrap and +yyFlexLexer are affected.) Within your scanner itself, you can +still refer to the global variables and functions using either version +of their name; but externally, they have the modified name. + +This option lets you easily link together multiple +flex +programs into the same executable. Note, though, that using this +option also renames +yywrap(), +so you now +must +either +provide your own (appropriately-named) version of the routine for your +scanner, or use +%option noyywrap, +as linking with +`-lfl' +no longer provides one for you by default. + +
    `-SFILE, --skel=FILE' +
    +overrides the default skeleton file from which +flex +constructs its scanners. You'll never need this option unless you are doing +flex +maintenance or development. + +@anchor{Option-Always-Interactive} +
    `--always-interactive' +
    +instructs flex to generate a scanner which always considers its input +interactive. Normally, on each new input file the scanner calls +isatty() in an attempt to determine whether the scanner's input +source is interactive and thus should be read a character at a time. +When this option is used, however, then no such call is made. + +
    `--main' +
    + directs flex to provide a default main() program for the +scanner, which simply calls yylex(). This option implies +noyywrap (see below). + +
    `--never-interactive' +
    +instructs flex to generate a scanner which never considers its input +interactive. This is the opposite of always-interactive. + +
    `--nounistd' +
    +suppresses inclusion of the non-ANSI header file `unistd.h'. This option +is meant to target environments in which `unistd.h' does not exist. Be aware +that certain options may cause flex to generate code that relies on functions +normally found in `unistd.h', (e.g. isatty(), read().) +If you wish to use these functions, you will have to inform your compiler where +to find them. +@xref{Option-Always-Interactive}. @xref{Option-Read}. + +
    `--stack' +
    +enables the use of +start condition stacks (see section Start Conditions). + +
    `--stdinit' +
    +if set (i.e., %option stdinit) initializes yyin and +yyout to `stdin' and `stdout', instead of the default of +`nil'. Some existing lex programs depend on this behavior, +even though it is not compliant with ANSI C, which does not require +`stdin' and `stdout' to be compile-time constant. In a +reentrant scanner, however, this is not a problem since initialization +is performed in yylex_init at runtime. + +
    `--yylineno' +
    +directs flex to generate a scanner +that maintains the number of the current line read from its input in the +global variable yylineno. This option is implied by %option +lex-compat. In a reentrant C scanner, the macro yylineno is +accessible regardless of the value of %option yylineno, however, its +value is not modified by flex unless %option yylineno is enabled. + +
    `--yywrap' +
    +if unset (i.e., --noyywrap), makes the scanner not call +yywrap() upon an end-of-file, but simply assume that there are no +more files to scan (until the user points `yyin' at a new file and +calls yylex() again). +
    + + + +

    Option Directives Within Scanners

    + +

    +flex also provides a mechanism for controlling options within the +scanner specification itself, rather than from the flex command-line. +This is done by including %option directives in the first section +of the scanner specification. You can specify multiple options with a +single %option directive, and multiple directives in the first +section of your flex input file. + + +

    +Most options are given simply as names, optionally preceded by the +word `no' (with no intervening whitespace) to negate their meaning. +The names are the same as their long-option equivalents (but without the +leading `--' ). + + + +

    +@verbatim
    +    7bit            -7   --7bit
    +    8bit            -8   --8bit
    +    align           -Ca  --align
    +    array                --array   equivalent to "%array"
    +    backup          -b   --backup
    +    batch           -B   --batch
    +    c++             -+   --c++
    +
    +    caseful or
    +    case-sensitive  (default)
    +
    +    case-insensitive or
    +    caseless        -i   --case-insensitive
    +
    +    debug           -d   --debug
    +    default              --default
    +    ecs             -Ce  --ecs
    +    fast            -F   --fast
    +    full            -f   --full
    +    header="FILE"        --header=FILE
    +    interactive     -I   --interactive
    +    lex-compat      -l   --lex-compat
    +    meta-ecs        -Cm  --meta-ecs
    +    nounistd             --nounistd
    +    perf-report     -p   --perf-report
    +    pointer              --pointer equivalent to "%pointer" (default)
    +    prefix="PREFIX" -P   --prefix
    +    outfile="FILE"  -o   --outfile=FILE
    +    read            -Cr  --read
    +    reentrant       -R   --reentrant
    +    reentrant-bison -Rb  --reentrant-bison
    +    stdout          -t   --stdout
    +    verbose         -v   --verbose
    +    warn                 --warn (use "%option nowarn" for -w)
    +    yyclass="NAME"       --yyclass=NAME
    +
    +
    + +

    +flex scans your rule actions to determine whether you use the +REJECT or yymore() features. The REJECT and +yymore options are available to override its decision as to +whether you use the options, either by setting them (e.g., %option +reject) to indicate the feature is indeed used, or unsetting them to +indicate it actually is not used (e.g., %option noyymore). + + +

    +%option yyclass +only applies when generating a C++ scanner (the `--c++' option). It +informs flex that you have derived foo as a subclass of +yyFlexLexer, so flex will place your actions in the member +function foo::yylex() instead of yyFlexLexer::yylex(). It +also generates a yyFlexLexer::yylex() member function that emits +a run-time error (by invoking yyFlexLexer::LexerError()) if +called. See section Generating C++ Scanners. + + +

    +A number of options are available for lint purists who want to suppress +the appearance of unneeded routines in the generated scanner. Each of +the following, if unset (e.g., %option nounput), results in the +corresponding routine not appearing in the generated scanner: + + + +

    +@verbatim
    +    input, unput
    +    yy_push_state, yy_pop_state, yy_top_state
    +    yy_scan_buffer, yy_scan_bytes, yy_scan_string
    +
    +    yyget_extra, yyset_extra, yyget_leng, yyget_text, 
    +    yyget_lineno, yyset_lineno, yyget_in, yyset_in,
    +    yyget_out, yyset_out, yyget_lval, yyset_lval,
    +    yyget_lloc, yyset_lloc,
    +
    + +

    +(though yy_push_state() and friends won't appear anyway unless +you use %option stack). + + + + +

    Performance Considerations

    + +

    + +The main design goal of flex is that it generate high-performance +scanners. It has been optimized for dealing well with large sets of +rules. Aside from the effects on scanner speed of the table compression +`-C' options outlined above, there are a number of options/actions +which degrade performance. These are, from most expensive to least: + + +

    + + + + +

    +@verbatim
    +    REJECT
    +    %option yylineno
    +    arbitrary trailing context
    +
    +    pattern sets that require backing up
    +    %array
    +    %option interactive
    +    %option always-interactive
    +
    +    `^' beginning-of-line operator
    +    yymore()
    +
    + +

    +with the first three all being quite expensive and the last two being +quite cheap. Note also that unput() is implemented as a routine +call that potentially does quite a bit of work, while yyless() is +a quite-cheap macro. So if you are just putting back some excess text +you scanned, use ss(). + + +

    +REJECT should be avoided at all costs when performance is +important. It is a particularly expensive option. + + +

    + + + +Getting rid of backing up is messy and often may be an enormous amount +of work for a complicated scanner. In principal, one begins by using +the `-b' flag to generate a `lex.backup' file. For example, +on the input: + + +

    + + +

    +@verbatim
    +    %%
    +    foo        return TOK_KEYWORD;
    +    foobar     return TOK_KEYWORD;
    +
    + +

    +the file looks like: + + + +

    +@verbatim
    +    State #6 is non-accepting -
    +     associated rule line numbers:
    +           2       3
    +     out-transitions: [ o ]
    +     jam-transitions: EOF [ \001-n  p-\177 ]
    +
    +    State #8 is non-accepting -
    +     associated rule line numbers:
    +           3
    +     out-transitions: [ a ]
    +     jam-transitions: EOF [ \001-`  b-\177 ]
    +
    +    State #9 is non-accepting -
    +     associated rule line numbers:
    +           3
    +     out-transitions: [ r ]
    +     jam-transitions: EOF [ \001-q  s-\177 ]
    +
    +    Compressed tables always back up.
    +
    + +

    +The first few lines tell us that there's a scanner state in which it can +make a transition on an 'o' but not on any other character, and that in +that state the currently scanned text does not match any rule. The +state occurs when trying to match the rules found at lines 2 and 3 in +the input file. If the scanner is in that state and then reads +something other than an 'o', it will have to back up to find a rule +which is matched. With a bit of headscratching one can see that this +must be the state it's in when it has seen `fo'. When this has +happened, if anything other than another `o' is seen, the scanner +will have to back up to simply match the `f' (by the default rule). + + +

    +The comment regarding State #8 indicates there's a problem when +`foob' has been scanned. Indeed, on any character other than an +`a', the scanner will have to back up to accept "foo". Similarly, +the comment for State #9 concerns when `fooba' has been scanned and +an `r' does not follow. + + +

    +The final comment reminds us that there's no point going to all the +trouble of removing backing up from the rules unless we're using +`-Cf' or `-CF', since there's no performance gain doing so +with compressed scanners. + + +

    + +The way to remove the backing up is to add "error" rules: + + +

    + + +

    +@verbatim
    +    %%
    +    foo         return TOK_KEYWORD;
    +    foobar      return TOK_KEYWORD;
    +
    +    fooba       |
    +    foob        |
    +    fo          {
    +                /* false alarm, not really a keyword */
    +                return TOK_ID;
    +                }
    +
    + +

    +Eliminating backing up among a list of keywords can also be done using a +"catch-all" rule: + + +

    + + +

    +@verbatim
    +    %%
    +    foo         return TOK_KEYWORD;
    +    foobar      return TOK_KEYWORD;
    +
    +    [a-z]+      return TOK_ID;
    +
    + +

    +This is usually the best solution when appropriate. + + +

    +Backing up messages tend to cascade. With a complicated set of rules +it's not uncommon to get hundreds of messages. If one can decipher +them, though, it often only takes a dozen or so rules to eliminate the +backing up (though it's easy to make a mistake and have an error rule +accidentally match a valid token. A possible future flex feature +will be to automatically add rules to eliminate backing up). + + +

    +It's important to keep in mind that you gain the benefits of eliminating +backing up only if you eliminate every instance of backing up. +Leaving just one means you gain nothing. + + +

    +Variable trailing context (where both the leading and trailing +parts do not have a fixed length) entails almost the same performance +loss as REJECT (i.e., substantial). So when possible a rule +like: + + +

    + + +

    +@verbatim
    +    %%
    +    mouse|rat/(cat|dog)   run();
    +
    + +

    +is better written: + + + +

    +@verbatim
    +    %%
    +    mouse/cat|dog         run();
    +    rat/cat|dog           run();
    +
    + +

    +or as + + + +

    +@verbatim
    +    %%
    +    mouse|rat/cat         run();
    +    mouse|rat/dog         run();
    +
    + +

    +Note that here the special '|' action does not provide any +savings, and can even make things worse (see section Limitations). + + +

    +Another area where the user can increase a scanner's performance (and +one that's easier to implement) arises from the fact that the longer the +tokens matched, the faster the scanner will run. This is because with +long tokens the processing of most input characters takes place in the +(short) inner scanning loop, and does not often have to go through the +additional work of setting up the scanning environment (e.g., +yytext) for the action. Recall the scanner for C comments: + + +

    + + +

    +@verbatim
    +    %x comment
    +    %%
    +            int line_num = 1;
    +
    +    "/*"         BEGIN(comment);
    +
    +    <comment>[^*\n]*
    +    <comment>"*"+[^*/\n]*
    +    <comment>\n             ++line_num;
    +    <comment>"*"+"/"        BEGIN(INITIAL);
    +
    + +

    +This could be sped up by writing it as: + + + +

    +@verbatim
    +    %x comment
    +    %%
    +            int line_num = 1;
    +
    +    "/*"         BEGIN(comment);
    +
    +    <comment>[^*\n]*
    +    <comment>[^*\n]*\n      ++line_num;
    +    <comment>"*"+[^*/\n]*
    +    <comment>"*"+[^*/\n]*\n ++line_num;
    +    <comment>"*"+"/"        BEGIN(INITIAL);
    +
    + +

    +Now instead of each newline requiring the processing of another action, +recognizing the newlines is distributed over the other rules to keep the +matched text as long as possible. Note that adding rules does +not slow down the scanner! The speed of the scanner is +independent of the number of rules or (modulo the considerations given +at the beginning of this section) how complicated the rules are with +regard to operators such as `*' and `|'. + + +

    + + +A final example in speeding up a scanner: suppose you want to scan +through a file containing identifiers and keywords, one per line +and with no other extraneous characters, and recognize all the +keywords. A natural first approach is: + + +

    + + +

    +@verbatim
    +    %%
    +    asm      |
    +    auto     |
    +    break    |
    +    ... etc ...
    +    volatile |
    +    while    /* it's a keyword */
    +
    +    .|\n     /* it's not a keyword */
    +
    + +

    +To eliminate the back-tracking, introduce a catch-all rule: + + + +

    +@verbatim
    +    %%
    +    asm      |
    +    auto     |
    +    break    |
    +    ... etc ...
    +    volatile |
    +    while    /* it's a keyword */
    +
    +    [a-z]+   |
    +    .|\n     /* it's not a keyword */
    +
    + +

    +Now, if it's guaranteed that there's exactly one word per line, then we +can reduce the total number of matches by a half by merging in the +recognition of newlines with that of the other tokens: + + + +

    +@verbatim
    +    %%
    +    asm\n    |
    +    auto\n   |
    +    break\n  |
    +    ... etc ...
    +    volatile\n |
    +    while\n  /* it's a keyword */
    +
    +    [a-z]+\n |
    +    .|\n     /* it's not a keyword */
    +
    + +

    +One has to be careful here, as we have now reintroduced backing up +into the scanner. In particular, while +we +know that there will never be any characters in the input stream +other than letters or newlines, +flex +can't figure this out, and it will plan for possibly needing to back up +when it has scanned a token like `auto' and then the next character +is something other than a newline or a letter. Previously it would +then just match the `auto' rule and be done, but now it has no `auto' +rule, only a `auto\n' rule. To eliminate the possibility of backing up, +we could either duplicate all rules but without final newlines, or, +since we never expect to encounter such an input and therefore don't +how it's classified, we can introduce one more catch-all rule, this +one which doesn't include a newline: + + + +

    +@verbatim
    +    %%
    +    asm\n    |
    +    auto\n   |
    +    break\n  |
    +    ... etc ...
    +    volatile\n |
    +    while\n  /* it's a keyword */
    +
    +    [a-z]+\n |
    +    [a-z]+   |
    +    .|\n     /* it's not a keyword */
    +
    + +

    +Compiled with `-Cf', this is about as fast as one can get a +flex scanner to go for this particular problem. + + +

    +A final note: flex is slow when matching NULs, +particularly when a token contains multiple NULs. It's best to +write rules which match short amounts of text if it's anticipated +that the text will often include NULs. + + +

    +Another final note regarding performance: as mentioned in +section How the Input Is Matched, dynamically resizing yytext to accommodate huge +tokens is a slow process because it presently requires that the (huge) +token be rescanned from the beginning. Thus if performance is vital, +you should attempt to match "large" quantities of text but not +"huge" quantities, where the cutoff between the two is at about 8K +characters per token. + + + + +

    Generating C++ Scanners

    + +

    + + + +flex provides two different ways to generate scanners for use +with C++. The first way is to simply compile a scanner generated by +flex using a C++ compiler instead of a C compiler. You should +not encounter any compilation errors (see section Reporting Bugs). You can +then use C++ code in your rule actions instead of C code. Note that the +default input source for your scanner remains `yyin', and default +echoing is still done to `yyout'. Both of these remain FILE +* variables and not C++ streams. + + +

    +You can also use flex to generate a C++ scanner class, using the +`-+' option (or, equivalently, %option c++), which is +automatically specified if the name of the flex executable ends +in a '+', such as flex++. When using this option, flex +defaults to generating the scanner to the file `lex.yy.cc' instead +of `lex.yy.c'. The generated scanner includes the header file +`FlexLexer.h', which defines the interface to two C++ classes. + + +

    +The first class, +FlexLexer, +provides an abstract base class defining the general scanner class +interface. It provides the following member functions: + + +

    + +
    const char* YYText() +
    + + +returns the text of the most recently matched token, the equivalent of +yytext. + + +
    int YYLeng() +
    +returns the length of the most recently matched token, the equivalent of +yyleng. + + +
    int lineno() const +
    +returns the current input line number (see %option yylineno), or +1 if %option yylineno was not used. + + +
    void set_debug( int flag ) +
    +sets the debugging flag for the scanner, equivalent to assigning to +yy_flex_debug (see section Invoking Flex). Note that you must build +the scannerusing %option debug to include debugging information +in it. + + +
    int debug() const +
    +returns the current setting of the debugging flag. +
    + +

    +Also provided are member functions equivalent to +yy_switch_to_buffer(), yy_create_buffer() (though the +first argument is an istream* object pointer and not a +FILE*), yy_flush_buffer(), yy_delete_buffer(), and +yyrestart() (again, the first argument is a istream* +object pointer). + + +

    + + +The second class defined in `FlexLexer.h' is yyFlexLexer, +which is derived from FlexLexer. It defines the following +additional member functions: + + +

    + +
    yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ) +
    + + +constructs a yyFlexLexer object using the given streams for input +and output. If not specified, the streams default to cin and +cout, respectively. + + +
    virtual int yylex() +
    +performs the same role is yylex() does for ordinary flex +scanners: it scans the input stream, consuming tokens, until a rule's +action returns a value. If you derive a subclass S from +yyFlexLexer and want to access the member functions and variables +of S inside yylex(), then you need to use %option +yyclass="S" to inform flex that you will be using that subclass +instead of yyFlexLexer. In this case, rather than generating +yyFlexLexer::yylex(), flex generates S::yylex() +(and also generates a dummy yyFlexLexer::yylex() that calls +yyFlexLexer::LexerError() if called). + + +
    virtual void switch_streams(istream* new_in = 0, ostream* new_out = 0) +
    +reassigns yyin to new_in (if non-nil) and yyout to +new_out (if non-nil), deleting the previous input buffer if +yyin is reassigned. + +
    int yylex( istream* new_in, ostream* new_out = 0 ) +
    +first switches the input streams via switch_streams( new_in, +new_out ) and then returns the value of yylex(). +
    + +

    +In addition, yyFlexLexer defines the following protected virtual +functions which you can redefine in derived classes to tailor the +scanner: + + +

    + +
    virtual int LexerInput( char* buf, int max_size ) +
    + + +reads up to max_size characters into buf and returns the +number of characters read. To indicate end-of-input, return 0 +characters. Note that interactive scanners (see the `-B' +and `-I' flags in section Invoking Flex) define the macro +YY_INTERACTIVE. If you redefine LexerInput() and need to +take different actions depending on whether or not the scanner might be +scanning an interactive input source, you can test for the presence of +this name via #ifdef statements. + + +
    virtual void LexerOutput( const char* buf, int size ) +
    +writes out size characters from the buffer buf, which, while +NUL-terminated, may also contain internal NULs if the +scanner's rules can match text with NULs in them. + + + +
    virtual void LexerError( const char* msg ) +
    +reports a fatal error message. The default version of this function +writes the message to the stream cerr and exits. +
    + +

    +Note that a yyFlexLexer object contains its entire +scanning state. Thus you can use such objects to create reentrant +scanners. You can instantiate multiple instances of the same +yyFlexLexer class, and you can also combine multiple C++ scanner +classes together in the same program using the `-P' option +discussed above. + + +

    +Finally, note that the %array feature is not available to C++ +scanner classes; you must use %pointer (the default). + + +

    +Here is an example of a simple C++ scanner: + + +

    + + +

    +@verbatim
    +        // An example of using the flex C++ scanner class.
    +
    +    %{
    +    int mylineno = 0;
    +    %}
    +
    +    string  \"[^\n"]+\"
    +
    +    ws      [ \t]+
    +
    +    alpha   [A-Za-z]
    +    dig     [0-9]
    +    name    ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
    +    num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
    +    num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
    +    number  {num1}|{num2}
    +
    +    %%
    +
    +    {ws}    /* skip blanks and tabs */
    +
    +    "/*"    {
    +            int c;
    +
    +            while((c = yyinput()) != 0)
    +                {
    +                if(c == '\n')
    +                    ++mylineno;
    +
    +                else if(c == `*')
    +                    {
    +                    if((c = yyinput()) == '/')
    +                        break;
    +                    else
    +                        unput(c);
    +                    }
    +                }
    +            }
    +
    +    {number}  cout  "number "  YYText()  '\n';
    +
    +    \n        mylineno++;
    +
    +    {name}    cout  "name "  YYText()  '\n';
    +
    +    {string}  cout  "string "  YYText()  '\n';
    +
    +    %%
    +
    +    int main( int /* argc */, char** /* argv */ )
    +        {
    +        flexLexer* lexer = new yyFlexLexer;
    +        while(lexer->yylex() != 0)
    +            ;
    +        return 0;
    +        }
    +
    + +

    + +If you want to create multiple (different) lexer classes, you use the +`-P' flag (or the prefix= option) to rename each +yyFlexLexer to some other `xxFlexLexer'. You then can +include `FlexLexer.h>' in your other sources once per lexer class, +first renaming yyFlexLexer as follows: + + +

    + + + + +

    +@verbatim
    +    #undef yyFlexLexer
    +    #define yyFlexLexer xxFlexLexer
    +    #include <FflexLexer.h>
    +
    +    #undef yyFlexLexer
    +    #define yyFlexLexer zzFlexLexer
    +    #include FlexLexer.h>
    +
    + +

    +if, for example, you used %option prefix="xx" for one of your +scanners and %option prefix="zz" for the other. + + +

    +IMPORTANT: the present form of the scanning class is experimental +and may change considerably between major releases. + + + + +

    Reentrant C Scanners

    + +

    + +flex has the ability to generate a reentrant C scanner. This is +accomplished by specifying %option reentrant (`-R') or +%option reentrant-bison (`-Rb'). The generated scanner is +both portable, and safe to use in one or more separate threads of +control. The most common use for reentrant scanners is from within +multi-threaded applications. Any thread may create and execute a +reentrant flex scanner without the need for synchronization with +other threads. + + + + +

    Uses for Reentrant Scanners

    + +

    +However, there are other uses for a reentrant scanner. For example, you +could scan two or more files simultaneously to implement a diff at +the token level (i.e., instead of at the character level): + + +

    + + +

    +@verbatim
    +    /* Example of maintaining more than one active scanner. */
    +
    +    do {
    +        int tok1, tok2;
    +
    +        tok1 = yylex( scanner_1 );
    +        tok2 = yylex( scanner_2 );
    +
    +        if( tok1 != tok2 )
    +            printf("Files are different.");
    +
    +   } while ( tok1 && tok2 );
    +
    + +

    +Another use for a reentrant scanner is recursion. +(Note that a recursive scanner can also be created using a non-reentrant scanner and +buffer states. See section Multiple Input Buffers.) + + +

    +The following crude scanner supports the `eval' command by invoking +another instance of itself. + + +

    + + +

    +@verbatim
    +    /* Example of recursive invocation. */
    +
    +    %option reentrant
    +
    +    %%
    +    "eval(".+")"  {  
    +                      yyscan_t scanner;
    +                      YY_BUFFER_STATE buf;
    +
    +                      yylex_init( &scanner );
    +                      yytext[yyleng-1] = ' '; 
    +
    +                      buf = yy_scan_string( yytext + 5, scanner );
    +                      yylex( scanner );
    +
    +                      yy_delete_buffer(buf,scanner);
    +                      yylex_destroy( scanner );
    +                 }
    +    ...
    +    %%
    +
    + + + +

    An Overview of the Reentrant API

    + +

    + +The API for reentrant scanners is different than for non-reentrant +scanners. Here is a quick overview of the API: + + + +

    + + + +

    Reentrant Example

    + +

    +First, an example of a reentrant scanner: + + +

    +@verbatim
    +    /* This scanner prints "//" comments. */
    +    %option reentrant stack
    +    %x COMMENT
    +    %%
    +    "//"                 yy_push_state( COMMENT, yy_globals);
    +    .|\n
    +    <COMMENT>\n          yy_pop_state( yy_globals );
    +    <COMMENT>[^\n]+      fprintf( yyout, "%s\n", yytext);
    +    %%
    +    int main ( int argc, char * argv[] ) 
    +    {
    +        yyscan_t scanner;
    +        
    +        yylex_init ( &scanner );
    +        yylex ( scanner );
    +        yylex_destroy ( scanner );
    +    return 0;
    +   }
    +
    + + + +

    The Reentrant API in Detail

    + +

    +Here are the things you need to do or know to use the reentrant C API of +flex. + + + + +

    Declaring a Scanner As Reentrant

    + +

    + %option reentrant (--reentrant) must be specified. + + +

    +Notice that %option reentrant is specified in the above example +(see section Reentrant Example. Had this option not been specified, +flex would have happily generated a non-reentrant scanner without +complaining. You may explicitly specify %option noreentrant, if +you do not want a reentrant scanner, although it is not +necessary. The default is to generate a non-reentrant scanner. + + + + +

    The Extra Argument

    + +

    + + +All functions take one additional argument: yy_globals. + + +

    +Notice that the calls to yy_push_state and yy_pop_state +both have an argument, yy_globals , that is not present in a +non-reentrant scanner. Here are the declarations of +yy_push_state and yy_pop_state in the generated scanner: + + + +

    +@verbatim
    +    static void yy_push_state  ( int new_state , yyscan_t yy_globals ) ;
    +    static void yy_pop_state  ( yyscan_t yy_globals  ) ;
    +
    + +

    +Notice that the argument yy_globals appears in the declaration of +both functions. In fact, all flex functions in a reentrant +scanner have this additional argument. It is always the last argument +in the argument list, it is always of type yyscan_t (which is +typedef'd to void *) and it is +always named yy_globals. As you may have guessed, +yy_globals is a pointer to an opaque data structure encapsulating +the current state of the scanner. For a list of function declarations, +see section Functions and Macros Available in Reentrant C Scanners. Note that preprocessor macros, such as +BEGIN, ECHO, and REJECT, do not take this +additional argument. + + + + +

    Global Variables Replaced By Macros

    + +

    + +All global variables in traditional flex have been replaced by macro equivalents. + + +

    +Note that in the above example, yyout and yytext are +not plain variables. These are macros that will expand to their equivalent lvalue. +All of the familiar flex globals have been replaced by their macro +equivalents. In particular, yytext, yyleng, yylineno, +yyin, yyout, yyextra, yylval, and yylloc +are macros. You may safely use these macros in actions as if they were plain +variables. We only tell you this so you don't expect to link to these variables +externally. Currently, each macro expands to a member of an internal struct, e.g., + + + +

    +@verbatim
    +#define yytext (((struct yy_globals_t*)yy_globals)->yytext_r)
    +
    + +

    +One important thing to remember about +yytext +and friends is that +yytext +is not a global variable in a reentrant +scanner, you can not access it directly from outside an action or from +other functions. You must use an accessor method, e.g., +yyget_text, +to accomplish this. (See below). + + + + +

    Init and Destroy Functions

    + +

    + + + + + + +

    +yylex_init and yylex_destroy must be called before and +after yylex, respectively. + + + +

    +@verbatim
    +    int yylex_init ( yyscan_t * ptr_yy_globals ) ;
    +    int yylex ( yyscan_t yy_globals ) ;
    +    int yylex_destroy ( yyscan_t yy_globals ) ;
    +
    + +

    +The function yylex_init must be called before calling any other +function. The argument to yylex_init is the address of an +uninitialized pointer to be filled in by flex. The contents of +ptr_yy_globals need not be initialized, since flex will +overwrite it anyway. The value stored in ptr_yy_globals should +thereafter be passed to yylex() and yylex_destroy(). Flex +does not save the argument passed to yylex_init, so it is safe to +pass the address of a local pointer to yylex_init. The function +yylex should be familiar to you by now. The reentrant version +takes one argument, which is the value returned (via an argument) by +yylex_init. Otherwise, it behaves the same as the non-reentrant +version of yylex. + + +

    +The function yylex_destroy should be +called to free resources used by the scanner. After yylex_destroy +is called, the contents of yy_globals should not be used. Of +course, there is no need to destroy a scanner if you plan to reuse it. +A flex scanner (both reentrant and non-reentrant) may be +restarted by calling yyrestart. + + +

    +Below is an example of a program that creates a scanner, uses it, then destroys +it when done: + + + +

    +@verbatim
    +    int main ()
    +    {
    +        yyscan_t scanner;
    +        int tok;
    +
    +        yylex_init(&scanner);
    +
    +        while ((tok=yylex()) > 0)
    +            printf("tok=%d  yytext=%s\n", tok, yyget_text(scanner));
    +
    +        yylex_destroy(scanner);
    +        return 0;
    +    }
    +
    + + + +

    Accessing Variables with Reentrant Scanners

    + +

    + +Accessor methods (get/set functions) provide access to common +flex variables. + + +

    +Many scanners that you build will be part of a larger project. Portions +of your project will need access to flex values, such as +yytext. In a non-reentrant scanner, these values are global, so +there is no problem accessing them. However, in a reentrant scanner, there are no +global flex values. You can not access them directly. Instead, +you must access flex values using accessor methods (get/set +functions). Each accessor method is named yyget_NAME or +yyset_NAME, where NAME is the name of the flex +variable you want. For example: + + +

    + + +

    +@verbatim
    +    /* Set the last character of yytext to NULL. */
    +    void chop ( yyscan_t scanner )
    +    {
    +        int len = yyget_leng( scanner );        
    +        yyget_text( scanner )[len - 1] = '\0';        
    +    }
    +
    + +

    +The above code may be called from within an action like this: + + + +

    +@verbatim
    +    %%
    +    .+\n    { chop( yy_globals );}
    +
    + + + +

    Extra Data

    + +

    + + +User-specific data can be stored in yyextra. + + +

    +In a reentrant scanner, it is unwise to use global variables to +communicate with or maintain state between different pieces of your program. +However, you may need access to external data or invoke external functions +from within the scanner actions. +Likewise, you may need to pass information to your scanner +(e.g., open file descriptors, or database connections). +In a non-reentrant scanner, the only way to do this would be through the +use of global variables. +Flex allows you to store arbitrary, "extra" data in a scanner. +This data is accessible through the accessor methods +yyget_extra +and +yyset_extra +from outside the scanner, and through the shortcut macro +yyextra +from within the scanner itself. They are defined as follows: + + +

    + + + + +

    +@verbatim
    +    #define YY_EXTRA_TYPE  void*
    +    YY_EXTRA_TYPE  yyget_extra ( yyscan_t scanner );
    +    void           yyset_extra ( YY_EXTRA_TYPE arbitrary_data , yyscan_t scanner);
    +
    + +

    +By default, YY_EXTRA_TYPE is defined as type void *. You +will have to cast yyextra and the return value from +yyget_extra to the appropriate value each time you access the +extra data. To avoid casting, you may override the default type by +defining YY_EXTRA_TYPE in section 1 of your scanner: + + +

    + + +

    +@verbatim
    +    /* An example of overriding YY_EXTRA_TYPE. */
    +    %{    
    +    #include <sys/stat.h>
    +    #include <unistd.h>
    +    #define YY_EXTRA_TYPE  struct stat*
    +    %}
    +    %option reentrant
    +    %%
    +          
    +    __filesize__     printf( "%ld", yyextra->st_size  );
    +    __lastmod__      printf( "%ld", yyextra->st_mtime );
    +    %%
    +    void scan_file( char* filename )
    +    {
    +        yyscan_t scanner;
    +        struct stat buf;
    +        
    +        yylex_init ( &scanner );
    +        yyset_in( fopen(filename,"r"), scanner );
    +        
    +        stat( filename, &buf);
    +        yyset_extra( &buf, scanner );
    +        yylex ( scanner );
    +        yylex_destroy( scanner );
    +   }
    +
    + + + +

    About yyscan_t

    + +

    + +yyscan_t is defined as: + + + +

    +@verbatim
    +     typedef void* yyscan_t;
    +
    + +

    +It is initialized by yylex_init() to point to +an internal structure. You should never access this value +directly. In particular, you should never attempt to free it +(use yylex_destroy() instead.) + + + + +

    Reentrant C Scanners with Bison Pure Parsers

    + +

    + + + + + + + +

    +This section describes the flex features useful when integrating +flex with GNU bison(1). +Skip this section if you are not using +bison with your scanner. Here we discuss only the flex +half of the flex and bison pair. We do not discuss +bison in any detail. For more information about generating pure +bison parsers, see section `Top' in the GNU Bison Manual. + + +

    +A bison-compatible scanner is generated by declaring `%option +reentrant-bison' or by supplying `--reentrant-bison' when invoking flex +from the command line. This instructs flex that the macros +yylval and yylloc may be used. The data types for +yylval and yylloc, (YYSTYPE and YYLTYPE, +are typically defined in a header file, included in section 1 of the +flex input file. %option reentrant-bison implies +%option reentrant. If %option reentrant-bison is +specified, flex provides support for the functions +yyget_lval, yyset_lval, yyget_lloc, and +yyset_lloc, defined below, and the corresponding macros +yylval and yylloc, for use within actions. + + +

    +

    +
    Function: YYSTYPE* yyget_lval ( yyscan_t scanner ) +
    +
    +
    +
    Function: YYLTYPE* yyget_lloc ( yyscan_t scanner ) +
    +
    + + +

    +

    +
    Function: void yyset_lval ( YYSTYPE* lvalp, yyscan_t scanner ) +
    +
    +
    +
    Function: void yyset_lloc ( YYLTYPE* llocp, yyscan_t scanner ) +
    +
    + + +

    +Accordingly, the declaration of yylex becomes one of the following: + + +

    + + +

    +@verbatim
    +      int yylex ( YYSTYPE * lvalp, yyscan_t scanner );
    +      int yylex ( YYSTYPE * lvalp, YYLTYPE * llocp, yyscan_t scanner );
    +
    + +

    +Note that the macros yylval and yylloc evaluate to +pointers. Support for yylloc is optional in bison, so it +is optional in flex as well. This support is automatically +handled by flex. Specifically, support for yyloc is only +present in a flex scanner if the preprocessor symbol +YYLTYPE is defined. The following is an example of a flex +scanner that is bison-compatible. + + +

    + + +

    +@verbatim
    +    /* Scanner for "C" assignment statements... sort of. */
    +    %{
    +    #include "y.tab.h"  /* Generated by bison. */
    +    %}
    +  
    +    %option reentrant-bison
    +    %
    +   
    +    [[:digit:]]+  { yylval->num = atoi(yytext);   return NUMBER;}
    +    [[:alnum:]]+  { yylval->str = strdup(yytext); return STRING;}
    +    "="|";"       { return yytext[0];}
    +    .  {}
    +    %
    +
    + +

    +As you can see, there really is no magic here. We just use +yylval as we would any other variable. The data type of +yylval is generated by bison, and included in the file +`y.tab.h'. Here is the corresponding bison parser: + + +

    + + +

    +@verbatim
    +    /* Parser to convert "C" assignments to lisp. */
    +    %{
    +    /* Pass the argument to yyparse through to yylex. */
    +    #define YYPARSE_PARAM scanner
    +    #define YYLEX_PARAM   scanner
    +    %}
    +    %pure_parser
    +    %union {
    +        int num;
    +        char* str;
    +    }
    +    %token <str> STRING
    +    %token <num> NUMBER 
    +    %%
    +    assignment:
    +        STRING '=' NUMBER ';' {
    +            printf( "(setf %s %d)", $1, $3 );
    +       }
    +    ;
    +
    + + + +

    Functions and Macros Available in Reentrant C Scanners

    + +

    +The following Functions are available in a reentrant scanner: + + +

    + + + + + + + + + + + +

    +@verbatim
    +    char *yyget_text ( yyscan_t scanner );
    +    int yyget_leng ( yyscan_t scanner );
    +    FILE *yyget_in ( yyscan_t scanner );
    +    FILE *yyget_out ( yyscan_t scanner );
    +    int yyget_lineno ( yyscan_t scanner );
    +    YY_EXTRA_TYPE yyget_extra ( yyscan_t scanner );
    +
    +    void yyset_in  ( FILE * in_str , yyscan_t scanner );
    +    void yyset_out  ( FILE * out_str , yyscan_t scanner );
    +    void yyset_lineno ( int line_number , yyscan_t scanner );
    +    void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t scanner );
    +
    + +

    +There are no "set" functions for yytext and yyleng. This is intentional. + + +

    +The following Macro shortcuts are available in actions in a reentrant +scanner: + + + +

    +@verbatim
    +    yytext
    +    yyleng
    +    yyin
    +    yyout
    +    yylineno
    +    yyextra
    +
    + +

    + +In a reentrant C scanner, support for yylineno is always present +(i.e., you may access yylineno), but the value is never modified by +flex unless %option yylineno is enabled. This is to allow +the user to maintain the line count independently of flex. + + +

    +The following functions and macros are made available when %option +reentrant-bison (`--reentrant-bison') is specified: + + + +

    +@verbatim
    +    YYSTYPE * yyget_lval ( yyscan_t scanner );
    +    YYLTYPE *yyget_lloc ( yyscan_t scanner );
    +    void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner );
    +    void yyset_lloc ( YYLTYPE * yyllocp , yyscan_t scanner );
    +    yylval
    +    yylloc
    +
    + +

    +Support for yylloc is dependent upon the presence of the preprocessor +symbol YYLTYPE. Support for yylval relies on the type +YYSTYPE to be defined. Typically, these definitions are generated +by bison, in a .h file, and are included in section 1 of the +flex input. + + + + +

    Incompatibilities with Lex and Posix

    + +

    + + + + +

    +flex is a rewrite of the AT&T Unix lex tool (the two +implementations do not share any code, though), with some extensions and +incompatibilities, both of which are of concern to those who wish to +write scanners acceptable to both implementations. flex is fully +compliant with the POSIX lex specification, except that when +using %pointer (the default), a call to unput() destroys +the contents of yytext, which is counter to the POSIX +specification. In this section we discuss all of the known areas of +incompatibility between flex, AT&T lex, and the POSIX +specification. flex's `-l' option turns on maximum +compatibility with the original AT&T lex implementation, at the +cost of a major loss in the generated scanner's performance. We note +below which incompatibilities can be overcome using the `-l' +option. flex is fully compatible with lex with the +following exceptions: + + + +

    + +

    + + + +

    +The following flex features are not included in lex or the +POSIX specification: + + + +

    +@verbatim
    +    C++ scanners
    +    %option
    +    start condition scopes
    +    start condition stacks
    +    interactive/non-interactive scanners
    +    yy_scan_string() and friends
    +    yyterminate()
    +    yy_set_interactive()
    +    yy_set_bol()
    +    YY_AT_BOL()
    +   <<EOF>>
    +    <*>
    +    YY_DECL
    +    YY_START
    +    YY_USER_ACTION
    +    YY_USER_INIT
    +    #line directives
    +    %{}'s around actions
    +    reentrant C API
    +    multiple actions on a line
    +
    + +

    +plus almost all of the flex flags. The last feature in the list +refers to the fact that with flex you can put multiple actions on +the same line, separated with semi-colons, while with lex, the +following: + + + +

    +@verbatim
    +    foo    handle_foo(); ++num_foos_seen;
    +
    + +

    +is (rather surprisingly) truncated to + + + +

    +@verbatim
    +    foo    handle_foo();
    +
    + +

    +flex does not truncate the action. Actions that are not enclosed +in braces are simply terminated at the end of the line. + + + + +

    Diagnostics

    + +

    + + + + +

    +The following is a list of flex diagnostic messages: + + + +

    + + + +

    Limitations

    + +

    + + + +

    +Some trailing context patterns cannot be properly matched and generate +warning messages (`dangerous trailing context'). These are +patterns where the ending of the first part of the rule matches the +beginning of the second part, such as `zx*/xy*', where the 'x*' +matches the 'x' at the beginning of the trailing context. (Note that +the POSIX draft states that the text matched by such patterns is +undefined.) For some trailing context rules, parts which are actually +fixed-length are not recognized as such, leading to the abovementioned +performance loss. In particular, parts using `|' or `{n}' +(such as `foo{3}') are always considered variable-length. +Combining trailing context with the special `|' action can result +in fixed trailing context being turned into the more expensive +variable trailing context. For example, in the following: + + +

    + + +

    +@verbatim
    +    %%
    +    abc      |
    +    xyz/def
    +
    + +

    +Use of unput() invalidates yytext and yyleng, unless the +%array directive or the `-l' option has been used. +Pattern-matching of NULs is substantially slower than matching +other characters. Dynamic resizing of the input buffer is slow, as it +entails rescanning all the text matched so far by the current (generally +huge) token. Due to both buffering of input and read-ahead, you cannot +intermix calls to `<stdio.h>' routines, such as, getchar(), +with flex rules and expect it to work. Call input() +instead. The total table entries listed by the `-v' flag excludes +the number of table entries needed to determine what rule has been +matched. The number of entries is equal to the number of DFA states if +the scanner does not use REJECT, and somewhat greater than the +number of states if it does. REJECT cannot be used with the +`-f' or `-F' options. + + +

    +The flex internal algorithms need documentation. + + + + +

    Additional Reading

    + +

    +You may wish to read more about the following programs: + +

    + +

    +The following books may contain material of interest: + + +

    +John Levine, Tony Mason, and Doug Brown, +Lex & Yacc, +O'Reilly and Associates. Be sure to get the 2nd edition. + + +

    +M. E. Lesk and E. Schmidt, +LEX -- Lexical Analyzer Generator + + +

    +Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers: Principles, +Techniques and Tools, Addison-Wesley (1986). Describes the +pattern-matching techniques used by flex (deterministic finite +automata). + + + + +

    Copyright

    + +

    + + + + +

    +The flex manual is placed under the same licensing conditions as the +rest of flex: + + +

    +Copyright (C) 1990, 1997 The Regents of the University of California. +All rights reserved. + + +

    +This code is derived from software contributed to Berkeley by +Vern Paxson. + + +

    +The United States Government has rights in this work pursuant +to contract no. DE-AC03-76SF00098 between the United States +Department of Energy and the University of California. + + +

    +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + + +

      +
    1. + +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +
    2. + +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +
    + +

    +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + +

    +THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + + + + +

    Reporting Bugs

    + +

    + + + +

    +If you have problems with flex or think you have found a bug, +please send mail detailing your problem to +help-flex@gnu.org. Patches are always welcome. + + + + +

    FAQ

    + + + +

    When was flex born?

    + +

    +When was flex born? + + +

    +Vern Paxson took over +the Software Tools lex project from Jef Poskanzer in 1982. At that point it +was written in Ratfor. Around 1987 or so, Paxson translated it into C, and +a legend was born :-). + + + + +

    How do I expand \ escape sequences in C-style quoted strings?

    + +

    +How do I expand \ escape sequences in C-style quoted strings? + + +

    +A key point when scanning quoted strings is that you cannot (easily) write +a single rule that will precisely match the string if you allow things +like embedded escape sequences and newlines. If you try to match strings +with a single rule then you'll wind up having to rescan the string anyway +to find any escape sequences. + + +

    +Instead you use exclusive start conditions and a set of rules, one for +matching non-escaped text, one for matching a single escape, one for +matching an embedded newline, and one for recognizing the end of the +string. Each of these rules is then faced with the question of where to +put its intermediary results. The best solution is for the rules to +append their local value of yytext to the end of a "string literal" +buffer. A rule like the escape-matcher will append to the buffer the +meaning of the escape sequence rather than the literal text in yytext. +In this way, yytext does not need to be modified at all. + + + + +

    Why do flex scanners call fileno if it is not ANSI compatible?

    + +

    +Why do flex scanners call fileno if it is not ANSI compatible? + + +

    +Flex scanners call fileno() in order to get the file descriptor +corresponding to yyin. The file descriptor may be passed to +isatty() or read(), depending upon which %options you specified. +If your system does not have fileno() support. To get rid of the +read() call, do not specify %option read. To get rid of the isatty() +call, you must specify one of %option always-interactive or +%option never-interactive. + + + + +

    Does flex support recursive pattern definitions?

    + +

    +Does flex support recursive pattern definitions? +e.g., + + + +

    +@verbatim
    +%%
    +block   "{"({block}|{statement})*"}"
    +
    + +

    +No. You cannot have recursive definitions. The pattern-matching power of +regular expressions in general (and therefore flex scanners, too) is +limited. In particular, regular expressions cannot "balance" parentheses +to an arbitrary degree. For example, it's impossible to write a regular +expression that matches all strings containing the same number of '{'s +as '}'s. For more powerful pattern matching, you need a parser, such +as GNU bison. + + + + +

    How do skip huge chunks of input (tens of megabytes) while using flex?

    + +

    +How do skip huge chunks of input (tens of megabytes) while using flex? + + +

    +Use fseek (or lseek) to position yyin, then call yyrestart(). + + + + +

    Flex is not matching my patterns in the same order that I defined them.

    + +

    +Flex is not matching my patterns in the same order that I defined them. + + +

    +This is indeed the natural way to expect it to work, however, flex picks the +rule that matches the most text (i.e., the longest possible input string). +This is because flex uses an entirely different matching technique +("deterministic finite automata") that actually does all of the matching +simultaneously, in parallel. (Seems impossible, but it's actually a fairly +simple technique once you understand the principles.) + + +

    +A side-effect of this parallel matching is that when the input matches more +than one rule, flex scanners pick the rule that matched the *most* text. This +is explained further in the manual, in the section "How the input +is Matched". + + +

    +If you want flex to choose a shorter match, then you can work around this +behavior by expanding your short +rule to match more text, then put back the extra: + + + +

    +@verbatim
    +data_.*        yyless( 5 ); BEGIN BLOCKIDSTATE;
    +
    + +

    +Another fix would be to make the second rule active only during the +<BLOCKIDSTATE> start condition, and make that start condition exclusive +by declaring it with %x instead of %s. + + +

    +A final fix is to change the input language so that the ambiguity for +data_ is removed, by adding characters to it that don't match the +identifier rule, or by removing characters (such as '_') from the +identifier rule so it no longer matches "data_". (Of course, you might +also not have the option of changing the input language ...) + + + + +

    My actions are executing out of order or sometimes not at all.

    + +

    +My actions are executing out of order or sometimes not at all. What's +happening? + + +

    +Most likely, you have (in error) placed the opening `{' of the action +block on a different line than the rule, e.g., + + + +

    +@verbatim
    +^(foo|bar)
    +   {  <<<--- WRONG!
    +
    +   }
    +
    + +

    +flex requires that the opening `{' of an action associated with a rule +begin on the same line as does the rule. You need instead to write your rules +as follows: + + + +

    +@verbatim
    +^(foo|bar)   {  // CORRECT!
    +
    +    }
    +
    + + + +

    How can I have multiple input sources feed into the same scanner at the same time?

    + +

    +How can I have multiple input sources feed into the same scanner at +the same time? + + +

    +If... + +

    + +

    +then every time it matches a token, it will have exhausted its input +buffer (because the scanner is free of backtracking). This means you +can safely use select() at the point and only call yylex() for another +token if select() indicates there's data available. + + +

    +That is, move the select() out from the input function to a point where +it determines whether yylex() gets called for the next token. + + +

    +With this approach, you will still have problems if your input can arrive +piecemeal; select() could inform you that the beginning of a token is +available, you call yylex() to get it, but it winds up blocking waiting +for the later characters in the token. + + +

    +Here's another way: Move your input multiplexing inside of YY_INPUT. That +is, whenever YY_INPUT is called, it select()'s to see where input is +available. If input is available for the scanner, it reads and returns the +next byte. If input is available from another source, it calls whatever +function is responsible for reading from that source. (If no input is +available, it blocks until some is.) I've used this technique in an +interpreter I wrote that both reads keyboard input using a flex scanner and +IPC traffic from sockets, and it works fine. + + + + +

    Can I build nested parsers that work with the same input file?

    + +

    +Can I build nested parsers that work with the same input file? + + +

    +This is not going to work without some additional effort. The reason is +that flex block-buffers the input it reads from yyin. This means that the +"outermost" yylex(), when called, will automatically slurp up the first 8K +of input available on yyin, and subsequent calls to other yylex()'s won't +see that input. You might be tempted to work around this problem by +redefining YY_INPUT to only return a small amount of text, but it turns out +that that approach is quite difficult. Instead, the best solution is to +combine all of your scanners into one large scanner, using a different +exclusive start condition for each. + + + + +

    How can I match text only at the end of a file?

    + +

    +How can I match text only at the end of a file? + + +

    +There is no way to write a rule which is "match this text, but only if +it comes at the end of the file". You can fake it, though, if you happen +to have a character lying around that you don't allow in your input. +Then you redefine YY_INPUT to call your own routine which, if it sees +an EOF, returns the magic character first (and remembers to return a +real EOF next time it's called). Then you could write: + + + +

    +@verbatim
    +<COMMENT>(.|\n)*{EOF_CHAR}    /* saw comment at EOF */
    +
    + + + +

    How can I make REJECT cascade across start condition boundaries?

    + +

    +How can I make REJECT cascade across start condition boundaries? + + +

    +You can do this as follows. Suppose you have a start condition A, and +after exhausting all of the possible matches in <A>, you want to try +matches in <INITIAL>. Then you could use the following: + + + +

    +@verbatim
    +%x A
    +%%
    +<A>rule_that_is_long    ...; REJECT;
    +<A>rule                 ...; REJECT; /* shorter rule */
    +<A>etc.
    +...
    +<A>.|\n  {
    +            /* Shortest and last rule in <A>, so
    +             * cascaded REJECT's will eventually
    +             * wind up matching this rule.  We want
    +             * to now switch to the initial state
    +             * and try matching from there instead.
    +             */
    +            yyless(0);    /* put back matched text */
    +            BEGIN(INITIAL);
    +         }
    +
    + + + +

    Why can't I use fast or full tables with interactive mode?

    + +

    +Why can't I use fast or full tables with interactive mode? + + +

    +One of the assumptions +flex makes is that interactive applications are inherently slow (for just +that reason, they're waiting on a human). +It has to do with how the scanner detects that it must be finished scanning +a token. For interactive scanners, after scanning each character the current +state is looked up in a table (essentially) to see whether there's a chance +of another input character possibly extending the length of the match. If +not, the scanner halts. For non-interactive scanners, the end-of-token test +is much simpler, basically a compare with 0, so no memory bus cycles. Since +the test occurs in the innermost scanning loop, one would like to make it go +as fast as possible. + + +

    +Still, it seems reasonable to allow the user to choose to trade off a bit +of performance in this area to gain the corresponding flexibility. There +might be another reason, though, why fast scanners don't support the +interactive option + + + + +

    How much faster is -F or -f than -C?

    + +

    +How much faster is -F or -f than -C? + + +

    +Much faster (factor of 2-3). + + + + +

    If I have a simple grammar can't I just parse it with flex?

    + +

    +If I have a simple grammar, can't I just parse it with flex? + + +

    +Is your grammar recursive? That's almost always a sign that you're +better off using a parser/scanner rather than just trying to use a scanner +alone. + + +

    Why doesn't yyrestart() set the start state back to INITIAL?

    + +

    +Why doesn't yyrestart() set the start state back to INITIAL? + + +

    +There are two reasons. The first is that there might +be programs that rely on the start state not changing across file changes. +The second is that with flex 2.4, use of yyrestart() is no longer required, +so fixing the problem there doesn't solve the more general problem. + + + + +

    How can I match C-style comments?

    + +

    +How can I match C-style comments? + + +

    +You might be tempted to try something like this: + + + +

    +@verbatim
    +"/*".*"*/"       // WRONG!
    +
    + +

    +or, worse, this: + + + +

    +@verbatim
    +"/*"(.|\n)"*/"   // WRONG!
    +
    + +

    +The above rules will eat too much input, and blow up on things like: + + + +

    +@verbatim
    +    /* a comment */ do_my_thing( "oops */" );
    +
    + +

    +Here is one way which allows you to track line information: + + + +

    +@verbatim
    +<INITIAL>{
    +    "/*"              BEGIN(IN_COMMENT);
    +}
    +<IN_COMMENT>{
    +    "*/"      BEGIN(INITIAL);
    +    [^*\n]+   // eat comment in chunks
    +    "*"       // eat the lone star
    +    \n        yylineno++;
    +}
    +
    + + + +

    The '.' isn't working the way I expected.

    + +

    +The '.' (dot) isn't working the way I expected. + + +

    +Here are some tips for using `.': + + + +

    + + + +

    Can I get the flex manual in another format?

    + +

    +Can I get the flex manual in another format? + + +

    +As of flex 2.5, the manual is distributed in texinfo format. +You can use the "texi2*" tools to convert the manual to any format +you desire (e.g., `texi2html'). + + + + +

    Does there exist a "faster" NDFA->DFA algorithm?

    + +

    +Does there exist a "faster" NDFA->DFA algorithm? Most standard texts (e.g., +Aho), imply that NDFA->DFA can take exponential time, since there are +exponential number of potential states in NDFA. + + +

    +There's no way around the potential exponential running time - it +can take you exponential time just to enumerate all of the DFA states. +In practice, though, the running time is closer to linear, or sometimes +quadratic. + + + + +

    How does flex compile the DFA so quickly?

    + +

    +How does flex compile the DFA so quickly? + + +

    +There are two big speed wins that flex uses: + + + +

      +
    1. + +It analyzes the input rules to construct equivalence classes for those +characters that always make the same transitions. It then rewrites the NFA +using equivalence classes for transitions instead of characters. This cuts +down the NFA->DFA computation time dramatically, to the point where, for +uncompressed DFA tables, the DFA generation is often I/O bound in writing out +the tables. +
    2. + +It maintains hash values for previously computed DFA states, so testing +whether a newly constructed DFA state is equivalent to a previously constructed +state can be done very quickly, by first comparing hash values. +
    + + + +

    How can I use more than 8192 rules?

    + +

    +How can I use more than 8192 rules? + + +

    +Flex is compiled with an upper limit of 8192 rules per scanner. +If you need more than 8192 rules in your scanner, you'll have to recompile flex +with the following changes in flexdef.h: + + + +

    +@verbatim
    +<    #define YY_TRAILING_MASK 0x2000
    +<    #define YY_TRAILING_HEAD_MASK 0x4000
    +--
    +>    #define YY_TRAILING_MASK 0x20000000
    +>    #define YY_TRAILING_HEAD_MASK 0x40000000
    +
    + +

    +This should work okay as long as your C compiler uses 32 bit integers. +But you might want to think about whether using such a huge number of rules +is the best way to solve your problem. + + + + +

    How do I abandon a file in the middle of a scan and switch to a new file?

    + +

    +How do I abandon a file in the middle of a scan and switch to a new file? + + +

    +Just all yyrestart(newfile). Be sure to reset the start state if you want a +"fresh" start, since yyrestart does NOT reset the start state back to INITIAL. + + + + +

    How do I execute code only during initialization (only before the first scan)?

    + +

    +How do I execute code only during initialization (only before the first scan)? + + +

    +You can specify an initial action by defining the macro YY_USER_INIT (though +note that yyout may not be available at the time this macro is executed). Or you +can add to the beginning of your rules section: + + + +

    +@verbatim
    +%%
    +    /* Must be indented! */
    +    static int did_init = 0;
    +
    +    if ( ! did_init ){
    +        do_my_init();
    +        did_init = 1;
    +    }
    +
    + + + +

    How do I execute code at termination?

    + +

    +How do I execute code at termination (i.e., only after the last scan?) + + +

    +You can specifiy an action for the <<EOF>> rule. + + +

    Where else can I find help?

    + +

    +Where else can I find help? + + +

    +The help-flex email list is served by GNU. See http://www.gnu.org/ for +details how to subscribe or search the archives. + + + + +

    Can I include comments in the "rules" section of the file file?

    + +

    +Can I include comments in the "rules" section of the file file? + + +

    +Yes, just about anywhere you want to. See the manual for the specific syntax. + + + + +

    I get an error about undefined yywrap().

    + +

    +I get an error about undefined yywrap(). + + +

    +You must supply a yywrap() function of your own, or link to libfl.a +(which provides one), or use + + +

    + %option noyywrap + + +

    +in your source to say you don't want a yywrap() function. +See the manual page for more details concerning yywrap(). + + + + +

    How can I change the matching pattern at run time?

    + +

    +How can I change the matching pattern at run time? + + +

    +You can't, it's compiled into a static table when flex builds the scanner. + + + + +

    Is there a way to increase the rules (NFA states to a bigger number?)

    + +

    +Is there a way to increase the rules (NFA states to a bigger number?) + + +

    +With luck, you should be able to increase the definitions in flexdef.h for: + + + +

    +@verbatim
    +#define JAMSTATE -32766 /* marks a reference to the state that always jams */
    +#define MAXIMUM_MNS 31999
    +#define BAD_SUBSCRIPT -32767
    +
    + +

    +recompile everything, and it'll all work. Flex only has these 16-bit-like +values built into it because a long time ago it was developed on a machine +with 16-bit ints. I've given this advice to others in the past but haven't +heard back from them whether it worked okay or not... + + + + +

    How can I expand macros in the input?

    + +

    +How can I expand macros in the input? + + +

    +The best way to approach this problem is at a higher level, e.g., in the parser. + + +

    +However, you can do this using multiple input buffers. + + + +

    +@verbatim
    +%%
    +macro/[a-z]+	{
    +    /* Saw the macro "macro" followed by extra stuff. */
    +    main_buffer = YY_CURRENT_BUFFER;
    +    expansion_buffer = yy_scan_string(expand(yytext));
    +    yy_switch_to_buffer(expansion_buffer);
    +    }
    +
    +<<EOF>>	{
    +    if ( expansion_buffer )
    +        {
    +        // We were doing an expansion, return to where
    +        // we were.
    +        yy_switch_to_buffer(main_buffer);
    +        yy_delete_buffer(expansion_buffer);
    +        expansion_buffer = 0;
    +        }
    +    else
    +        yyterminate();
    +    }
    +
    + +

    +You probably will want a stack of expansion buffers to allow nested macros. +From the above though hopefully the idea is clear. + + + + +

    How can I build a two-pass scanner?

    + +

    +How can I build a two-pass scanner? + + +

    +One way to do it is to filter the first pass to a temporary file, +then process the temporary file on the second pass. You will probably see a +performance hit, do to all the disk I/O. + + +

    +When you need to look ahead far forward like this, it almost always means +that the right solution is to build a parse tree of the entire input, then +walk it after the parse in order to generate the output. In a sense, this +is a two-pass approach, once through the text and once through the parse +tree, but the performance hit for the latter is usually an order of magnitude +smaller, since everything is already classified, in binary format, and +residing in memory. + + + + +

    How do I match any string not matched in the preceding rules?

    + +

    +How do I match any string not matched in the preceding rules? + + +

    +One way to assign precedence, is to place the more specific rules first. If +two rules would match the same input (same sequence of characters) then the +first rule listed in the flex input wins. e.g., + + + +

    +@verbatim
    +%%
    +foo[a-zA-Z_]+    return FOO_ID;
    +bar[a-zA-Z_]+    return BAR_ID;
    +[a-zA-Z_]+       return GENERIC_ID;
    +
    + +

    +Note that the rule [a-zA-Z_]+ must come *after* the others. It will match the +same amount of text as the more specific rules, and in that case the +flex scanner will pick the first rule listed in your scanner as the +one to match. + + + + +

    I am trying to port code from AT&T lex that uses yysptr and yysbuf.

    + +

    +I am trying to port code from AT&T lex that uses yysptr and yysbuf. + + +

    +Those are internal variables pointing into the AT&T scanner's input buffer. I +imagine they're being manipulated in user versions of the input() and unput() +functions. If so, what you need to do is analyze those functions to figure out +what they're doing, and then replace input() with an appropriate definition of +YY_INPUT (see the flex man page). You shouldn't need to (and must not) replace +flex's unput() function. + + + + +

    Is there a way to make flex treat NULL like a regular character?

    + +

    +Is there a way to make flex treat NULL like a regular character? + + +

    +Yes, \0 and \x00 should both do the trick. Perhaps you have an ancient +version of flex. The latest release is version 2.5.8. + + + + +

    Whenever flex can not match the input it says "flex scanner jammed".

    + +

    +Whenever flex can not match the input it says "flex scanner jammed". + + +

    +You need to add a rule that matches the otherwise-unmatched text. +e.g., + + + +

    +@verbatim
    +%option yylineno
    +%%
    +[[a bunch of rules here]]
    +
    +.	printf("bad input character '%s' at line %d\n", yytext, yylineno);
    +
    + +

    +See %option default for more information. + + + + +

    Why doesn't flex have non-greedy operators like perl does?

    + +

    +Why doesn't flex have non-greedy operators like perl does? + + +

    +A DFA can do a non-greedy match by stopping +the first time it enters an accepting state, instead of consuming input until +it determines that no further matching is possible (a "jam" state). This +is actually easier to implement than longest leftmost match (which flex does). + + +

    +But it's also much less useful than longest leftmost match. In general, +when you find yourself wishing for non-greedy matching, that's usually a +sign that you're trying to make the scanner do some parsing. That's +generally the wrong approach, since it lacks the power to do a decent job. +Better is to either introduce a separate parser, or to split the scanner +into multiple scanners using (exclusive) start conditions. + + +

    +You might have +a separate start state once you've seen the BEGIN. In that state, you +might then have a regex that will match END (to kick you out of the +state), and perhaps (.|\n) to get a single character within the chunk ... + + +

    +This approach also has much better error-reporting properties. + + + + +

    Appendices

    + + + +

    Makefiles and Flex

    + +

    + + + +

    +In this appendix, we provide tips for writing Makefiles to build your scanners. + + +

    +In a traditional build environment, we say that the `.c' files are the +sources, and the `.o' files are the intermediate files. When using +flex, however, the `.l' files are the sources, and the generated +`.c' files (along with the `.o' files) are the intermediate files. +This requires you to carefully plan your Makefile. + + +

    +Modern @command{make} programs understand that `foo.l' is intended to +generate `lex.yy.c' or `foo.c', and will behave +accordingly(2) and GNU @command{automake} are two such +programs that provide implicit rules for flex-generated scanners.}. The +following Makefile does not explicitly instruct @command{make} how to build +`foo.c' from `foo.l'. Instead, it relies on the implicit rules of the +@command{make} program to build the intermediate file, `scan.c': + + +

    + + +

    +@verbatim
    +    # Basic Makefile -- relies on implicit rules
    +    # Creates "myprogram" from "scan.l" and "myprogram.c"
    +    #
    +    LEX=flex
    +    myprogram: scan.o myprogram.o
    +    scan.o: scan.l
    +
    +
    + +

    +For simple cases, the above may be sufficient. For other cases, +you may have to explicitly instruct @command{make} how to build your scanner. +The following is an example of a Makefile containing explicit rules: + + +

    + + +

    +@verbatim
    +    # Basic Makefile -- provides explicit rules
    +    # Creates "myprogram" from "scan.l" and "myprogram.c"
    +    #
    +    LEX=flex
    +    myprogram: scan.o myprogram.o
    +            $(CC) -o $  $(LDFLAGS) $^
    +
    +    myprogram.o: myprogram.c
    +            $(CC) $(CPPFLAGS) $(CFLAGS) -o $ -c $^
    +
    +    scan.o: scan.c
    +            $(CC) $(CPPFLAGS) $(CFLAGS) -o $ -c $^
    +
    +    scan.c: scan.l
    +            $(LEX) $(LFLAGS) -o $ $^
    +
    +    clean:
    +            $(RM) *.o scan.c
    +
    +
    + +

    +Notice in the above example that `scan.c' is in the clean target. +This is because we consider the file `scan.c' to be an intermediate file. + + +

    +Finally, we provide a realistic example of a flex scanner used with a +bison parser(3). +There is a tricky problem we have to deal with. Since a flex scanner +will typically include a header file (e.g., `y.tab.h') generated by the +parser, we need to be sure that the header file is generated BEFORE the scanner +is compiled. We handle this case in the following example: + + + +

    +@verbatim
    +    # Makefile example -- scanner and parser.
    +    # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c"
    +    #
    +    LEX     = flex
    +    YACC    = bison -y
    +    YFLAGS  = -d
    +    objects = scan.o parse.o myprogram.o
    +
    +    myprogram: $(objects)
    +    scan.o: scan.l parse.c
    +    parse.o: parse.y
    +    myprogram.o: myprogram.c
    +
    +
    + +

    +In the above example, notice the line, + + + +

    +@verbatim
    +    scan.o: scan.l parse.c
    +
    + +

    +, which lists the file `parse.c' (the generated parser) as a dependency of +`scan.o'. We want to ensure that the parser is created before the scanner +is compiled, and the above line seems to do the trick. Feel free to experiment +with your specific implementation of @command{make}. + + +

    +For more details on writing Makefiles, see section `Top' in The GNU Make Manual. + + + + +

    Indices

    + + + +

    Concept Index

    +

    + + + + + + + + + + + +Jump to: +$ +- +% +- +[ +- +^ +- +a +- +b +- +c +- +d +- +e +- +f +- +h +- +i +- +k +- +l +- +m +- +n +- +o +- +p +- +r +- +s +- +t +- +u +- +v +- +w +- +y +

    +

    $

    + +
  • $ -- see EOL +
  • +

    %

    + +
  • %array, use of +
  • %array, with C++ +
  • %pointer, caveat with unput() +
  • %pointer, use of +
  • %{ and %}, in Definitions Section +
  • %{ and %}, in Rules Section +
  • +

    [

    + +
  • [] in patterns +
  • +

    ^

    + +
  • ^ -- see BOL +
  • +

    a

    + +
  • actions, embedded C strings +
  • actions, explanation +
  • actions, redefining YY_BREAK +
  • actions, use of { and } +
  • allocating memory see memory +
  • arguments, command-line +
  • array, default size for yytext +
  • +

    b

    + +
  • backing up, example of eliminating +
  • BEGIN +
  • BEGIN, explanation +
  • beginning of line -- see BOL +
  • bison, see also yacc +
  • bison, with reentrant +
  • BOL, ^ as normal character +
  • BOL, checking the BOL flag +
  • BOL, setting it +
  • BOL, syntax of +
  • bugs, reporting +
  • +

    c

    + +
  • C++ +
  • C++ and %array +
  • C++, multiple different scanners +
  • case-insensitive, effect on character classes +
  • character classes in patterns +
  • character classes in patterns, syntax of +
  • character classes, equivalence of +
  • clearing an input buffer +
  • command-line options +
  • comments, example of discarding +
  • comments, example of scanning C comments +
  • comments, syntax +
  • comments, valid uses of +
  • commments, in actions +
  • copyright of flex +
  • +

    d

    + +
  • default rule +
  • default rule, explanation +
  • Definitions Sections +
  • distributing flex +
  • +

    e

    + +
  • ECHO, explanation +
  • embedding C code with %{ and %} +
  • end of file -- see EOF +
  • end of line -- see EOL +
  • EOF and yyrestart() +
  • EOF in patterns, syntax of +
  • EOF, example using multiple input buffers +
  • EOF, explanation +
  • EOF, pushing back +
  • EOL in patterns, syntax of +
  • EOL, $ as normal character +
  • EOL, in negated character classes +
  • error reporting, diagnostic messages +
  • error reporting, in C++ +
  • error rules, to eliminate backing up +
  • escape sequences in patterns, syntax of +
  • exiting with yyterminate() +
  • +

    f

    + +
  • file format +
  • flex, introduction +
  • flushing an input buffer +
  • flushing the internal buffer +
  • format of the input +
  • format, Definitions Section +
  • format, Rules Section +
  • format, User Code Section +
  • freeing memory -- see memory +
  • +

    h

    + +
  • halting with yyterminate() +
  • header files, with C++ +
  • +

    i

    + +
  • include files, with C++ +
  • including C code with %{ and %} +
  • input(), and C++ +
  • input(), explanation +
  • +

    k

    + +
  • keywords, for performance +
  • +

    l

    + +
  • lex (traditional) and POSIX +
  • limitations of flex +
  • literal text in patterns, syntax of +
  • +

    m

    + +
  • macros, see preprocessor macros +
  • Makefile, syntax +
  • malloc -- see memory +
  • member functions in C++ +
  • memory, allocating input buffers +
  • memory, considerations for reentrant scanners +
  • memory, deleting input buffers +
  • memory, for start condition stacks +
  • methods +
  • multiple input streams +
  • +

    n

    + +
  • negating ranges in patterns +
  • NULL character in patterns, syntax of +
  • +

    o

    + +
  • options, command-line +
  • +

    p

    + +
  • pattern aliases, expansion of +
  • Patterns +
  • patterns aliases, how to define +
  • patterns, how the input is matched +
  • patterns, precedence of operators +
  • patterns, syntax +
  • patterns, tuning for performance +
  • performance, backing up +
  • performance, considerations +
  • performance, using keywords +
  • POSIX and lex +
  • POSIX, character classes in patterns, syntax of +
  • POSIX, non-POSIX features of flex +
  • preprocessor macros, for use in actions +
  • pushing back characters with unput +
  • pushing back characters with yyless +
  • pushing back EOF +
  • +

    r

    + +
  • ranges in patterns +
  • ranges in patterns, negating +
  • reentrant, accessing flex variables +
  • reentrant, accessor functions +
  • reentrant, API explanation +
  • reentrant, calling functions +
  • reentrant, example of +
  • reentrant, explanation +
  • reentrant, extra data +
  • reentrant, initialization +
  • regular expressions -- see Patterns +
  • REJECT, example +
  • REJECT, explanation +
  • REJECT, performance costs +
  • returning from within an action +
  • Rules Section +
  • +

    s

    + +
  • sections of the input +
  • sections, Definitions Section +
  • sections, format of Rules Section +
  • sections, User Code Section +
  • stacks, routines for manipulating +
  • start condition, applying to multiple patterns +
  • start conditions in patterns, syntax of +
  • start conditions, explanation +
  • start conditions, inclusive v.s. exclusive +
  • start conditions, integer values +
  • start conditions, special wildcard condition +
  • start conditions, use of a stack +
  • stdin, default for yyin +
  • strings, in actions +
  • strings, scanning strings instead of files +
  • +

    t

    + +
  • terminating with yyterminate() +
  • trailing context in patterns, syntax of +
  • trailing context, limits of +
  • trailing context, performance costs +
  • +

    u

    + +
  • unput(), caveat with %pointer +
  • unput(), explanation +
  • User Code Section +
  • +

    v

    + +
  • verbatim text in patterns, syntax of +
  • +

    w

    + +
  • warnings, diagnostic messages +
  • whitespace, compressing, example +
  • +

    y

    + +
  • yacc, interface +
  • YY_CURRENT_BUFFER, and multiple buffers +
  • YY_INPUT, overriding +
  • YY_START, example +
  • yyleng, modification of +
  • yyless(), example +
  • yyless(), explanation +
  • yylex(), in generated scanner +
  • yylex(), overriding +
  • yylineno, in a reentrant scanner +
  • yylineno, performance costs +
  • yymore(), example +
  • yymore(), explanation +
  • yymore, caveat +
  • yyterminate(), explanation +
  • yytext, default array size +
  • yytext, definition of +
  • yytext, modification of +
  • yywrap(), explanation +
  • + + + + +

    Index of Functions and Macros

    + +

    +This is an index of functions and preprocessor macros that look like functions. +For macros that expand to variables or constants, see section Index of Variables. + + +

    +Jump to: +b +- +d +- +l +- +s +- +y +

    +

    b

    + +
  • BEGIN +
  • +

    d

    + +
  • debug (C++ only) +
  • +

    l

    + +
  • LexerError (C++ only) +
  • LexerInput (C++ only) +
  • LexerOutput (C++ only) +
  • lineno (C++ only) +
  • +

    s

    + +
  • set_debug (C++ only) +
  • switch_streams (C++ only) +
  • +

    y

    + +
  • YY_AT_BOL +
  • yy_create_buffer +
  • yy_delete_buffer +
  • yy_flush_buffer +
  • yy_new_buffer +
  • YY_NEW_FILE (now obsolete) +
  • yy_pop_state +
  • yy_push_state +
  • yy_scan_buffer +
  • yy_scan_bytes +
  • yy_scan_string +
  • yy_set_bol +
  • yy_set_interactive +
  • yy_switch_to_buffer +
  • yy_top_state +
  • yyFlexLexer constructor (C++ only) +
  • yyget_extra +
  • yyget_in +
  • yyget_leng +
  • yyget_lineno +
  • yyget_lloc +
  • yyget_lval +
  • yyget_out +
  • yyget_text +
  • YYLeng (C++ only) +
  • yylex (C++ version) +
  • yylex (reentrant version) +
  • yylex_destroy +
  • yylex_init +
  • yyrestart +
  • yyset_extra +
  • yyset_in +
  • yyset_lineno +
  • yyset_lloc +
  • yyset_lval +
  • yyset_out +
  • yyterminate +
  • YYText (C++ only) +
  • + + + + +

    Index of Variables

    + +

    +This is an index of variables, constants, and preprocessor macros +that expand to variables or constants. + + +

    +Jump to: +i +- +y +

    +

    i

    + +
  • INITIAL +
  • +

    y

    + +
  • YY_CURRENT_BUFFER +
  • YY_END_OF_BUFFER_CHAR +
  • yy_globals (reentrant only) +
  • YY_NUM_RULES +
  • YY_START, YY_START +
  • yyextra +
  • yyin +
  • yyleng +
  • yylloc +
  • YYLMAX +
  • yylval +
  • yylval, with yacc +
  • yyout +
  • yytext, yytext +
  • + + + + +

    Index of Data Types

    +

    +Jump to: +f +- +y +

    +

    f

    + +
  • FlexLexer (C++ only) +
  • +

    y

    + +
  • YY_BUFFER_STATE +
  • YY_EXTRA_TYPE (reentrant only) +
  • yy_size_t +
  • yyFlexLexer (C++ only) +
  • YYLTYPE +
  • yyscan_t (reentrant only) +
  • YYSTYPE +
  • + + + + +

    Index of Hooks

    + +

    +This is an index of "hooks" that the user may define. These hooks typically correspond +to specific locations in the generated scanner, and may be used to insert arbitrary code. + + +

    +Jump to: +y +

    +

    y

    + +
  • YY_BREAK +
  • YY_USER_ACTION +
  • YY_USER_INIT +
  • + + + + +

    Index of Examples

    +

    +Jump to: +< +- +a +- +b +- +c +- +d +- +e +- +f +- +g +- +h +- +m +- +n +- +p +- +r +- +s +- +t +- +u +- +w +- +y +

    +

    <

    + +
  • <<EOF>>, use of +
  • +

    a

    + +
  • accessor functions, use of +
  • +

    b

    + +
  • backing up, eliminating +
  • backing up, eliminating by adding error rules +
  • backing up, eliminating with catch-all rule +
  • bison, parser +
  • bison, scanner to be called from bison +
  • +

    c

    + +
  • C++ scanners, including multiple scanners +
  • C++ scanners, use of +
  • comments in the input +
  • compressing whitespace +
  • counting characters and lines +
  • +

    d

    + +
  • deleting lines from input +
  • discarding C comments +
  • +

    e

    + +
  • error messages, end of buffer missed +
  • extended scope of start conditions +
  • +

    f

    + +
  • format of input file +
  • +

    g

    + +
  • getting current start state with YY_START +
  • +

    h

    + +
  • handling include files with multiple input buffers +
  • +

    m

    + +
  • Makefile, example of implicit rules +
  • Makefile, explicit example +
  • matching C-style double-quoted strings +
  • minimal scanner +
  • +

    n

    + +
  • name definitions, not POSIX +
  • +

    p

    + +
  • Pascal-like language +
  • pattern aliases, defining +
  • pattern aliases, use of +
  • patterns and actions on different lines +
  • patterns, character class equivalence +
  • patterns, end of line +
  • patterns, grouping and precedence +
  • patterns, invalid trailing context +
  • patterns, repetitions with grouping +
  • patterns, special characters treated as normal +
  • patterns, syntax +
  • patterns, valid character classes +
  • performance optimization, matching longer tokens +
  • performance optimization, recognizing keywords +
  • +

    r

    + +
  • recognizing C comments +
  • reentrant scanners, multiple interleaved scanners +
  • reentrant scanners, recursive invocation +
  • REJECT +
  • REJECT, calling multiple times +
  • restarting the scanner +
  • +

    s

    + +
  • start conditions, basic +
  • start conditions, behavior of default rule +
  • start conditions, exclusive +
  • start conditions, for different interpretations of same input +
  • start conditions, inclusive +
  • start conditions, multiple +
  • start conditions, use of wildcard condition (<*>) +
  • start conditions, using BEGIN +
  • +

    t

    + +
  • trailing context, variable length +
  • +

    u

    + +
  • unput() to push back characters +
  • using integer values of start condition names +
  • +

    w

    + +
  • warning, dangerous trailing context +
  • warning, rule cannot be matched +
  • +

    y

    + +
  • yacc interface +
  • YY_EXTRA_TYPE, defining your own type +
  • YY_INPUT, overriding the input mechanism +
  • YY_USER_ACTION to track each time a rule is matched +
  • yyless() to push back characters +
  • yylex, overriding the prototype +
  • yymore() to append token to previous token +
  • + + +


    +This document was generated on 2 July 2002 using +texi2html 1.56k. + + Index: ossp-adm/autotools/lexyacc.ps RCS File: /v/ossp/cvs/ossp-adm/autotools/lexyacc.ps,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/lexyacc.ps,v' | diff -u /dev/null - -L'ossp-adm/autotools/lexyacc.ps' 2>/dev/null --- ossp-adm/autotools/lexyacc.ps +++ - 2025-04-19 11:54:39.063678259 +0200 @@ -0,0 +1,18618 @@ +%!PS-Adobe-3.0 +%%Title: (A Guide to Lex & Yacc) +%%Version: 1 2 +%%Creator: (Microsoft Word 9.0) +%%CreationDate: (D:20010722204043) +%%For: (Thomas Niemann) +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 0 612 792 +%%Pages: 39 +%%DocumentProcessColors: (atend) +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginDefaults +%%EndDefaults +% Removing the following five lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +297cf25e88dd30ad0d765f74ea031713dd819da0977424e8dc1394394c20 +3357dbf038e41b397af0906ddfc7b441ac04d35b3c5bf8b072a6fdc7285d +eb12fc6fa5645278f23b97f6fa3437451e375019c2291d0363be33411e8f +6b8d6a20a5234de67e2061763b5ddcbf22f063da2a8302c832aa41 +%%BeginProlog +%%EndProlog +%%BeginSetup +%%BeginResource: l2check +%%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved. +systemdict /languagelevel known +{ systemdict /languagelevel get 1 eq } +{ true } +ifelse +{ +initgraphics /Helvetica findfont 18 scalefont setfont +72 600 moveto (Error: Your printer driver needs to be configured) dup show +72 580 moveto (for printing to a PostScript Language Level 1 printer.) dup show +exch = = +/Helvetica-Bold findfont 16 scalefont setfont +72 520 moveto (Windows and Unix) show +/Times-Roman findfont 16 scalefont setfont +72 500 moveto (Select ªLanguage Level 1º in the PostScript options section) show +72 480 moveto (of the Acrobat print dialog.) show +/Helvetica-Bold findfont 16 scalefont setfont +72 440 moveto (Macintosh) show +/Times-Roman findfont 16 scalefont setfont +72 420 moveto (In the Chooser, select your printer driver.) show +72 400 moveto (Then select your printer and click the Setup button.) show +72 380 moveto (Follow any on-screen dialogs that may appear.) show +showpage +quit +} +if +%%EndResource +/currentpacking where{pop currentpacking true setpacking}if +%%BeginResource: procset pdfvars +%%Copyright: Copyright 1987-1999 Adobe Systems Incorporated. All Rights Reserved. +%%Version: 4.0 2 +%%Title: definition of dictionary of variables used by PDF & PDFText procsets +userdict /PDF 160 dict put +userdict /PDFVars 86 dict dup begin put +/_save 0 def +/_cshow 0 def +/InitAll 0 def +/TermAll 0 def +/DocInitAll 0 def +/DocTermAll 0 def +/_lp /none def +/_doClip 0 def +/sfc 0 def +/_sfcs 0 def +/_sfc 0 def +/ssc 0 def +/_sscs 0 def +/_ssc 0 def +/_fcs 0 def +/_scs 0 def +/_fp 0 def +/_sp 0 def +/AGM_MAX_CS_COMPONENTS 10 def +/_fillColors [ 0 1 AGM_MAX_CS_COMPONENTS { array } for ] def +/_strokeColors [ 0 1 AGM_MAX_CS_COMPONENTS { array } for ] def +/_fc null def +/_sc null def +/DefaultGray [/DeviceGray] def +/DefaultRGB [/DeviceRGB] def +/DefaultCMYK [/DeviceCMYK] def +/_inT false def +/_tr -1 def +/_rise 0 def +/_ax 0 def +/_cx 0 def +/_ld 0 def +/_tm matrix def +/_ctm matrix def +/_mtx matrix def +/_hy (-) def +/_fScl 0 def +/_hs 1 def +/_pdfEncodings 2 array def +/_baselineadj 0 def +/_fTzero false def +/_Tj 0 def +/_italMtx [1 0 .212557 1 0 0] def +/_italMtx_WMode1 [1 -.212557 0 1 0 0] def +/_italMtxType0 [1 0 .1062785 1 0 0] def +/_italMtx_WMode1Type0 [1 -.1062785 0 1 0 0] def +/_basefont 0 def +/_basefonto 0 def +/_pdf_oldCIDInit null def +/_pdf_FontDirectory 30 dict def +/_categories 10 dict def +/_sa? true def +/_op? false def +/_OP? false def +/_opmode 0 def +/_ColorSep5044? false def +/_tmpcolr? [] def +/_tmpop? {} def +/_processColors 0 def +/_defaulttransfer currenttransfer def +/_defaultflatness currentflat def +/_defaulthalftone null def +/_defaultcolortransfer null def +/_defaultblackgeneration null def +/_defaultundercolorremoval null def +/_defaultcolortransfer null def +end +%%EndResource +PDFVars begin PDF begin +%%BeginResource: procset pdfutil +%%Copyright: Copyright 1993-1999 Adobe Systems Incorporated. All Rights Reserved. +%%Version: 4.0 2 +%%Title: Basic utilities used by other PDF procsets +/bd {bind def} bind def +/ld {load def} bd +/bld { +dup length dict begin +{ null def } forall +bind +end +def +} bd +/dd { PDFVars 3 1 roll put } bd +/xdd { exch dd } bd +/Level2? +systemdict /languagelevel known +{ systemdict /languagelevel get 2 ge } { false } ifelse +def +/Level3? +systemdict /languagelevel known +{systemdict /languagelevel get 3 eq } { false } ifelse +def +/getifknown { +2 copy known { get true } { pop pop false } ifelse +} bd +/here { +currentdict exch getifknown +} bd +/isdefined? { where { pop true } { false } ifelse } bd +/StartLoad { dup dup not { /_save save dd } if } bd +/EndLoad { if not { _save restore } if } bd +%%EndResource +%%BeginResource: procset pdf +%%Version: 4.0 3 +%%Copyright: Copyright 1998-1999 Adobe Systems Incorporated. All Rights Reserved. +%%Title: General operators for PDF, common to all Language Levels. +[/b/B/b*/B*/BDC/BI/BMC/BT/BX/c/cm/cs/CS/d/d0/d1/Do/DP/EI/EMC/ET/EX/f/f*/g/G/gs +/h/i/j/J/k/K/l/m/M/MP/n/q/Q/re/rg/RG/ri/s/S/sc/SC/scn/SCN/sg/Tc/Td/TD/Tf/Tj/TJ +/TL/Tm/Tr/Ts/Tw/Tz/T*/v/w/W/W*/y/'/" +/applyInterpFunc/applystitchFunc/domainClip/EF/encodeInput/gsDI/ilp/icl +/initgs/int/limit/PS/rangeClip/RC/rf/makePat/csfamily +/? /! /| /: /+ /GetGlyphDirectory +] {null def} bind forall +/v { currentpoint 6 2 roll c } bd +/y { 2 copy c } bd +/h/closepath ld +/d/setdash ld +/j/setlinejoin ld +/J/setlinecap ld +/M/setmiterlimit ld +/w/setlinewidth ld +/i { +dup 0 eq { pop _defaultflatness } if +setflat +} bd +/gsDI { +begin +/OP here { /_OP? xdd } if +/op here { /_op? xdd } +{ /OP here { /_op? xdd } if } +ifelse +/OPM here { /_opmode xdd } if +/Font here { aload pop Tf } if +/LW here { w } if +/LC here { J } if +/LJ here { j } if +/ML here { M } if +/D here { aload pop d } if +end +} bd +/ilp { /_lp /none dd } bd +/icl { /_doClip 0 dd } bd +/W { /_doClip 1 dd } bd +/W* { /_doClip 2 dd } bd +/n { +{{} {clip} {eoclip}} _doClip get exec +icl +newpath +} bd +/s { h S } bd +/B { q f Q S } bd +/B* { q f* Q S } bd +/b { h B } bd +/b* { h B* } bd +/q/save ld +/Q { restore ilp } bd +/GetCSFamily { +dup type /arraytype eq {0 get} if +} bd +/GetCompsDict +11 dict begin +/DeviceGray { pop 1 } bd +/DeviceRGB { pop 3 } bd +/DeviceCMYK { pop 4 } bd +/CIEBasedA { pop 1 } bd +/CIEBasedABC { pop 3 } bd +/CIEBasedDEF { pop 3 } bd +/CIEBasedDEFG { pop 4 } bd +/DeviceN { 1 get length } bd +/Separation { pop 1 } bd +/Indexed { pop 1 } bd +/Pattern { pop 0 } bd +currentdict +end +def +/GetComps { +GetCompsDict +1 index GetCSFamily +get exec +} bd +/cs +{ +dup _fcs eq +{ pop } +{ dup /_fcs xdd +GetComps +_fillColors exch get +/_fc xdd +/_fp null dd +} ifelse +} bd +/CS +{ +dup _scs eq +{ pop } +{ dup /_scs xdd GetComps _strokeColors exch get /_sc xdd /_sp null dd } +ifelse +} bd +/sc { +_fc astore pop +ilp +} bd +/SC { +_sc astore pop +ilp +} bd +/g { DefaultGray cs sc } bd +/rg { DefaultRGB cs sc } bd +/k { DefaultCMYK cs sc } bd +/G { DefaultGray CS SC } bd +/RG { DefaultRGB CS SC } bd +/K { DefaultCMYK CS SC } bd +/cm { _mtx astore concat } bd +/re { +4 2 roll m +1 index 0 rlineto +0 exch rlineto +neg 0 rlineto +h +} bd +/RC/rectclip ld +/EF/execform ld +/PS { cvx exec } bd +/initgs { +/DefaultGray [/DeviceGray] dd +/DefaultRGB [/DeviceRGB] dd +/DefaultCMYK [/DeviceCMYK] dd +0 g 0 G +[] 0 d +0 j +0 J +10 M +1 w +true setSA +/_op? false dd +/_OP? false dd +/_opmode 0 dd +/_defaulttransfer load settransfer +0 i +/RelativeColorimetric ri +newpath +} bd +/int { +dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul +exch pop add exch pop +} bd +/limit { +dup 2 index le { exch } if pop +dup 2 index ge { exch } if pop +} bd +/domainClip { +Domain aload pop 3 2 roll +limit +} [/Domain] bld +/applyInterpFunc { +0 1 DimOut 1 sub +{ +dup C0 exch get exch +dup C1 exch get exch +3 1 roll +1 index sub +3 index +N exp mul add +exch +currentdict /Range_lo known +{ +dup Range_lo exch get exch +Range_hi exch get +3 2 roll limit +} +{ +pop +} +ifelse +exch +} for +pop +} [/DimOut /C0 /C1 /N /Range_lo /Range_hi] bld +/encodeInput { +NumParts 1 sub +0 1 2 index +{ +dup Bounds exch get +2 index gt +{ exit } +{ dup +3 index eq +{ exit } +{ pop } ifelse +} ifelse +} for +3 2 roll pop +dup Bounds exch get exch +dup 1 add Bounds exch get exch +2 mul +dup Encode exch get exch +1 add Encode exch get +int +} [/NumParts /Bounds /Encode] bld +/rangeClip { +exch dup Range_lo exch get +exch Range_hi exch get +3 2 roll +limit +} [/Range_lo /Range_hi] bld +/applyStitchFunc { +Functions exch get exec +currentdict /Range_lo known { +0 1 DimOut 1 sub { +DimOut 1 add -1 roll +rangeClip +} for +} if +} [/Functions /Range_lo /DimOut] bld +%%EndResource +%%BeginResource: procset pdflev2 +%%Version: 4.0 5 +%%Copyright: Copyright 1987-1999 Adobe Systems Incorporated. All Rights Reserved. +%%LanguageLevel: 2 +%%Title: PDF operators, with code specific for Level 2 +/_defaulthalftone currenthalftone dd +/_defaultblackgeneration currentblackgeneration dd +/_defaultundercolorremoval currentundercolorremoval dd +/_defaultcolortransfer [currentcolortransfer] dd +/initialize { +_defaulthalftone sethalftone +/_defaultblackgeneration load setblackgeneration +/_defaultundercolorremoval load setundercolorremoval +_defaultcolortransfer aload pop setcolortransfer +false setoverprint +<> setuserparams +} bd +/terminate { } bd +/m/moveto ld +/l/lineto ld +/c/curveto ld +/setSA/setstrokeadjust ld +/defineRes/defineresource ld +/findRes/findresource ld +currentglobal +true systemdict /setglobal get exec +[/Function /ExtGState /Form /Shading /FunctionDictionary /MadePattern /PatternPrototype /DataSource] +{ /Generic /Category findresource dup length dict copy /Category defineresource pop } +forall +systemdict /setglobal get exec +/ri +{ +/findcolorrendering isdefined? +{ +mark exch +findcolorrendering +counttomark 2 eq +{ type /booleantype eq +{ dup type /nametype eq +{ dup /ColorRendering resourcestatus +{ pop pop +dup /DefaultColorRendering ne +{ +/ColorRendering findresource +setcolorrendering +} if +} if +} if +} if +} if +cleartomark +} +{ pop +} ifelse +} bd +/_sfcs {_fcs setcolorspace} bind dd +/_sscs {_scs setcolorspace} bind dd +/_sfc +{ +_fc aload pop +_fp null eq +{ setcolor } +{ _fp setpattern } +ifelse +} bind dd +/_ssc +{ +_sc aload pop +_sp null eq { setcolor} { _sp setpattern } ifelse +} bind dd +/scn { +dup type /dicttype eq +{ dup /_fp xdd +/PaintType get 1 eq +{ /_fc _fillColors 0 get dd ilp } +{ /_fc _fillColors +_fcs 1 get +GetComps get dd +sc +} +ifelse +} +{ sc } +ifelse +} bd +/SCN { +dup type /dicttype eq +{ dup /_sp xdd +/PaintType get 1 eq +{ /_sc _strokeColors 0 get dd ilp } +{ /_sc _strokeColors _scs 1 get GetComps get dd +SC +} +ifelse +} +{ SC } +ifelse +} bd +/gs +{ +begin +/SA here { setstrokeadjust } if +/BG here { setblackgeneration } if +/UCR here { setundercolorremoval } if +/FL here { i } if +/RI here { ri } if +/TR here +{ +dup xcheck +{ settransfer } +{ aload pop setcolortransfer } +ifelse +} if +/sethalftonephase isdefined? { /HTP here { sethalftonephase } if } if +/HT here { sethalftone } if +currentdict gsDI +end +} bd +/sfc { +_op? setoverprint +_lp /fill ne { +_sfcs +_sfc +/_lp /fill dd +} if +} dd +/ssc { +_OP? setoverprint +_lp /stroke ne { +_sscs +_ssc +/_lp /stroke dd +} if +} dd +/f { +{ { sfc fill } +{gsave sfc fill grestore clip newpath icl ilp} +{gsave sfc fill grestore eoclip newpath icl ilp} +} _doClip get exec +} bd +/f* { +{ { sfc eofill } +{gsave sfc eofill grestore clip newpath icl ilp} +{gsave sfc eofill grestore eoclip newpath icl ilp} +} _doClip get exec +} bd +/S { +{ { ssc stroke } +{gsave ssc stroke grestore clip newpath icl ilp} +{gsave ssc stroke grestore eoclip newpath icl ilp} +} _doClip get exec +} bd +/rf { +{ { sfc rectfill } +{gsave sfc rectfill grestore clip newpath icl ilp} +{gsave sfc rectfill grestore eoclip newpath icl ilp} +} _doClip get exec +} bd +/knownColorants? { +pop false +} bd +/makePat { +gsave +dup /Matrix get concat +matrix makepattern +grestore +/MadePattern defineRes pop +} bd +%%EndResource +%%BeginResource: procset pdftext +%%Version: 4.0 2 +%%Copyright: Copyright 1987-1998 Adobe Systems Incorporated. All Rights Reserved. +%%Title: Text operators for PDF +PDF /PDFText 75 dict dup begin put +/docinitialize +{ +/resourcestatus where { +pop +/CIDParams /ProcSet resourcestatus { +pop pop +false /CIDParams /ProcSet findresource /SetBuildCompatible get exec +} if +} if +PDF begin +PDFText /_pdfDefineIdentity-H known +{ PDFText /_pdfDefineIdentity-H get exec} +if +end +} bd +/initialize { +PDFText begin +/_intT false dd +0 Tr +} bd +/terminate { end } bd +/_safeput +{ +Level2? not +{ +2 index load dup dup length exch maxlength ge +{ dup length 5 add dict copy +3 index xdd +} +{ pop } +ifelse +} +if +3 -1 roll load 3 1 roll put +} +bd +/pdf_has_composefont? systemdict /composefont known def +/CopyFont { +{ +1 index /FID ne 2 index /UniqueID ne and +{ def } { pop pop } ifelse +} forall +} bd +/Type0CopyFont +{ +exch +dup length dict +begin +CopyFont +[ +exch +FDepVector +{ +dup /FontType get 0 eq +{ +1 index Type0CopyFont +/_pdfType0 exch definefont +} +{ +/_pdfBaseFont exch +2 index exec +} +ifelse +exch +} +forall +pop +] +/FDepVector exch def +currentdict +end +} bd +/cHexEncoding +[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 +/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 +/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 +/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B +/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E +/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 +/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 +/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 +/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA +/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD +/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 +/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 +/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 +/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def +/modEnc { +/_enc xdd +/_icode 0 dd +counttomark 1 sub -1 0 +{ +index +dup type /nametype eq +{ +_enc _icode 3 -1 roll put +_icode 1 add +} +if +/_icode xdd +} for +cleartomark +_enc +} bd +/trEnc { +/_enc xdd +255 -1 0 { +exch dup -1 eq +{ pop /.notdef } +{ Encoding exch get } +ifelse +_enc 3 1 roll put +} for +pop +_enc +} bd +/TE { +/_i xdd +StandardEncoding 256 array copy modEnc +_pdfEncodings exch _i exch put +} bd +/TZ +{ +/_usePDFEncoding xdd +findfont +dup length 6 add dict +begin +{ +1 index /FID ne { def } { pop pop } ifelse +} forall +/pdf_origFontName FontName def +/FontName exch def +_usePDFEncoding 0 ge +{ +/Encoding _pdfEncodings _usePDFEncoding get def +pop +} +{ +_usePDFEncoding -1 eq +{ +counttomark 0 eq +{ pop } +{ +Encoding 256 array copy +modEnc /Encoding exch def +} +ifelse +} +{ +256 array +trEnc /Encoding exch def +} +ifelse +} +ifelse +pdf_EuroProcSet pdf_origFontName known +{ +pdf_origFontName pdf_AddEuroGlyphProc +} if +FontName currentdict +end +definefont pop +} +bd +/Level2? +systemdict /languagelevel known +{systemdict /languagelevel get 2 ge} +{false} +ifelse +def +Level2? +{ +/_pdfFontStatus +{ +currentglobal exch +/Font resourcestatus +{pop pop true} +{false} +ifelse +exch setglobal +} bd +} +{ +/_pdfFontStatusString 50 string def +_pdfFontStatusString 0 (fonts/) putinterval +/_pdfFontStatus +{ +FontDirectory 1 index known +{ pop true } +{ +_pdfFontStatusString 6 42 getinterval +cvs length 6 add +_pdfFontStatusString exch 0 exch getinterval +{ status } stopped +{pop false} +{ +{ pop pop pop pop true} +{ false } +ifelse +} +ifelse +} +ifelse +} bd +} +ifelse +Level2? +{ +/_pdfCIDFontStatus +{ +/CIDFont /Category resourcestatus +{ +pop pop +/CIDFont resourcestatus +{pop pop true} +{false} +ifelse +} +{ pop false } +ifelse +} bd +} +if +/_pdfString100 100 string def +/_pdfComposeFontName +{ +dup length 1 eq +{ +0 get +1 index +type /nametype eq +{ +_pdfString100 cvs +length dup dup _pdfString100 exch (-) putinterval +_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval +2 index exch cvs length +add 1 add _pdfString100 exch 0 exch getinterval +exch pop +true +} +{ +pop pop +false +} +ifelse +} +{ +false +} +ifelse +dup {exch cvn exch} if +} bd +/_pdfConcatNames +{ +exch +_pdfString100 cvs +length dup dup _pdfString100 exch (-) putinterval +_pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval +3 -1 roll exch cvs length +add 1 add _pdfString100 exch 0 exch getinterval +cvn +} bind def +/_pdfTextTempString 50 string def +/_pdfRegOrderingArray [(Adobe-Japan1) (Adobe-CNS1) (Adobe-Korea1) (Adobe-GB1)] def +/_pdf_CheckSupplements +{ +1 index _pdfTextTempString cvs +false +_pdfRegOrderingArray +{ +2 index exch +anchorsearch +{ pop pop pop true exit} +{ pop } +ifelse +} +forall +exch pop +{ +/CIDFont findresource +/CIDSystemInfo get /Supplement get +exch /CMap findresource +/CIDSystemInfo get +dup type /dicttype eq +{/Supplement get} +{pop 0 } +ifelse +ge +} +{ pop pop true } +ifelse +} bind def +pdf_has_composefont? +{ +/_pdfComposeFont +{ +2 copy _pdfComposeFontName not +{ +2 index +} +if +(pdf) exch _pdfConcatNames +dup _pdfFontStatus +{ dup findfont 5 2 roll pop pop pop true} +{ +4 1 roll +1 index /CMap resourcestatus +{ +pop pop +true +} +{false} +ifelse +1 index true exch +{ +_pdfCIDFontStatus not +{pop false exit} +if +} +forall +and +{ +1 index 1 index 0 get _pdf_CheckSupplements +{ +3 -1 roll pop +2 index 3 1 roll +composefont true +} +{ +pop pop exch pop false +} +ifelse +} +{ +_pdfComposeFontName +{ +dup _pdfFontStatus +{ +exch pop +1 index exch +findfont definefont true +} +{ +pop exch pop +false +} +ifelse +} +{ +exch pop +false +} +ifelse +} +ifelse +{ true } +{ +dup _pdfFontStatus +{ dup findfont true } +{ pop false } +ifelse +} +ifelse +} +ifelse +} bd +} +{ +/_pdfComposeFont +{ +_pdfComposeFontName not +{ +dup +} +if +dup +_pdfFontStatus +{exch pop dup findfont true} +{ +1 index +dup type /nametype eq +{pop} +{cvn} +ifelse +eq +{pop false} +{ +dup _pdfFontStatus +{dup findfont true} +{pop false} +ifelse +} +ifelse +} +ifelse +} bd +} +ifelse +/_pdfStyleDicts 4 dict dup begin +/Adobe-Japan1 4 dict dup begin +Level2? +{ +/Serif +/HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus +{/HeiseiMin-W3} +{ +/HeiseiMin-W3 _pdfCIDFontStatus +{/HeiseiMin-W3} +{/Ryumin-Light} +ifelse +} +ifelse +def +/SansSerif +/HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus +{/HeiseiKakuGo-W5} +{ +/HeiseiKakuGo-W5 _pdfCIDFontStatus +{/HeiseiKakuGo-W5} +{/GothicBBB-Medium} +ifelse +} +ifelse +def +/HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus +{/HeiseiMaruGo-W4} +{ +/HeiseiMaruGo-W4 _pdfCIDFontStatus +{/HeiseiMaruGo-W4} +{ +/Jun101-Light-RKSJ-H _pdfFontStatus +{ /Jun101-Light } +{ SansSerif } +ifelse +} +ifelse +} +ifelse +/RoundSansSerif exch def +/Default Serif def +} +{ +/Serif /Ryumin-Light def +/SansSerif /GothicBBB-Medium def +{ +(fonts/Jun101-Light-83pv-RKSJ-H) status +}stopped +{pop}{ +{ pop pop pop pop /Jun101-Light } +{ SansSerif } +ifelse +/RoundSansSerif exch def +}ifelse +/Default Serif def +} +ifelse +end +def +/Adobe-Korea1 4 dict dup begin +/Serif /HYSMyeongJo-Medium def +/SansSerif /HYGoThic-Medium def +/RoundSansSerif SansSerif def +/Default Serif def +end +def +/Adobe-GB1 4 dict dup begin +/Serif /STSong-Light def +/SansSerif /STHeiti-Regular def +/RoundSansSerif SansSerif def +/Default Serif def +end +def +/Adobe-CNS1 4 dict dup begin +/Serif /MKai-Medium def +/SansSerif /MHei-Medium def +/RoundSansSerif SansSerif def +/Default Serif def +end +def +end +def +/TZzero +{ +/_fyAdj xdd +/_wmode xdd +/_styleArr xdd +/_regOrdering xdd +3 copy +_pdfComposeFont +{ +5 2 roll pop pop pop +} +{ +[ +0 1 _styleArr length 1 sub +{ +_styleArr exch get +_pdfStyleDicts _regOrdering 2 copy known +{ +get +exch 2 copy known not +{ pop /Default } +if +get +} +{ +pop pop pop /Unknown +} +ifelse +} +for +] +exch pop +2 index 3 1 roll +_pdfComposeFont +{3 -1 roll pop} +{ +findfont dup /FontName get exch +} +ifelse +} +ifelse +dup /WMode 2 copy known +{ get _wmode ne } +{ pop pop _wmode 1 eq} +ifelse +_fyAdj 0 ne or +{ +exch _wmode _pdfConcatNames _fyAdj _pdfConcatNames +dup _pdfFontStatus +{ exch pop dup findfont false} +{ exch true } +ifelse +} +{ +dup /FontType get 0 ne +} +ifelse +{ +dup /FontType get 3 eq _wmode 1 eq and +{ +_pdfVerticalRomanT3Font dup length 10 add dict copy +begin +/_basefont exch +dup length 3 add dict +begin +{1 index /FID ne {def}{pop pop} ifelse } +forall +/Encoding Encoding dup length array copy +dup 16#27 /quotesingle put +dup 16#60 /grave put +_regOrdering /Adobe-Japan1 eq +{dup 16#5c /yen put dup 16#a5 /yen put dup 16#b4 /yen put} +if +def +FontName +currentdict +end +definefont +def +/Encoding _basefont /Encoding get def +/_fauxfont true def +} +{ +dup length 3 add dict +begin +{1 index /FID ne {def}{pop pop} ifelse } +forall +FontType 0 ne +{ +/Encoding Encoding dup length array copy +dup 16#27 /quotesingle put +dup 16#60 /grave put +_regOrdering /Adobe-Japan1 eq +{dup 16#5c /yen put} +if +def +/_fauxfont true def +} if +} ifelse +/WMode _wmode def +/BaseLineAdj _fyAdj def +dup dup /FontName exch def +currentdict +end +definefont pop +} +{ +pop +} +ifelse +/_pdf_FontDirectory 3 1 roll _safeput +} +bd +/swj { +dup 4 1 roll +dup length exch stringwidth +exch 5 -1 roll 3 index mul add +4 1 roll 3 1 roll mul add +6 2 roll /_cnt 0 dd +{1 index eq {/_cnt _cnt 1 add dd} if} forall pop +exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} bd +/jss { +4 1 roll +{ +pop pop +(0) exch 2 copy 0 exch put +gsave +exch false charpath currentpoint +5 index setmatrix stroke +3 -1 roll +32 eq +{ +moveto +5 index 5 index rmoveto currentpoint +} +if +grestore +moveto +2 copy rmoveto +} exch cshow +6 {pop} repeat +} def +/jsfTzero { +{ +pop pop +(0) exch 2 copy 0 exch put +exch show +32 eq +{ +4 index 4 index rmoveto +} +if +2 copy rmoveto +} exch cshow +5 {pop} repeat +} def +/jsp +{ +{ +pop pop +(0) exch 2 copy 0 exch put +32 eq +dup {currentfont /Encoding get dup length 33 ge +{32 get /space eq and}{pop}ifelse +}if +{ exch 5 index 5 index 5 index 5 -1 roll widthshow } +{ false charpath } +ifelse +2 copy rmoveto +} exch cshow +5 {pop} repeat +} bd +/trj { _cx 0 fWModeProc 32 _ax 0 fWModeProc 6 5 roll } bd +/pjsf { trj sfc fawidthshowProc } bd +/pjss { trj _ctm ssc jss } bd +/pjsc { trj jsp } bd +/_Tjdef [ +/pjsf load +/pjss load +{ +dup +currentpoint 3 2 roll +pjsf +newpath moveto +pjss +} bind +{ +trj swj rmoveto +} bind +{ +dup currentpoint 4 2 roll gsave +pjsf +grestore 3 1 roll moveto +pjsc +} bind +{ +dup currentpoint 4 2 roll +currentpoint gsave newpath moveto +pjss +grestore 3 1 roll moveto +pjsc +} bind +{ +dup currentpoint 4 2 roll gsave +dup currentpoint 3 2 roll +pjsf +newpath moveto +pjss +grestore 3 1 roll moveto +pjsc +} bind +/pjsc load +] def +/BT +{ +/_inT true dd +_ctm currentmatrix pop matrix _tm copy pop +0 _rise _baselineadj add translate _hs 1 scale +0 0 moveto +} bd +/ET +{ +/_inT false dd +_tr 3 gt {clip} if +_ctm setmatrix newpath +} bd +/Tr { +_inT { _tr 3 le {currentpoint newpath moveto} if } if +dup /_tr xdd +_Tjdef exch get /_Tj xdd +} bd +/Tj { +userdict /$$copystring 2 index put +_Tj +} bd +/iTm { _ctm setmatrix _tm concat 0 _rise _baselineadj add translate _hs 1 scale } bd +/Tm { _tm astore pop iTm 0 0 moveto } bd +/Td { _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto } bd +/TD { dup /_ld xdd Td } bd +/_nullProc {} bd +/Tf { +dup 1000 div /_fScl xdd +_pdf_FontDirectory 2 index 2 copy known +{get exch 3 -1 roll pop} +{pop pop} +ifelse +Level2? +{ selectfont } +{ exch findfont exch scalefont setfont} +ifelse +currentfont dup +/_nullProc exch +/WMode known +{ +1 index /WMode get 1 eq +{pop /exch} +if +} +if +load /fWModeProc xdd +dup +/FontType get 0 eq dup _cx 0 ne and +{ /jsfTzero } +{ /awidthshow } +ifelse +load /fawidthshowProc xdd +/_fTzero xdd +dup /BaseLineAdj known +{ dup /BaseLineAdj get _fScl mul } +{ 0 } +ifelse +/_baselineadj xdd +dup /_pdfT3Font known +{ 0 } +{_tr} +ifelse +_Tjdef exch get /_Tj xdd +_intT +{currentpoint iTm moveto} +if +pop +} bd +/TL { neg /_ld xdd } bd +/Tw { +/_cx xdd +_cx 0 ne _fTzero and +{ /jsfTzero } +{ /awidthshow } +ifelse +load /fawidthshowProc xdd +} bd +/Tc { /_ax xdd } bd +/Ts { /_rise xdd currentpoint iTm moveto } bd +/Tz { 100 div /_hs xdd iTm } bd +/Tk { exch pop _fScl mul neg 0 fWModeProc rmoveto } bd +/T* { 0 _ld Td } bd +/' { T* Tj } bd +/" { exch Tc exch Tw ' } bd +/TJ { +{ +dup type /stringtype eq +{ Tj } +{ 0 exch Tk } +ifelse +} forall +} bd +/T- { _hy Tj } bd +/d0/setcharwidth ld +/d1 { setcachedevice /sfc{}dd /ssc{}dd } bd +/nND {{/.notdef} repeat} bd +/T3Defs { +/BuildChar +{ +1 index /Encoding get exch get +1 index /BuildGlyph get exec +} +def +/BuildGlyph { +exch begin +GlyphProcs exch get exec +end +} def +/_pdfT3Font true def +} bd +/_pdfBoldRomanWidthProc +{ +stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth +0 0 +} bd +/_pdfType0WidthProc +{ +dup stringwidth 0 0 moveto +2 index true charpath pathbbox +0 -1 +7 index 2 div .88 +setcachedevice2 +pop +0 0 +} bd +/_pdfType0WMode1WidthProc +{ +dup stringwidth +pop 2 div neg -0.88 +2 copy +moveto +0 -1 +5 -1 roll true charpath pathbbox +setcachedevice +} bd +/_pdfBoldBaseFont +11 dict begin +/FontType 3 def +/FontMatrix[1 0 0 1 0 0]def +/FontBBox[0 0 1 1]def +/Encoding cHexEncoding def +/_setwidthProc /_pdfBoldRomanWidthProc load def +/_bcstr1 1 string def +/BuildChar +{ +exch begin +_basefont setfont +_bcstr1 dup 0 4 -1 roll put +dup +_setwidthProc +3 copy +moveto +show +_basefonto setfont +moveto +show +end +}bd +currentdict +end +def +pdf_has_composefont? +{ +/_pdfBoldBaseCIDFont +11 dict begin +/CIDFontType 1 def +/CIDFontName /_pdfBoldBaseCIDFont def +/FontMatrix[1 0 0 1 0 0]def +/FontBBox[0 0 1 1]def +/_setwidthProc /_pdfType0WidthProc load def +/_bcstr2 2 string def +/BuildGlyph +{ +exch begin +_basefont setfont +_bcstr2 1 2 index 256 mod put +_bcstr2 0 3 -1 roll 256 idiv put +_bcstr2 dup _setwidthProc +3 copy +moveto +show +_basefonto setfont +moveto +show +end +}bd +currentdict +end +def +/_pdfDefineIdentity-H +{ +/Identity-H /CMap resourcestatus +{ +pop pop +} +{ +/CIDInit/ProcSet findresource begin 12 dict begin +begincmap +/CIDSystemInfo +3 dict begin +/Registry (Adobe) def +/Ordering (Identity) def +/Supplement 0 def +currentdict +end +def +/CMapName /Identity-H def +/CMapVersion 1 def +/CMapType 1 def +1 begincodespacerange +<0000> +endcodespacerange +1 begincidrange +<0000> 0 +endcidrange +endcmap +CMapName currentdict/CMap defineresource pop +end +end +} ifelse +} def +} if +/_pdfVerticalRomanT3Font +10 dict begin +/FontType 3 def +/FontMatrix[1 0 0 1 0 0]def +/FontBBox[0 0 1 1]def +/_bcstr1 1 string def +/BuildChar +{ +exch begin +_basefont setfont +_bcstr1 dup 0 4 -1 roll put +dup +_pdfType0WidthProc +moveto +show +end +}bd +currentdict +end +def +/MakeBoldFont +{ +dup /ct_SyntheticBold known +{ +dup length 3 add dict begin +CopyFont +/ct_StrokeWidth .03 0 FontMatrix idtransform pop def +/ct_SyntheticBold true def +currentdict +end +definefont +} +{ +dup dup length 3 add dict +begin +CopyFont +/PaintType 2 def +/StrokeWidth .03 0 FontMatrix idtransform pop def +/dummybold currentdict +end +definefont +dup /FontType get dup 9 ge exch 11 le and +{ +_pdfBoldBaseCIDFont +dup length 3 add dict copy begin +dup /CIDSystemInfo get /CIDSystemInfo exch def +/_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont +/_basefont exch def +/_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont +/_basefonto exch def +currentdict +end +/CIDFont defineresource +} +{ +_pdfBoldBaseFont +dup length 3 add dict copy begin +/_basefont exch def +/_basefonto exch def +currentdict +end +definefont +} +ifelse +} +ifelse +} bd +/MakeBold { +1 index +_pdf_FontDirectory 2 index 2 copy known +{get} +{exch pop} +ifelse +findfont +dup +/FontType get 0 eq +{ +dup /WMode known {dup /WMode get 1 eq }{false} ifelse +version length 4 ge +and +{version 0 4 getinterval cvi 2015 ge } +{true} +ifelse +{/_pdfType0WidthProc} +{/_pdfType0WMode1WidthProc} +ifelse +_pdfBoldBaseFont /_setwidthProc 3 -1 roll load put +{MakeBoldFont} Type0CopyFont definefont +} +{ +dup /_fauxfont known not 1 index /SubstMaster known not and +{ +_pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put +MakeBoldFont +} +{ +2 index 2 index eq +{ exch pop } +{ +dup length dict begin +CopyFont +currentdict +end +definefont +} +ifelse +} +ifelse +} +ifelse +pop pop +dup /dummybold ne +{/_pdf_FontDirectory exch dup _safeput } +{ pop } +ifelse +}bd +/MakeItalic { +_pdf_FontDirectory exch 2 copy known +{get} +{exch pop} +ifelse +dup findfont +dup /FontInfo 2 copy known +{ +get +/ItalicAngle 2 copy known +{get 0 eq } +{ pop pop true} +ifelse +} +{ pop pop true} +ifelse +{ +exch pop +dup /FontType get 0 eq Level2? not and +{ dup /FMapType get 6 eq } +{ false } +ifelse +{ +dup /WMode 2 copy known +{ +get 1 eq +{ _italMtx_WMode1Type0 } +{ _italMtxType0 } +ifelse +} +{ pop pop _italMtxType0 } +ifelse +} +{ +dup /WMode 2 copy known +{ +get 1 eq +{ _italMtx_WMode1 } +{ _italMtx } +ifelse +} +{ pop pop _italMtx } +ifelse +} +ifelse +makefont +dup /FontType get 42 eq Level2? not or +{ +dup length dict begin +CopyFont +currentdict +end +} +if +1 index exch +definefont pop +/_pdf_FontDirectory exch dup _safeput +} +{ +pop +2 copy ne +{ +/_pdf_FontDirectory 3 1 roll _safeput +} +{ pop pop } +ifelse +} +ifelse +}bd +/MakeBoldItalic { +/dummybold exch +MakeBold +/dummybold +MakeItalic +}bd +Level2? +{ +/pdf_CopyDict +{1 index length add dict copy} +def +} +{ +/pdf_CopyDict +{ +1 index length add dict +1 index wcheck +{ copy } +{ begin +{def} forall +currentdict +end +} +ifelse +} +def +} +ifelse +/pdf_AddEuroGlyphProc +{ +currentdict /CharStrings known +{ +CharStrings /Euro known not +{ +dup +/CharStrings +CharStrings 1 pdf_CopyDict +begin +/Euro pdf_EuroProcSet 4 -1 roll get def +currentdict +end +def +/pdf_PSBuildGlyph /pdf_PSBuildGlyph load def +/pdf_PathOps /pdf_PathOps load def +/Symbol eq +{ +/Encoding Encoding dup length array copy +dup 160 /Euro put def +} +if +} +{ pop +} +ifelse +} +{ pop +} +ifelse +} +def +/pdf_PathOps 4 dict dup begin +/m {moveto} def +/l {lineto} def +/c {curveto} def +/cp {closepath} def +end +def +/pdf_PSBuildGlyph +{ +gsave +8 -1 roll pop +7 1 roll +currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse +dup 9 1 roll +{ +currentdict /StrokeWidth 2 copy known +{ +get 2 div +5 1 roll +4 -1 roll 4 index sub +4 1 roll +3 -1 roll 4 index sub +3 1 roll +exch 4 index add exch +4 index add +5 -1 roll pop +} +{ +pop pop +} +ifelse +} +if +setcachedevice +pdf_PathOps begin +exec +end +{ +currentdict /StrokeWidth 2 copy known +{ get } +{ pop pop 0 } +ifelse +setlinewidth stroke +} +{ +fill +} +ifelse +grestore +} def +/pdf_EuroProcSet 13 dict def +pdf_EuroProcSet +begin +/Courier-Bold +{ +600 0 6 -12 585 612 +{ +385 274 m +180 274 l +179 283 179 293 179 303 c +179 310 179 316 180 323 c +398 323 l +423 404 l +197 404 l +219 477 273 520 357 520 c +409 520 466 490 487 454 c +487 389 l +579 389 l +579 612 l +487 612 l +487 560 l +449 595 394 612 349 612 c +222 612 130 529 98 404 c +31 404 l +6 323 l +86 323 l +86 304 l +86 294 86 284 87 274 c +31 274 l +6 193 l +99 193 l +129 77 211 -12 359 -12 c +398 -12 509 8 585 77 c +529 145 l +497 123 436 80 356 80 c +285 80 227 122 198 193 c +360 193 l +cp +600 0 m +} +pdf_PSBuildGlyph +} def +/Courier-BoldOblique /Courier-Bold load def +/Courier +{ +600 0 17 -12 578 584 +{ +17 204 m +97 204 l +126 81 214 -12 361 -12 c +440 -12 517 17 578 62 c +554 109 l +501 70 434 43 366 43 c +266 43 184 101 154 204 c +380 204 l +400 259 l +144 259 l +144 270 143 281 143 292 c +143 299 143 307 144 314 c +418 314 l +438 369 l +153 369 l +177 464 249 529 345 529 c +415 529 484 503 522 463 c +522 391 l +576 391 l +576 584 l +522 584 l +522 531 l +473 566 420 584 348 584 c +216 584 122 490 95 369 c +37 369 l +17 314 l +87 314 l +87 297 l +87 284 88 272 89 259 c +37 259 l +cp +600 0 m +} +pdf_PSBuildGlyph +} def +/Courier-Oblique /Courier load def +/Helvetica +{ +556 0 24 -19 541 703 +{ +541 628 m +510 669 442 703 354 703 c +201 703 117 607 101 444 c +50 444 l +25 372 l +97 372 l +97 301 l +49 301 l +24 229 l +103 229 l +124 67 209 -19 350 -19 c +435 -19 501 25 509 32 c +509 131 l +492 105 417 60 343 60 c +267 60 204 127 197 229 c +406 229 l +430 301 l +191 301 l +191 372 l +455 372 l +479 444 l +194 444 l +201 531 245 624 348 624 c +433 624 484 583 509 534 c +cp +556 0 m +} +pdf_PSBuildGlyph +} def +/Helvetica-Oblique /Helvetica load def +/Helvetica-Bold +{ +556 0 12 -19 563 710 +{ +563 621 m +537 659 463 710 363 710 c +216 710 125 620 101 462 c +51 462 l +12 367 l +92 367 l +92 346 l +92 337 93 328 93 319 c +52 319 l +12 224 l +102 224 l +131 58 228 -19 363 -19 c +417 -19 471 -12 517 18 c +517 146 l +481 115 426 93 363 93 c +283 93 254 166 246 224 c +398 224 l +438 319 l +236 319 l +236 367 l +457 367 l +497 462 l +244 462 l +259 552 298 598 363 598 c +425 598 464 570 486 547 c +507 526 513 517 517 509 c +cp +556 0 m +} +pdf_PSBuildGlyph +} def +/Helvetica-BoldOblique /Helvetica-Bold load def +/Symbol +{ +750 0 20 -12 714 685 +{ +714 581 m +650 645 560 685 465 685 c +304 685 165 580 128 432 c +50 432 l +20 369 l +116 369 l +115 356 115 347 115 337 c +115 328 115 319 116 306 c +50 306 l +20 243 l +128 243 l +165 97 300 -12 465 -12 c +560 -12 635 25 685 65 c +685 155 l +633 91 551 51 465 51 c +340 51 238 131 199 243 c +555 243 l +585 306 l +184 306 l +183 317 182 326 182 336 c +182 346 183 356 184 369 c +614 369 l 644 432 l +199 432 l +233 540 340 622 465 622 c +555 622 636 580 685 520 c +cp +750 0 m +} +pdf_PSBuildGlyph +} def +/Times-Bold +{ +500 0 16 -14 478 700 +{ +367 308 m +224 308 l +224 368 l +375 368 l +380 414 l +225 414 l +230 589 257 653 315 653 c +402 653 431 521 444 457 c +473 457 l +473 698 l +444 697 l +441 679 437 662 418 662 c +393 662 365 700 310 700 c +211 700 97 597 73 414 c +21 414 l +16 368 l +69 368 l +69 359 68 350 68 341 c +68 330 68 319 69 308 c +21 308 l +16 262 l +73 262 l +91 119 161 -14 301 -14 c +380 -14 443 50 478 116 c +448 136 l +415 84 382 40 323 40 c +262 40 231 77 225 262 c +362 262 l +cp +500 0 m +} +pdf_PSBuildGlyph +} def +/Times-BoldItalic +{ +500 0 9 -20 542 686 +{ +542 686 m +518 686 l +513 673 507 660 495 660 c +475 660 457 683 384 683 c +285 683 170 584 122 430 c +58 430 l +34 369 l +105 369 l +101 354 92 328 90 312 c +34 312 l +9 251 l +86 251 l +85 238 84 223 84 207 c +84 112 117 -14 272 -14 c +326 -14 349 9 381 9 c +393 9 393 -10 394 -20 c +420 -20 l +461 148 l +429 148 l +416 109 362 15 292 15 c +227 15 197 55 197 128 c +197 162 204 203 216 251 c +378 251 l +402 312 l +227 312 l +229 325 236 356 241 369 c +425 369 l +450 430 l +255 430 l +257 435 264 458 274 488 c +298 561 337 654 394 654 c +437 654 484 621 484 530 c +484 516 l +516 516 l +cp +500 0 m +} +pdf_PSBuildGlyph +} def +/Times-Italic +{ +500 0 23 -10 595 692 +{ +399 317 m +196 317 l +199 340 203 363 209 386 c +429 386 l +444 424 l +219 424 l +246 514 307 648 418 648 c +448 648 471 638 492 616 c +529 576 524 529 527 479 c +549 475 l +595 687 l +570 687 l +562 674 558 664 542 664 c +518 664 474 692 423 692 c +275 692 162 551 116 424 c +67 424 l +53 386 l +104 386 l +98 363 93 340 90 317 c +37 317 l +23 279 l +86 279 l +85 266 85 253 85 240 c +85 118 137 -10 277 -10 c +370 -10 436 58 488 128 c +466 149 l +424 101 375 48 307 48 c +212 48 190 160 190 234 c +190 249 191 264 192 279 c +384 279 l +cp +500 0 m +} +pdf_PSBuildGlyph +} def +/Times-Roman +{ +500 0 10 -12 484 692 +{ +347 298 m +171 298 l +170 310 170 322 170 335 c +170 362 l +362 362 l +374 403 l +172 403 l +184 580 244 642 308 642 c +380 642 434 574 457 457 c +481 462 l +474 691 l +449 691 l +433 670 429 657 410 657 c +394 657 360 692 299 692 c +204 692 94 604 73 403 c +22 403 l +10 362 l +70 362 l +69 352 69 341 69 330 c +69 319 69 308 70 298 c +22 298 l +10 257 l +73 257 l +97 57 216 -12 295 -12 c +364 -12 427 25 484 123 c +458 142 l +425 101 384 37 316 37 c +256 37 189 84 173 257 c +335 257 l +cp +500 0 m +} +pdf_PSBuildGlyph +} def +end +currentdict readonly pop end +%%EndResource +PDFText begin +[39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +0 TE +[1/dotlessi/caron 39/quotesingle 96/grave +127/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE +/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft +/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine +/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus +/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla +/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis +/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash +/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave +/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde +/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute +/ucircumflex/udieresis/yacute/thorn/ydieresis +1 TE +end +%%BeginResource: pdfimage.prc +%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved. +PDF /PDFImage 38 dict put +PDF /PDFIVars 20 dict put +PDF /PDFImage get begin +/initialize { PDFImage begin } bd +/terminate { end } bd +/nulldict 0 dict def +/gv { PDFIVars exch get } bd +/pv { PDFIVars 3 1 roll put } bd +/BI { save /savelevel exch pv mark } bd +/EI { /savelevel gv restore } bd +end +%%EndResource +%%BeginResource: pdfimg2.prc +%%Version: 4.0 4 +%%Copyright: Copyright 1987-1993 Adobe Systems Incorporated. All Rights Reserved. +PDF /PDFImage get begin +Level2? StartLoad { +/ID { +5 counttomark 2 idiv +dup 3 1 roll add +dict begin +{ def } repeat +cleartomark +currentdict +end +begin +/ImageType here { pop } { /ImageType 1 def } ifelse +/ImageMatrix [ Width 0 0 Height neg 0 Height ] def +/ImageMask here { not } { true } ifelse +{ /ImageMask false def } if +ImageMask not { ColorSpace setcolorspace } if +/Intent here { ri } if +SLBApplies? +{ ApplySLB } +{ +mark +/DataSource here { } { currentfile } ifelse +/Filter here { +dup type /arraytype eq { length } { pop 1 } ifelse +1 sub 0 1 3 -1 roll { +/DecodeParms here { +dup type /arraytype eq { +1 index get +} if +dup null eq { pop } { exch } ifelse +} if +Filter dup type /arraytype eq +{ exch get } { exch pop } ifelse +filter +dup +} for +} if +/DataSource exch def +currentdict /ImageMask here not {false} if +{ sfc imagemask } { image } ifelse +counttomark +{ dup status +dup currentfile ne and +{ dup flushfile closefile } +{ pop } +ifelse +} +repeat +pop +}ifelse +end +} [/Width /Height /ImageMask /ColorSpace /Filter] bld +/SLBApplies? +{ +{ +languagelevel 3 lt {stop} if +currentsystemparams /SourceListBypass known not {stop} if +currentsystemparams /SourceListBypass get not {stop} if +currentdict /Filter known not {stop} if +Filter /CCITTFaxDecode ne {stop} if +currentdict /DecodeParms known not {stop} if +DecodeParms /K known not {stop} if +DecodeParms /K get -1 ne {stop} if +} stopped not +} [/DecodeParms] bld +/ApplySLB +{ +{ +/UncompressedLength +Width +DecodeParms /EncodedByteAlign getifknown +{ { 7 add 3 bitshift } if } if +Height mul def +/DataSource dup here { } {currentfile} ifelse +5 dict begin +/Filter Filter def +/DecodeParms DecodeParms def +/Intent 3 def +/AsyncRead false def +/CloseSource false def +currentdict end /ReusableStreamDecode filter def +currentdict /ImageMask here not {false} if +{ sfc imagemask } { image } ifelse +} exec +} [/Width /DecodeParms /Height] bld +currentdict readonly pop +} EndLoad +end +%%EndResource +%%BeginResource: pdfasc.prc +%%Version: 4.0 2 +%%Copyright: Copyright 1992-1997 Adobe Systems Incorporated. All Rights Reserved. +/AS { +9 dict begin +/shrink? xdd +/Pury xdd +/Purx xdd +/Plly xdd +/Pllx xdd +gsave newpath clippath pathbbox newpath grestore +/Dury xdd +/Durx xdd +/Dlly xdd +/Dllx xdd +Durx Dllx sub Dury Dlly sub +Pury Plly sub div exch Purx Pllx sub div +2 copy gt { exch } if pop +Durx Dllx add 2 div Dury Dlly add 2 div translate +shrink? { dup scale } { pop } ifelse +Purx Pllx add -2 div Pury Plly add -2 div translate +end +} [/shrink? /Pury /Purx /Plly /Pllx /Durx /Dury /Dllx /Dlly] +bld +%%EndResource +currentdict readonly pop +end end +/currentpacking where {pop setpacking}if +PDFVars/DocInitAll{[ PDFText]{/docinitialize get exec}forall }put +PDFVars/InitAll{[PDF PDFText PDFImage]{/initialize get exec}forall initgs}put +PDFVars/TermAll{[PDFImage PDFText PDF]{/terminate get exec}forall}put +PDFVars begin PDF begin +PDFVars/DocInitAll get exec PDFVars/InitAll get exec +/N224 [/CIEBasedABC << +/MatrixLMN [0.412399 0.212585 0.0192871 0.35759 0.715118 +0.119186 0.180496 0.0721893 0.950485 ] +/DecodeLMN [{2.22218 exp}bind dup dup] +/WhitePoint [0.950485 1 1.08899] +>>]/ColorSpace defineRes pop +/N232 << +/SA false +>> /ExtGState defineRes pop +userdict begin +%%BeginResource: file Pscript_CFF PSVER +userdict/ct_CffDict 6 dict put ct_CffDict begin/F0Subr{systemdict/internaldict +known{1183615869 systemdict/internaldict get exec/FlxProc known{save true}{ +false}ifelse}{userdict/internaldict known not{userdict/internaldict{count 0 eq +{/internaldict errordict/invalidaccess get exec}if dup type/integertype ne{ +/internaldict errordict/invalidaccess get exec}if dup 1183615869 eq{pop 0}{ +/internaldict errordict/invalidaccess get exec}ifelse}dup 14 get 1 25 dict put +bind executeonly put}if 1183615869 userdict/internaldict get exec/FlxProc +known{save true}{false}ifelse}ifelse[systemdict/internaldict known not{100 +dict/begin cvx/mtx matrix/def cvx}if systemdict/currentpacking known{ +currentpacking true setpacking}if{systemdict/internaldict known{1183615869 +systemdict/internaldict get exec dup/$FlxDict known not{dup dup length exch +maxlength eq{pop userdict dup/$FlxDict known not{100 dict begin/mtx matrix def +dup/$FlxDict currentdict put end}if}{100 dict begin/mtx matrix def dup +/$FlxDict currentdict put end}ifelse}if/$FlxDict get begin}if grestore/exdef{ +exch def}def/dmin exch abs 100 div def/epX exdef/epY exdef/c4y2 exdef/c4x2 +exdef/c4y1 exdef/c4x1 exdef/c4y0 exdef/c4x0 exdef/c3y2 exdef/c3x2 exdef/c3y1 +exdef/c3x1 exdef/c3y0 exdef/c3x0 exdef/c1y2 exdef/c1x2 exdef/c2x2 c4x2 def +/c2y2 c4y2 def/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def/PickCoords{{ +c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}{c3x0 c3y0 c3x1 +c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}ifelse/y5 exdef/x5 exdef/y4 exdef +/x4 exdef/y3 exdef/x3 exdef/y2 exdef/x2 exdef/y1 exdef/x1 exdef/y0 exdef/x0 +exdef}def mtx currentmatrix pop mtx 0 get abs 1e-05 lt mtx 3 get abs 1e-05 lt +or{/flipXY -1 def}{mtx 1 get abs 1e-05 lt mtx 2 get abs 1e-05 lt or{/flipXY 1 +def}{/flipXY 0 def}ifelse}ifelse/erosion 1 def systemdict/internaldict known{ +1183615869 systemdict/internaldict get exec dup/erosion known{/erosion get +/erosion exch def}{pop}ifelse}if yflag{flipXY 0 eq c3y2 c4y2 eq or{false +PickCoords}{/shrink c3y2 c4y2 eq{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs}ifelse +def/yshrink{c4y2 sub shrink mul c4y2 add}def/c1y0 c3y0 yshrink def/c1y1 c3y1 +yshrink def/c2y0 c4y0 yshrink def/c2y1 c4y1 yshrink def/c1x0 c3x0 def/c1x1 +c3x1 def/c2x0 c4x0 def/c2x1 c4x1 def/dY 0 c3y2 c1y2 sub round dtransform +flipXY 1 eq{exch}if pop abs def dY dmin lt PickCoords y2 c1y2 sub abs .001 gt{ +c1x2 c1y2 transform flipXY 1 eq{exch}if/cx exch def/cy exch def/dY 0 y2 c1y2 +sub round dtransform flipXY 1 eq{exch}if pop def dY round dup 0 ne{/dY exdef}{ +pop dY 0 lt{-1}{1}ifelse/dY exdef}ifelse/erode PaintType 2 ne erosion .5 ge +and def erode{/cy cy .5 sub def}if/ey cy dY add def/ey ey ceiling ey sub ey +floor add def erode{/ey ey .5 add def}if ey cx flipXY 1 eq{exch}if itransform +exch pop y2 sub/eShift exch def/y1 y1 eShift add def/y2 y2 eShift add def/y3 +y3 eShift add def}if}ifelse}{flipXY 0 eq c3x2 c4x2 eq or{false PickCoords}{ +/shrink c3x2 c4x2 eq{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs}ifelse def/xshrink +{c4x2 sub shrink mul c4x2 add}def/c1x0 c3x0 xshrink def/c1x1 c3x1 xshrink def +/c2x0 c4x0 xshrink def/c2x1 c4x1 xshrink def/c1y0 c3y0 def/c1y1 c3y1 def/c2y0 +c4y0 def/c2y1 c4y1 def/dX c3x2 c1x2 sub round 0 dtransform flipXY -1 eq{exch} +if pop abs def dX dmin lt PickCoords x2 c1x2 sub abs .001 gt{c1x2 c1y2 +transform flipXY -1 eq{exch}if/cy exch def/cx exch def/dX x2 c1x2 sub round 0 +dtransform flipXY -1 eq{exch}if pop def dX round dup 0 ne{/dX exdef}{pop dX 0 +lt{-1}{1}ifelse/dX exdef}ifelse/erode PaintType 2 ne erosion .5 ge and def +erode{/cx cx .5 sub def}if/ex cx dX add def/ex ex ceiling ex sub ex floor add +def erode{/ex ex .5 add def}if ex cy flipXY -1 eq{exch}if itransform pop x2 +sub/eShift exch def/x1 x1 eShift add def/x2 x2 eShift add def/x3 x3 eShift add +def}if}ifelse}ifelse x2 x5 eq y2 y5 eq or{x5 y5 lineto}{x0 y0 x1 y1 x2 y2 +curveto x3 y3 x4 y4 x5 y5 curveto}ifelse epY epX}systemdict/currentpacking +known{exch setpacking}if/exec cvx/end cvx]cvx executeonly exch{pop true exch +restore}{systemdict/internaldict known not{1183615869 userdict/internaldict +get exec exch/FlxProc exch put true}{1183615869 systemdict/internaldict get +exec dup length exch maxlength eq{false}{1183615869 systemdict/internaldict +get exec exch/FlxProc exch put true}ifelse}ifelse}ifelse{systemdict +/internaldict known{1183615869 systemdict/internaldict get exec/FlxProc get +exec}{1183615869 userdict/internaldict get exec/FlxProc get exec}ifelse}if} +executeonly def/F1Subr{gsave currentpoint newpath moveto}bind def/F2Subr{ +currentpoint grestore gsave currentpoint newpath moveto}bind def/HSSubr{ +systemdict/internaldict known not{pop 3}{1183615869 systemdict/internaldict +get exec dup/startlock known{/startlock get exec}{dup/strtlck known{/strtlck +get exec}{pop 3}ifelse}ifelse}ifelse}bind def end +%%EndResource +%%BeginResource: font TimesNewRomanPS-BoldMT +%!PS-AdobeFont-1.0: TimesNewRomanPS-BoldMT 001.002 +%%CreationDate: Thu Feb 4 15:35:30 1999 +%%VMusage: 31834 38770 +%% (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype +%% Corporation. All Rights Reserved. +%% Times New Roman is a trademark of the Monotype Corporation, registered in the +%% US Patent and Trademark Office and may be registered in certain other +%% jurisdictions. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.002) readonly def +/Notice (Copyright (c) 1988, 1990, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times New Roman is a trademark of the Monotype Corporation, registered in the US Patent and Trademark Office and may be registered in certain other jurisdictions.) readonly def +/Copyright ( (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Times New Roman PS Bold) readonly def +/FamilyName (Times New Roman PS) readonly def +/Weight (Bold) readonly def +/isFixedPitch false def +/ItalicAngle 0 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /TimesNewRomanPS-BoldMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44337 def +/FontBBox{-180 -250 1008 889}readonly def +currentdict end +currentfile eexec +8498736888c9d6cc5b4c34be0b812a72e387d6e7a561a27d82a1e8bb2179a3d4 +ebf2dcf85bd71552495700e1212202b5f11ba07f809932611743273abd00f836 +0adec6401ec43597154d4fc22af8b245b76c111ea2286e621eee2d34428f4390 +8f4045d7750ffbdd5b7a1d8c9440dffa463c35f749c5e8a5bc7af5a0a9b9012e +211693f4c8e3dab725ecfe8388f7722b495812e985e15e86f2dc76cbf00c6ff2 +d3e0b1683f9cfcff220dbe4cdeb2bac0aef019c331410cfe43db94b7332d5d14 +c2bfa5d6d559d541b9b03be8cd8c82839f13f7e72ae862e006b7f18887b55dc1 +7faff9da5b0916c5a183157190972e3a520433511952e0bea08dacf7dfbfd5d9 +482add2fbd715a844158ee7f0f8de171c8a4d2b56139cb3fbad6cb83e7bfefd8 +cabb28255a2da8e69a33120e4c14a187a52bfe7f719316508235e41cd7af3d03 +52742ebd3899f772b273d3dc4bf7266bc37caa62fcf8eb0c51a9a17924dec803 +f081413e2970d2086bfd77412fa87db0889ca4ea7ea98c0138aeacc9f102aa56 +2b4bb15ed28a7b1d392034b9be447b18f81025006f125a96caf5ca2cfaae9cd8 +e7ffcf50ce4cbf3b609fe742063f5fde2027bd340f8649319239b5bf5589706c +18ef7c166856d6a73ec891ff7e47b535b0ae59ac97d8207055d97b9231d0a465 +7884e5aeca0c7775cac7e15eec30c8a7feea9b4c330e17736644dd463e090272 +426169ac46dc4289323c0638b8347efa103cdb018c6ca1c12dd2bae6ac7243a9 +7cbed2ad3fe8695070393f393463c26368e8f733c376f451b905260dff6dc803 +27f8eb292e51088c7190b38c7bf995763b181f111067e9d453b295913c8031ad +6cfd37e4bb3776232c07c2207e9ee0e0a892e7cc44d6a017c56beb61f67af99c +da584f50e0922b18e90850f67977a528ce0f63060ca0b3ea350982007dc6f50e +c751b5b72a4095a9683b54f22b1e0e967c39cd7cdae529af8fa825bf1f27e3bf +65a50b90b15d1b849c38c42fa4bc6d173a9bc6db8aadc094a5b1cf478397e101 +b36f22acf9089a403aa28a067966582929bfd26c1a5b9c7aac8fd0809998f130 +7330a0ee82ea761b830d9c6e76723b04a5d19fc89ea0d4382ab584e4b5440b4b +85f6a451b2d2da5c98cad8be9fb5eea3003f3bb7203d5c36d7a8d7c0f555f3a7 +0120b9f8daf4a7480a43f81b7a28e4bbf2c226e0c2464d031f958aa354d63f6d +b0e2e678c913addf205d5507ab268516251e81f43c9fa8899e41f8381ed57aff +9d4dcec6ba34f9d0c2f61a648bf0a3afb0434e78eb81477149ad143b960d5e28 +df2072bb0fb5f4dd67dd780af5b885b39c1a283b59e8103e7ef921a6e4a0ecf3 +81e68f3f35a911c92ef6a233adb4f02dd4b3d364b719550bb2f1c59357f228f6 +922da150a5941ec234fed7b74437b866db74f5794bc875c70f94fc44a8402723 +f521766a4cb1507c15debe8f590610d4d00b1883de17d60582441b4d45aa206d +27c06741f0f64be15246a87ce64d7791e8590d6156cb69f2275626b583d97f99 +884161186079c5c293aa07b130ec6923b5d5f048f5c59511cf2795eb72f29dc7 +46138def0fc6068392e9ec194ae565d9d679840193d1120108542400e57aa4aa +968fee982e7801b7acd39634aae8b6eb70c636c3f940381f3689494916bf8f26 +41c8c35d175af369c3c10d6f8bc2fb1bb307bf0047ad1108af73b5b065453cb6 +0820e713865e8a862ca525499af6b7cd92b41392be016092443d34b5844003d3 +3fb293cb467559e1328bc2e950c95a5bb5057ec2cd3c66ef213c93278b612a84 +f26043bd6d04cbce34186a892080e70efb9e401a32437cc18e98db490003f8e5 +5aab2b889313fcc511eb6d88a50938653265177cc4fed8c1f114343790ae2ba9 +8949cd589443b56e2c13b8748e1243084ecd3cfbbdf80573aeea661e6b0e8019 +5f8d2be0179501b39b158b16f566bc7746dea19a9b455d627da25c1035714f64 +ce91aa02e70b88f70bba8431798498b0ba60ab022b3cb3fdff874fc17e7a955c +5840e7cf312c97875188609f89b6dc5362c7cb4331d4956cdc713e8d3640e5c7 +398b391e14e86eac9398bee03b58f686a3efe57576e8c20b4d7a27ab2ad4c346 +7f571578dd3cf4433b7863bb9788edec3e25395a27a376a6f8610f427de651de +14ab0ac4fc8aa7bc73bd75c26b38d2cde4936685509a4ace454764993256a8ed +ef3865b7e7c25bb431908c8a08fe989fe50d82436d5f844dd9a9aa772d5919f0 +98791963b0303c3197223c98a24786f7bd3366ff7196328470984520cdf2b6eb +477337ab36eed0657cf10bc269c751ab2c5b612a47674bf56ca4ecf102ab4885 +f1db8a2656ac46f2c94fc1f7ca0a8f1e998f6f6fdb1f430de257265b4e4d8a42 +8a4764fed742cb94e3a6f915f12abd9d7ce361f9b9ac3945eb79a8c7b09af484 +85eb415370d8eb09f2c094b05da672dc30d7185617ec5971cf65746f061dac56 +7f9fa42fb5169624ee6ef4a8b5f994f477bbb538bf10f10642da6729c80312cf +0f83bbba6f0ee721cbd3a02b3a83a30baa2cdf57b9fc6f4c49e9f92714cd5f89 +de9d56f323b19ef8e6d76ad884e1de0ee5398871ac3436fbcab30ec2b8dcd15a +8a22dcad60e4cf59deb5eefccc075e9007fe96299f7bbc7ecefbf2016de21f38 +d12f83b780ff7dc51c8c74a31ffc7334b096dd6e8adfaccb3198dea5223a9170 +c48232190cdf024b66bc3ee0eec914222889ec539edfd6862e65b9161a207215 +794e6b9f63db75fb0ae3ebdecf49797520257379a304c5ad091e01326352fae6 +0f9c129a39f1b040eeb56f63ae76bacec7094e9ffc29a4ba5dc25260868a71bd +2068ecbfb87259ebb878b85f2e4060509f0154b3205fcf30f5415767ede2bffb +61ad2db3368015fc73fdb1dcc3ad452e1a796f2d71d4f4aff84307919c0b9f34 +b31a0e3f7e45f0312a4f25f108f58bbed84da0aeea8a2a5847871394536bd5dd +07e640f4fea069dbd88a303ba4e09fdc013d5c11b14741371f1f8fb67c9aef7f +464fbdd8dc429b4544512024b0399e97c6125b445af8fd1ead445c0ca503dce4 +85328ecefe8aa9e2f63200cc289ed207a01bfaccf653cdadd2d9dac28f0a90cd +433008fbeb298cc3c4dd02730f14e93590ff20a2b4d938510e1d32c76fc9d8f4 +3115f4a0808ff4c3b5101801a47fd0376026749a1436feb100c80bd310b357d5 +9080007962df6350284311d0e418330e42fc1390edca459a72c09f9d892ab294 +b09b3884cfd6ca61de597819125df6607ef5acb392b01042c87afed112b8fe4d +fdcc98e0d1c4d50478477436cece90801d097c44c4bfd2ce7618f9e20f8e814c +7f9c66fd03384defd764d21779354d59f518f813c5fc7b99f47d1d216785e9fc +a6174b6881e5fc8f2e3f711f9bc7569f4c88020529141c81ba84f3a01a9f4ec1 +aca49fe842bfcb52ac9258341b2f2bc7db1cc3c18bdd51cc738b222d5a2bf687 +975f04a6cb5ede81945580291e728896b4124073be62f2847c941df825e20a5a +b8a16663ee2ebac4741ee47a907fc2dad2d33384c43ab78f3b9f392e4cb6ab5c +7947b779d3b6755cf2ad36b7f2139bb1d1143e333c0df26c319cb0bfdc3d163c +a0cdcda3898675feacd03e16c3a3b5e5c6190a4935721f03894e5c0f9c9081d8 +5141bb5a9d776cc72bb65b0fffe3f91c8275c369b7b7f73ca69d25c1160fd9df +8903b5acdcc931a58e150e388ab16bb66982297c4d484aa3284d540068128734 +31f61821a9c97ebf31a8cf2df50d7868216322ca2c511e0821efc05539c901b0 +3e6f4a74d922c6bf6e93d370543e8720b7482f4494d2854e5a85642534a58d7f +c14f2851e027968f73593cb71adcd68289c637201cc3385869df7783c71e3281 +7482025ecbc5ca7b9d0e150a2d7e9fc7e42d27251866ecc50946e358d0cb25c9 +b1816005acd9dd1defdf0c3542ccdc94672ee33773aeb31e6707e05e37676aa8 +abad394aacd42bd0bb4fefd29e6343150083892671b14b30438a812bfd134124 +f7c9334d3296d66dfae659b9006a458f3779c80577eab9cf6061d69a6cb6f106 +d4a9162e7c68179d2efd2936c1b2e3aad9dd8b7962c75b4bb0f8f51ac06c88c2 +03bbfe7abdeda08d947f87f0e9932ffaa39719ab32b45eb8e601c1f3ff989c1e +21581f439dffc6f3cd4ae7e76da236737e6eb57d050dcb631721946558b6aae4 +67b264117720f9c844bd1b20d97c81a4f37c75d26d3b41d33e37b1779f2fc2e9 +a7d1c6651f2db9d8fbcadcce3d2272f5bae46318406754740f7c3e28cce0ff1b +a0416870f3958bd358d545c8133da84f255ea9bba40de9bb3f1e9f3f5783db2a +a4f86cd5dc8b62d11896db064a837b4fbd8c1202674888bbbe5b3d64638b6d95 +24e1f8f4ae17ce3dab6f9f194f10eec65c84f82286a9faccae9e3bd57c512c2c +654cd6f21c6eb9bb16368d12bffba078cc90864515b48fdc2f85a7a09c1f1896 +3f357905595785cc17f7be498ed9297dbddbb71c55c2d1ebb798a44c4788c9bf +0fe0025905e4adc0af8fdb89cdeb838dd2d9b46e1c7a2f9deda25c48ed53c1fc +7b67928412463c0affef74369c88f1aad052694ea21ebc3a7bbe4e9eb0b06c36 +82fefc78667c50bb8c4053082a71db4ae9a484e9e56aded3aae0ac338c5aca7d +15c9fb904731dcfe01680420887692dbf9a6792632710189e1087ff7c5b6cc2c +f2fe7f11aa7060780588f6028deea7d6370b4232be79beeb87557786a79cb288 +231e14f797e337a781c133a8eb3ffcf5b4a509698e15612e58eecaf5f27108d8 +5baa981f7c54b10aaa07d73a5bb78111f5c789dec1a9ddb50e3bf74f0146b6a7 +31a371a521fff0efe67123e6b1cb47fc643ebcfe0413e9689f4029d2b75e7fb3 +d96d090eade7f07cb04b3f03e5f20292004a81c058de24fe03015177870f603f +2267173c7ad36b62df174ab2c8d948684e8b7aad972d5fe998d65aaba91af4cb +1a21ce90bbd562230a005dc1d288d64f2176a145111322b44db16c7147b64cbf +0fe39ea689257774af7078877e0203de11efef9c6eb7b2740b7e461def5629bc +1af161a0a24d418bf6ea5e5912a89a7d49642c2eba4d2942ca8ce511975d6cc1 +becdaaac9dfe1d8153bfbc31a891cb337a3207ec31f8d1dbca8cced4ef40a73c +5b5e9148eb782f4119a79929861d12e02178868bfd14a1388fc1b2376221f5e6 +44688e59f32fd793e57e48d600045b1eac4033ef111a3bdcaf1ccbd275e30422 +04db61386b5931c6c747fd5a5a0cd1fff3b40492b6ec8cdbbbbcc9840642b46d +dd17bc5ba7e86ac4896406aa6ebd67efa76f1dc1ec9a9a34c478a520b0dfd97c +c30304f267b5e6f33199aec1cd033966fe22f73b34e38a94b06e62245de1a71b +cdbf528be36a30c245deba1eeab1a32218578fa41e08d0a9b252aa77cdddaea2 +864b3f543dbfb7f84c66435e918957f0e1bc82c3159dece241790bf7959b37bb +e2bf1b245ba1c95829feb852449fc547b0e91ac28607affc834085d94cdbc4a9 +1ef9bac22ceb1f69cf2938d19580d6e9ef0c8688ac576231f96cb9f55b2d6ab7 +5c33fb7480791354096285ae88fb0d6d79f779b9d040144b3b182804eeabf413 +5423925a50e3c5529d649491f26a141a57ad5cee8dc83065196f0f7f385219d1 +4436eb36cca894f8cf28fd6ae3ce2b8f384619f03342d254b98bc8bb08d8d608 +9eeb98fa8a5068d500d999031ef081fc6f0fa21b250f0e717affa92680b4d415 +4a5f71bb73f83c6841070dfd1cafd205ced0f203d4db63d841c46e8fc8b6ce99 +db144553b387f5c9adbc7775190529d96ff5c8702ef1ea8ea05429ea733780e5 +9bbcdd74ff23ef84d498d3de82cade349c7df965707c430d0790f0f8564141a5 +ec9b7cfec5f0d14df6a47084b32a1bced03abe4ea4bd6e3051099da188378c99 +ce2b7d1d81e1f6a49f68caa7eebfc5e6c19601957fee797b6634035c95040a4f +3e7ffe9cc49238786b670432a1f36b398db7295eab9a6869a19f0b28ee1d6d1f +994ce3ce864fced9c0cce664d75f2395632f1413b4c6bf84650f579a7906ec26 +6cb81a7d8e5e58167b00d1d7d807164ddc9a3b24e4e4c360d2dd7533901e1872 +1d235ab850c9631d47192079f6b487f4e304cf61456e34fef5fd969b19499554 +4fd6a79466d6c2ce79b372633b0f8b1d0c319a4662e6ed6a085bb605392302a9 +b8960c103e7c0f2e55c0ba52aaa6df8ba6a5b9accb301c736b54199a33a2ed6a +1822c51c9aabe3610db5bc89e59b929f3922652149992bba89943590a34cea2d +5d2f2940ed5cf9659436dd467139dfac14086a5ca7fe3a8e2330e16a11fa9e6b +32c6f6cd9009c7ad190cb950d0e91ed2b23dead3aab829ffb4c22ea5e45f4135 +59289943270c1a9148425b16ab013bcd5b69ea89644d7209313f0cbe5c454d11 +8b73786dae0c6d71dec07c6a7c308aeb31a173edda16ad59958c34cda8289ea7 +c866f27686d0fbe38bc3a172b1ec42db52c635386eaccae3a07c1da3eb452f92 +98b5eb837730e10c103c9b0424a155f3d65da926c6657dec64b684cf290b8c8b +f8445aca65da7e4040915b6e4534aa25d2262f8d43249acbbfeb6a3590c4c052 +16aa6da6742ca27883612bacb2f0a92c008159f4c2a7c1acbeb0919114c6dfa7 +86f351bb615f14c511c7ed52c0e32f1859eb26a99337c499f5eb0f20740bbe78 +ef0cf615d4ab16b2a52addf6ea9e468bb7ba2593c2a98b1e9531785c4d9e4ab4 +dd167b58163fe917eeff1aaec036756e857a8e25f0b7030ef7c5fc0c095beee6 +698c8e09ee3a3a0d7b0529c40ca812c85e6b45639f0b425012b16c0b401c6c03 +ff681af19cb35af31b35833ce8f91735758ea5fbddc95c0b5bcd65869d14b882 +9f73515b6051d123bcba268445fbf2240a54ed594f2d1cf1180f9d8238764f61 +6d3087c780d1dc6d150874657d53fedd64e415c58dba4d2ec1f642e491a0bed6 +3b6e43e1878f8b605dcd10e7b0f593e34858b730ff8e59f373c5d0242353f422 +30259908d52b5d64da3f8e69f19a45aa4b31afa07033008657d249e3972c9959 +b6867a153db92846b0ad9e0829f8b04cd4c610c2905a0b7422801df96add663f +a22ac2cd8cacd5f916f9153952d7fb245f7afb1c4532eb69735260831d7baab8 +6fd622d5fa90357a2c19fa01b48c7e6deaea665c5d0eaee4b22909034b6d0587 +fada8426b1b2cfd57efd25eef6792b50027042ae2820264893653c86207eb1a7 +07a23f0e8094320afce07c7212bdb3f8d035e5a8d4ac43165e8853c5548697e5 +0b8b1a931baba3c3f4cdd5dc43e81a12a5f12748d6f99e475fa4b93d1112a654 +b8c35bb87da2b1190f876f9f52fc0f5f2979b247e1741510b68135c04eb67547 +cf01c143a04f8a95f165320e2c362683604fed7b4c4b9e43655409df721ea862 +9e2d995694dd525dafeba8b06f7c69451721656144956b6089b8fb4488225454 +d01c027fde7921000a2e3faad29c8adea2b0638a1de7017ee3a220c140254fa9 +7fddc17827786fa059a39a55f88a3042e4ae47ea0700a73932b2e4db74638391 +033bd132d630249988330ae734389e632713642768b17c2aafa28e979e221032 +4f7da2df825e9921556e6f6b43cb56c20b604d822d4b47fe5d96855511f7bbad +be92a36f159b747b2869749d5e1c69a9c8fab11a7525d16d3b9bce6711e6e03d +aa9e88bbb9ba333b7d1b3347f1ef3825f28a3cb8b2aceac35accdd50e3272e9b +b4e4ac561ee22f6837eae67c54ae6d857bd0c68b26ce2525e992d5514509c980 +58b68c3895de08172701572777a3b800b9d13a7644601052ad76137f25ebbee1 +7ee8da67d9bc646e46bbe1cb954a9abf550b55ecd4c0044fa5af26feede555ab +fb6fb0beecf8dddabdfff56823bf8236f0e6b94298d352bd68743a17a3670605 +31edda540f4d2f18e1b0fa4b4162c6df84849eb56b488d0d6467169b337146e2 +4ae21f9638467f8c464c376194f75b53af07e1695edff4ab2acf7c2cf64b77e4 +52d0971ea0cf8958f1bb0acf4e882618ae4df0e6710945126320abe475843fc6 +3b17f5970648f7f994d0139d37eea3af1feee8f9f487bee609f668901069010c +25b691d8aee42c9175a7bb5b2affc61736736ea98644bb11b2f7ce616dc9c21c +4da7434929cd4897cf75aed0b34bbf13e3dedb7b853645c40418a819cff73c6c +dc65425f181b92089dc703b0712fc01241438a3d600dd3ba4932a165aac962d2 +6847b85bf547f42f7d0a8ca112a26a9c2da065b3adf9e6f4cb14e7c7f0130166 +34a0abf8098ebdbdb30bcb757b5c7524054b63f68c016d3bb38878d15371e05b +1f51270dc45f72024c6bb4b78bdf1d8375ac2e27eb23323e35d3600cfe96c904 +385634f5e7704f391ed477f4e4506d45bf1b2726132b949ad230c3327e58c9fd +c6fdec48042add7ec4b22836d4249298ed65231bfdc81b5f6434c9dfec5427af +1446f0a452eaaa0b86cffb7073ec6c49069fdd779a457c3acd32e026f0ce3d4c +e14cd486300929bf6f48addf7cdf13c4cbffb415b76216dceafdc43fad6cae3a +1d6bab805c677889f42bc03d1ca181b2ea2d5baf3d60ede4f5c78e76b3c1c83a +64e9fe67d47f275fd55396b2dc490cd3cc898c6dae246f183d980217674bbcd6 +e46051a3237b28c5ea5a3d9772fdf7209cf1a646daf4c24e8d663a1116613984 +f438e68f65423030353d2c4c7e1f02661d59dea875e87f87045b88f44fe21705 +62366286540ebf2f3d88a44235d4883014df2bb00a6d13d6c40c7dbce2a6d79a +9e6d721284df66c119187fb4523ab488742e94406792d7faa8667bd655f75298 +9d787ee009e0e1af6987d356ce308ed4c9b94547d5ca807ccdf3bc416806a8e8 +75a69cba441b66f21aaa5ded1f9c4f86bad5def2c0ebba69dcde83c7d9d12c63 +9ff48514c15b75007c191cb7b11f32952dfc803f02c0495d5881111266e0125d +437ea8ba0258aded84163e3d26245e7d7a145e2f1eb9b3b59b56c06861dc81e5 +3dde7dc2367523a13544ee9927806aeb62530828fa194cb673cde49aa155106a +aed7b9e54c407656ee331f48b500babca64abe2ef3ef24c50a65f51ca9e8613e +91996fe8b583d858c97ef1379bf18e74024289dbb7bc16471cb9fa4902067e33 +f57c53b0aa8be49672d8862b31031957018202ee00eca8555f10efada7d74865 +e29ac60771faa7550cba79c877ed8b54d4de7d685a797db75e45e69345a26456 +6be5ad0618170d74866877ef9b10101521ed42e38112070077e0e26f3a52d0ef +58ea91ecacf64e2f1f7489f7c222b33c739352f7453fbabdc61a40401a62ba38 +92abcfa93e4c44850f66a89977662f5e713d55e9083115f081a2567d6fb6fd48 +6bf6fe523fc8e7962850a039b0995b3035f3dafd9959fcf33022188ca9ef962c +1c2f7f82738239a210e6c82298292c4d34527991678cb824db172979c29fa195 +127587eafdd1a5618a57424c915824a9d63efe7e2cf86ca0d0dc3c6610054495 +dd132f138f0d4905cd07cfe3117875e5a510092565976cc3d93aa6c5fbe023f8 +579a79b85d09b16ff8118ad9662778f3b6861bc85ceec040eec75e388a18d160 +df445613db4ab144fccd8dfff7fed6bf08133d969478504a44f08c3ce4ea6b6a +7b87eb337f5358145835542b76b5d2b30f18d552be3cdaa111c48ce48ebb5394 +7b668785831c3d94c745a87cca6a67cbf2292583ba26ab7bce976680af59d3aa +772629d0585d5a1b0099923974e60fe5648d0df2c7935409069d5450f4b2f3fc +a01b277fc53686c121c63feb9c11d73ad9edf123e97c48d4dbf0129e938a6bea +37c4f0281409332b95df40bf08021fc70fff3ce4178fe3f826c797f8a90e3cb4 +cb4af9ef01460480f9e2a1e1eb98e2e54003d174a42c50b6a717e3525b59597f +2cbfba559492cf946b714a1b68e9275908f99f19caae0b28c6d18deb07b91cb2 +074fcf85414e905c7c264a4dfd6463ac60686f8698024a28b47264aec2e412ee +5e6ca5300ca542b802417be88850b7e078b9f779bb26310b6ac7a9740574f9b9 +1a7707e3862551a53b901d017e0a3e27fade7cd5f72ea091a78bf027ac1784d7 +cdd53acaaab8ea963ef7368c40dc39a24fd0f31ae5285bd714976aec2abcf1d7 +9f47c577a9537b22d16e6616d6206bf002948406a8e7a9e2158ba01bbb8f168a +be4493f2d44b23d517e6c4ad36d99ade05253059c878e0e91241967c06aa39fb +c383ee58c19637072eec047cc23b80c7ad383bd69a57402a370d1cbde24c4f86 +2cb6ccdf291b7e403ad0125da428e60d50395aad5f002363255e7227ec018a7c +5bd8228e3dc0114d3bfdf3827df4e4a9e8b79ea6f97218414d7c4adb63547611 +20b293ae54f2cce01943d8a75e5e98e65ee3d70352bfe2fa03cbf1d76026efe2 +b98c560783f7b9fc4e859da28479e27eb36898300299419b9b19f0e14787efae +994de5e657135eaf1749b7c4e5b67c46ae752a259bc950c87a754ec7cee98cb2 +85163ee68ccfc718631a1bba7b75ec965c33391277704d324189edb38ebeb02d +0fcbf79b11f4b35fcf229b81456201953ae7d54e2d7345f01b64d1a9c5472b4a +79d522fbe1fa2fbb25845eaa8bfe9f953bf0c2ea0d901b8a8b640e3a1aa67f44 +695848104df6d7569afffbbc97bdb69c4d836978dd801524d6f6adaf5a4d328a +672aaf4d3f4094e569d52ebdce196ddf97617b5487f0ee44a71f11bc2ffb6afc +b5708f2729852b3a2f266aca2c0edb2882ce71529c375d086d9b22ba82b6e73f +21e8a2076fee28f62a874b3bab94d897a6e85e2166bf8661c34d384c317619dc +5c6cdbf3c439877d6fa5c151efeb0f3796d05f00c91d076075599c2850e138f4 +f19d0e6c7e03fea4c240c8942dbf466e372b925bb630371cbd11cf127740b175 +e534db41756020a921bf46336d8aeb195f99f5cc3aa031d79c7b70c5aabd348b +758777e5d8bb4ce8f9c088666fb04c83fb8ef288d2c0306bc59c6f10f2ba3c54 +ad73ce30e281aaea55bbd19229ac326e37b94667884de768c869e61d6d5d494c +0a36505c7900ab735fc84b268e3b33d9b1be0c96da06cfea993f7cdba0ed52df +0c92b7562548e0cd99dc59740daf84aea8c227375cb6dd27ec3db7f57aec5007 +931f68e7d6c7bd4e822660d0df20dc7a6c18d0f3a783c5206db4434cf43102f0 +f06d4e333fcd69d40ffceadd41ff95ed889c437e0df67334fd2809db12b319fb +ab43f49a938f522ccea4eca0dcacbeebe23cad5c2ce651d23ef39f2a7bd5ac0b +d56fec22c8cce9001b61f51c9ca0172db724600c74b899703b03e22f7a4fe5b3 +e116cf2d85b8f4a7b94c7e31b69dba387909fd47d7b7f1a1a23defc2e42c457f +8dde4d3032f6b70d4b93a7c3374bb4e9041bbcc99f9ea3e2d2c6ae2d71ba9d2b +e3ea01353a2e3eb67c8a93f00a551bb6d7ebcaa8c7e2a66f9167e3632c83af21 +e4fd6137e7bdba837b8189845ee9cfc6806100e78309079cde319c9cc8852fbd +b81d9851831799d3d2d2f620f8862b9c39282d632366044dbb0b65e56cd26f92 +5edd09c34d517c84e0c3e7dac264e1f6faa1ea9bd934d46e6953f47f0b813643 +8b361d01e081037dedeaa08f63bb448d036e617b5dbd11fbdc0645dbf8386c20 +0092b11996f291011635f8e9d63c197e5c269081e9a434f1d67b51430bcc6634 +de71f20fcd193c095f6714c81d64940a4dfeaf73f8424f1797ab3ec58966980d +4a5965abbf9f73c55d366c944ef0e8f6d526df7d8c4b065feb75d43cb6defb66 +3d035cbe8ba3e7f6a595641b8b6776482ac161996c860ee688231a911f59c8b5 +d33ef4263f953e9434cc5e30d632fce69b4fcd03dbf86066ca99776b105bec95 +214a19bfb35fcf116c1ae05eaa457f6c6d2f4afc2022b1a6ca9dc9e2eeed5b4b +6b37fb588cb70d49108b447b2f208ad3f30e78b462f87aa1327a11ebc3b8e824 +7982e951e3d53df59b9d3d33a49e955840d6424b2060ad1d040ce26b9807513f +de401bc2d9d258f997ea2e2d51502ea57717ccb9ed7174434332deb3b4c2a951 +3d1ae68453c3f408d1424ae02222ad54d635c8d5442e3bc03c28aae1e105f03e +ceff2c890341ffad79c58f62534603d41860d80813bd2541558e2ce20b2bfd8a +858985365f7d8b006e1fe8785a3f8edd32b60a6824bd9ad1e86f5ef7f6411aba +41f768a554e9839ef9fbaf90cbaeeaba0ea48edd6fd9a96d5a8c8ddac3e33b3f +38c2813eb823ad5fe40e960d1295e11a87c5bf3cf717c8f4b3f2392410b9e138 +6ce464b54236a87f099499cd5e2a9da5396dcb48d50f621895dc8eaca0660fb9 +ba7e0b51992f138c4f58e22e2f87af00a979deb234cb79437fc3b53601fd8a81 +a03088252bc035a72e8e560883023874e2356b189074774d54d17a5d730557f2 +89a018aeb84bfa4f24f708be48980ffd22e85db7859870fb28b2c050b3bc3492 +1fd978d54414121b47fd4d292e5edf0e8b24d0e2cdcfa1485e734c2a1e0755fe +b64c9a5bb8ddbf643062787cd44a4ec9c3c6439741768ab205cb60fd359d9207 +f2496a308467d38dd2a55bd02387a9e7f48370f7ca135d456c07f390f9f91933 +f89c8c9b62a58903c084d55ebad0f5bcb090de112145cb2ad14c151764df574f +98e26cc60eb64e687e934d7d0a8158cb77531fc65b85c8834e5f47d8cf4c9472 +1fc7f6b996497061f3122039392e35e65bfa89aad08cf8c9aa73d124bde81f04 +0e013d3595b75a2ec515edc70b7d4574e94680176176d76bc66400bdc7ffa687 +c06de3c41402e7b247f58c8ade87aa055aabdd59af271fb1182b48e759b68112 +cc1d0318bf70048984d4977fdba099a7e65fd767e061fb752049b55f2f768cc3 +e5928ca9cfa04302f7bad802011c5f85154204636493fed798322d610c638003 +1d4b70af84ca4057174857efc5b4df89fb3f970c34505ca64cbe183bf19aa6ff +4ec184a400d89babd91569a4c6286085083fb179e8143c3f676d486536dd6e64 +90afbb0c079fbeaf1277b1407fdd7718fa863b1677f18c5c24089cc8c3ff389c +15266e6d82ab8ed2c893e24139a52556c0cc121dbab4b341f41bf04748cb4a7b +402b38247a6ac464c36160e66acb648ef7b72d9f0a4c553c7b7f2db52a1d77a2 +105938392cadd8ed3ca806fd7ca41852ef12dc0a0f3190e684fa591690f24eb3 +08c16b6f79c2dc4887dd4c394af1a6ce79481b79ce028d52d12240ff7af1cd62 +4c5df3a24c7e1a6e0522987e2f7eba7cca30fddfb75e15eff0ea9bdfaac60fd3 +84c53e461e1ebf0fdf60d981eeef2f9846e2e227beb1409547abe19650494a7d +e9a13c36615a782b38593223f7e4331ab97a26bbac1754538ce52f24952698ad +ce04836522b69a826bc690d2190ed239474ee13aed347c57bb4f69d0954fade2 +e3bcf549ae4b81095615715729d7e7110420ba14de537b56747d48bdb1f53ffb +6a81ef117206ec93bba6fa10a6b647f8062dadffb7040a799b87bd97116e3407 +f3ed21bf76aaf148bc23f957ac80650f0a902838f818e37299eed9237f903e5a +f8da3dfa6ed41779187dc95b99f6f81f25c099e62333a3d811a88917b11e2b02 +387ce84784896e8fff40762389958d9ab3e673aa5ac538508c65e156ed4a8372 +4e9496fc24ab91dd754ae35e6865c194d086a01d0e28af6a12515358d5418a8e +9034db39ffa1be40768376629c5ebcd045feb693667bdd055fc9d6c764a9d7c5 +1307915ea0190cb417a3f2b40f4072fd8c2a2c70a19aaf9010514b6a1ad94e61 +b8ceb5d95daa4324f87f4a8097e4860ed5a583efd9fbd7eb45c304bf84cc8725 +ef3f8d6e782acfbf5f923c59a9f3d0966d7f1b074e38b59ab4e73de45be3b5b9 +22dfde966b032baaa695f8ec52d78c03f974affc8101ad626d740f8a7daa4e37 +6caa36a628f8204e3ccfba82770450e7cde0c9d1ab2dce37930f0bd812759848 +311d46618368566e66f790702163df9b5024bb500feeac508eeced26acdf5493 +cfc78cce98f523304f72227e92f33b5e5028caa7dd2f118dbf24193abe5caf80 +9c69c8ef24f9dc55cc0b50c34d9bcc04d250ecb904561a92377387e3dc0dd2f3 +ff5c4e1484d1c151dfb5301194d9b22a8ee4aa53554deda61ba4320248a1f513 +f0b001e22dfe49bf22f7b88702d55939202825b06cd001fb4e2cf90417d4cdef +edad2070bed3698251bc1f119ba6b483e9e7855593d9e274261737e0cdb24140 +33e5edebd97c48146b5f31ecc3f64f0a8b4fa38a3ef6898816937e1c12b12077 +3f4320244094e8515252dbfcd3f37a7506b111642486700e3dc3d70a01527da3 +85973fa0125e71357666762e230c204f8344e4c5a39b5edcb9470fcdccaaa75f +e2e5f4c1d30be8712c9c187ae05e5c7aad608d67325e4edfb6b123d7e5d4b9e1 +c0736eb30932af995fec4066e77662b38514c20ba9d57fbbf4c9d3173a5e9baf +a63b7721902cf750db33aaffc593d0bb02591d00df63dde5c3869755da6aa230 +b4593c76fd547fd937ea5aae8458669836d5325682add7cdad1f54ff9a04b11e +e9a22d453864e11b7564ad8021bfb2db4f01baf56eee9e5e9516ec8efc9ccdea +5caf3f25060025df0b27680cd77378be50972818bf8c8418fa71191b91d24f87 +b282596c944dd9df959f94501299639b3b6bc2750a0f2f18aa935bf4829cfb02 +6cd2aae18922e3634198315e31bd864a8b6bde4adcfb1662d327effa6607a0d7 +dc3d5bbb4456b2cb4c6ddd9b08e97a6e96ef1030ca90b8261ea076d567f556bf +4a2bbba95564fd3fd20dc1ef35784dc3a5a331ffbb8799dce8884b30d71f6326 +f63b2abfa3e8112b67c5d1d1fbcb3d58eb8a30adfa0d593081ef7e7d3f4a29c7 +7cec4f56cb930bf7e42dbbe8d848bbb8a8494bb5b9b52621f3141883c5b7abf8 +0d8f8693448dd59ed13b93f92739fa55c87494838895f952231660c418059e7c +21c29da9d8b84e3acece7c909caa8bf78ba63b09ac7862e4e4d07e3f278fbd4e +4981dd90eaf2dff80d033de6a47ec9f9af3c0ab51e8a856d787c9351a2c32844 +cae1aea54dd98bb7caa277ac8b76f1fb9502d3732cdc21346ddb6050b2c22461 +201adafb84c80754816fd3a34dce8efad165745855fc0ff29bfa12af40f11de1 +29786a3025fe0b206326c7e700e7cacacd2fba1fcec3a5d6bdacc52d43301b23 +a9a8ff21f36251b821d421e3b1d4ab472d80ee02733b077c44fbc489bbafa62f +57f834b292c7e10a5b934a0857ae96559e3f19ae40071d2618c7249f87367faa +dcf04c07e2374a134aa5fc65c99b8641b435c57126c34a4266a8f02a347dd9f7 +2108e93702b4d88cd788486c4c89c99522cca731c27af4c8c93d939d8ec2306a +4ca94b46fac5d71aad4f9a505caf6af9b8cdb370f629019cbba26006fd4ab8ca +757b8ca3fe7805c6d99980ac37bfff4786cd82a33195f189082ded8040aade82 +4dd62b03079d614580c287418295cfe86e80377f68ee251a5a8ded6ca31f1a08 +45a3d569323c5f0c68adb4370fe36d559e4fad3a30a6bae9b0f144c4305a4144 +7fdccdfa868ff8eeac6bd86db9ae7a777a8b7c36a30ab2b022985e4eea220310 +0f0f92aa1cb436e0a4ae1bd514de820906b278a8099e2a47f60ffd939d4d4ad7 +4356b32039715c38aaff583af35387756bf4aa7046c03495647044f1a9d53c86 +344f00034af1ba0f7c002f59ac8def3f25534afd87769999aea06c7a31ce1f8c +ef2f7cb61d6aca0993ce33fc4f4efc2c82e391a71a88057d06143e8e0e714a32 +803f1fd91f12ac7241065e17744839eae74e761729fdc6c9c21b1c56198f605b +b82242ad03158a7b1f1cf7a9b70598f7d30201f2dbf0da690fde5593f35ed5ea +10b254ee771afac1155db152326d4f087bd65b3e818bb8d447a5ddd8c82031e0 +6c0865bc58adeb95f6dc0a3e346862e2dfe591ccb5eed2358bcd81cbd1f553f7 +f98b016866879ee6a700181e718d08fcb93a7c2559c8b24be22245b3a1462c5c +26ed141e72e44f30169dc1463523ba5ebabf8c4f0d045a0d161daa99231e4591 +e0f9cedf12bf72e518a2a749d3d4cdaab27290f5be07a1c3640eaf5fa50af65f +2ecd76de150cea6855f59c4d5e4cc16d71f61d3d56c1b1b248909561ab7a654e +4c914a12e2f35685604ef214712f001556a06b483812fb7b55aa1202fb3d35ed +de38d4d2e5c029fd0ddc423bb98c5998f9e151307d32aa325de8ce822d2f407d +f5c75a2b4326fffb8f58beb7cdb7dead2208391faf994c6a1b97fa57554f49f7 +56ec67821174811f7d4e2360baee2a9b48d1520493608d2036cec9038b3f7408 +f555bd053752a4d236014624de0816577dea26f95b2fcc0ff8a3576e509693b4 +029f84306c9425e3f705c756de7eedf796390ea1a30d0347ea158dd7e9282d71 +dd2122d8ec7352eeed9de3bf1726cb5f05ec5c2eae43c6e6ada089249c050607 +8e09c548fce1aa4852b84bc1897d7f09b73ea5e7fc4323355d3bbd5f1bc45fdd +b8fa679aedfd56df18ca3446240ab49a520a8871151f8cafeeeeed0955a4c932 +0d9c9e3f6564eebf60801815b34a05ec13d278fb1546fdf7605c07ceda409afd +506ab0d8358a978c08979407171c4f9825100063f258580d553c41fdf60050af +41f87445f8cdb3e8e108e42b5450cda53b438d14f2825bb07ee4f2b6d341a5b1 +a1e75dfef4c760888f7a613b106a0dea5b7408df84d5e914a332631319a63d30 +1819f54b93d50a3e4e01743d37680193927ae3938b2ee70dbc9cb6f237c115fe +8c8e6e0348f0e07c40e511ec5ce5f4ef8e6e21a6bd5cf8df4c654f62b35a4013 +4ba74eea31cf85c30f417434c7226d0fd66f94d539672a29272830af6205c521 +254904e719694e24c146a1bcd4aa98f4a3faa5bc2430b57f0548944d7b269405 +a516d7fda0178a76f2054dd4d6c8324ac2621ff03110bc3aa6cb9dbc77c22b26 +47b42286360c270404fe67f0466f23f90dd94fdb154f000a19dca55423c4a66e +e3ee48e79225d3669dac6d6040c54d47dfe423e3569e331cfa2ede0f6fc397fe +fb2c5b4a8224a76cd4d1449b363db636ddd8b50b07718f7008c85264a5b323b6 +028e5970c6a55b378fb21983ebb93670d06d4a61972f8979a2b96489b62e2c65 +cf1eace5642500063a80ff4815cf4fe4fab544433ee977fa4c1bc87e4ec3fe91 +50b8aeffa23adc9ecf467f051215cf89db5167ecdc0b9877a29010851da1292e +80b71c6ccb447938c9208ad5e2952c3407b7262658f0f3494d0f2f1a4d03b20e +1e0ab7650c9ecf8e62bdc96519f81301211286e2db6287bb73d775ae1b0f5057 +7e580983e305899c9e72a1c6048aa264055c22677dcca13c39a60c5042e14ae5 +e8b93dd4374b4855b90c90db1bc33e4c7112f09c13fe3a273faac4ddbc9f7e83 +fa75dc01e879c42049041bb9e139455399ab7a3670d967a08a9c887ce859c02f +786302460d597108827c3128dad98ff21bb738612661a8d4ddc7ed8f550e9659 +338638670a4b3f2c7cb835864a193fe4e4b7eeeb4c38ac498ce6b528f4213358 +485ff3e17d21f49c704c9ef60355a2bbb485142a6428863cf0fdbf5c0c8b4aa7 +d07dc68d87c3768961b245093fbaff895fe4e2bdd456d3afea1415d3dfc86495 +81012c24e65e0c2b62f182a7a027b64cf4ee869626ac37532e3b39b81c452875 +c0ec6ae0c3768b95408f1c56b693d08f97ccfbf00189dd508979d38141a485bc +0f16177a787b5698e7d85147b0d20a243f74676db6c2f7c606fd2400852a06b9 +96c5e600d56645fb712c1363b7dffbdc340dcf7baa7cf826699986b443c0c47f +f87a801c11e53bb673e0091de70d15a4d8568db86671e256b548f107955ea288 +8014fccedee67923fce6a1f4baeb23d7d43bf1299b49b5a65638bf4389d476f5 +bbb64cc73d82861d81055fb12b9c6314f69f5ae54c798a27db6fbe589423b942 +d8257912c7c625179a197c2e20cb4bb84f1d8cb7b7708704e0a49691738822ba +fa30cbc7c3a13abc3e73de418d50f0a442ec31a5d37024b1d708e52146a5fe08 +a093448ccde61fa8d3d4001db36c6ab90c63d60b55e8b23b993228cb117fc1f6 +d500e92371f2d1402c5e0f7a8403e407a00a23ecc5c4b36c6aef22c5fa99daf4 +4c46e7629cf4945def3f2efbc0b7348076419a2f00d073aebe5853a54e1f219b +933608e9404473b77a416c29d0d1f8296cd8a5f488835f6bb7657cf2a3c6bb6c +0b93d1b145b3d2a3758c004af75167c0b08eeda348639fc3a0b47f417f1353e7 +130f6e5a35f45a1d9c74649e207fa24ebc8f2fc9babdfd5e82cd09a2c9e5be5d +b87ac5d3bf1a7081bced48297b2e9b8ec2648e86ac3ffc5283bce621bf4703e0 +5c73313978f2d3714934a5e72797084c99e3056473c1fdb610283aa72cc43697 +f3ab6a7d3215edb54aa42d21c1a8f68ab880d617969048f4ea9983ddf5573ef7 +3be5b8e1be085592606884bf18e18dd496fedbbbdbcc79f901df8946b638aa1a +45b5e03a6d5c330d3ab5f23fe0443fb973f283ee33dde48c97a387ba13eacc82 +07ff258a228b5c97dafdc5739014f23e464eea52bac2e576e01bce831a87e05d +b7d851f0381861298773cf5837465d4872f6b02b8a857a9a0adcf942b78ea110 +5afa83ab622d4dd7108439bb7e23fdef871f3bd4c83521a3811d5a442f9e1144 +439a32cc3c4fc10b7846b7d1dc7bd3dffd9ab59f91be8903701e6341cb31cf95 +9b81115620d144e644001cd83c3df33282b3daa937e22472d20a4c60942acf0e +31417147aaf3ac3b011e746edc54e9d254d5edd887110beadb59314ae0f956bb +4e53ec25ce4d4a7fe5d32213ec9128cd3f5cfe1cf8d876dc1e45fa44474a7f5e +d2dbecd5b070828524f9511e52f957c886e128da71588e51cdd2f6d98c53b0ec +a1a3dda7382a3cae7958a1268caba384475daec9880891fc91ebf40b860d4741 +43f93d6e82ada1cedc3c9632ddc37c6bf4cf0f0f45f27d4fa1e65d565033f549 +d3055a103c2f73fd8aa861fcaa7ca1ea9fc9457b8626a05deb5859002c3f2f5f +259fccf5fc84e9c189f8c5f421c8ab1c0e3e4ed355ddf1d3e077319964639cab +6eeb814ef141898c64115a6d0ac3a7b500261cf5a9476d1ef4bbc6367c9451c5 +7cdd58e4ca8738f65c347e47ee354a2f4211814fc86e82fe7d54e0fc80a981af +dd8cd945f208df317ebb820bb8897eeb582ce3720449e215ced897f1304a2f90 +ce91c559daf1b3a93d5b7f986c84eec5ba8752a2b432501d3b74666237f0558a +20487bea29d88c2e52645c230a497e6622efa798069c01dde8c0977aff55c806 +c334f3c18fd16d5ba6bc87b8e5e649da29dd1f2d5be23c401a13c4f032a74d53 +10fe8282ca4ea4d63589f604a2ad81d98c97ebc160399427f12309af61c5934f +53f2ff4ab5c4d75ebfaa40ccd3bcdd96727206a391aac93dd18d7f7331ae341b +558100d7cdbc75391e8eecd6533c70c6789009caf0938f90ba91ba35a6a7f98b +9e3077309e64a5c36f6c65dcd60cb7b2357f82bdf7a3a865bf53b5972b5baa67 +57a3dd8bd69849f59a7aea980c2f5363892c75d49c04ccc65d2b4e1aff679f78 +0e444e91c6db630c84973f8b64893c508079e60c89d7d14755438c796160fa3d +43b73de3057c0c1dd41bcabc2dc4c3f325dcb1dff8b7b83a70aa730e2c777474 +77aa86483d4400804c627fec734fa946a9bc5ba75863fa9d8a3b24aa15b2d6f0 +b0a04a6be9e09e8084e7944fdd335a45af12ba4acf3eeab62fb3c28c8424998b +80aab78864663f8521bd26c1d44422b3cf5c2ea83558bff92f6b59b25d88f0f6 +601c079048e92fc0b23412a4975b55e94d4c27bf66138c946518801dd23ca426 +49f23046ec1b00df5b0d0fb1e38754909ad7f7ee53aa43471df0e859463ac055 +22a9c2a0c00eadec76f1fe98e023d97c71ada33d27014d4b8061f8296ec7bb04 +1391d96830a1447e54df0c0f65a00a4c29b069599550b37af18f1f03995b7df2 +eeb770d4d0fe8525177e984a4b97bdc189dd4b54ece7accbd9cb9bc74e4c2c69 +e9f655c0b6762061574adc858759fa3b3a6d9801f647b7812bf007e04d4fc71e +f484f7854227c0ac910a31b417f29363a5467a7677c8fae77c7151596cd815a2 +7cc7965555e76b6ac4c5cdfa751c7b51e34842cb712ec0d2392aad88c4ff9a63 +cf72e6d3a7da979d67fa76f5a58a41c567069a42797e6deb6e605aaaec56c41f +d881b0f5ffcffecb333e9b1c6eaf2c8cd16972a17450f175c348a63b16d50277 +ee47ca33acb0e0cf2e941084e286cbaa47b4ec91a0d9401a960cd0d1427f7d30 +57519d72ea365c0d23b0f8d8c22056e5e07dde2e2949f6876022c7cebb5d123f +50b774a25d655e55ad5c5ee6678fd42e97ca734f3ecf8a3adfa467cd7d2d36ff +e0332789f18260e5393c0151634775026a63bd5d1a8113eae9bb40315f378823 +13cc12c64193af10d29202e2336a0427f93cec717c404765fbc273b107998119 +b39f2d81e28e23f4fd2bd7d24fea9ca9674ffb76da29ff80649c7c9c003cdd8d +f8f8e0232b0442b82f05b7adb6b6e8b99243503c2168736afdaa109818fbeb46 +4dd2ec06733f36e4b3a5fc4e23777d7b797c46d01389edac2c04b755bd8eb1b5 +36b252a27c4ee6ea9d244c1788beac18c1e08fad670c763e00225da3ac545dbb +e359a690893e1cddf32149e3a3b5b47ff47014cca7c2411b780c4241b07bdba5 +9486ac235935b6e7f65d4740d33351a08a034fa0044371581fda5b2fbc57f860 +4b7fb3c7fa7febf6f38afdc9e78993a6d381c3741d72a6f8e1653d04e1dd66fd +39da14b516105f57f380bae66659b9b1376554e1d090402eb104c75198571f34 +7fe00f0af7918456b32f7733cb3c22dad52b520c4dc30e08a1d69b464d96beda +6479759a6d3b0042ac809ed2a66836a6ddf8c66940558b236b318429d67c4cb6 +fe37df64ec0cbbf259fe1c21e7cd941e0b9b73993c537da9bb6d2da4f6170c32 +9a3ccb373a0308e172de1a397c73c86b2e52c34f3b26811ebce832ecab4e37f7 +8a57df2a94358cced9f027f9f6aadb80ec56223aaddbca89266ab57f0366489c +31758dac832d6bf33ede942b3b709dfc2df30043c58b691405ee0af178bdce9a +bb61eb0ca01b697d572a2e3411e5c37731695f3df7c61603291688037a71243e +5b68f48e4fdf4b18ea149579ab08588aacc90026d5b5b6db74a7bb413e7c6564 +932fadd101dd6b2d9c9848431a23bc10fe0d5249fd2698828470459e7ea01c9a +a571ec6b5d4aa8a16caf16dc5316ecb149bf32105289643986bd10a8daeb53ff +9d745304e60745393b5d033eb0cfff54f6b4cf0a2d93f2037daeeb52a2a565ae +0dcf97af14488167f2d3f4a5f7b6f24227fab3b4439c6e2a8f1fda86af5a1017 +09010d77e003eaf4a35069c35a1a61bac73ff648280488a5be65e751929f8a27 +f5a9f5e848f8dea2a6046a8f2b388ec38033125204b96d4339d38359cae9debc +29106eaf89feaaeeac1d402f11a780f088a1e86223a56dbe2eaaded213e91b53 +088205d9ccf752c92b80c65c2b3469a3e00fbd90bcdecdb6390e35d58a5e90f2 +d977ca1c7987c83bf72a92fdfe0c86c887a81bcc33147587e77b5bd7cdd3522d +64240c75479ec66baeb5f4816d3a4487b340407c6a74cbd61ef958714207efee +6903650f086e03ba8b5f130be1e3804e475b2e55d409951affaf39d5e88ca91b +e7521a990f67f03b4df406905cbf260d3a323f7f89af3184055529ad8cdc03c8 +7dfa8b458d480f3d0bd608d0fb3385335fa57297c02500712dd534ce3ca5381a +9e472a099c984080abdc39361dc3a6d8a1c043eac03c60a7cc9320162fefe049 +59243cf57f4a0c76891431555245d3ef69280ecf11d2a9739ab4f7e0ff9816b3 +ad5ed62f66d5093f29b145ec6e00d3e485acab9dc22fc801dbcbddfaa248e218 +d83271bc53d25ca3639367b246f625c15988e0643a8659df4615621f97f5cd20 +2111cf2bf7b98a27e9c9e6e046e45a573acf6b3b7749688e50a6304b2504183f +1593ab43397f5695ecdad683430271851cdf48018c74ac3d44399e867c337d48 +be1310cd621dc72ef8061dc9f59a6d74601ae1f702614019adf427d700f79fd6 +c174487121437e65c945a7993ab95465cbd5e4fd2688c57047c1a588edc525c3 +c8059a95d7fde40f3fc1b6ae901b3afcdabc83c78ea383b673ada5834f43c252 +c9e5c4ef706d2b2373bcd83b734a6477b4dec8bfa9741945eef11c335170111e +901e30b2b56f902d200a29eb4f9e50aeb51070ef8f8135923ed83f0469bf8424 +beac3442e8ca795868e16c46aee4758cb295865c87976b868e1cbbc442392b03 +3a584796b4694ebed884c7389c456966364ad1529f189045ae12bda20c3882ca +5b294d3c45a4761155d802fb9767b45e7df9e9fb2187061580f0892e32ad3535 +a482c1dd7176a7bd3d7956cb08ecaa15171b04b6e42812d1740d21aad8a4f02b +9a754f65d55dc9e224018f7a4db6fca4afeaa2bebcf43df94b43207335e56ea1 +0aa72e066f9ef82cce0fa6bcaaad0d73ab418c61b81822b20571c16d4c483e6f +0a5316270797753ed67a72b2a33d9a28a737e463c878c12e923033ddfeb65cec +a869c62c3a7debf6d25dfbe0fe5e429424113163eabe415bdc5a2ad33c912fb0 +9f04f10453e33fb03d8bb17d80e73b995c57c7f5dc380f13bf1718788421c577 +3232b462dbe307d030ef950438bd6f7d49a625bbd713975b86a2de685aa9efc4 +416748d6ba8d96fc8d6f5cbe2e223a64c2f7e3e56c4b46a1735108d8cd1682e9 +35133dea6762375afe9871fbd829008beddc0f7a520a302f8e4cd7f749c9ffe8 +d99fe0465d684139f327dc4af4a5498f9cb7587af1cf48736145873849e2762c +15a3576201ee3b862c30d8e467d0793fd3ec16ac2b606fd7f096d016214ab55b +e10f9261c5a977da013ce3aef37a811ca02dcec67e3b2fe85e671b73738886bd +58f82a9514db2f1714d8a61b1993dcd40163be25fb5ae11012621963063e0834 +6a012fa6205feeeed0a2e7ab9bae25217b94fc15e0ab3bec8d0246c0ea39d91c +27310313df9a6a8cbc2c21cba8dba11d0867325433aa066cd7f70ac2322de211 +d07432dafb0cda9623f24dfcee745483b5b487f7f3807c61a333db414ef5cd2f +71f699caa2aa8b115a501cf7f847bbb693b9ddc2873d2d777f0d5967d813258d +1ba011fa0b1769e05dd58a26672d643966c3fc3735ce54c34c7d8a6bc22d66ac +fbb7f3e8b0973ee4ec09335512ad5e3be89528d9030f570bc455e8c9ec862ed6 +c663147653904f98bdd4db271e8c3dc15b88afaaf8022e6a0c034d13805057cf +1d3fbc6ae03d18d146805fe30e93ed5a95f5222e71c210e355c23322c8f2156a +2dadeecc441f7eec675f5915fd2d18df02e5d81620850c2dff41fc7ca0e6e22b +4a02199f54beeb940c788922b33a64c2e3076ff82e320e77e745f7647bb12f45 +bfac0c91dd3e9dcbe3b02f98154563f9e0356cd899db95738c135741ec047ef5 +7cd8b931e585c5dd9571e2c04ef50e4ef27336428ecc608589e679c61f76ca64 +be45585c17ea5348cc2895679ea9a34d770c1a64ae5b16b312e6b5a8dcdb942a +2ae12a994ba3a46a3cb87b37c60c1f5616e0761968e6d946fa74642e251b22c6 +5228c676d802d5bc14b086ee7ab6ac05a9633c6be860413e3f11ed951a00e946 +db4ea439cfe92a5f96b3c540d6b1c79c9059f4740e2bccb7bea143bfd662bb7f +3f8f7e3301c9974cb1f8ede6d0f37f3be97c3d3988f219aaa57e5a59416713bf +a51f39eaa6c9dd8061545f8f4d5166ae049ba2002ab57544ed3d1cc35dc5b1cd +e1c2747ddb0528cb899c71568b09efc95dc50cb5e7776a1effbbaeaeb8d2f852 +fc38334d53b8b593d3dc2ff8569da123a0d2c4bd62e48aa56ecd814db488a669 +af1a51b0da500c1c528541e7a50034f85c2e54f2c0c6dc77fed88a50b634d4c7 +34f392d459e6ce87fd02b513b4145eb71e41d1737a1eec267df3f031027cf2f3 +0de91a8757124097cb6c7a94d3faf93e477196a30cc8f4fe96256afa293d6b0c +6f8621f8ea4df835912d38d6acb82469da3b3736cf981c94a01ebd7a770cfeb5 +1ee589f07c5c5a4be5a156ec265e4b28d1f44669e1d5690ebf2f3d88a44235e6 +62a029e0620fdc0ff0fa1e0dffa79bab83733780db56169182b8bc1443f33b9a +96d7c15dffa25dd1e74c6fd65aa8c427fb5378e8af98094d5efa5c4de356ccd8 +5a4a93417604daddd4a30e1be6156df7ccded63b4fc317efb846c807d46e3406 +ad405f0f358edb8db86a95b6aa5f369975030d34b7ee5fd8f9ef0fa8c6162c47 +3358bac69333993cca212457bd52c7f478f23459c37a1026c9dd9d9d21a07a46 +1cf7d1762d1fad87567b71525110708b7cd853a8deb39047fa46717c86784fce +53d7024bbd26b8babb0871ba6ec0d1eff561e948dbeb2f72f4ca55c9c452ad88 +bdd28acaa0eed54c6e654007ffab077ee769d9ed80a3b21cba436a649d97500c +d2468edab5b23a70ee244eb9a684b1ed0e1cfc9a6537c9c2b0999d5db07eb8b2 +951251cd19c6378a009d81a5ca61dda17c12dad94007a12ef33e8807c6bae45b +1af312426234bd5f28cbbbc96de0fa88955d8b1f2f2b2b12504e7e8d63c3d0b8 +888681b700bdbf7241550a55a8099214ebbca3e46d68dfe6b66784ec031b41ff +2906c8bde06f0a0a6098e5d3625f6930b99a3fd8815fedba31eb3fb8d40d29b0 +cee92124f274e14633efccd22ce7f4bd476fc073f0ac35b810b114836f7eb319 +d3812c7c2491519d6846d0e0b4de693702edd1a702fc6183011d0c31cc5655cc +e08923490220507a17d9fff7f097ebb6fb63bf518ee7a1c57115f352c077adce +6e84ece85c34c0f24829f23f956291fc1572ee35242f8235427fbad99cbcdb91 +8b84b327222535cb95b53417da9ffaa4af85ded3eaacaf995059d2cd4787708e +60dff44e075227a69968c9b0a3d756c2ca4e3f36460dae430002277c37aae61f +f5e5dad055a00c847464145bbf05e21b0fe2bed8738629d95f3175fa21df38f1 +38b0d947b3d65777d24af2da33ff467fb12a9d00afb474cc7334178619a8cc91 +ecc601c98b2b8dca7fa88b48c4b7f6430aa751ff995db878026a6e91db78bbb2 +a98924c770307a9b991dcec113fe5a48c0396ac324a5059823ecdb788da4bd9e +60e8194e12ecbb3532fb86fe8e9ef3459b259c3dd5e8098754c8c3d87e9e5fc1 +bad0f7f63163c0e68fc80bea3696c7ca8b33def5ce23717b047aea770b0c6be6 +fcf88a5b0a95c3337277b515652622d6ba186a80d34cf1e02b33435cd7a2e1c8 +d82217538dbf366e181cafd300dfb089d27f736246ced011b53b7ceae2fb314d +06ff73b11256e3c86dd7f923a13d63746047bb9b45bc1dca58bd0288def2f236 +355aea24f0a1d0e1c5f5cad3318465a8de2124864923d281fb684d9e7f0e1768 +fea6d759af5be03bb744f290fb4a5fa60b7fc9722220ca8465e6abfed70a4fae +36084e461862c280e59a8ccb3f66303f572e9afc81e9287a2d6e68a5504cf692 +9ac1e6a385efba81ad2c2757c96d59db527b19446b383810295e6be6e2f22eb3 +656857b7973e69efd0268278081b6b806362d465576208a70f25ed14c218f329 +f4490aab46ab1bbf458112bb3cfb650f14ead2d08dc8214492e9fb06b5596bb5 +282e1bdccdf3d4200671ac4e13c7ef8870fe8ddec3bfa067a8976844bab6094c +28a1d7fb7fa127531d1227029baea93bbc898fac105a622f28932f16e2e0cd64 +64c9ff461f11c71253cc2c6124011bbef368b8abf801cfca85ea9915febb9506 +987a2ca7bb4b368989adcb4ace9e1d51b98b6c4dba9cf602ce0af71c3a80bfac +2db2b06ce3d07f58f565ab214d3a6e4ea363f673546a7748f2c2763e94aa27e1 +5f4f90ee7dcebe52b9a32afd3eb7c9db9cadfbb73a8703267d3756183c46d568 +b3a39706c6aa261b149f2804253f204c188d5c1df062e60a8bc5b54edf88fea3 +fc6de60b465f8881381169d72a4c9efe1bd835d132bc0fc05563146f69b28703 +e49e817be954da45f54270b359506fad0aff7a12652221accdd77acf79a3a57a +d1014f83f1a7be91f3f45912dda19b25cb49a7e4174d74055c49a77c49862797 +fdccef3fc82a2e6537cba82fe74e96971cd6dddb3a1008988d6966c19729df5c +c345f214812ea50e8ef7ee339d3e8097c8ae9eb8edd09f970dcfbbdc0516eab1 +29a4b72c2cca455bccd77e8d30ead4c93f4d7b3cdc17b0622818415d761c6a70 +8ef0a3541d85682b878320441f75b9371c2544cf019734695efe3d3e909df69d +a3f50247e77a7059b1bfe48cff42ad33e1a6f2e67e8b0f4405699112ca83fc3e +d933a4915398bdb74af2955548f67182a2bf97475a1f98540014fa2672941121 +f1ad75f2b07cefde404bc7912ee07602e5e1d977dc7d24fcb598c320cdcd6f7f +f9299f19728cb6e545a42fcec71847efe4fb5b942f9e0406e6813345748059f1 +1de87b5ed8c72358d739b92202572ed175be1f5314c8f77633fa146f799e010a +a6c0d71f3cc686a97932dc952d585ce38962621f3aaf4bf97d14fd662013f814 +3a5ab8e72ff21ecc1a1f28944179427d14dfbc32f15c4848fb596eae16d8c4d0 +72b32e926f0cd2c014239ee3de6fbc15e71bd4db8550446af38192d5427633aa +2a3e96713b46bec7d7d49466823dcaf68cf8f6d8b5c30e06a75dd626d71f60c6 +b0cec9b06a53fef5aedccc0144f6a0890533adddc967510b8e41ec5b5f8ee7f6 +a7cd5409581938ea34b0713ad534cf3ce62d9a6067ce112591eeb7ee165ba5f1 +3e35ef9737ee628beb8627df2a69ac5d7ff3b920c204fefa38ff826b22d11b03 +0fddb64f58d06a39addd9ac9d5e6def205785c7593e4167f09ff34c7239df87f +6b2a93d7c05987061d05e375eff1e5b87c87e721d6b2df3b0b6d8d7c00700893 +6aca3b5a59bc7d6e0ccb1e6442dec296580dd4ff8e29fe95a6dc94e222e3c0a1 +f2db321b2b5d82881b4c6a03053cd36b733540b66e8864b81c6c469a8007386f +be1f15239aea0e16b64b07099c666c3c3561bff5b798109c1afcd1e277b16879 +908b26ca93081f673d5bb0e57a98129f2823f84ca5389d1724c4908e63ab8a01 +b1a31137a628e6edd143093f20658cb271064d02a0e57d2194500969a46e170e +a74a013a30a5cfb3f85fe0ff118a1df33cbecbe762a735375587f8aac2414221 +fb4c562f65beeb6e3478d19dc8c54ba9ea5dded5b2435cf47aa6e9d8449d61b0 +5bcdd34a8c0ed9c68a46afbb1210d1ee584c31beef3bd0e19fc7e7e53e6e5144 +68f9396026550444a7f2a1d9861ff363ac752884660f6e3a27639976e04603a3 +187cfe164b2fdef737d7812c72a42cc26734256b3c6384e7a9e5188e5b258126 +1cea92ab518a591e3c17402b8d6ac6e8ba8a616fe2f3cd85aa1d947c7d004eff +ec84f19f648a0986687a02757f747f736b8e44835ecf944fce94e5d5b6d22c23 +55108cf69b28a5677d66647af9fb512e1dbddd263cbac4766759eb17ad2705ec +316ec43818198949c6347b6df11505866590dd1e7c6e9364c8f5be7bc68c5d99 +b6ec3a14988677e026718519c26fb09d3fe37c44b46037d2cfafaa69250a1552 +f90c990cd9a5890387e2105ddda8547a9ad5fd9bbb473025476b3e9058381786 +efb351d4449691c04126b03cc4fb1080b8d59ccc6e3813739fc156972c8f1d95 +8dcb1df8b1486d95b00e83bd5542b6e177270cc0abaea5a787454ed7c0c756bb +74e63ca9a29b2a900a43d646ac91dbda711c5dfdf8bc32204dd4d01bb1c0e047 +90f0432ec15f498a0af0eb8cf597a6c5ba1b49acda534f8a33a630e50bc7a01e +55372d5fb7451d77d09f2045ec3d97d3dff73801291ee733911a96e09c90fde3 +8c68a541668591411eeadf77dc7f99dba8cbd972fdcbbd01d89637f803c60df0 +e2f6a98bfffed349fcaca1d113e264c1ffbed892ed168c3db19f796da3c3d643 +fde51886b89f647346708ef34b9c8565ecb1c6bfcf60addd119ebbbc1ba78600 +3a894076fc258b1d0c1f4d4793f16d2a5e23e15e212fc1279be67e3daca4045f +4fa45604a900ccaef41beb9ca12e2aa6fdecb50f10eb19e52548d8b473d0d315 +560e7b33896fadd827505519cf94e552c6dfd3ee2f5c56116da426ec96324e6d +9f23304f2fdb2442150af2507b99031da28e89ca5c8707925c3f7df71524c8ff +bd025de6396f4877615d66c42e5d87cab1bbb720524c32a14d0b3fc018bccdba +38a543e997b430707d3e79e6f3bc467254cec9af101efd29b6e4ac9654a9e471 +1265da42e4f5fc3c58ce163a53e8383b18e6f23c2b622bd3d7ffaff76733c004 +a49859885c544803a2cecfdfd3d0df5c7019d4cc333257b61cebf93c39876cc7 +e4555fee5e03b042023ae1ac59b0616342218dabe3af133c4913848d9b24a2e9 +2b3bd166fc38a530d1e353460cf30d982bfa5ab2f09e30de2bb667b4afa7fb51 +2aba5d41b2bc26dc6a888459c131bda1ade6a0722b8fd693d625dde45a23fbe9 +fdac2f0cceee811137f601eea46564b93f36b61d9c105dd7dfcddea0ac0ec713 +5d3344a51b8658163c1bd5a80ff0770ccd912f1f707047e6dbdc2d2579c9801a +fab26f5be43d8a03cace57e5c4f0f63c4f03bf3198f6dfa833f41e7e2db11d8e +9a3739ec70f4204d3c04db4164e33c0926840979d60194c136f39ed9f5554532 +7479e29ec15e62c47338c5bb70faded6405977317bbafe5f5ecb7544f8e884d4 +ea7f93e41492d3d692b1a5f3a932af6094f07024ddb7a405b1b441b85c65c2bb +d3687351e3c6e5cdfeca24e7ea2e1c17624013eb219b2d1c11e1af21eff5106b +f9a5d8f1d86ab853001cda2402e6db1e21ffdad72bdf4138b6fcefc5ee443699 +aae77201f3e7f8455df5c6bda280d0913d8716fd80e2815def984e7de3ac2804 +60498493d82d0c4be267c7627d9fde3e6c0299c226c28f3b841c123596ffdea0 +670b7bcd270868cae6bc24736e95d36d5ad98176c1e75b1b6754f10a00a62130 +f3d4bbd607f906a60f14089f4745646601dbd6c055c628a09b652ff0bf6f86a3 +8c48fa8e16cdcb942b3bf905f778006be282aeba4f540dd3d65945ad14d54a01 +386fc28ab2ce4fe01b1d8f5c27df51f363342e4364e9865e45c02d229f490174 +4ee8f29e27a3fc873ff1312830d5e4d91ad9efe80802cac0c807688eed3c0aa2 +3699f9a9aae755d406d9144b527954709e17b860be68ed2912179eb8744ce833 +4751ef79d5486949a835aaf4dc24173ef52a230528123ef039a650842f6dfb5b +35755ccedb387d40162093ea6e546534d0ea396377abc3a22fc3f35c6f1447fe +2c576815e2a86c9e0afabd0459f74a13f8b0ff2cb534e2ed69ecdd5944d1cbe0 +206048c00770329552fd1a24110bc557612dcfd62a383f4d588b93a4c9d1193e +b60f17b27a22ccd2bad12f3bc0a5117aa59b4e47aa6bf9f63904f2ec9fc780f8 +74e0d9442070ce8efa2efc41ae269fdcd31e7756f7063e8fed63244ccd384163 +cdaae16b120dbc73296eb7bfc14863928001f8e7a697ccb21fa15b0655acee5e +0fc529497d3bb33b4080a753121817a9c260e49860fa70d591b34a89a0fe0dd3 +1bfb3c722bfcb209d2a711de80d436b384918fd47234d94b2fcf51d938d91da7 +1669342932144dcc27189c85388f1711584e910e88f050f43989e110af6af70f +ce9ee223e12f15834e34415d2d5566c6ac0a7efa11631e6afb4cd753bb8b8452 +dae2d3811cd752d9b5a3b4d0d601229c975701d225ae2336f6630752371f4820 +071adf79a34af35b86a3c2fe2515c56c18d080138f35fbb390d3fdc5d2dfa2ca +992c5831c5bda4645d7fdc8bd41c5d4a6c3a41e4cc79a0a62bd0e8e78cbc9d0e +fbe51fc28a1b441599eca62bc4e0dfd0921a7d5cae3f27ff2f8b1d17afd81709 +d87339c9be7c57cdf4d6e157e4e6f1e316574f8a61c64613223b5f78ce73095b +684f38a0447cb1633e000ec05e9f33070d7d71c3dcc97f5dd9cfb77cfa466702 +39a2a07f0969adf2233432f4951f9fd484e3cd04e944fbcb8f6c5c2999a20ace +eb0dd09cb4c2625769b07e8a79167f204b028b8bae23d2dee75fab58faadae91 +6edb1cef05056ff6010b09582e6bc229a6d6d2a30f5a6e7842df8c86f0feba1a +019fb2e4965c5d430d35fe30802e9aae19570852ed00bb22776a808c86080e05 +f83a38942da3a78171e1f166d4af2487878b89a76d5c0d3a72cb3c00c8e1cf52 +27ffd4d6e851891613417e63e8608adbf208e59c5ffd18c2d84efb5ce92d85d6 +63e98ac33b26e6a4cc4d6115174a8695e6c83e288a867260df462fc48dc9a7bf +21e96c680f3dd3cf1c69dce24f8ea70604ecd23df1b655bfdbfdd7bbedc26f97 +3589ca33a7f3256ac1dbcb72f4068c585d83c5b631c770aeb10af936e01c353b +ee6aaca99edda0ed9bfa1530e1bed37dcdedbfa10b9f4baff8079dcc61c0a4ee +0a8390b8ee52433486fec50f22facef032500af1db0d976f6df11e8a6b7860e2 +2592c73ff63f15a5ce45be37b03b9e14d7222b03260f18680dc6657c776137b8 +ea98f498e520d15dff885feedfe8983164b5664eacdc8203dfdcb97503205a94 +ebd7d1d92c738872271af3d167b4d8327a0ca571d22cc048d6becd24c7ec52ec +6983551d9441b73a17bd37db89d7b5fdf6c53f73ca987f63ede9aa0693a40e3d +faaddfb21a2564cff84410ae093ef5e382061297c53aefd7e9a5f4fd19052574 +c3a5fa0af8ac059f3b980d670c53e8f40a5f14b3f6bcf2cc9ba95c572489a34d +ddc43f1712f23a4ffd158a4ffbf07a8190ab6feefc687851aac2a2ebd100f171 +51bbcc4bc67c3e17e020545bcbb70414baa4507d6d62ae43a67e246af16aec3a +344932fd31ae2808957f41c9711e62bae1ef4629f31940de87d0515e94dca2cb +f3994d12d317015f1c28d8e49c6c29bfd899d0a489320cd242f20192739c93a5 +8b951f09479556a43a3fe5f53d70007e8541b534292ab1ec8cf3b627ab78074d +de81e2eb14966f6a5ba59fc61831cc56ce084e1bdd57dd55e8020301492bac80 +441d41ea8f1d7e12d45e21c0a6c1b0144774785a579839bc51eb282cd06d5e33 +4d9e6d8a75c77a4f7fcb659ecad5eec190c09af2ecabf64b8f1d1427601b0769 +c000c249fba2ae62440bfb401180df017636b485637162320fb6b0e1571d100a +33accfcc4bd30eaf4ffb7b6a6055596b0b8915155628f014ef12e5497b9811a7 +2cbacdb8a67e0f28e83e4a54b41a697f97d1f57990969b747e42333596fecd70 +fe72e9033b2f438e853c46bb9e9e1dec64698dd311058214fd2914c3aeb72c37 +e24dc3c88e03b41c8b4c14d1fc21ae1543d2388cd9968c99b0f2ef0b37c07373 +b2271ed4c33a8987116d8ccba89a92bbf075fc01ee1ba1fc60b7173f824572bc +08ed62031023a863323b887ea742d1a3fcbeec4795c3680c093da059173a0f86 +b3cef52133cec4c2f0b639789c4c69237ae08bd02845ce364e30c28b95de35a6 +176dcc317bd180afe89b4a02079311dffea21edc192e601de53856f0c328ef80 +7cc4c9df1a9cb11986891de4a9e824297efe588c7456b70b4151c68cc7c48422 +be15578cb2c90f54b25c78e64ccfd9cc476d7dbce7b5ed95429178206b9d6b4f +08fe0f66795f4279c9eff84a0620cdc044cb84285911a2a87903a4f86f71d61a +6c0c066595fa0497f6fb30105296aaf4c38b729a410f563c19b1f349db8f68d1 +cc5cd9ea5375253b6278f163cd43b4cbd6357d8b7ebf03c6a51bbbc874333e68 +d885a466d3bea70dd9b74d89dd39694d7a96b39fb743e450a7bd1b3a73fdec7e +aaaa096b73be6eca1e3e1f8a407efab54227079b1d51abcbfbe034af69db5a44 +c4e07d0a971224573f75a4f557daf7639f6b7ac1156d7de01a690c05dda535b8 +5b30cbf32c03b4c40bce719c53b6550d1342cb0f286dcfd611a4ea5c08f7b29c +2a0e9dab6e47fccb716748e9aa42d6045d67ebf5dcaffd9388e78778255c420c +b286e3f77b0782bbc2246567101d9ca6320ba202f731baf12b9241cbac2901d8 +daa65df864aeb18c6ae8d56cd538f4b8a859d4d309fb174817bd980c54bb06ef +46c15e7eb7d51b0ecc6ed1a8da19e2b03a9ae244a9af3933952800764c4ed8a4 +a3d61b4858713dfb5c5d9c2c4ca0c89ae486982033fa94fb7caaa9aa17836296 +4f4bd5548b78129e8ddf60f0178e09493c38a30e5944f4f608297c23e6ac1077 +cefb010ffa6d4493ec5c2c36c2dff1e2678757f7854013439b6d93bdcb3c28db +b7d763958fef13de8a541b28f801a7dc81d59b8b33b7624e3d2b40d11bca7390 +19618e30bf215dbaeb4931df7909d745102a97b0e25d5434e34be7f68cbadc58 +589baee0181d6209d97b6eb2bfdbb1655e56b22c56ed7602d7c4bfef6dd783ac +8118e705c6e433de198a16d94d8b63c18ee31bc05f7c2c7da4b8707ceff59305 +7ab5d34417372d247b35bc8d1703d0cf3ec469f8db0f386c303459ac9fe564f6 +0a9d400c110282c900fc0f2ed22a9c9b3c8c6bcca5102d532ad59b13f689a11c +f6f9e88883183e7d3b1b03916658e2eb6a471563ce90ee524387d5d732c3e473 +cfa1c6b5678fc9fd1dc543f9692c680598793192d38c5ba07aa75e55fdc6ae87 +60eae4d0f1e7e84e1e3563127b4cf4798275ac892f64e2b5019fb3f9d63d82c1 +8f6f83044b0514d70571aa9dd6a3c3d75c2ec0915babec40ea2b430f8e72ffc5 +a35aa5af1d578802614ab502fbe14c9868b727cb578b7af9dc59f4bf58163eab +28c7007db4f59fb6ead68cdbb54be56683d84ae18de924e05c24cd2e6ede8c70 +4533fb9385d5416e1bfc1dbc6fce36de77a535c5d463df1c253c9457d7dc7652 +8522cfc84bd9ec3a813c0bd008817ce1ad40109752bd990508d0699507c2988f +e65696a950fd0440dc975e3cd52c69840c0f5fa19df83e1775051c1311213eb1 +0eab31d0319eaa2496f49fe79a16ff0a3f322a5dca0146725445cb191e1f74c1 +ec47dbcffd1a0ad33f5480faf36f67744a4834107d03018b7f19b7c9f9f49b03 +616dcb50c24148ba55118080e47201f439f099421d6a4340dff4cbcb4538ea4a +a229d228d1e3bc42466db739900616d99e7f6452303aaf98c6d150c131507272 +3ae1646232328891467321742af86d65555c759a477dabbcc4ac50268034e1c3 +3f9923a21f5b5f774c83453e54026effde61c808ce8f13727291e7c29c6a1732 +471d20e3131f4473e11a20594575d0c4fc2b446baacab399990c551ecb91f410 +4c4790bd071902805d25d2136a96928471c805c79d84a4ee085dbc863fa27116 +f1b7d3b86bb0b94b41d94abc348a3befc3e2bffa78d6bd017c8e21470590a712 +5d3cb57f7d414367177fdc687282d56adb1c5662238b2abf7453f48051553d72 +906cdb6d0e8f84061dd77c440120b0ca084813f9c20a44e91158c3254ae7b8e0 +d40a5feb3563d9c6a02eb5b4e09d5a4a21cfca067258f3ad84b79b245d2fb010 +66b9bca633311594664c7e1e43f67691f6964d19a37390d7bce97648fa9aa0f8 +9b90b5601115dd9a05f30eb80e9002dfc370fb25186922a1422a7a8739c99e98 +696367884468fd5b2f924a98c35749e8a7be46f39d801fdbb987c2fcab9914ea +e87e3a066027a327c910ca591144cbbee11fcd76a1f01a7c83678bb39e7a54af +bbfd30f590606e69f9d4155de25d0cd1113e6cc27d4af69064233cd8831f0f10 +e47739137db5aa9c422d77ea2d6844b7a080eac56803bc408681603819beaf3a +2827d33e96bd6934172b0fa2742342a3f69fe62f2fb389cc4f408b6fa6469e30 +66b21dc64b18d9ded429c850be147f0c8c750f65fcbb4564ef9e865cfe80d017 +83d2711db42b1d7a1de945605b983e0ca09fdcdfed96307644a16b60f425126d +681265ed5ba75182f5428420ddff62e83b6d57b92aac1d765c74ae095775e784 +18557812357c966abb2474bff88f59f6ff8af8411d37e5c0d02f725055705f84 +1bdaaba61728c340a60313f0ae42ddeecc1565caaaf54a80af0a75eaf421bccc +e9d476f23df35c1bcd89a22e7661c1a7f56abcfaacf765141cb3c5da04cf108a +8f76ceba0172d366684bb71f51caa1e135606d38b4f4a71630a7abd2ef877f38 +b8e75649abec0dc275d43db59c4aaaf87cf9a20ecebca4b1a7a7ece1f9e42491 +e5fe7762a96bc5d3d18acff99ade3ec62a13663effcc72e0576283de2b45741c +3e0e14567315bb9d2a09d6dd5dafc49f99ab3c250ee71bf4f9f06d42534194c1 +b825b4c16fad32bd5b13d1ab6285c163ab948ded26924b0308e9f02b05b84a25 +ebceb1f214095b77501067d6ed6f0a10257fadde20ac0eb79048fdbda22bb3c3 +bd4575eabe2926aa2e2edd749e6d9525afd7ef9035fa65a6ad6520b3a7d2da35 +71438a2640815a618bead83da31a789edcede2e5d1c3517609927afa97454cb8 +c2f56b33e3ce24b3de50edd5ae2c1f3574f3b42855af5f3aeb13e427900bbc71 +403dc6c496ce594ac50d0f4cc6a16e9f617a48acaf167ec4f7140c33fff90e42 +647d46de8fb58b9e873fdf223c327f1b9339d24a162f9bb255a3effc2d868618 +bfab67025f76f2015eead7819b1f57bf6b7d2e9bcbc62189cb800ead7976cfd5 +95b2b13385f7d39413ddb8667a52ec847a753fd1e59e68ab973810164667aab7 +8fd30556cf2a88216d529ea625a79a01bd2274f26ea9c865429c68621dc6001e +6ed17dc0f8b5fb21f89757e44295a286379eb8e228a8408de8094c09f58057f0 +3229b1ed791cb5de6e25cbc7e029870c7300644511a259edf9ebe82b08c6d01e +fdec094b29536be4ee024dade73a39ad514f88b49a5f70aa28a8737e7b665ca8 +51561914f5c917e9f0b69022b3274657d0da1cae16a164f7285424f32a1ee0e0 +fce179fdf9bb6863a959ebf3128204b071f7233fde28fa1b8feaef4d26fb2a71 +2eb5860387f30284717c4388338919c658d203a2d6c203bb64dd4343c22164be +3307322d9a2ccccf0cab9815e0c2b2e06a84c1253652b5b5b471aefc5b8bb49e +3879bf02059377f16f8b739b6255b2727ed46ce82317c4c88309a21ac0b95bf8 +51bd2eb32da4ee583b26b12c6157477254bb6b71c0d37bbf34e218d5db70188e +719cd9497226339b60e6a1d6cd51ab707a41220bad9492531b5fb0318cd3c06a +961f64ddc3efc0fb26adc45658f73e4662ea92121b71220c7a87cacba25d2670 +8a33db999e1b36fc6380658ca1518c972a12148a101230dfe9f5a992bc24709c +873a73b86cc4ec478c3ddb14c68ba9e8a9edb4a5f35e6ebfd19821c09d75d0c0 +209806d6e2726597c11d36129b1f8304e578d554f3a1969a48f5095e759238e1 +0fdc3b52a9b560f7af9ee7997179a10671ca25efa6497065e5511f3d71e17fd8 +cf5105d16dfe46114b6c070b7ee6cdfc121ef9c2301a44c4d0957c6841cc120e +4766a51229c665bf60e401d8bd79971e0bbc0b3c13a14062cfc0dfd41bab5a61 +2c2e1b5a5a1f3a4b0c6d4e40b07a3a2e6c674a5d8ccba872887b85ec0bb4ad0a +669bd729b06a9de82e06803be5e6c06b81f43df6528cd41a9f08f60be991077b +babcc3ed85112ffff92d8d010f36276a0bd60bac888165ca09553c323d4c6969 +f4acf1765dbc74913e8cc3ec387474df3cf784dabf1c770b848d54e0d0f2daeb +99158c4a288147301aedb4d05325a0dc9b4dc6651b1cc9f8ee54da01ef421f2d +bc4dc4468b9d5136b535a703844b670341f313b36e449e00f7b832332b9ac019 +489874596c8a4392a55c63505f96440eba1ee31e276f3cdc534b399459223775 +2b95d0cc8ef6277df7fd17df182adc8e3aa34c787d4c8e5c3b1efa640ce25a4b +39a669be2f72870a5acf7744f198cfb1dc9015df53488f0b371fbbe54df7a675 +e869f3830a96b49f7dee4a35ac5cd259cb30659d1bb8877b05f68560c94efba2 +653620691753d8dfe80403dc9e25ac59be251f1c278976eef940be45cd3f42e2 +dfd443299d781a6839427a74d7e3e0e955ec43ebf8522cb7d12234f00e722325 +6d2c48d320c73ae1702c800394235ebcbde727b09e30d4fff8c9cbb5f33fa88c +ac3a23cf3c1d4b1dbcad53bdffd2d97704991bf095e5e9d191444ea80d3f6e19 +1a39f2c3f46e160b93b0d6bc03a56012189a2b8593ca132065b951966dab689d +5f007a2f700c0c0fba65ce3814dea47ebb8b1ee1c5381da4015b57612a8af3bc +fd46f56591e53302feb467efb5633af715e099ce8df0ada14095467879e4f82f +07cbdb7a16dc1ac05db4b1971c30b2d0377b9a4baf698a633499f4327d416d8e +0245ff281806dfe5ada865d1a225a85e89074711647fe07a7d380d60c5349591 +253a98db44bd969cef00ff7dd236a4efef27e1b61f8913f1e826f9e73d536243 +67103a0a35fe45a1a2babe78aab73ec848b55174b7129c195dac367a17ae4d9a +c4e9c7876006b067b6006270fd078db6bb47b413d089abe8ce531ac0a8a00ae2 +5a392378ecd5a4abab3e57a0b9e0862a0a1500adda6a4625dddc26b39171b002 +9544990fcec65847413e69f3c1739afa919d2f6b90bb4b56940a88b715eae942 +7a5ebc9556a4d0e730bd1579d8f11a26e48a7fea58981d40accf1df09327b791 +8330674752a6761bc7a5ec5f31690137db6f9deb681bdff16b125bbf1646784b +c9f41964b1ed64b3d894f29bf32104191bc347037147ea4c0a96040e48446ea3 +799ac90ffad5136a560c077ddf8c984006afa293e3c8e6399e16ba31bfeffbd0 +d9380755a6c7459ab0072ee11dcfb62428912b19dc459c316a2ebac60838bdfa +6c0c38ee5bcfbc17fee37c5684ae478674ee7aa91b05a8b92492f7aedfb52dc9 +aa2d9e68b83d461f44dfde0cc1a433dd7b589a48a1afb5e135e884267e68f1c4 +e167316f8812e9e1559e2714a2313618f116991cb69c56cc02db76a2436c3852 +23c4058c79b33565e52b112951070a8a39b8ab5844558f871b68bc17cc68b6ed +abed7e42470d0f41fd1f193678d255a2fba3bbd0f3ddae252dcb473cd18e6a9f +96f09d74a4982cc98b7196d99744305aa665277845bcb4b006525340fc79a54b +87e3e353efe9dd4bc1653338302c41b58a11d628bc6579009542b7baca20ec0b +c0458bf2bfaa40e6f7015b0de112b7dd54ad8154ee89fb05702fb5bdbbd0caf8 +59f3d343c1a917970d5cd79379815a61cd1b1cb5f94959a0b263db6fabbbead2 +10cae44a73dbbfb9a2a5af35144b2e4b647ed376790d7aef50a75113e3a90c5b +d40c51a48a5354e2445f58c038bee61d647c58558c1d69a49b2b468efa66ce79 +636761570e5bfef800b6ceee7238838c71d3c5c28408dd89acb1e728b64f2adb +ca3fe8e25c5a98d5a49a30c994785b7ccaa07a2689a705b55b3c83ed68bc2ebc +c9b433baf146f792545188374f294c7df0d64983827795642bf07cc5030b5d6d +a13343bdb8fec0039c275c883451f59941ab3c6be0501fe97fe44c9285b8eb2c +940c0165aea7366f3812d6529f341eaa6b7c1138e9ac03410be3836224f11bb7 +70d1a59a5dca76f4995aaea315c758ec847c8c450ee5b2c32816329f7a1cf85b +ac69add76b9ed4d8697ccc76f48cd1334f4a9a286a00c2d72c5ddc1204c8c95c +4108bfc410909a1c3ea9385bf2e8551d9267a2245590540ead98f4f1b9b36534 +2ccc0de73c502a0af0d462468677143124c41d1dd4aef38ca60f9b275fc79afe +a09e48934274567e8cb70b61866edba8dc0db9ae6d41f93d350609ec138d3c57 +722af790018aef77ff1088b10a2fdcb84d4d2ea475dcd304ae2fee146baff366 +137bf5b02a71a0c298a578aa0d3f901a87d83a012c9993c615df923d6154f0ec +022409a17aa03b5dec6742b4e3058752123a4f58c5ce99df4678055ae5988202 +dac324e9792a6ea99d65bc6efd4fb6bac1b6a073723bae6a8c6c7da730743d12 +57bc4c738f2f6b67a20956a8695f0d79476c7ae76b5222bba47d87f88ffc5510 +50af88ec2244de25171204883d8cd636aeaaa20109a69d3169d6f51091d134c4 +bc9705dc47c9f3f00085edcc3e9df50e306a2454d77c56825f626deeab5eb388 +cfddb946052b676f354daeafc795c949b0a309d37e693ce3842b896067f98a7b +196289629ac99d263f78a2c80c0498e8d04776e2fc1c16cb0a8b5c73bff0fafc +8427431ac637b5ab30b1ba074fb8d53361ca62b056a95ce9ecd8c008864bb48f +184b28db9c458ebc1584468b756edb2a34f51279147af186a728aa7c2bd87c11 +fe980ed3ecd0686feb8badf3859ab318e996bb031d13583aef80d442fe74417d +9f0732a78530aa6a8208f9415e23b7a34c0c9d29a1c17dbee47af50618543f8b +f1660b91e6fdbdb641f0ec0e0a80afbaced5e6383f0279b7a1434da672470a4e +617871a7b604101001208eeb3f2b6828f6d5b09bd994cd7af5935041cca399dd +36f8eb10bad58cba1d671c101b4b0e445935ca3b692ce35b384dea0bb2afeab0 +8b7b8cbff433859188c099b8f5d0829bee0cdc709fc3592e7c699976b9cc8a94 +c21be8df72d68ed8fa66c0f15d61b8381bc538903b412f94d4d69b6fb6172711 +98b48d0f8f3ec2f4f874247dc8f018bea20ed272488aa221fe7ae39e02f3e660 +9124e4f25a2cb0a5b0f4afa077b78c338b0c786eda15369aa62ca48bc1b4522e +06aebafcc369925592f0f9d16a3033206cb729d6e701ba2a78958ae5daa2eae6 +624ea310f14b7789c00ba685517e8171002c6d21be55af191757094ba46a7dac +47ebb906af239619aee06583dc600515f923b40241aa9c91fd67135b3983d87e +47d1721098244c520cdb85cf659d630d3c6f393db002db7231e2c63ad55785d3 +db9037caf37d03c50b60ad943c295b275b6de5cc5c208074b5b1ab7906a482a0 +dc6932239c09a93b17b8e899c9c630215579b263b62acb5868655ab3967c69b5 +7f5a557a98b8e90a4c8615359dd673bb7159a168c30d3abb2384bace70c4cb3b +f4551f1f25592729ffdd086d149d8eee5262f86704a18512943e0a08a939b0c4 +d1256072b5307a1a690818cee0fa1d876dc322743ffcc0205bd314229f16909e +8e203c980c51c8238a6a5fff859583d9036b474eba1cb24d80838812fbe6f80a +2f949b6b6a88597e171130b3220605eff576c5e5b3ec641d67422720bd33fc88 +60a31ad8754b82e8903a2c9a105baa0f01c60206144405be860194505dda1f83 +edfba361cdff818e9dec9524eaa254051fa1f1dcaff869d3476250f9ac8daa5e +8e934d99761eec112a1c7a63e896237948807cdd7718fa863b1677a293b9d52f +180f9875b45a4e59eaa0dc652ae0c73376e8fb92ca5b01bc4c32509d9df7b1e0 +54b011270d68ba7b9849a4105c1047e88870db5358469d7627615bf0197f59f0 +abaede9d2d5686ca4e9bf9ed8a1af123fd572af1ea5a1eb0f776d7095e7eedc9 +9145a06f907f23d27315cff3478def1ba1d90fd9dc36eda386f1f2d5687428af +b522f21a95ab86d108057dccfee7ed14a4ee6465cf4a438ab838de119a273389 +4fd859b19e23f23e74504d3d94211e4d2548899a4a759f194b0b5e65cb0f0e27 +b26c4b2bced04fd757d623d0e4486b5a230834cc719f115c8d6a3c79737c95bd +b07c55d85d1984902023ca837c52fabedfa3b0f867c8dd182a93457232ae0e2c +169693d1b2f84d06a5b6cc718620cb9addd4398e5ce8459c042cef7e320b484d +366d26499ce5cbdf89f517cd90b2f4ec83ffa94b5e6408f8c230a1c743a3faa4 +59b26c10c215722bf6323cbd63fa190af6da683bea8011849c43d1b6264762f8 +5fd7498ab1aafcb9bbe9fd1a81e213a1dad90d7946dddff0c71f53496ca7856e +a169da59ae746298736459c40117d1423fc29f387b2f5eee8a58f3395580b457 +73455305743f1dfd1892ee781ee58bc1c7bfeedc002db5a6853711675f1525de +4e05e0d98875112f349bdb1b60701b4650a2015147b8f49994a02bfd1561c8ea +937d81e2d819a34ebd2ce63cb1e76826b2190e67e850645055e7c1be3fa8f42f +7b90817fba14287d5f3f27e2c9444f7fe2f46d48d2543b4943362d663600d9ba +7111b252d171091fa0283cb53ad4766142deecdd04f5c5e01ddb9fee287d3d3b +cd2aea4b44d26941f5d605a39c2f9385671bfcd8d99c9b651e4c83efcbf47cb0 +7f9e6f1e8f22c7680fa396de5eada2ea24a148df9bb7ab6b8c0f10a44f3b2bae +27fbb8622601b26bb8e988a32ffee9c6366bfe4dd45d00a2982731a7613cde18 +7df7e1b53b894eb4175854025e00bdb9d3abd87357059037690695911e24a976 +e842a17b471cef8af23ed726810b2f5dafa5c45282fffa81197addb829265037 +e6624c78ab6b2e1b420f2e7c081415c40cfebcfff9ded542ade15b30387d074f +d49b146669815cf7a7e3f2f2b1200df853bddbbc723e83e9a6f6a9e48a9a7fe4 +63797e31e517cfa4d62e95780ebf6723ce0ef0df918478402c4ec18b2ef31b16 +9d1948a37b1f5104cccc0d7078fe9f99a0ee49087628ae0976a7034c01beee08 +57a11c7f3418a3dfa94a6ecd457985edd820ede2409fc85496a2c99e1d40c580 +b9100d3249996ae768ca1dcaf30bb73923c854de63372b3907031f3c8f560861 +6cb2742cbc36dac52e4a9b30d8d2ece2cdbea66e4859f48317705ce6dd31c746 +425def64c94d41c5b5cbdd15071c1d0902730e74ecc00dec7144661c16441369 +9eb4adcb9d7f0694ab50454dfcb1f37376bda3fa8121de9969901580091e2549 +a1a6449d725d5f00ff6c08d491d4f9827eb7c448a797c4587486e52dce0026cb +8d27c20b5dfc4199a4d1804e5a6119ff8b31d344effa4526ea92ce977a7b9214 +47a2627517e5199e7ca8ebfd64353bb2df770be24763eb249ca31271f81bd9b4 +8da98f3824081d9cbf0786890707741224c85d2f026dfc3d704b1ef3fc5159e1 +7cda95fc0f9fca39adb3818220c6e70cf9a8e0e6a45a8329754b1155b13ef667 +7c86cdf5adf29b6f66b9ef7ee5b3e5a2caa5c521654315ee8f3c7a22ae275b8d +9ad4097c8912f473cd2288ccb1de14bffb182f912cdfc4607632bcf72a68472c +a3f73de61b8b394a58c0c0e52b8a3da52364aa462f8e60152ee89e1d7d808600 +88fe204abb99f8ab3dc162365d0fbd2ab2361bd2543b9b2a758c73b1ffafa248 +d452b5a6c2cfb32427bdc5dc15e50f89b641eed24457d91ee1603d34caa40196 +809e0d8666e0a193e981e3ad9c7d69948951ebdabe3188691bc1a98c57b37155 +917e977babecb60db4267e019ccd4371b4801564442e49cfd94a027370b8f11a +aa0a21d0907bc37bcb4ead45a9f86babaf59748cf1bff59835a4eace1a34ff54 +7c0bd028a05ac937dcdf0a6ab614fcff03c4f33ce73d13d39f25b30b92774940 +a0a3c15fa3c8acc1fd085fdcde10910da72c8c08074cf784629acb12ac7d717a +4960714d62dde17964c26c89b5aaa8feca8398b5635381ab0043ee7dee4ab3ad +6701e18de05b2668ccafd75f0db086da302816c0379b2e7793443ee1a23df2c3 +7a2c2847fcd45b656e1f41334e6d815790129958be71eee3fffe94ebe8003316 +3e46b85d98640b155d7e8d908da655deaf5cf8f251f6291ab69a5f6694f58aa1 +baabc9bcb4688ec44423d90e38f5e30a9e8082332d7e9c50799b5a1a4f4952cb +e5d11e2bb7503ce9e724bfa8082971aeb37565bda258be47ca28e415d5e04062 +ec3a2e4522739f528826221b893d1517c3c8de8ef30f8c4a020d6f2619aea149 +eb81b34b683f007dfd5ffd5dfe42cfaa691dd1309615a3be2ba68a5ca58d8cfe +38a5f6bcb225dd6583f593e44b456de9234b2ae9ae5c248894945022a6137ecf +acdb185dab1883d804b7d7674db1f461ef6074b4321a952f60d3f706957a1e9d +4e8663e76d4e48028f52713d41f6cae0c11d81c3c1e04d1bed5fd1fcffd18df7 +50795e4a370772aae4de369b9ff39f44d342d5e0f57e89f13656c84951bc7a96 +4437a2d0af4f4301597fc29aae8d1f7e857ffc64b8923e4b478d90f7a66c5ccb +0384bfe956f2458ebcda09654723d06f8732ab7718277ca23896cbb42db207c0 +1b87be28a819298de3345c9689de7a49e05af7cbf05004a139ddf582cbcfde68 +357f645c3d039f08b1ca3de537fb65d670afd27ce6dbb05d6d7b7e5de4a23c80 +2bbf1af5aac241be2b50c6bfef665ef7fda1dd2803c14f4e7fdef97f7b9e05db +600563c561353a2be5ba4acf2fbfd5a34e0707311861a56afd96874aa67228a0 +796b860a9bcbba872e33d921f70f7cfb053e4969e5fa491a86afaede9e94e0e2 +cff77e4498b657d6a6080b2f3a113566ae9164122a47c1a7cd9d4dd06f88ae48 +b541004ca24713881bc345e0a4c0632869e7c10c409ae9b89d18d34e5b6cb202 +c0185ae366e3790d0c8ca01a645c8c5bee6892dbf7edb9de9c49583e4152d760 +bfd8adc5d0a6d012532094a69fc9c8f22bc79406f55f9e070a432f30f0953c11 +df193b41b857effc9cc9c6339aafb527041dde7a5ef5d833a0b9d7378ff1bfbd +22c129b448aca2f40b0f6a2b6c727989bebe513a3ece99a85c5742c13937ef75 +2c2e2c48cfd95ab1d5121081f5adcc00920e7cf45fe6380fdb680e9c160fb9f1 +17dd911f3d68d63313d31c758dc5127b62ce809585dff9feb1c84ae685aa53d4 +a0d773a70123ebc8344eb4412e5d4e7a1634574d33c7a540aa5d6888bd9ce53d +f9d4084403a09c92d1e219c252c6f2f2f8204f1bce6dfd59768c129a6c13a12e +0f872c89f158b441a0fe6eebc8c6a6ec953210134825b88793da2224dc74b42d +730c760e9cc2ddf251eae24ab26de86e02eaf70bc7cca7f5df06b25fcc88dff3 +4f2b1fb4005bab3e0e02ac3b9363325f507dfce0b90550ef10f7606fce11f663 +0439939d4e0d85650d06b9674a571bffa97e45df14a274b04dc15ba175a66b20 +60d79321f9307eedc7f2c5e8c12cb1751170d233485a608051500b853974744d +5fec52f5abf645dffa4202d6a8ee2e550023b1ba3dfb55dca82541b98ff6d7c4 +d1610704ad98ea8a0d2f01c42cc7bd7a35a5f4da6115f9be15f3267b3d9da283 +3c2fdfd549ca4f11e4ad0b4ba4ce23c425ea33667b3429a89911a1e5c31a7b32 +12f1adc6f3a85f4cf417cbae988f3f9146563503baebaa4bb27400a643d9f72b +d4b72369f2bcdc7f8b55e1a7e3f35a7cc63a8bcf3b27eb30c32815c2c3aa6c4d +191420dad55fb70c0c90daa8c95aa80e0b524f5f7190ba2fb2d6a9f32f2c1975 +c04aa40724ad75dcbcf6e968d49033a5c84b6b0dbe995f057350c379be6cf9c1 +556dd0905e3c7d0dc1c1c02890c1958912b2fc096fb0a3f6e2c83bfd1ae0c48e +6ad4ac16d632be6fbd8f1020de4a9a676646765eaecc4434f4fa6754a5bf69ad +7fdf4505f82cb3643dc9602e88b4baa1226cd172db1023030e24557ed14f834e +c17d30cf054d9a7fe422a33658aae82ca4e4decfeb1cd249f87be85eedcce016 +9d368c8c6646f65c6b0e86bb160150a97cf5cc5ed02a4b66d97302bb9baa7557 +5aae2825892201674d665595c6433b241029270206275e5168d801cb61161803 +9eb81c5374084aae957813063aa8e99a9a6cc8bc7b12ecb5aae01b2649995fad +eca6559bc45f18a7ffa65081c891190ca4d23feab45ffc86497eb2cf6721297f +533bc50b03f6aaae79d70ddf5366629bae20ea39ea9c96da9b2a759df4eea26b +9b8b42c2bea8b1c1dbcbdaff51d76fe6aa6e8c08fa6362913c4aa19373129b77 +b7b8b4c4879aa07b8fcefb3dbb588052c927e7b84b1197e7e6ea5a15144c614a +5c02f94a10206710465143aed29007e58615270b73baa639e98b626716c51645 +2d200384dfa58fc4f51210f22c67e218cb779c2496216d66589781b07a347db4 +076070bf7ed0e70dacdda6ca88029c0c032fb523878903c1e795679c41d29e32 +5f5dece443f5aa97b7506f2594af6e8e15628203a2f74e3e703088919dde71cb +a2d563a43ab5ce41a84d3bc491ac9d3fe7a3c0a63a7a34b8bb4df1628b1e09a6 +ccace891b1c1d22e50d8856041982716e56c70f9858653c73d82861de515a821 +dda4dcc53d96c2847268de92bcdf50217d5dde3c4a7e1a6da8f7b0388354dde9 +f98eeafecaf0738d654cb599e4baaa68e051f0160cc7428b96dd1447fc9b7bcf +c22f860b2b108618bf376f0312d7442aa88231cc72886a2af61ac97d6385ebe8 +b96c25205cea2208cc1fce5710df07803b2c60ca4aeba8531100913e02ad5a70 +f527ecfac6898a091b2082ebcea88c76855661c2ebd88f2e45805f4d00703b6a +bfe8df89ef6a41a8170fc5098bed8b51f16fbb4d70d78135c474427d9d3d35bb +dea30d64d73de31b44da120e131ad75e0f8bf243bc06e34e25ac7fdc4d3d5721 +4966c4c778a9fa87b7ac67cecac40c109bccb771c98d98225b1f7d681690faa5 +9b89b7b364fa651f6c52cd64ac4e32f584e73ec09ff4de7283dd5ffbcdcd0580 +86e0cbfe336217d97e917ddc757eb727a249a8fd9024eed6829b1daaa47e10cb +acf296b52ce19308876feb20d4259d7220a062878334db342cc4e546d8af39d3 +a395d99ae8e5fdc5e02d66f5d2a3ac78a333839910995a682ce355f46a492321 +c35e30952dae667c4844bd492f592ea61bc9441d8cfde8cd07a48716fc5f4df9 +260a904b0a800e5404ffb88fdaecd25d95590e484313e3f63386f3069df0d8a3 +2058c2e5543170a4b76e2dea577205e8795874764f7e72ddbc394703f262b64a +ad5d2f1342a48c0d0364316c23709c65ecc0a66e3f9eed92c5ddedc001356f21 +34091f07794463090c82f419bb33b74bd577dda2eb41184f0f14150f80f0971a +3438fb9c97f5a37739c0658a1df59828df06a3324299066a042a3b87ef61c08c +984afc459c53d2387b59c6beb649774f6424605e4925a228c70f4a1ee69f86d9 +8c2d1078ba0ec0191038632f34f07a70b5bcbee4187d443888a3ff81cec64a4e +dc845762357fc030777ae09117ea87e2d637a717b66f5a986c4ad5796df2209d +b3ebfdc9e917e9891f8fb8319ec1875c4fe2e87a20164f784a604fd4612b50d4 +582e4b45126383792500d18fced9e33582a627b30fe3be54bb557c4948d5ddb6 +81641592de540922e5d3d5849819bae0bbc0b0943267872cfbb2cb6ee0a97dff +6ef9d6eabc6e7529293c57eb27be7449fc7e8128850eee6b63f4533ac7da79b7 +986b23eefaa395f6fb7ab59596c56870cb6eae2fe177ac15f5a5afd45d4098a0 +578d42b204fbda6180b1ae63df709c2e723462b1debd2d423e6371dba37ea587 +fae0ed09616415a055b19f39f64f30b4a82cc1544475d30dff84c1aaaa539cd9 +b07379b977af5cabaec242eeba8e8289f168c6820ab4bd3920d09299ef7420b2 +101649446f993dd6f321c3a0beaf95f05fefdbbf1ef50c3ed7d00e02626a5eb5 +dd540d0a60c8efe3a0a01150af8ef705fb20bb8cc5be7c0675442009364308f0 +47d8fa7a4b18f2c8a5f5c29b7ada09217cedf13026df1d6a74a25ff1d46de278 +f11d5f0ae951a592a23082031649979f12697af46be553680ce4226de0daca52 +cf1dd13e1d12aed25e5fcd2904a25b2c9649dad897d9d3e9f3c79ec2b307426c +276dd4f32d92245c7767155ed5c7288712335d8f8f992afad4dc3cece0fbdf50 +8212a8550655aa897b3873dbff7ff54be068430f91a2825b737f26ae4e29fa12 +7c1aa1ff2090475ae422a80cae3446cc1efa480122eba85c42d142facc621e9e +b416ced9b606c41bd71e04171bb76b36bdc3269a5942b9000726d2c18c636e4e +9dfb61994e35c1b24c3c15ff13d9a6825a48576d7f69d63a08ef0b967369c58c +a8deb7531f4ec4d4331fb89c49e2f3fc397df20067f8dece059e3fd74c61126e +71ccd9a26dcc0d7a867a52c73e894735f9f4288186323827a635084f3c685496 +936b211b0e19edeb0cf141ecbf2083ae654c32aa7d46f82824807d94f05f66f6 +b31505b7d38d3fbae7a60cc305953e81c57362b9d19b74f95cac45d1e02eb53b +6cbac79ab5141b81f154cd79a36a894b5655c2a81eb7e051c03a3f3a48c6e5b1 +1af8f943926e6005bc2215a8145c33854d78cae43c481bf4c1a807e6383c1d10 +9aab88041dc8800d18de737456014219aac65da11673d66c9e9dd6138aba485b +35c08ccf0882b130b11857e6ffe1393707b305b57ef8d4be49629ab54b47a240 +a2ec3257c0703ec4907d211ce053e1f414c2b5b1cc0b3d40dbf3507740bf1fc0 +96369d74e7018d0ae0778303690061646dc4eab7f6ba825d184669f6b3cc864c +470e5246a487f3d23ff328cc0d377df5fa689c0b98d46b5a1983401cefeb65dd +90dc8d7cdb5320b56ffcfe98213ead81fa180b703cde5d0e68e8092fa502a352 +6fd9afcc8d75849bebea765c86c700aefc86654166eaf811e44f942f0e9a774d +67c94e862e5906be4ad7e88fd70d8f04069868733f13173578e4b1ca4b582bc8 +6b9241bde7d2a34925d6b481774505b4184b4d084f43e5ea4f9788e71ccdc95a +400db5f1b1370d595db2381941a16558b92ee8e7578188b5643e5dd673606152 +6b8e2140290ed148a9f92c5b545b874d70c049b8355bc103a3d328b3e8841c8e +3dba2b658587aafc3109c5a2bdfde2ffe3850a502e4de17802beaddbf4ce542b +f4097ed98c64f80fe71ec216fb951601c367509b02fdac83a29b15273182bf3e +95cb99263924cb615456ee0e5ae4c7aa6f1ec6a948efb734c49073ed8823e552 +386351ffc1ccebee82632b49f51277035274e76b05c28cb5987ecc96ee815eaa +21c6d26f70fcbc7c7b867a5237fead73c30c0ceedc417514191fef7aff960abc +5c162dccd3bfeb1bbb3049393f9bc0802fe10c61f73a6d4592d16bcc45af8201 +f5cac42d78a974c55e124ddae9d8eb1b6015fb2588cb27e118190b315cd5e0d3 +2db1576890d0d406441082cb85d301fb8b600eae783b8842efa4f1b0b6195946 +99066b34cdb18f219756f200807e740fc003c39ed4dc14131eb283fbe5944fad +f93da0205d0d2f1190869e9df546f9fb77071c01b829c2be4d2eba149efe200d +3d1806e061c5073ac4c4ebcc06b3e6b908cd801fbcdf45c1af6c0d5a6fbb18a8 +2a482d5d81947b38ecaf5abf60a029ed7ddb12855a1ba11f629b9790d9c3e8d1 +21951f6a7810f5290008457b5c05bcdd26555c346b7d2a43833599e5ce94c8e4 +fc121012ab5d9c0b019f3df52d371b89fdfdc3f9203da2efd0ba467b3c2137ff +878bce3e96c9ccb7ab8f7c24be27623e4865d7e3e6807902268033921977c73e +6615292a86963683013b35650df01f8012bde85382550255155b47d40e8be11d +d982ef4ad4dcb7587693eb563a785c +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N170/TimesNewRomanPS-BoldMT 1 TZ +userdict begin +%%BeginResource: font TimesNewRomanPSMT +%!PS-AdobeFont-1.0: TimesNewRomanPSMT 001.002 +%%CreationDate: Wed Feb 3 17:58:35 1999 +%%VMusage: 31909 38845 +%% (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype +%% Corporation. All Rights Reserved. +%% Times New Roman is a trademark of the Monotype Corporation, registered in the +%% US Patent and Trademark Office and may be registered in certain other +%% jurisdictions. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.002) readonly def +/Notice (Copyright (c) 1988, 1990, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times New Roman is a trademark of the Monotype Corporation, registered in the US Patent and Trademark Office and may be registered in certain other jurisdictions.) readonly def +/Copyright ( (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Times New Roman PS) readonly def +/FamilyName (Times New Roman PS) readonly def +/Weight (Roman) readonly def +/isFixedPitch false def +/ItalicAngle 0 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /TimesNewRomanPSMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44335 def +/FontBBox{-167 -250 1009 878}readonly def +currentdict end +currentfile eexec +f6abb3c4a9e98add6bc26730a9ffdf20be50bcf6a1c5637622935fe077cdbea8 +f6323cd20fc451ab06edc1b1bd58ba9b9a7a2aaef053f6417b8b06a9be76fb0f +72a917e7eca5721ead2adff9028755e2eafb35c6076ff9b8413882132021da99 +2df81fc44b9db8dcf5dd9b9600cd0b7fc0b4858bc9d808b2014ccd52584b7cb6 +ac5984d86608786a95d7baa1fe5066f3c0860c74a5a39137d7316b3a734684fc +4744160cb0cdc44bc7bcd4c09d103401acd593ffa19d3182231598686dbcfbb9 +547b7006b778e07937882e23ef5ce04a8ceb5b649599ea7ad9b1d42e4ab3052d +affa1f481c418fb9f2fef0365a1d783c19b0d481896e4db2dbf81c8828df8a56 +dd04d98a01d3032af8deb856eea90335c8e1267a07005a470adf1e3db998f342 +f499fad7e323b00e4aab610d6e6a5ba06a3d77d722c07618416dbfd805cd9ee1 +ef80d47567003d2c012a4820d817f3352827c5321f65e9642e21efbfe30dcb52 +2074ca047c20fa9a6ce5b812947accab19a5bf8471c2f677c2b3d1c2e4c3d469 +959923ae73436f69afbea1b4bdec295361258731d99cb153972a7020450812dd +11dc48abd71c472392234b64dbdad62d30795ee0862ff2557ddc8f26e5c6fbbe +efd5d895d167e677c98fdf9ac79a79d0de6e7a0359281cff958092060cac12b0 +adb73fb28afe6f263cf621f3ac87532ceff5a89773ddfb033f9c1d9820acb670 +c60f64ceca281adf959ceb1336c3784d73b7277d34522745beb64bbf53bcf87b +7ed201188547b2c10ca9ba0a3d45d86203dd3bde394dcd39df57d9d823a5aef6 +49b88cd21aa4e9c0aff5fed7ed6503a3bb8731b65066d87561843fc8d1053527 +f67ab7308acac63485a36e2ee410db74f4b40047fae14502627d1cc7cd1aa96e +3ec74cec95846bbb6a6b561dfe512fc9e08eb319224a63b3edf68ccced96c977 +3b00e3dce561e2eab3e0be7924c49d8616c1fb025e267dc4d9b97b28a8b47666 +292f055f5c611633a72276212185b2b691d272460e4b84797053a4c68ef08e4d +335192a22e85aecaf0450d068e92d3d655e043750804fed4b206a3a6ec6dbb6f +cfb146668509329d6f32a636c3120dd0982374925fedec446eab19eb6d756fa7 +23c5f23530cc740bb7a800946652ae0f2f79e43ef8308b558ce9fea559f0d8e0 +78a2424103d41bb8690083a71071a37b787dd86f99b5b457637fab68e74f048f +e5fc975bc673dca66ff4b8bcd3fd37fba7ef83a0b6b128a3b894a953cb8b4e1b +144cc1ebc168a74187e8c92ca9f8dab0635336205b46c8188c97046a1a09940b +8efbcfc6acad7458f4334a5f8ada324176a97f0b0c846be9a39a15d71bbc661d +8dfe852b945b17a9ae0e7c50f3c036869e479882afbe4824a1bab8ec451a3faf +3545f6469bd7469e70c16e9b21c62f2b7e8a9849c529026dd7db949225b9e1de +e08e523028f6493a6a242f6f6a9155abf5433c21916e5d0333554fc512603563 +81a17599b364dfb521fd1536addcda537621925c4323c428be5242a948cfbc7c +66057ebd295e1dae16cb509d409f13e41d18e575bd365a76d9a9b66ef91c223a +fe014849f2a0589cb8815bba87f687d0152af615d292c2d3622b93785497251b +9d3487e36dade8678e6952e32ca9b82e4c730461b460c87345ced26933d2a40d +7cda7f22b684f8b1444056fcfe5b319de2507612aa30264ec5f2f57994965326 +92a2acf19961957096c5329c35fad642f8cb6381252db48967ec8195a1c65eff +f5477791f7e5844144bd310813f6987ad76e03957e00b667ecd977a3a4e5e22c +92c21ee1c8a5cd079917c97bdd1906f85812c19d4342456c89696163df16bd89 +88d595e216a4dff03c799b732d44830f7b5fd7c4b1d57993b3f295de9734d670 +399e206faec928e6a921dc501a066790b23599364c4dacacf61dbe4da5d2a333 +972193dba868b79992de264786d40969b5fdb92152559d3ec8dba0cf86ef34a2 +78baac6e02937f01c890a931d407a316bd19605599c886ac430a37040b6f8cef +3803fdbd23cdeb165bce1063da271c473eaf710034cb04d7edc330f68205e265 +0b92d285f880fe76848c0236cc32bb73f13a60890e1405e3cd4e8acf47ae02ee +b1ded8408f856b5bfacc2e32b3eaef2add12046471c48a396533b417926ee7e2 +e21c4190d7f0a9a9bf52839ce4b7517703740b61eb91d190249fe5d5ee58176b +dbcefa0d7229f1150094b8c649066c1b1a759a7a5df8ab8893d92f53ce8ac5c6 +50c13a327c0f2ed6e40e2089fdeff33c862923f5a2d88b39aae0069e8807f400 +bd3bc340616fa2482f19c4596399bddfb564f843cd535ae124cd1b027b7fab3b +74d617a8ef6c979283b83b7d2605bf8fcf5b15d7ee6c18646be9a9fdecea74ca +f3acc4b3bd9937561865299ecc89484b9dd63429cc2a0eeb55e299649b3cdb9e +58700139005ad609c29290665e70946a2af3787c952ad30243ba31eecbd50bac +3842ec204cc8b32205e51c059b68289bc51616bf3569e2ae3fa64fed308ab6a3 +1bc2415d4983b4f3216a9a060a1f0e9b3e3af15efc69991a4b876deeef55b8fa +7f54797779a4c42d9f3fd2a3b86422a1d2f3038b305de2b56f0a037249d37d29 +b589a6d7dacd1ecf1767e0460dbd319bc6067d30ebd41972bfe93614ace01429 +43cadc5eb0c03df892bc05f058933e8be8564988780a915dd56e819c261e249d +ff2442f3ba0481c2ba39ddd7875e98df24dc5789972500c2d82dc1358da0cde2 +72723d8e8fcd5f8c6f2b456dacb343dce13113fbd3e3c03aa4609513b9484231 +c9dcdf0b89fc2c69fca39c28e632569b7e12c43ac1ac7353154c2dbf592b0f3b +b5f64d2c309d3c5c92c6ccad216af314dc3cefe42c3236cbfe8a0c3ce9dc831b +9e39bff15b37ca3c070a0f64b1342c3be9808c5c8fe3f3755eb27404ef0ecc5f +2e491a2c5ca01f9da22e64b467a554364c7e9fdbb5d22c219a9f3442e2531640 +084d4330c30bf97fafcdec9fbfe366a813e8e502afd1c6148450f356e25eaedb +fdfc663fa484052b6abd9763bc2785bfef9fd51e9849c552dfad165b61a1020f +0f99d3fe7a4f7f8541478a6a10bcb91f157ab0283fbf4832a51de050e76bfc2a +6adc1619554443aa485d6a574b04d8ea1a97dcae958ae6596ea4652bb1798cec +723a1857fcbbd6e139ab8b019cae0dd740199c6f9949d8d599a7194206c2c154 +b92c82b677a62afe4ea019a1f5aa1fd7c26aac0bf0b0802016ef05b723fe48bd +6c0057725973bc10f3d4b174bfbb4202ed2dcbbcecc4a903270659e53f139e11 +61e94a2243d1a3c3b604df7e7200be9fc88efbfbce4f7e61725fcb8452daa59e +2ce841f42051d3d44f0c9ef6c9b3f7c71aabe267695157ae80387733ed4e3565 +8468eb67ce14e89b27774e917c17486110daf77a3e4546f9784542cede6c400b +41f28f26c0f2c2250bdfd90121739430584a3b903a5b45743b78d2058302e67f +416154e503f9fa79e4436c6564c21b1d6496f12fd3cdfa95d7c4a1e12623c14b +59ebcfd7bfabc3dcf9103c30a8a9959f35e956af6047dbc2684c479f3670b4a2 +8fd43d805c994bef1f4829858c2f2e0762a9360a701cc53d687a7c935213a96b +e243dbd06ff93bd4b56dd8f2e609e4ffc998d19ac35d7fa920735f0e13eeb40c +17d9e85d21ec383c824fd9c2504aa9c15eb94ba1ad3a9e818a195b02247d2670 +dfc417fb6736ffb3622d34aca0d55c859a0d7a0db9382fe62f00849670a5d8c7 +788d81e5d1ada92658b6abaff5b0e3183921136949bc11bf2db8bc8dc3989a4b +c260301329898ff3b5cfacd779005178754f96c4c40cc25f108bd056877e0a66 +6ee9ae02a62c14aaaa06379cf132b453c9969637e5c88fbc352ff12368529994 +a69627090eef23227c64497e2bec8c4946b6ac966153b7ed5cdb59cd166fb67f +7ff876502e1082da14acaed323da50ee782fdfad6620b830937a55446a73aa84 +a0b72a7e5ef7b2f80a6da25142b175c958223981902848649e2cbe83b11d3652 +6a4ecab1a90791d6ab9041087d89af8f821bfba0f5e79c09e1b5a315b7966a65 +b28d3b31ba53862650da1117dc89b37856033c631c7dec7bf99a394c750867a7 +82f14c0fab9608760ef3232e73341ac8e116aa0593abb709fe10b204be8055da +57628c0d80860f5503463a48b3a04dcf41334f1c64de87340eda23cc1ed63c1c +c75cc3417246fd35e30956ddedbe4e45ea909894c57ce3e98d5590de5e27d869 +89b77133dd5e0239664d68c38556829fc98862426c3efe551eff3703e4bea882 +d7bf89c80b6ee50b505de1160df1a195bec23c8864beab038da856287492a547 +c58d0732296248457b9babdcbdcfdfd505a8d4cf640e5c35ba9aa1317f148b69 +c29d429ccfe45a82311271d986e69da224f92dd8ff09b4bce066b665ed505393 +c4c9066ba1173d6a47b8fa535dfd8e5aac10f99ea120cbc734d80223e940b447 +576cce30dc9fc395fd6b655b2d5ce3cbb01a35139b87949b6cfe167352e6ba29 +90c83491dd504adc95c7a55c0105c35b58c400183016363b1b3a30ceacc73c50 +ba9a46d04b052ef9b59be5ac4247b17dac3bcebc53709a47e3294288a243f674 +148e2064c504e009034c9a81b03944fe75bd4b4cb9705a6e5e7f5fa69170bc3d +cde77ebc7c9612cfcf4f26ed4e359e71eea513d0c28d701bdbac3a0c78a573bb +557550c2caf200e1f890b1b2ac96c6ad6e4f2240310fb99d8e2dbe4d8ba38e63 +81b5af191bff9052ca247669f6392fdc9fcd650a547e80e2b66e66ea171833df +4e5d2d8da5481fcba57ccc6d1ed120aab96440d2f365a70558846e38faffcb5f +f6cf29a96b2195aee40c2ff4bbdb2f7c41bf243398061f7712f848ca54d56ded +c28481ba0f8f9a79327515a31dd77f3638f184be301409d422331494d5dcc406 +40df68c74e290717e1e5a321feb879d6df12fc7b59265bf8b02587dafbd301a7 +10548072a7dbc384f1c0ed4fc4db552acd56643eb00d2ead09f2233df1a0635e +d044f05bb675f10ef340bbe58a11264b602a06d1d5b050996708a45c4afb377b +211ed9dc1eefe33e368df9ed9340290da32aca7283d582516d4082e4176fff48 +232d75e6e2e3d1777da4a2638130b88a2722d2ac4098c7cb08b0895fefe529ce +b7527ab0f7ce08750ba94ce6d34cce1d73ed935c392aaa68465612f13068bca6 +ac423c6b1b7e6fdc60097a495c6a4c2aa64ca653c4a093b07ae20eab4b6e3469 +feddfab424d093d273c16fd5be6975923a1742f5316228dc3f3434f9b8284fe7 +267dd4ba69d8e855477518d9f547c21050eb78928bc794c0125a204dfea19216 +e29ce4a67ed2567eb4f75a2226575382d49ab39771f6b48a11632355e0d66fe9 +1b8c86b62029875dd768dd002229f8e6a64ec32c9066afb5764888d91cf8aa6c +007b21ed4ccc7833f300f1f64ed17a1e3ab5f5ab06be612e0f5aacbf5e7fde04 +113e0a40561001af0fc4824813b1b7ddf5b0124886ab91fba3cca84babf3e182 +381b5e7f29384aed8992925ec497b4599f15574214e8ae577dbb498a0e625f25 +237c3e0dc3a0ca8e183706dea70c000fc0116ac0f903a7966582a3bbffcd7c8f +9a65bdd23bbb689006814f8e3bd2fdda1a033351061a9c4702887ca4fcab6c32 +cc3bceecd2a2ba21195f9bc4e9e9942672bf4cebf2e2cb4eb398e5aad63bdefc +cc0f68cd83fae94fcfc96d02a4b64ca69a5a3e416fda6e0e7220445895c78db6 +65922ec7e70fe6f4302fbc2ec1d4f42538ab3ef4bc14d8f34690d6064099d3c4 +3a8223654616d472381626d18a03959cfebb7e1c012dbcaec4feea490f1468c5 +a1646a92a94066f40357d70c2d3bff4d47053936bf3b15910af863f39c46881c +65dddb3b43cf586c8182d05bfc7d555edefa8d0e136c927db29771f7c28fcf19 +703ee5885021d2f6bef4a7a954d96f818247f29649128d477351743242e03689 +049d804633e6b89486c6017fd256fc94cb3e6c2356597af0305f6f65bcb2fff2 +43628aa549bb12795bd9a3874a7491bbb68a7988420ba782c3abfeda0f24e7da +80a30186af4f1ba9bd904920a0cd4890277a072bf28a7304b4620ca544d38182 +5422dc7897e3fd01e95dd680bbcc9645b72a9bb52818ad22a36ad6983725bba8 +45944fdaa6018f14edb790cc44476d856b0244db1ac1b8ea32ccf11c34d2e0d6 +8416044098a01d814d0abdc26144a6d95333343a66d05b1e05c33d171d2d847c +1194334ae1f2b194410ba28540cc9893d12590b7bb874d251121c8e627e39b72 +147bfcefa8d15228297b629d7c2edd41bb14ae28482550b6a528591ef09fa74c +ba79b8e0be0de751bd78725b2ea2bdea0e1e6135177271dc802866f884e75450 +dcc5faaf4fdbede9257d40144023cda224ddc35c6f4ca6550734f2b1b6c0ecb4 +fbc0f0a8250d0e561e2d1c1c09c69b8d8f6cc8269d37c203c43e1b906ea6283f +9822e01a2dfe22834df194765fa7bf0c07e1cd4058bb3b793d57d01622663fba +dd203b50fb215c5fb6a29144f3a40000e86d5f3876967445da05ca1976970359 +cd13413152f9f2620a05b0287fbaa2680548f1cd8091ad6bd4a98f98bf64f06b +5c944ba7ca5af4e91e29209b4e1ce53b06bc9680ee09f99ada972b1c15033be8 +a6019c7d1a72778eb31f5947897fb06a37c24199f65d8cebfcf011617c2f8138 +8b6673c1690c5d566f22e094c501cdd836f5ef61cd43428f175df29b43276796 +08351ddcdb6f3071f44d632a1706f8c1d8903fd3cf5b03be1350c6e0795c1b0c +b2df64d47103ed852bea3d5ff173e8d956e61e8666d15d3350e6bd699856e444 +51ca1ef6605ef7fbeffee932cdd5b0ccc32dbcadd0e713acdc2be6917165f465 +a25977eb3d88134aeb1e9acce8aba657cde0a6a906e204a1dcf3eb1c1d9ff2bc +e61878392516a319c717fb2da43c6cc1a0bdf294d1bdb84f31b3efd302528e7f +d49ec2da1ccb5e36d10ccda5488707e58bec5f7d18ea999ed27e226b60dc68b1 +80a78da57f6b392c8e54beae466918d2b07d2ce40595a6c9c02684e3aba73e3f +a24c9748a5304c7cb2a2cb669b8e33b46e940886fcb5ddcc72a548e330796307 +b8d087da326a0402deda94d6502956ccaa7b4d64550269fc6c926593d4e0dfd0 +c7c98d7a97c0e04dc5c3fc96fd9d032854346b45bdef9f800d5f7dd51732c815 +fddbcf50f0ef6782c014ecc31e186f05942722a0c7ddffb12e2eeb816f528b98 +5f1b19877f54b6215d3f539cea41128a17fa5ce78db583ef63ae628e84af8933 +a07099e055f6f4bea76429129f16bd5b2dc70a072d57170f0ae1d31bf95e6529 +81ec9b496650b74632f5f52c54347b359beb5bb51ccb12aa5ea4fa186fd063e7 +c727c366518060ce0dd6807c5a98d5dd0a3fc6ee2a83d75f621023de7a6f50ad +92e2c64a458b0dc4ddf51273e96907cb5d95bcb28f2f32052c73769564e30a47 +1720f92eebe81a21cfe03cffa887c459798b39f43edb5705e2af693e7314233c +6b6e38f0c4e11b824edb4680024fabf424ac73e4e2ecb891ee856e3fcbc6a0d8 +71a64ba7196cd535a7e3218f686cf1e3e190c33b93c5440d6c3d590f7ccd9db7 +76240ee4957a8ff22babb28b73d55476c536c4093b3666c2bb7c7eced3a71baf +642eb3c01a38ce2ee3b71c15a99fad0bcd657dc944fe554858f9e4854f307d99 +3726e1aab2fdf2e63bc36ae6638a49fe2896541cbc471cc2dfe488d70ee79662 +bd0e4eb27f0769d94cafbc94737852c153e36ec986e0404f1d405f80f2bbdce6 +8d4e5ff2999a900b74568be1a01eef5f89593f048e54baa18f1975f7497e660a +0857007fd17b5121a2ce5e5fe01130309465e6a1febfc58062bf2beb9b6e31ec +d51e5b3fa990ec506ce20369d49d2cf7dfcaad501b66b8657671325fe91ccddc +8837ade4b68e4a071d85d21f36906d42fcd535e25e7917a18bad61127aab5bc3 +bfa666824c105935696063a9dec91c4d29845025de74a79bfffa3546f12b3662 +093f85205742712987340f17303986211184af465b5f2c28a996bd99e52c1288 +909cb0f9d5af47a1b362b35f4f25f5346837181b4980d80fcf28e8d5f043ae73 +6674b72c94e823bcef512b3bdf1ac4623840e18815765f3061f8dccc70f3cd53 +d2ac931b35e443439af50877c724382b0c84b72b2bc14c491dc98b62be729790 +299ef708226052bffad623a2ae38c674ec59104ec05182a4ccb96553c296724a +240a8b0444af87272bc404289bb32e77a9d258e7256bc6b7812bd99714de483a +7d70038918fac6e77f6a0b91d7aac17253fddb6c9e300dd03b95b5e98c781b20 +550a9be0e4c0af221d9a6d9b0fc0dae3884dd8e69309fd8e8f21ee4288b6369f +56c6072743282f15a4a161f1d6081eadb40f09322566f52f766cff328f0dc964 +b240b66112c7bb803b6b12eddf764e6bddfe5a65cd00b8cdb6944e90170b21d8 +3402490502696afd064b69457e31ff5857ac715824d583f5864d54b8af33d6b2 +ed344bfcdb58dc5838e0bccffa46da302cc110fdd8265f12e18e22f1cc352c5c +5ecfa7fec9eea36a822466b874073fb6e71e7b87e53038e921bdcba08b87e6a8 +7a9727e7364c7ad7ad1a70ff2bfcdd72756f06ad2a7dde1823ec28a8f3ef65ca +5213408eeaed128dfa5aa2725a2fafb412a7c21ab713b6e10cd5b444e240f643 +3a79dff389e0750b65abc5314abc9491ae63c701bb7d9596188248515fdb8f27 +314624bb3450e34cb43f25f8e422f72bde4728812d94a54d7734d14ed95f7eca +1bb309428855a8277b7b12e576da9df54b7ccbcb5e3f89fb48cc351992b28849 +f6ef204e3f6ec2e47d49324238dfbe37193f2ba023c13be2716d1fb0b2d4ec29 +23966bcb671e8c490d443895e0d3cc281b89015163ea70b1d2189c21e3f8ea94 +ba8ef47ccbb49257b0c2748b9eefd8abe489f5af5817b8983cc2649725bd3457 +eb8b04890467192d80882b112137deee65a6285a249c6671948b93586e16221d +a38e1e867724a0eda19ff25e708b663d96f1dbb9f63d2001b93a869510d433d6 +e8dab3e95b1bbf4d4475828269330bdb34eb13bb9fa0fd32f15b928c4dc673e6 +566cdf4f533db49a3cdf0c82c2f87273c69cddaa94df1a2fa4ce401da6ed170b +ca690fec7cbd8f3248761c1ea1c4fbba8c76364cf03a8d5767123b00a26a060b +fb80702f290244a71d633409b7732eea98360ac3f0d3254a9f863e33ff9ec1da +e693a8e6ece0e91146ac3264a48b7892fc2183e0a35b55dc1423e38a0191b075 +b8265335ea5ea371823f080285ee045ae2f79a59c019be62a4845d66d319ce24 +717bb7663ec228f4cfc3d89dc9f6a1cabe64e4b9724904c011ecb008a3d03ed5 +d416da027a699921cd185eb9a33eed607789134fa00258e1bbda378cafda332a +eab14ae51f05afff3f0365b9817b90d059341091bc5b4d64e59d3fd941ccedff +bee6851f21af90cf096e83bd80f40a8f2c220f292cc210ededf9a6e00043a87e +6b881f762ac807168eb1e6e1fac2063aab701eccb6992e1d4d6c7d1694f79365 +95259da7cb923911f5df24e568f8527c3bf2f3c48ddd5c2e3626b4fcb5f46822 +3e890cffffa557c44344621f40f5e5496c02dbf9469be9f6cb788e8ec0a3654e +ac3d7a2e04210df54bfd854a56a94def38bdd5ba8aa4c3c70982aa7091bd4d27 +4fd42bde0b2285eeded5cd72fdd663daa168dec99688145f44a00e00ec523efb +f17115fb04e4da0d7379e029be1fc2576986bea27d50950780755043358f064a +e08b86a621f1c5ca56f19e724fc620b15aaad0c77aec450efc53d36ceadcb51a +a90462fd0cfaa3b2ebcc1ed0d1cc57cd177f94ae4d6997a864d5ab6ebc0b7f48 +36c22699685493ad050daacf7b843d2313b9283014ef5aab2428202f6da36d39 +38408a933781b8bf0f1f1bc9e0a899552dbc1555a7c53b009e9ea4fdd8ce7fce +b29a3d1a0ea3cbc6d11575bcd93ab7e45ae43d29e992b6bd1188942cdffa4cbe +e24ac056111cd70159d06d69b3d878752a66d8352db48aab64b4cf9d23a90ece +0182ae7a95bde9f592fc3ea913a5d1b1e73bd41aa39b9ffcb34f0b06021ee1b9 +247c1e623232a19f6b8450336225c33a1c43eacee383cc3d478eb66da27b14bc +98330c7973e7b2df9e5f4042eb35548b4c85c13af52e30a8b317e418c75ef70d +a709ee5690e841244596cc3242a8dfc5693847099b88ded40ceba3fa90a30ae8 +86d1c713b173a27c3f22b50c348b9ff7dd2174fa0dbc1e0ef5cf5dc29779314e +30ddee80ef2a8e34deef16d8e86120186348eb4470b533e702fa6a481b2e0bff +d4778beb2619a5964be6e2d0bf63cb22edfeb68c3e3d4dab656a2ed75af89f94 +92301b3a940c45531de1d5d725133628697ec58f6e9bcfcb78b10ec2c521a79e +8fc0e8922847c76b93d8af7769b591f7a9ecc43449d84e85179634645889d9e2 +3183a9bd1b7b08e80661e23e892f07dfe6fd51085d96d34392d142762ae93884 +c8d62e8b4c0707ab5083bec15ac45c83a405fa8c8ade245fb8eb6ab27615f79b +0327b9f1857fa77a2e7a3ec0f9ecb26fb58bbb14de5c92f38c0a336520f6cd6e +2a1db12c945536e055c6c4a3ce70f0a4495b941bd639bcbcdd84a56df0214382 +8cb8eb1034a51fb4ca9654942f4fe510cba51d8efdd982bdf26fdeffcca435c9 +5c9e2df5f5391115e4c47186a9e29a3dcd99d03e1e056247eada1bc5dc5ad810 +b785dab19faf611c56d473e4736d8c5a8fedbc3f7df8e7641e5bc06a27c9957b +f642d5686856100be55ce65c598ebf0903c6e7afc8c195b8a4d47d5ed6975b58 +302597d12d3a50501ede77789e49e0a5e2fd7bb6d4cd1a2aa310543bf08af557 +511e56da9c7e7de5ca555ce55c49a4aa1014670a547e80e2b66e6696f45ff7b6 +f96600342a1e2b4ac5e34af19f62b514d1966c9bb490b31ba27c532c2bb55c3c +8631c31ba2c2a7ca07a87572a3e11c5797cc81617586bd0dfbd24ca33fa50bba +bf3ae38af30cfd245cbe1b6f917be08834feb707227845d1c99511290b8c7598 +5f4fb0cb307b61556465e2fdf88e955befae7231e31d0d2e608bf6e8ab088f1f +6da3c61b85e37758197ba40e7ab213b24003cc758280cbb5fb9081462e3701dd +cbc75135a8e92b55dff747343d8582db1c0c05cb442abe5d39912a37e1e5fd51 +7908756a3369b330ddc1ec251ea812b800fffb4733308142c43b139978cc9730 +1058490e5807f2130d818d185a098e27b0e7ba0b69238c71788af67dce65baa1 +a5149e3fd6cbe297279d1f09d4a384e982a8866b2eb1563e24cf5090bdefd79f +8750202318979403d5190a3af1ec062386aae1540f804cf77465d99a38c4418d +c5b8d0e5e9b14fe2ea7dee31597883e8dc067e10fa87bb5f38fdf7b40b9bb3c4 +3dbc2d4f0f8f1d9563f8ef0449443ef794d65020fbec4bf918df8a7bd0809d28 +56aa0814a42cf64b77e452d094f28600daa3d309619a47ad54a673e7e8f164ca +b47756646e870b478cf493676de5025ea1a188bc7ab202f32b2bf2f476ac6f59 +2a0e8027add757a9453dcf860925a7658e1482cac333c598b030c40e77529414 +f8556c108f78686679e29ce7eda8dea5de2c91c9e45209f13b3d856fc32bab5c +decd8b45b4e3229c45fad7de722e04df1dc68274726131e2edc97551b11cdd13 +806f53667c05e973209d38d994dc53a3c59be4b93f44b81f08ef80a1894cc23b +6e089193fa011e5d9118b1a1872cfacae3089c9cd1892fb925304f8d82005aba +a49e268419fc78bf33ab7077da0c2d6475e33d13aed7d3c252c02e55c209746b +cc4d37d8654e67d09f98bf1f72555adb69a5c14a7d961ee9d96dd5e71b9b5b2f +54f04ed89ecf353d69507e81ffb9639bd0119f0796d5995a4f73eded5c56010e +6394b532008d9cff8aa23f2d31ae04876c365819e60902dab4d0cb024ecf83a4 +f596ee4029300da3bf7084e51421e65febd0f3942bcabb9686eac9ca30b39eee +af9efc08a2e905675976cbd7b775bcc3d5e8f33084c2593e6d2a69095502c062 +206bd45511ba189a0380894809d68cf15338e1e809a29d635001d11a4e859302 +7e901009d1bba44bb2f4daecd91646cc225801e62413f5ebe1573201dd28540e +5846ee956af0be32099a4cc0a11c03c6f743de8c1b76a968d26d6b030cefa91e +22f07bb1f0738cba0f27f734764554fee6d8fae8b97bd7c23307209a50cd6f7d +65ae71282c4daeef0d06f9c3da7731d47ddab176a8589e6f8748f0aee00ffb37 +602cb073d631cbaf2ecd9b5e51f7448775fc10c76758f0b5f1988598eaba3ba8 +2348893bb54f7b8f736660392aecbd60a3483f2a2bb6a398e938b4dc4b64c2aa +47d5d550e7251bfeb020be37193f2ba020bb6897334f5c5c4435e4e8b24631a9 +16ef02af862d2e4f336e18d48728dc381eab03b408d31fcfc0891c7edc563fe1 +5be8f9ee4363378a717db8112d41e3d506e1e6114be57496496dd1ada1568945 +e9f1e8ed46066a4df35f8ca13c08ef4a8bab5e1f5ebeb9281f987204450426f5 +53b6a8e55d001e8c0979418ea1a223279f92ac892346b981907cd1fa8f1dc92d +d446738ad5f2f8521c29117f32fdca61843bfa7773b9c5720f4c8482c79bb651 +5261c85d4a06056f36517c2355ad4fe9b4d9c4d0e40da86ccfdbd1e7a8c025fb +e081f2b1580801aeb1b0f70bb43b06a2b7feb556819b32c769342def516cea42 +5e1b02dec445049e0f65a849fba37810dc737bcf9463847878a4dd511eafc374 +fb03dde30a8c8de7b0ac1f3a38ed57b2434efe1c2382605474b616f146a23d4a +5b2b849c4f1f4914e0a303dc15e48eb847a0adc80c8534b63867d45bbafe8b08 +c6ea3ee34425f7e4891deef35666f5813cb8043f0b80070a7d913d7c4d785001 +9f1cbb89139c80ba1b91672e2e993014947f1f8fe26bd63aba8149a9978fe610 +d4e752e0b1a8041589cdebc36bf194f5a7b294c1e781f97c0643a58b4a86c16e +c5d132ac0f1c4537b57ff7f97328e44bcfbb58973f454fce41d574a97fc0dcfa +6897115aff5fdac2a3fd2c4aad3b95357954cb05c49a168748685e665081359d +1e4b62392f69030a9cfe81069d85c3cc3d0887a13336f741ff3da201752270df +f510bb7ab23833e2ef4f6d3cb8a04e05835fd72b43981839ad90319ef1fd389a +e4e5097f6e1e8c2b56acbfd61e9670d7fcbed32901fa507b3b591ded7ef2888c +10058a9af7f53f1355803eb26cf7b0b3b6068482329628576b6d36be904fb03f +243ae1d241c859ed72d9bbb366a88d4da82c54509ec28110458e4e1b2b73fa5b +f348a40e9ab06a8290e20a4add40615273ec263e6c90bb92ab1599f7639284d4 +c2f1099cb4ef75b0c9d16b41f25d4bf1a0c625e199ac7d748cf6b50cff711c52 +865c4ee381d5d78ca56abeca4f7de6e1bd3d29031466e74116f7df3d3e79202a +5436d7b2b01b653164265bd9beea95a85d1e9de887de445e8b6f1590cbf4af69 +015820b0b1a8c49ca4edcbab62a9ef99bab1ebc3e95add3fb7ec8e604396ef84 +fe401daefe4269eea483153d7d485f952160682e3415510b711774f1ef055b89 +48192fe0f96307685402cf6ab05a577f6df127aac03fa55333c7b392454afe2f +4f06b0881d81a0b68fd4be1cbd8f34172219737df0e8b3d5aa08631cb64cedc6 +fb7d4ab012a17117b8ae752a259bc950cb8be08de07737f9b5706175aa425075 +0d22fbb656bd2bb8916805d58ae985136855350977ca50555300e8b8bfaae103 +8a38b78622e018a165d0442f8fe1446a815a81cfd246b87fbb2d7aff0cd7e7ca +af44dfd347ddbd9640a0463b7c7cc516edae5cc49ea22a75d858a137d7154e29 +65e04905f8c092000e3725ff735e4cafd5e5ccdf3606a12ce12568f98f7cdf3a +fd35629e9c8d4e86d21da1d8d2672f12852035c4bb7188e32825aec60f544c3e +75d4883054da93232a91f63078bb116eb6a6aa6666e1522f32c2ddc3bb51958f +a1000ab302985ff4952b1a991730cb8cc9d76056e58627e33ac73e8e7181dbbb +08405e27f67081dbb34342f567039eed99160e3e71e1afb8a62035f26d57ba61 +9eb558abb12e58ac098b1a0e1a41a3a1af86117a339d380a1662fc25f516ef12 +0480aefa0519186f1ffef6889fad2c73630e1339008a3cccb47a978442b90f31 +38aedea79126ac1a3c89adc908f2997af0b308dfb48dc6dcd063e88655f94a95 +3aa252fe6ee57490691a676fe8d67d8bc3fef6e4881ad647c0c4c72609c2bce0 +fd8e0b71a6d92d0e26ffd3ca287906948121176a65a3b75365291de84855ec94 +3d2521d1ae796fd9b2210b9e3706978e88b3f9124abf11017cf175c756342bd3 +90f3ab2cedfdfe8b72bd78c1184d116fa99bdc8f71560bdb656814dbf0e789fa +ddffbc47882a5cf69711ae34646feb4078f507db6afa85ad6544b1f840b33ae6 +dd43d3b8612bb43189ced6bd1b54efb545ef9aa508f197c8254f31999d5ae5f9 +2c37df70f6eee261744f85b4edb91103c333375b26248d9ba262b4be39f5ebc5 +88930682150f60c2bb661475649f366197ad207d0e94b46dd7613eee8cc69975 +14b8fe868ddc4e845f6081b53b3d1121a0764d00d84c9513375a6032fb78e47f +10951e50188abca8511e135f868d5f4041b92ea58fd66612061c6aedb8dbd232 +22314eff4d4c7ffd7a5fd1c44c418b172c26a6f5ac68e3603b7dd88146f52a33 +36b7e4785c2c597aa02b5a593b9f16658b4927f3c65750dd06dfded0defcc63d +111e5d493f53164f07203df57fe50fba1d7f722ac33c7a3af53d83792b1b8122 +c38018b90b6103502fda38d79f6b88d263da569a8b38aff8265488fe058ce93a +4e999d20cd6bbdb3ea13a35f33e20d69fe44b913e1b88793aa7d65eca3cdf39d +8b9c6d6c19646b114ca487bcea4c7e82ab2894c78d09bf370fe0395c92f6ff34 +41779e0d85c9f0a82f518ed45bcdb8a8ae48a1b726c37720b77f1980d6a33f6d +15a7504f2195dad102044395ead6c07d2da7deca1410d399211faef7a8eb73ab +d5c6d60adb9d6c7f1e23b74c6051bafa277b8dd67b472024b0ab3816697eb1d8 +211a5d49b6a97d5dc25f2a26817ac6bba940a603140f960e5723a96091c833ff +fb840dafcdcfa1d36f997bd4ad3474a41de472385ffca2bf9a151af35f675c8e +4f8d2677a08d77de88b6b2120f9137ec66787b44dced2a0df5f38f5cec446dd1 +6c34b720a1e40a9010511ab8007af8825c5bc495aa4625a4e3918cfa720cd37f +086e668e0c924082567d383756210621966a5fe19d58fe7477386b66182d996b +b39ab868de43d1b24331e6eb07475e498c12a87245a8b0d57174fec0d18efc77 +832d05259c1b77f3817b48a5ece6cd4ce7568694d753839ba92ab1a2d8ab1cd9 +af7c694110011eb30b4a53da8fb16613b008b770e30c89a27762baa4e80818e9 +f53e26f5f8897eef5111aba6a887a17cf90ffa573c17dc8d49f8bfcff80f22f3 +ee9d5bd5b162c7fd915462980503cbac322490ea4960e36b2291f726f3fae8d2 +7741904592a868867effdc4ebbb37b17029747a918b26e8f3d0d6e13cbaf548e +fd512f02a1f5cc19c9546c311d974e4f5e6ee54eb46d33a6f7c14a89c1cce4f4 +3eb3604789f883829fe2de0f3438e39648960e4ef5cb352778d3243ee6b5e3b8 +8d0edd177bcde0b7136f202fffbd6cfa4e591352881c2bd6d8dbe1ff88246f08 +d187aaf780e962ce6d5d4f845d75d09340b5aee8cde12810aa9ec925098e7d5e +d6975b5830264b090d20f5f84430f28e991f25c56fe9b565f2adaea5bcc60e98 +4194ae4a4c293d71261f0f53309005b7a69aaed79d0f24ca12bd92bece951e76 +b7c579ffb16a18236476fe27beed185b9ff232d42b66e4d712bf8b0c30fe607c +9f1b91ce213958703229758a0b42cc487bab277f89dbe2cb0727559de98400da +2a80616852d4ae9e102df122d8562b997b4d36805932283af1595aaf1a6b4493 +f3698a777ce9bea8e383d6dc1f5e3f2cb8ad8bcf65942e5959aa9ed2f5c5ecac +8e55de02e736a58a12efac4b5bffe439bb82c89949e04ea99e648124f46f698d +018e0877fc278d3b8e5e4c0ac0e5d40ed97c7ef889a8f9fcac2f4de775b33133 +c4bc3e86fd595f4de1aea5e527230a975556c83b5421fa17a531c365d46873b1 +a7083bc3a84fda0443a5976a16393b4952c3a20bab08bb67df4979db5ca6c7f0 +d0af6eb85f6c1559f006ffb57f980485f7f4d86ada87baee76341bda21f1cba9 +4187ead84fc119db7c3b0d25ee1761941806279c625d3ad7778a557ed09c2d36 +9de6b5537a5ec4c91e34124ff9a648da8195a3716aa15b727c6a4f450606360d +859990a906cfbe471c0ddb42372e9492ad4914a722dc4c451f3a91646ca340df +f8ff15904b5a7d4d5071bc536142fb5e026618df5876c183f3347112f37f0599 +37b625f61429612af6e431dfa647c1ab5d399c437e74555ec918a7b5a4789783 +e4fba621cf27afda0594c198e47a46d51eeabfafad44350c469f9532db1981f6 +e71aa8a4aa10f3a6841cd8a6797df56d46bd406e35fa7697c043c1fd79b3aff2 +daf3a5e4c16b97a778975395133cf534f01deb1554e3787117c68bd7be9d405a +383ebce1cb7c2b04392cf7215e20f3fb20e5f9c80cb443ad3d2fe8ea187b9aa7 +c4f79e110b6cb384ae52f2e57df4daa1c5f2af7bff1c09ce6262064df2343609 +0c1e893f029700e38cbf99d7d9b07b798e6aeeff0716a8bc60734dd267c9a71f +5b89a1f13af15d3550f6ceb39281637939a08a352c96d1b68fbc66d753cac523 +3526683d1fa9eacbaf7efdc635611ace7cc8244f210a9146920813622ee84bd3 +6c1bc5850be84d78cfcab7a9e716d53775ecdb30ec40e6b64cf1b5d3933852d0 +54e53b720194b83efb78f285b20945f83a4330540f300f30bf572ff878f3c377 +4f1b623a9ea95cdf228638a335cf466b836729b1ade08c34a8b29095fc5c47a7 +0418e9b1861d37d5668fa13e5c705e8dd2f1f41756c3d16fdbc4104ecc6e933e +21f0f1af88b016fcf61cf686295bfa7d6a4197a7e7d93aaac5d220c32a89168d +070a4dec58e7d22271884df7949d613ef3279c2dd0f3d25d9cc5b30f55abb4c3 +c8e73b230c245da37e4c7e418f23d95e89c5c02f18ccd4b2464a5d91b4db2637 +9fd6f1e56450dd72ec8846289328e0049fbf8ab5759e67b5046e69c02a74acbd +7c5adac41ec860cb140be4edff216b514ae2153e761a4d1d12bc2e9300bc39a6 +95aaf4e7189b0eeda1a2a0f758b1e112b639474a4bd034e3f871404372e789e8 +f0c9690e2dbe996aa8968f93a27619f9bb0b3c3529c888f23f10fe6ef2777062 +550f69d5dd0f19de539421408379bc098809892410ed161779f8d659e228658d +94c31c9bd4d4935275f2a78db1abc1b887fe3c252e36b4d1a40fa2c174360b6a +32638aa4624e8e9b12c7649003f84951dcbaed188b14f8a13ec45ace2dd229f7 +9da9c40147eb7ec49370893222836b0c6e9b46e3f13b7df8ea9b4fb8279bb16c +10d302acb7f63ea533cd63383e390e8e5525f43eaa22127ce02ffb4db6da9143 +d44226e97f713f5f656ad9fe3c1d04134f26cb9479ccf767d3cab0041a7f44de +68329854718adf6a0300ebc3729a230a4da004df7d441f027a26b670225200e0 +75521a8c020c7b79dd3ac329da64d5a1093f4affe752eb3fe694c7f7a9fde0e8 +8ac850c5c851327b08dea845e2e58ee0ad12244f770ccde2568a81ae7a798a1f +bd757de543af0860b8207d7b865292f033d145a920ed5edd3c8503d8a20214c2 +53b300c7a235f013ebcbff2a1ec19f9a386302056b02cf578f2536d46f465a42 +3d3b7722b48b2cf10fa1de390ba33d1ea1fec259ea9d5080ea2ce4699a1cd339 +25d5f0574ab492ef4d3cecd175fd8cefe27bdb2ecb931b7470d5abe0fd017dcb +8546abd5339a90e8e78bf7bb37d59d98d2adf82aef356f23c4f6a24dd9492d6e +99c98026d344985fa85ac4b218a6b7fe922f456b2477350feec7dff522d0ef99 +44d1a7d023c34df69322d82802c0f034c5994bad5d6e5554646332a0832b834c +ec34154d297819af3aba4c48fcaedc1b02d7d06b9b67c5970a0cd6c91750eabf +fe559f749b026556b795cb609237611db37447d8fa791b0349f8e8e10542c103 +9ed262710890f4746077dd9fd200d594c38a1b3dc80a6bf9ef73cccd4b252661 +ab1ae75cb6e9bd239ce5c865faadfa4bf11b75ca28b1b0491673feb0b38cd920 +e9db4cd00c63ffb96c28d804a745166ba02515f26aeb85eb78c78213350fc37e +9c7edbdb69989e9276056807a02417b4286adaae9e865ada9f80ac0fde4be47c +744a3e1ba755c354c27ae2cb7bcf07bb6a1bd0c70d8ac0db21e963b950174025 +880a5c3ecd2e059fb6769e965a64f2ab9d323a73ceada61032de0ead3176dc52 +dc10d5617dcf42eead7bb1517a3cc815fee39faae4630956459819d3f92e5a76 +b4e3b25eeb9a59308613518a112be8bb8b9202b542526851d02fb96bf4f0118b +5b395cb10993fc5519268ea5b4a6b9f691534894afac1220925481d763d73991 +b3d28a906679e7c92a93c77c98d868d41a8f76d0b0e50cae584b099287b681ac +8893f79330fff6a1d2f3038b305de36dea177cc55686ac42e86ede3483b255a6 +8c82a0f031155fc8f16e0c57b69093976cf2d5d8cbd8b1ebafb0ebee2a7d15f8 +1a6e115d417ee014d7e55466ba3f971e2df8c4a09e0a6dd84ac96fc01f27660f +7be1e1b9d9ba4a411508d2dc5e597c4c2802a41544200de3d74b76fff1e76ae5 +5ffd05020cc5c0db2a7fe6201dec8136302ab77c27d4d855f248ba8e5a6be2c1 +71251dfb25c98457ac67d5774380fdb9b18e16d153fccaf7b4e9dad17bac756a +aab0f1b2f92f6df0b4162a3611d60904552fe68868696a76c58f2dac93a4727f +c28aee8b8fbb54f26bcf16db113985d4fed3e0e0750805479b3ab07f1d7a9046 +8f42f5e965fdf49efb467d306c67a28d41e87b0b9555f4f27430349f538d4a27 +9e92dc467a92fcadcd6f434d0bd64586d82a6d3a86555676381ff8e1c1625a2b +ddc8e0467e137d9c13e8958dc951fa6eb7abb283718e0cf6ac6a2f4f948aaead +e2e7e178ad49f7a74a49a3de659f077dda9f0da0011e72823f1f2f54b5140ac4 +a34300bfecf186537a913ac731336a8d99aef58c6666507f3b0f30e001c6bc41 +1c316a3122f644f86e01404df023e599d8b4c95ee49753fa55b0339e3e583539 +9e1bcf14b377c9e67ae75a4317c8eab8f1ff31ab7b543db77c28d0f959b06c0f +c731808e3eff9001c84d1ea78b239aa6f643260b405cc9333de4d8b4ba88901b +67e40986cc8367b6778e1b792f420054ac04b60f8beb0b519368fc3be9fc88c0 +cb4efd521a34088e241e4058437bcb53257ea1fb05e77fefe11f57d3683cf163 +2aa442dc90ead03230478dd11f7e12bb89ca40dc1b8e3b4870209507d1f74831 +fea81bfb28e6af22d8a130d2a133762abde4f671328036f0abedc2623a161337 +12c114da9fd164c8c17cc5a9e6af2018fdec15b2b753a2b1a2c0fa3420f02db1 +23b7247e32de02f7d5b88f8aa254f67dd7a804a6f9ba611d007c106b08b386f5 +d312e575afbf756ff9313d80f5398ec32bd8fd74dee98966756d192ac7c2d5a5 +fa6560398368c51057b4f8c52dc0a455ffc89f26fa2b2ae606f436c392a9e121 +9dddf0adafe770b44bde3e6130cbec42ab0edf7fa7589ef19282ee119fdfdaf2 +9c07c3b12c9ed073e324e65f5f5f459a86467877f586337737a091189380c6ea +b1ed057ec7c51d1edc855b6c839218909accbb02e603651511c6d066f25b6cd8 +abca72d991b18675f88de9cfb1c5c906f82cc2cb8c5087aa2dba0909b69e3702 +64fc427c826d9954289f09d0f047595182f1b70c0f6230f190e1939e312d0734 +e021b236f073b5c8de8256accf528ca490b282efe196562315e5e3e242264ef1 +1e2e67806753f949f816cccbb8a76ca28c6c686945f51ded7a965aeba508c29c +2e90ea778bf7243b3759f0a874c329f321cbc1b72e3c8e9afe22c5c5baa30fbf +ee6f071dfc67af8118ef8c191a9908daaa4c6d3824e333c3d86d8c924bcb24f6 +ecea0d212b05c3c6db8de588adadb078fccddbd3dbc22ab130a5f0e100719cc6 +1f87b37aaee93708bc67248c565ca37fd8b360ed7c8541b0ce4bb643a28cdff2 +f3f76ce59cb40490bff709c7d5ac00cc3394a78aab3cad3df99dac407bf67947 +cbeee97201f6d020f885452c429b356aa5fe814c4bc1f1fda7eb82e07f73890b +93fed540dee130d8aaba13265e30ffe4bcf94c94fd87fa07fb66385bfad04686 +a95d7dac2333f06bf4f76a886265dbe51f664c1a644b9d54937aa5fd34c37d77 +e3eeae8fbeb5f71652fb98e7d4e1fbec58a134a19f8a7e9cc08172a56a1823ee +c5d95cfa18ed339eab6b7adc04434dc0f0a6388817d641abdb56b3f967d6b4fb +9b3cc2510b34b1cb548ee3f91e10371015b3b56c65da29e0c9b73f959b02907a +5baa7e8b00ea1fb05575fd5bf433f6595f15bc89bf833eb85596afe151d122b6 +7a7d7701b308c43bfdc000240b7965c7acbbe8b257f9fbbb1f32d61616523573 +15e4193892894da8653ed76a0dfdb3be9d66d349d0d41909903d857302829343 +da13275709c830b1779f2fffe2142ead9a4dfbfa77a677054688e3d41a4bd458 +ac27fee8f7f1dbf25cb98d96524e1e09641d04712c57c68e2ba9ba77ec085c54 +c5d88441114a9b1a92a0e5590ca9db621bfa196ede344f523ef834d3a9ab2321 +92f3a7c70851a83e64bf662556a660f6b476ae1d9ec9a243513e8424f03f2006 +310d7827b61f90de5c2f068193b19e86629dd2b0c952be27c039db3588fdb474 +03381fe609a2991b0e2c8cb970ae43e815cc6e1a64d21acb9cc99efa4c82e8c5 +22f6fcdfafb6cd779502d8c5a37ab7a4e1691a8c058c308fc662082a9446d246 +51480f2012dc2898823e8749553076c2ca1d151a2d141159a57d2e6100a98698 +85ab7dc9d6c07e815e45e84bd043dfc264881e9f0e59499c8e711166eaca804b +d79eee175f48f5764fe6081fa2ef097127a6a1491d7e6d99adde7eeefa36433e +d806613476a273e303a508982633cd2623ca8d60fcbac4f8b97a7bce431ecd55 +29e6c1043d4d4a83ac1526dd25388303b11a4b3762b5b5ab055ab6753f33fb18 +a6119986085ca7d2cff56c8edf342976048383c55f8a84db779a6d16a9657c5c +26f46724be37aa67510a45886f907ae579a1ecb95e83d7827cc54b90cd368830 +fab83400c406a1e41d9294a5baea67c1cc39f59f5f9d2cd98ff26ea4377b99f7 +65f3daf1ad4736c36c20ef582cf138508c6aed0ebce18051159e606c51eab87f +7df243791b246ed502556407177dc488b1aafa33997f41bb7603a82aae417726 +3bc8822d59d91110723b8ca966940c08476b0c6ab423c139f4ef6e54f8c26ed8 +788ef49fa67aa7299487a22dea0e26655800636c24b8ba52f4edd006fc367f93 +c0c39755a4621a488661d39c70d7549dc579a886c29b59371e282af7707d1634 +461dae1bf891f96ae24d3289ef366c603d9c2dcda132ee7eddad90d455c868fd +31ab63d69d86dcd1ee9720e553bdc3349e16071c89739f4e0c8c64afc7cd97b0 +3c15175164efb05c7712525ca4a747889b33e189731b16fcd284acd45c2cc79c +79bf9fbd0ab063209c9502ab61a95dcb90089c64817ec3f93f64e531fbdf86f5 +49d94b5e687155acf8600108c186a6a99ef786e6ccf275a4dc51cf0195fd94d1 +ddc7e9db9d40119eebb2ee2164e8bd4b66054bb0363a8c2a12c42815895f9c05 +efbbbcf386eaa999440ebd6993c5babab3adf23f36399b3d8ffec36f15552009 +5cc81f46519e50ec4070613d28f8576b1a8d68d02550d5dce1064b2c6e806260 +a98aefa12c7a1e099f0935ec1b8fc0a88b0b23745d5079b9f8cb12a0867067bc +84c90f7b3ef3e677a9e3c2c0678c790c420cf23c1811145131264439cdc733f5 +50f728e3a0aa158d089bc0982224fa7fd893544f5a2945ede9f413f7f4c82efd +fb7772de6ea288dd95c4aa9b7e23af19425077f830ebba9b6164eea031aac08d +dea7928c1aceaf5a1378ca7e2ec768e87ab8c383395f26ee6f3fa4c63f003492 +8ac6dbbeaa6bdfce2ca2ae6eb4e9fece548863e27c99aa5f28c18c83eb569c01 +1cd71fde99ae8ebc49c0fa90afacdb7f2c400434e6a5844474ade693efd4c514 +c540b3422e86368773ad0b42f83c856ff4c0c2f5e30302800a859d0dcad72b4f +a963ab8a0a49700fab3ab7d30d74e18b22b7beba4d544767e38a949b0937b38d +74a92ed41603b903deef11c09f778a3074bae846ecda030a3101fe2991cc04ec +5eceb497b57f85b21d726b3be29f06769954e8e8e3c34b214de6b302cfb6de39 +c86911209d582aae7afca97e502b5864821a0810253dd32d975c368bd6a9911b +1e42d8984cc09f6c0e3d10d04fb6a22c86f09e5f45f6e7910f405a26a1a61d7b +fc7b66a97e5e4787bac8c5ac437d726076bf2ebf8ec018a638efa3402d252e24 +479d287d4a0366c947faf706bc80d956761e1201bc73522bb455ebd2509acc1d +c87c40d79eea1566771ae0a8a74191e8f6977dc87bafa60065287bca16c0cc5b +7dee1b47e46f62d8865252225fde09e830d9c723d0cccd4ddb10b8e8ffe0a19f +240ca79a2c75a58a066e7346c11f757437071bc2925d51d790856f8cd1409d6b +e75ee38a9555b32679b42b44c16cde12d63e215d23d796ab2dc27f6cff83b47e +5a35c1bb787f6b4cf9741336b0894ba6e93606c0d4f536a86cc07d2986b23b2c +219523d2fc12bf42f92cc1060d250f1600d25dc8a35a5b203b42914710e7f60a +04c77f1689ada1083abb062e9487a96259662d9364bdf480f45258326598ff8c +eb730b69d0c47a618d3ad771bdae09313e6522f0b1f7c2b032f3e9f6deb53986 +73ca83b465842a41c62b28175eb863ccc1343d5dd73135133fccae9f80d561c7 +120724d0179164d39cefd50873d53b508eb0b1377ad26a7ac9352a49fa447667 +95667359026afeed8d9eef25ef3f4015c3e16cad29072ad5ffb8d76e7d995449 +94997e816ba35323f8926e9f187759e49af630513c2ef4b7e2a8130d09f3b6b6 +d1771536404c147f10b72b6f39b085a7f7c17b986b2b6228dabc15f792557555 +4967f02c99b261412b509bde843bd479f030b85e642e44c3b17592893326849e +37e08e102bd37ebead3466db0f25f18aa477cf309cd213758776d7efa57a2edd +d583ba4c5be0127e140a57e5ae4885fc984c61f8820b7bac8c8ee491056d7027 +dcb6d900290ec2ee3a5716ad301e47a4a54cd0a40724dcd4ac9e5ad09356dc24 +6a4cdd5b4aea4fa027809f7597657f62946922162498ae737dbbd2578a9544f2 +3f94eaa05a030101e50b47e8d585035ae0f57ac81fd1425ded626ccdf2c705b0 +d54f05482649ac55d3bd5dd56b34aae61c41cd53aa90354e0c6a7662efffbe8c +79e3b72f7b0a54d2627e595cd3ee2a1622789d4ac79f864b0bfe0d8c5a3e629e +9a4cb7c6050e0b71f851bf28a6db00f6bf1f6dd11a9abba5323045b8cef74e34 +4c3675491e7265a9609a40a960b6dae0ab3681433fcc3773c8715340237aeb9f +21894ecfe1d5d89dce1140f937c8db5b4b9c15b0105a21259c392c753dc7ad87 +d2be0cc6f62d28802b2a6caf14a0f2cffd67897726c4333cd9c6c72378d0a3aa +a6329d641b8612be9c2b1dc65e6be81e24b867a6e59778cb57094c5308aa5964 +8de4136363790df7eb9ef8aa7fe71b534cc8cfcf616fd6318b9c314ccc10f331 +0d605faa252e6c21be4ce28f43c87119c9d26d7aedeef93cadee2770e6e07495 +d0a1b1cb086468f7eeaf8d3e1843f9e3d5cf0824a40744c6105b8bc4a536a50d +df8b7b7d1b6c5bc502c28415e99f962c5a8d8d48ebd1fe02383e4b3b9f091b37 +bcb5a23d01b7fb41154e8f6521a33ef31021b655ea2e10995de9815452c24dc5 +a17bdabd3ed8f3981aa43285c0fd0aa1d032798d02c5c91ae5b5ebdddb6455aa +523bb298c36d9f4c66a91cb612802b2c20dfa43bd4973618d9d6394b45cf29c4 +807b07cea14c031b1a89e8e0a832a3c63b105a0c171f269e273413b72e555732 +856b823d03dd537a4190ce8e2c22f4c8c980c85e430a4f786d5c84843e6753c0 +e6111e2a5114fe63adaee907ba9fda1a04a7aa55da3b5ffb3f987dd1194c564e +71e4d881b0b7d6436ba61b6dd927593d70adc7c9060d327d034cf54ec110443f +6d6b38f78be15eea781933c2f5bc31795ef1bdc8aca668c6e0977964ae6c6bdd +ddd1c104098d914862a5743c96d442e3d8f162e99339d8a9f0f3cba997d944da +1997395ea58e2049e89ba5f24b7124577200d20c67f86d6776f2f8ed41f6bce3 +ea2df4e43aa1fb5c9d2cee1be263564888fb01e04c9edbcd49512760bd7edf06 +330ad7a9ef886f3fe66dea6cc78e016fdf48dacf787193e3fc3e6683ecac66ca +1901dcab4afc87f889f479a76a4c827f4122d423189070e138d1469ee2c7a836 +f7db5cc2074655b94b793ebf915e0190dcd4e065192482d07bc406110e46d5b7 +50c81aa29e50e48930886c913220de17f839feea5a50c51ac99275b1c8ff1c9c +3065e4f3e4a874b264bce145bcc577700158cb5b1e2bf388525183267cc6ed9d +92630610c340c2669bb63fe963f089eb4de70f296e4bf01198901870464059f7 +b8a507f9796c600fa9798471dbf6bc628c775b3e3cbb1be2172b868cc24d940f +24f1657a87c0b2e63160865e28eaefa4402ecf0f9fa7b5147be33bbcac8b9f43 +63a0e99c949c15bb30103ed33c8e476f851b493d576a0b5224997bae21b1eafd +6586145be9ecb58fd1b7e7ec83a6754b31c867a751585e72446ad2fc197b0dea +dde8e00663b97fdff66d3634be342fa4c82606b532e7a85363fdf6909efd75f6 +853756be59269b512125295e8f857ded9c99ecd27ad158d5fcdf974399e218e4 +1c839a93e192722a918e80a3318e6ac44a9c0d3ce8f9ea7447ddb7762d5db78c +543e8a3f6e6d6a48b3a18426c3066a9db4890b955c1316e3addf9d4b4c9e37b4 +9dadbacdb05c3f859e9497ed0b134c3a83b8b8e7f18397557b2408e794d04498 +5d0996861655e2dabd7c69c49225ddcd018e32e38f7e5c3d03185375d0b295bf +f3116f75f8af949ff2df409366012fa5299c6670a7a21c95bfbdc692a0f916a9 +6329d9e04e836ffc2a52a8deea52d6cc25e92ff8e49ebd4bb97180d32632d9e3 +e18deb0d7a9c2158f810b1233f79e4aa8a1a0d8d65914c21e7ac26ce63d53383 +3ec072ca18f5e8709ecb7c8affe51afef3e7053b07818d2edaab08a621260ea2 +5636f1a5ac6b6ba3bf558726f48fe3e3fb753fc50c023d6ed256e45a8c69c108 +1bd7e1b664254d69a3fd1862208b9bc55853b228bdd2808fe50c8fe750e28850 +d1d23006da980c3cbbdc248049f6e7e17ecaca5f834e551ea8c39237affd2fa9 +89fd5656bb91d8930ae68b9f3b435ccbd7dd2b9a10f6865572b12e837eec5789 +f910285c4eb06965bd65e2c4ffc55c9ba260b4a3cdcb23541adeee3f54d527c8 +4265e0320bbcc2e000f3d35e66c4fbc436073794e676c00062b71ccdab486e7e +81453f3bb293aa7f584733df076ab6049706d33dcbbd0214cfcf7fbff19d4283 +04cc14afe03ef2976dc88eb6f03ba8815719e0c3bc05ba27dd825251b1c98611 +b3edbc557704b23c454b2d6df006be18cce29eddcc7ba8a325518d9d00fcb4a5 +95d710fca4ad4cd75a52505780fcecf9fe3321151c169bb97026ca90a3d1cfc7 +c94cd2a1235150335065f7ffd368d0079c90488fe4d3d3fef3769fa47eeeee56 +6ca9aa026979822f86b74cd356ec278d8d4af797f3516bbb00ad2809c07c0811 +54c0abd8265d923341aa789e54758593f8abc3a69210acd691aaf3e1308a4777 +2fbf57382d83d7e3ed6986cb4725caa5d0ec78ebe088ae17e5465453d00c0d27 +d927f0c8feeafd0ed42c95fc57dcf52ad223b0f8eddfbb1bc745afec9a2cfa3a +41b176f4a9c237e939fa6f661700d00e904b698bf49b4753478ee733f7392b1a +66b23a4e6378e1c58ed89567002775d0391340b164e90565c16ac436f4450fd6 +9b9f785e1a4581749b38693f3a047349d3adc441debf26fa5396a0609017186a +85758ab05e00197faf77f75dfd20b3ae9e3ae50694c1f916ae940e24c41766b8 +bb3d7774a05b71cab19f4eed9c5b6d0cd5fbf33ea37b528537a450addfba8864 +3bf80127ac9f0a735d8511f2c69661aadf55f5ffa5b79816e304159378b6a7c8 +f082a6fa88d40b6b0cfd2d49b8d33db2cde550d9476ef53709e19567ca58a939 +4d002d8593f52fe4ae1c62a714a4bfd6fcfb0aa6e97caab9ce7df768f10b5494 +3578023c993347f4c5c579ff526ef0672b552c123f270473b36ab80bfb46cd8e +624849573ef5f6ba0393b4bfa2a7cf450fb081c76ee1b15b8de4d78af5ff00c7 +c236f801dc1d927e27062e60f2b8db53528331985c3a121cfac6f93b215b2365 +4633c5d9f8c4f2eee33f1ec2adc384f327c4f0b471aefca353e292899f2babae +69072abd16cc9fa191a8d014df36017726d8f9a37fe5885a29f0bb16f9435d00 +d6811e0b944a4faf84096f75bba6388dd653cbce3e013e6cf58ebf768dd19630 +aaf8194a6907a83a5e98407e5ee32b5d25029b3149fcebadcbe0979a495c8d83 +07647641f63cf8d34be3202b70d165b7b66e63e4c6f66021f2ded0ef36b17d67 +55e22f71a5bd6aae3ffae9cb5b943c9817e69045964c389bae4449e590d6979b +9f57bff85ae806ac82ae0a8223118d871ee4cbb6fe088b661b2947dffd21ce4c +83f6febf2c68f75030c5fc2495521dd140a678c3d80b59e330c396889b5891f9 +6087c8009a1cec85d8222eb6225404764914aa1446d26862378ec7b0ebcb8cb7 +aedb3aea248d9251b813dc40def0a5c2bace5629a7693588ca0ec18ef50d66ff +6e94d9e6d9ef97cf9b12512c419b1ae162cd024fb4cc0334d8009ce343402035 +5f0f15dce1005c6b15a01e5b814acf9f6a07e39b9b918941af231586e573d3f8 +d15b169129142f50b6ff2232509c38db9abe8dc099137b5f8f68bfeb0105d228 +7f28a4d6d7a30e76b5c2655866a29b1bef139b846e0ba51c90aeaf9807511d25 +d0b2e24c1c500fd9064b162728816c563cc4365ff03cfac601cd997b5ffb13bd +8a230552abef837c667bba6887403de7a0fea69cf6ee4e212649185909ab7af4 +bd040b8edd0e7e8077acc2a2fc5ce545c51e965b0247059863fe3ead580cb928 +549a11a4e81cedafd213eb57852c0dccb0edb47c6145898b8e7e4a92f7ef7d4f +305254353600eb2f655ce9895f2dc23ece87bcc2f5ea50c3698f2719a54b80ae +68ebcfdc86d244e0b223d210f43e5fd158a3ac9c611e3adbdac7877aca6d8b83 +f496bec7414e262cd6dc7cee6eb5909cdee05433a0881ebe85edfa455610e0d9 +9c919fc5172e6455128d6031c11ded5eff27b4f2e9fcd6090931fc125a7bb9cc +513e69d76c121dfc9ba3bd77b02eb7acced3cb54bee92529b51e832d7de973b8 +be8d0735cbf68b9dc1ace56ca91cf74309e949eefcdce8268bb037ee8b9bb4bb +9f252c1826946ef7856c72e59ccec6fd39f65a48246efbe0c1b50cf9a99be251 +305491eb8516f8567d57c748575658b3a7aecd6ead9cced75eb195af157887e6 +d226d24e291f10178a09fc8ef94b9b439d3c932c3d4913c02d4118fd08b284cc +5c4cd9d997448fb8b387fe197c26d9be35f12537784ee2671f9bd3c433133e9d +3475ad4af4e7605e27842f1415292b487e7a97b287f638105e285cd259b73fd1 +270e330718ad34dff66a95dbe3c282d6882f6e08de35ad609fc23b483b704863 +014c5db9d3fbb3b31cfdf82a312c142547912db8ab75ef4d024ba9817e05914f +d3d681a977b3a4bf05b51a35089f54f982d052557a50aa489358046af47cddd8 +77e595ac0459acdc9bb1c17e1705ddbe3b32b79ff89736a05254fe529d7e3ba4 +78fca6b78819c10b92b5add78489c23e04db146b57ad8e18aba483c55dba1a4f +2834a0acb5df0d737402d5e7971aabe45600edf5f76b8eb0a63f4f3a1e848448 +b79eebe9c48eb2adf39f206e4b841f7b1aba1adc0dc336c1248403f4f4482f6e +550f6f8d4d00d23124047a7aca85fd9b4c3c643ffb9e35c4c67c6c8ffc5d212e +a66cc8975c6e4e26cd7749161e43bec983b37470b44df92605b3fd0dd665881d +88ff83beac1af40c89cd3477dd0dd45e92487e44cd36e91e84a60b19865f138a +fb00db551b5d9f087a34d04bb91b6fc5f9f843a755898c6b57735c2f830d53fc +4ee8f37bc59645148188b0dae4544e1537cb1dc21d641a0aa7d3025ff5fefdfe +18ac244db92e73b27de5e6fa78638fb614cdfef4bdded23a6c6a966d3bffd5ac +d0a507e9736d16a0304f4124120966e8efb531f8c94dd8f0e04fbc43532613f3 +f7a2a94a0472860a22e895cc70a65a6efebd1078a3382018a7d6dce1e294322a +fef3a7f410426aa6f8ee735e7446822a61a85a19a26076bbd4cdf3822a9bbed8 +c68e00dae2a9f855a34b7d4f6945deb8573db3bb8bc2678e47fa6ba63d98b8ac +84bb2d7c6e3d6cc4a13cad7a1254c5d7344cef8d122df0f0fd396fa21ea8cced +9148e9842f42918e874c262ed9a048511bfe3fd292c19d0013a2d6759339cfa3 +2b1cedcb5e20cdeb7978fab3f15f6e690e178aa0d8a686f2e53ad56594aa102f +3fd4f41b2b3d12a99685692fc66178a844be71ecb3563375ba51bad2bc432c21 +d31f48dcfe82ac9929bcf22e1a62fd6fb82595c7e7d4f01c2ee00411c5e62dea +2555f184aab5e2d23a6dcf4b7d5f97e2c829dbd35dc926051960da29d4262879 +8e0008d0868bcde5542d075e29e01989242aaa52e26b009d9dda9e56aea6446e +b4f9ed48e17cd79aca9d1b5c40f793539031648abc315b2a4c672563601bf405 +fe5aabed89218095005a4b9dbd8d0dc4f2a71efcd25dd568ed88ba692fa4aa79 +143d0fe1b7f08fc22afcea9b526f0a09f7cb33465bc7cab916b4ac55fbc52704 +434efcdad9b0143d9d2fa0e985339040577c6ea16f866f8845ab8e348f641e37 +22e2d297628c59020846d358a6c3f454ba70c83b6ba728a4296badce3a6573a6 +7275187a90f0f60fd6b2dac1097c0e15672b98e668d524fa4573da7ee48faf44 +d7efb71c4fecd7fe5e0957690d59a97ce29d341aeae27687ec53977a7bc6534e +108c2d47f8596db169a62cd40f592774a1fa9ea3b44eeb1738f65f662cc94732 +8cdc8ce47391414465675a29c7195014b7a34917085ca0d6c7cee1e956abcb3b +d08d895280fce976638b8705d32a5adb4786fc6d924810609f65945570a6e6da +35beb89196ba41b601e76364cb91dd2ba9852c4d61188fe6d8bbed9bf1a19938 +bbb84c89a266b999221228623a5ab608fa34aa415b20de24f406124d1b3ffe4b +2fe200f9f48165de77634afced6385b18b8dee7c250707ca1c308ff41b06c4c9 +3a3a173c648271ddb5218b4a5a053fd188ebd428da378b643a3f156386447d00 +83c1b5a868b2fd5ff59eee02e6debcc1f2f4f33a43dbc1fd1bad07574e45dcb8 +f979e208974906318f6f9a1859b685ee23625492893e5df9fc549691785db01d +e62b6e0f546c48ee9be8cb8c143bdff18cec63447df1abc959ef4958da056412 +65c6a741e7c5b167e3404ebca9b482a15b89af2d76fab052d47ae6cbece7f53a +0af4247d5a31b6e760bd0f1a52ade72fcc2bc31ab67599eeed012d69f68c2e2a +a3c5948834455ada670ac39cfae639f1ce2c583541a7963f4c0913bde6777af0 +871da1485469c4655d5f349437e7905968ac8155f992fe01689a849c777ecf7a +fd983743b72749aa9b26cfe1251be2e0ee12bbc781f315494b5bc41760c5b2b6 +3e911eaf2aebc135d3372c66d64f01c50a8f86097f7a51e7aa3e3afa6dfe1fb1 +ce801534a2a550f2299a1d7f3623a68fb7dd3a5a762e63c690637d8a31532dcf +76a8d04d36ae6157bff04ffb89e0f9eb4375d8b5c58d032e3ca54e0fb28cda4c +56db6f90688251d4ecf2006ffe701f394d3874d9d977ae19f662b46fbcb48930 +4314c54db20ae1c28b6b249175284a00fa229539c83b26d0d3cdbc4c9b4eb2e3 +54400875026e652c742d26899143d0bca4df0c8cfc25fec4bc6c6cfa21360e5d +5d1d0f7317f06141a493a3bbcfa23773491bcd00a01c5a38697c544622e35a37 +4b214cfe3085d317db4a841bf38164074afd3e4b73f0fd2fbbdc916a95c5f698 +a8924474af0033ef7d2c91b388e1bc0d5778115b7d8047349ea68f07ce0a2723 +2140f2c99d5da9a5839137b7a6ef5d2360779fb9e47bf17fe512e60cde3c82c4 +05895ccdae5c5e5573af9806a99c3825d52d2fb39318ae49b6bbf8ce496e62a8 +8e51d46f119e15b8763649499f9bcc58d703ee43a8c9ddc9d72ee20959387057 +39e71743a6bcd8663901f867adf7a316065d7a14f9992f81d5290d1b827be9d4 +fe2cef245bbad62651865f82eb6885a744ab37dd9ec0f0aae70dab753f9ee022 +f2930168e281bd02ed8d5e53e1ede54cac602bb6bf29d37def90f16a83a67e65 +7c20b20841109d1bec9e2c18ee86e9e9dd1948dec0e895eb824d8ceeadccbf17 +c02d409b99b5b2b320d8e87efc9e1abeae62b8e344bd44a8df0d92a875be3ef9 +2599bcd195badcb5e961047decdcfcf2aa3a59585c37582c7e7d069f76ee377f +437481b2b68a8a23d93a82d2a65ac200c8c5dcd1d7f8c5175d0f993b97bf9a88 +2caee5116c36f888428f08f26755c48a9eac5120525d6553209388b24ec1bb0a +99a67c917bb0c6130fd0f802cbb090dfa36eea6e2c2810530b8ba1ecb37c0eb3 +2cea6350946cd8fc422091dbaada4d1ab306e4dd7d7ceb5c4de1c355b9cdd4a4 +9828392ff302c594f7ab734d96a4123116516097959d9df9b52366071f0131ad +087dd099d6fc98f8bfe33473e8a5208945a55658a749198663b2eec0638065ab +3714ee5cf14b4b011795be345f50a9fae7ea240e08e1e14d43aa0e1caa538bb0 +415858d6f07a49db5b3d07c8b467431aac87c985a38085d4d9d26c85d0b1017b +2af0dc498f969b5a4573c7bf301778ba0b6a01d41c69388efd9ac9616eb7c5b3 +f4aee08f86be73f67a6812910f8e17c7b9212ce7538a932c9917a4482c9ed539 +ffee167e1af18c26abd2a09ee09580d8e2d8c2196d63b1afcc999e9422846303 +0e571ecd055ddecfbac125a918ddf07657f30d6206ded3dedd1c0028c3e6bcfb +ed1e1b39e456fac336459fcd7ec884bd6c3c0f0af62e670af3f1006a127a9631 +92dc0072dd53d486c19917ecbaee1028859163406e3d77f7333df6b1407e7527 +7539d8c811ba1746258149818e88555f0eb96c631551c80175296401ee362704 +302d9c42f5149ed8eb709d5142a1abe6687e0a3b1e7295f6d5273734730794ce +c4abc7069eb46d9f5dee2a165691e7f1f0b394e5722c61c98a41b6dfa86a2695 +73184e0f050ab66c50dfd6960a93e0740c7f06ec84f24780fdc03577e61386b5 +22b9c6786322957eaaa251c0577d189f254a9c87ee0daa6e6f25015f7d9d1543 +21db1c06c9bcf23b8ea58aa8bdf57baea64a637a0a0378c0d9d11a3d8e82aa79 +656527ceaed3943767b6c645c9f9482e358bc877e95f30f2ce040414e7610a55 +f2fb3bc028d3153881b4710e639dc3508034b9abde86b1c482441053c1d379db +b2560d3ba127ee97b0c9384a5c16f2b47559753bd9412e8b451f48df848092d0 +a968b8a77aa342651fb988a1cdf1a7729f715fbba7b244418f0f246a8da32ce0 +8421fbbf9e545d8a57052a033c0e40965739d4f6aa1a85e80bc7c94616348405 +0e9c35ee670bff8df987e97fd4c94e95d6e311d4b250ac7be717c80a9df47f52 +4b2d42f111ea1c2881b013086d72e9907f6ebbb82f3f1b0dd9433e2a298b6099 +3bcdcf5b80ffbb46f76338a1ce96186e52776ce5b528fe21714b81d32f1a86b0 +e949bffa8fa9d2872b19b040ee8ecc2d1e74b86fd3976ae1d49c93cfd40af615 +3ea058d33d99d483b8944437a20d0ed46558c2eac23ac42be587193baf4070e4 +c8aaaa2f2582e4c590bcba59001ff1c15db691f80ab98ca4b2797bb44f74a4ba +61500a655eda1b8c361a5b975fd805bc077cb6a14d09dc5ead9a75bbafc7f0bb +dbb47f47bf3aac6f00b6666fbdf2054b76cee39b1b34ab865fda074e59935f84 +649dac82ed5e67d507a4a93f5f0865779cfd7cdc5da63a5ac776b98110fef14a +32b0d9cb83a7e5bec3770b2c99d92f511daaa0fea9c6d00e2255aebef612615f +77a5cbb289e601a458e3c6151c18bb63e7ea9deb1b36aad6c823fe8548a8ced2 +62df2b7aca35d19c4e8ebf19bc017543b769b1ffed60314e6227e093ef9785ce +cb4a5a2b9bc153d72b4c4f4a464f79a66ecb50efef325dbb9a3206185da33189 +ab3ed13aeacf6d022e780d4b3ebaeed9ca27a6f183f8de4e3e08b57ec396e5c3 +ac8471fc1c9c96a982a762cf3e2462088a16935545fd49f58bf794fcbb6687e3 +b72b39efb09df6f55940b894eead89972a994663a272174e8c91adabdcb5b479 +a105ee010013b263883e2cd8f0abf8bd01e4c40bbaf65f5d4e8389f2e44fa359 +5956f0ac3874cefd448165c149e177bc9763fcff79463e07244ce614c6e27cf7 +aa00c32ae700c0b9caf06bf7edd0d35cb99de17c2559dbfe572313a02e26129b +1b734f1a5674a2fc6079c623c181a657edd469d7d1f3b63672077c238ef213a3 +7b3548e93fc6ab8b3ae0dfc73f2b51aafa6a44720866dbba3ab1432315865586 +4e51b7510353c4467b2e1043f5a8ca6af592df756ee5f5882cc09429cf9752c6 +076f33767855343851d9aea71c009e319057a5052629b6141d6507ea32a034b5 +5eaa6a4d9c4550dc27dec25e8f4a8b575de69bf8191eea4607157dd9f1c0af49 +cd06f96ab9d0fabbbe4a47be85004d7ba7fbdfd7b738e56464570643677844f4 +8c42a24825fe0627c02cc994ac05150e4f3d9b5b3f801563ece27e4fdd89c233 +524731206d7b156bf4890988ab6a77b89d13972b267e5ea9b17025ec9fc608ca +c9fd0071fa53f3b9797d6b008e132131335f63b5b59feafb2a58fe2d0259a106 +f890606693980345e42fca0f4142d27338d091e8e9bbff7ad58fb5d5209a5797 +4d04e9a9f47546b6643059cfec13bdb74b5e5f43e79875b74f4edede381d4185 +f4f3de8e6bd1d10107883e57bc7a8fc013f6497a48e0fbeb7f72b917d7063765 +3ebd28b5bcf5c11c09d1e925ca1859e6280b3d3dbf4062f234179ff8e3818105 +785d78a4534365d01d4c8015cfb0ad8d004149989b510ac308d5325b2590d040 +0b63d305fe0cd89f44e2af08ef78a4cf72950f166795f232849109df451a9366 +1e0226a13aba2a353a449c05d34ca14d2fca48febd2f3e91c1b4b81a56c04dd4 +efa3ac09f9dd7a5894f0a6e92361d2ed4d282dabdd5f975ce3af89046b1ff865 +bfc3c2f13785f3ad7f840dbcc470a7330c81e815bf55fdc6b0230d4b8198d734 +0c2e6232d553a37980d14322d11df8347876996dde9efe33b9215a4c761a2a71 +d907049ed7b595ea38bbc8fdc0e5aded0f624103d79e6d1a2841374839198f2e +99db304554468c32ce3e7eb6099fad97dbc72d14dc43621c47c8c6eae371f47d +879fbf6b84803d8bd80387f6cea2b71b4de744a969ff98474c088685b318cb14 +1aed17eb4e28d83c657f388e534e6147eb20a1e9d5df71bfce3addfae78820ee +311d690db28837e5c5dc6e1c58daca7c6023027598e131fdf9b6cebe18c666b0 +4a5fae871e88a4954a27000882a036b7a7e887271c3c91f5adc190c5747a0953 +36b75ba9694f757394b1bf1cae5915f91d45a4d5bea1c01ddeea30dabc81bafb +4308ddf4d9d39afdf3852d988b0af1a9e0ff4c2f3e7dfc7aaadb5765a9fb8850 +64167666c44dc7a5a3fd7e36d2441e2f7fdedf42946ed51842f15f7545033f10 +26521481744b924a3731bf9ecf056bee19a48d50f2d0dfd28eb50897c4517bed +f488aa11b11cb517a235218dde8ba121f6fb80bf642b1a51be3ef0c422d0ac32 +83491d7a1b6ac0c5ef02c45607bd80ee2e7926d6e77dff1947a129b2e48cadf2 +a35abb0047ac8e125bed2e0dad26bccb7d3c1ef38640c77928d0f02f12b3bd10 +fb720f2c9d150c880f04d9d0f4ff5b2551d47d0eff30826dd250fdb055bf7f21 +ec71b74c052c47ff25aced4cc147fc26687fe680e83f2d24c1b331f5fedc96aa +03511f40b47b1f54af177638df18770042e2820535eeb43941924d6da75e0036 +80e54a1504827d628c4ddaaa3e47eac37bf82a5c52aef5f6f8d0810355d42b37 +a5a0c844c97ef378a24590ea59a0f2d96862cf0ec5a0bc5abfafe6a5d812aeed +de09b89fd150ab6b3998b1c2598102e32b0383ea43a494deb2b7e1f47957687b +cf867a4105dce4b3c73b601ae0f94cbc426cc649e118f8c2e6b55f891f653ac1 +b078cef9020188a129eeff24009ce5d11ed4ae02c3c79c60a6a588afb15c74a2 +8f307f24d3a10616d27a521e66ad287752ee4b5ae5d08c8abb1a5bedcb146633 +fdca71f2b60d0799746d8a14324b972042dd459b66d1631e7880a85e906dab6a +aaa38244de0c7d5602fb4813ac8f361bb147ce5492a080a4a41f2c5f43ad70b9 +e537969f50689c283f84f2a6b426c2d512e6952c2823d26e06fbacd023754ed3 +b54f9f9b21a1c9cb4284db9154e640b2d7824d9e440c3d12db911f4fe63d940e +ec89303aa9faf798857397daa3052100560e97689f84008bd584396969682cf7 +8f1af3b0fb1d5d39b7399d928c3e33137688eb6f8c8b42bc7274860b2b623e6f +0f358f91eb7cd6686ef8d43e0cf4718f14fd8840f2e858ff7ae0d2f821bef88f +a4121c0da0ba042fc52349b1f7c7cc411dfcda2a69a2511155d6ffe9c9acc8aa +f933c2a72894e6713437a1e24448cf1e9d1ec5800806129942a65785aca7bd79 +c7060023960b187013cda24b886b47d88798f7da85940593200396c5f0b94364 +e9865e5e7d4d1681aabc4556aba980d5e1e86f4d826c792d7cc1c1b661aa8c25 +1fc0fbc44d5441edf14385962171e673756c96da133b39d81edc11944b269a41 +56260a96b585bfb8e0e3fc6d3a9b0383af76837278b1385a2b4e90e5d4c9c3e4 +eb28e38afd56b93655d0b1c6941582061aefafdecc04e6b4a6ab701952c5f31b +28d4e02b38dee914f02a00b2fe1c2a901a96c4382115513365c86ffa5bb6623c +b80b428421c82ef6f87d284f6ac40858d1f5da2b7b43762fc0daa32f40262c93 +d64269b729dfe0e2685ae49d14ffeca6a5011d295d88e084da1bc5d816a04e2f +d5a9659b84b42b144aef85ce2c17e2d72ef9e3768728109000f4255049f3e007 +60796b40d4e61e544ab0251e33daa3a0b9469c1f476814740f0ea8bd0dc77fdd +4db021232c2a153c067ce4da65e2b61483e0d5a9db8f3c43a07239d8c3ca98eb +5e5d06a2aa5380b880371a382e7c3ca01a0f03eeaff27fc9969d0ac32e15e8f2 +3261d48d349d10d780a8e5df201c3dded7c53f500fc25d7b70f74492dca239a1 +48e4323ec23193d10b159ded440233a6c20f1f6b0211bcc5ad21826953d019c2 +f2a9149b14b42a224afb8ee04a0a8a4af88b97441b5858da8fe07c1ad8e4a8c9 +10d52e3a06dd37eae567d436ed2915e05b57fe100da07d990dd4c105b71d9189 +da6588dd9cb064229c73bd4eff5c3471844ba6bf50be3c963476de4ac42e6029 +ed458b8a3c3bd242da994d75d09cbd3861677f217f6f66d305f08f4f212bf6a8 +8347c61487e42bb18db16e92e6c863e8275ed4c81edde0d6bf812646c9dd59c9 +9688537c81e8a25a7dea62271c8c2a39fe4d301bc17a23b31f3392d844dbf8d0 +941d12ba1708c4f945fd33cc9bb25201427502d327b148bb72ee79d00270f94d +db93a59297bfeb7e21d919fe47e9e18d4e126ac0606cdde6f19a4f7616505cd9 +3210765b52c7d4288f0cff1fd98fae3efaab87b773a684fc7782cac280f39cf2 +a1de9bce84b986671f2189e69a32f490bde7fb716af16fcc6744c9cc9f259fdb +67d9d236c5d5486f40b6927fd09eddb1fe52a33740220a8ae5c56bb3efdebb7d +063c7e548e60be1d930c9dda7d70885ac40a0f24279e6a99fd83422ca12819b8 +20d2f0648e8bc09c1b3b8a8333b6a5c5045a0bc0ef5288f2e2afd776619d4bf2 +7c2c01f542dc3b418ee1e066ad72da286610fbdfe1a3102c70894d4c16d16c8d +7cd89114884c3506367426fae024b8d6e62bf1c9ea2e14446325c67def29a475 +e6098c0d6f06eb7e92b969029a325b1db5117e1cd3f9123a2b2f47e5c471a4be +4040c17111829cb08a5a14b7676f1e97348173dd9b0ed680016f66273b1e5009 +c9ab12d865cf4de5d7b50dc0c6212aeb90b8695fd028597e563111d4616ef17d +68384a62393196dcfa6398b722abe9faac3bffb71bdbd27ea528ff39351e0008 +27bdf1fa065058695da9c7612e08d79151c9f9629c9052930a08a9f3770422d3 +cb1c0c39dddc1020e7578a2c279402d1e6a071fe5be7abde59a2d6659507ca52 +c160a9a4cfb15319bc27a12c520a198d843760a6668bc21799595c4cc9813dc1 +88247f65300186ea88e8b992cf269f8b54c7b62e92c30ae776c7904248725efd +581d3f0ece7c5b5f82aa8578d5a56c861a3eae9d8bcb458cf6ae850825f2559a +34d9317b1219d2046e4a67689ee73470520aa9bf8373f00a5db56053108f69b7 +aef0932c508a4953ca0a59722b74cfc66ff0b14567a0d69c0cdb6289deb2d0aa +d340d8ba25061bdbd3bfc69f3ad0885ec9442daa82e7cb8a75dcb22ff3533216 +6d7179c29408b49971417aabab643c6251ed19e3c587bba2f1dfe40d2ce86046 +75f15b7a1e3586fb4f63fff102e9294e144b624dedfad949dec203f6d619445f +d65bff82e848a4ca88c6bb125321c06b63b79f392267edc01419a94ef7bde0ea +45d072148ffc4935ac8d1eda18ff7d3262bd82eb4798cc4d7aae12ad09b9f1a8 +9a7c246e152f37677888d9c05366ac94466e07b7ecf072973fb989637b0265d8 +47aca259c40dc4c514b36eccb8361ecb6c16fa163bdbd9fafd3eeeab4a0f88f8 +3d194ed5472c8b89e89cdb7201fe0c15b3e232c4f5b7202b256bcd8ea9eff6d7 +fa6b55a261be99accc965b3f639de83f116d083deae383d0ef6ebe54bfc693bf +3c9a1a907b2bb30dac30ab528febc99829330ce52fc4e99e4a97d3c68a9705f1 +b61995e7503003ea195ccb90aa80a2297c404867d66040123d384c063c1eef54 +bf6fd12900d331dfc6035d98411b827b4741c0dd3af609d148d4979d9fe4848e +bf7027aa689cb4cf892991d10e2ebd477b7efa93e9f457db93d89072ee4655a9 +7915af32d5343c38e84aa59e91f60adc4eb1000f6b412a3794cad0972da7e197 +6c36347fc1a816b8b0c17736c64cf497f71d113568be4b4ba6185bccaa5a8712 +ab9355f4790eae941a276979d15923bd43945513080e94dc558cb3d1b36cfdd0 +ff66442d43314981eb440e7d9f50d9187221a07ea595fce621019cd27a9704ea +384b7dd5677e279b60201149d97629c4a29934ef6aafcdfd09fdf81de7578b37 +542519420e636ed8c90768ed997ce777291e27fd4c254a3e6e68672f63fde879 +2018e870c27ba074af35b95b161e6dcd25d007ad7bd958408cab836f2ff4e355 +b9340fac1b20aa60f2e98de2e49e78fc2da563dbb36ef52d9ee4acb0c281f2d3 +5a16caaa9d691e259befc0817458565a71c02b82aec024a15fd2806703233e95 +2e9b23c267d0002d5e9a57b1610a8eec49779952160570c1f2ffe8e999efe634 +40639b96f8300424472486f10dec7521e5c824fa5cb44baad3fc315b7a318f3b +bdb179f8c86e296ba48c9620701fa94e05dc1af0fef65d928d64ce53bdc71983 +d1f5792432aa289c4037b8e11c65c99788139fdcacebbd3f9a6fbc78022dfcfc +7c237b13f081ed16902b57a3572dbf02e7781b93259231e43dbcb2e4c95cb565 +453cb6081d9116ddef98b6bb9b82bf626911efe0a2a989cad6f510586d7c2cdb +17de05f6b32c5ee7b1b23743ef615fe7ec03d5ea74d65b901d9aa0fe7e639bc4 +5924afeba8187b292d2907b704edefbf6a31ba4b281e16d0813904ebcdf10203 +1d0c7b492e96a82280acff29c46450d8b3babc52710905f36154fafdd04a13e6 +23b720c5e3873cbbe0ae0b340cafd199163babac06e2a39b80ecea32191a4b81 +3bc5e29b6aa94caf63b61af099531eb575a2051f3342022aefc556f8d38ea366 +688a18757e194af271ac5be3f6293f60be84f639e68db3b85314fe8634f3f06f +defc4e6abd8256f21da36db238d70384cd5a23fce2cbb86251819ce6e5f59664 +b473c078788317bbc20834ea44dd1be437beaa001bd839a0d5b3cac33c1f371b +ba606b7ba345a1e36b0dfdb5d0bdab893d326b38bc7bb27b70c42984644d2e93 +3c12f29421d9043b5ac63eb9648898a6689e3d7aa95bcb203318ee48f45ba9a2 +7fde14e62c122d11e86604e1cbb0dfcfc517291b472952ee59d6b337c6433828 +7fcec61067f96ba0a51f37b2f52a4df566b199f53552dd9fd33021f05acb87d8 +94dd6758969c4093536f32bfbb77832b1c5917c63a2646f1063fefd4c8c87511 +d64ebb19186ab047200686080324c03ab4fac3f805e7a7030f69117a2809accf +6377f5344c56baebba354f9c3c0170c9c23030aba41628ed04c55d58e6fad31d +c1e411780c1644f037625acb9ea2e53dd6ce91caca1a34a668b0fce85ab2b05f +6ef119ee377348f0d579922e65062099db498d82c07219bf6a0e47d0961e31dc +eeaccc75bd4d599a24bb057c8eba3cd50e1e564678715fcf379987a5e024e455 +be53b92fe2c14a50e3ecb6a938413be1e6c910b9106d90c92ff0e04b8ac341c3 +e93e750b4b19ca0ca413295737db902ca61a94a49a5fd1d87271291d8fb3fbc8 +c1c988db99da7b58ad89afd51dbfabbacb89d4d8cea6c2ffb6178ba3a37e1edf +29868d5676824ba4b61f8a61b0ed1fe94386637937d83c16914b0bd6545d8e31 +8332cb1eba2d5ee5c072dc3a2433a3d205b504c4c1658e5c81bb3480575daaa0 +1a2041d07c64a27f83f124a3537b4ed1e50a537907043e3467262c853aa4a106 +7ee91d48848edf8e3b0aa8b069a28bab9cac1456a066cb73a582fa6e74b9d03c +b6222491c2a4c1d0ab7eef3e98d625a801e6acffac9954b7a71789976c4a8729 +b0ec0f1f10f80caf7e5fad90a5484734d63d693066693abd833b9ad941198116 +2fa30d894bd9996e9444e0950aacbb71006be35bb076c6f502b1ca475e39d55a +93fcbe75781ccdc17f0d6f5cbe6ad7e09506dcded9f0ef84a2e911024a81ac76 +be2396e96d3ea1d67cfd0265eac70bf6ccd64a5f9da777eec11b34da9041082a +d96f7915cc073bccbb8ca771b29dbb17fa3de3f78e5485cfc15b44989f2b3f66 +976fd95dc394f4d9ad33ef51eeb102e3b720dfb6e38155e2b5425d1a362e0d65 +6843644f71cb111b2a2ef1cd39bf52931c02f4f9dd1b5a27c76ab1645bfd3e0d +5032ba04870656bb977c8d0a47d757d623eda26f563196080dc9db7f7a913890 +8e8c6d7b45c452f6d49899022d51a4361a62bcb2eae927ad059af880375c0bd0 +a9fe8362271bc48563481bcbc7e0d3a965c8939de7f19c25e08cce124b78449e +3d08340eb08afa14412635cd962fbb80ca415975fbaf73fa3b4747d332a7b360 +c9570dcf13feb9f063bc5cea3ddd15514339f640761a344816295fc69aa1e9b2 +add4e17bed6dcc3466aa951419ad7df58afa06ed958b5e215678c2c0993f46ac +49c771787b41d7b9d8814eaf985620a4b04d0d3903a8979237b3059f95b122b5 +d6e5be952d53b65685c8145e647de043faf85b622ccb4648de5b5bbafda4aee9 +f6984070ce148c557ed02fe0003a3ad4a9ed16277a690155471f839c7f3d6cbd +b63623e948358834766e6dd91632f495fdb14054ed180ee20b366d5e84d883d0 +8d370a57002fe752c1b2233ef09babd62b1b7baca288e59cb6fca5f74384e3e1 +56746af72eda26aedc957af3c852103f171c515f74fde6edd40a504e51276dc0 +f64b9585ee82606784b0f1b791df3a92200d698b1a463287b27e4e1853d6e21a +d6b1d3392a6f710eba6e5fab778b30c48a5238528eb13d166c7358db64d69d10 +4801aa1c000bcdc3c4e487b6907c7849acf158de34273ea4acae0c8969f7c58c +db3e8efcd98f4c666e587e63c0097e2e4457c8f2fdb9c225925fcc499d80494b +a64b8cc6638b5d54736726d430d35487ecee985d8dfe13a9f2e7ba298942052b +94f110f387576007ffe986f63e01dbef1ec8f462403d88e0be5c6bcb6c701e47 +d27e27c2a4851f028cd44ffd0527feaac5c6e52315a6038948c94e8b4b96fc79 +b32f57066b785325065d99f62b41c1d290733a909510d8e216f4f7fa8be3a638 +28c2a8fdd78273a877f90b013d1706cc30de41ef4963fffeab7d5366ede6b501 +93cc4ef40accbd870c04e0f0b8b0e2aa66d7ec6025eba23118ba22abe7235cd4 +3cc2d64229c21bfa72e0c07ef15b48719d73d31aba756a159263fdb8a9591bcd +f61a3465d1f34629b1a3caf1e6625155f0cba6f24c91e317cdf773e1d855b675 +d4b8dd195e4801181c0062b61cdabdbae19f0e3edc56b9de18be95905b199585 +9aaf046421e11b866fcdda58147b9702edf6ac03a5f76e96f9caa7abe1a74c22 +9a0de6037d6326eb827d3c4771969648eed2014544b65268fac907a56a5676c9 +c3ac3e0589e2f4b7a43b8937dc15fe07d6c97ebbbfc20bf5e20df3d95cecbb08 +97d9f9b4f31b6692e200026ca0dcd4e672f52dfe518c30db176665413e60d207 +52db7a7b9e946c2ccc72b308870c27a70e483257fc70b9f905ac404fc03b9bcb +2392b55bd6db117898bd012bcd03e685daaeb37933c9f1d07abd85bc173c14c6 +b95be46e20d643de3a3c756699dd528148f1eb4ec3d0c91a41bca23b49cc604d +2d0e3970bd603313812c0fcf68825354d9544128f879f3c698e9adb76a16ed13 +65b65a2205cf3e2f516b4aef5f8c8c36102e47afca34e706aca2eec557512603 +8b7f5eb950d151a6fafa8d4b04d80a1a7f4365ff8e5c12be330f12132bb933f3 +96467e1569c217edf9e6ec5733642a28f9aaaf9dd869a51c1f058b0d9d064a9a +653c8490ff1a872f8367fc8e7216ace7577859f38a74e6f00c430a04672a464c +58b741a2b8db5b080f85cf30991435125ac7c9502dec6915b6f1ffdca3b81089 +13f3a2336d128c90431d0194068f3ffaa265e5856a533c1dfe6f3a37d65a6344 +0d4344bc07f7f3ed15c3db30ed945d3649c7806426553d7dfe5adda51c24fb03 +473102baa466846cd4e0dbac645cc72dfa84ccf5e39556ae05cd516f0e05f350 +75b2c8a65666ff175a5ef2f3b1bbff4ad89d3a35a42e96ee75bf7899b6039df8 +cc8ef1bfdcb4227486d0c6938e2722ee1d76d11ed35b0725d72b480bfe311e28 +26f5da51c65395b49baf87cc29f135badff38d89b043b5095944e3f699175780 +13309b9da333cf384278f491e4161e4cda6b7a14f47bf2a3a38755b410ff0507 +f45d91b0aaed0b2d4286b0c4350eef8aa0af1c308b2d436de419396d6d23e2b3 +760586ae7527811b5e0572c83622a2d27ead8bda8e5913d666dc848ae04d04ad +972bad412b54e92ded73ff89cda38ea36fe725fe41caa059bbd2d7e218b520e7 +71442aa4c13ec5cfb33ccc0fb13a2d4071f2903cb50e879a8a08a4e33f65803b +6649531dc4532536be61bef1fac11b7a4897e27026aa064eba648b83ac0f83f1 +71aa2cf919115764d7a47c29cb7eea3fd1708df1404a89fe9bca9702c40b7af8 +0245e9f96b9a7d36883058060fd2b1c10c26d6ba33ab7f92de51ac302295cd1d +578e0bf429dada86c0e2583652c2bd1770047429c8065cf559f19c2c6c36cf75 +97df8eb3cd1e04842216515af5faecd02f429d5c3ea1ad8905101dee8ffee0e8 +1e9c8e2e7a77fe3bca97c54fbc773b90b6081869a26d823e13f7e6f006efcfd7 +ca7de684063da23fefa65d51fe5f258aedfc473279138685fdff2c24ba1293ab +2a31e9ca4ff51f5eb23cd450d35f6c5cacc1f90cb7933bcc122e4739ffe7531e +182ccfffbcf887245c03a07a4948d72be072be63ceda951c139f2b3bacdcbb44 +a3a35853cd2a87e794ffcb604f11b8b873dd6f1de2c5b52336bfc105b5bd327a +1f5af182807b0b1f65b3238720859c6415f6139ab660d66b81010960887e9002 +7c48b8abf6526c54f29289db6ecf1d92ee191c9c68f7051d03cc70aaa8e5266b +62bac01cf5d7d4a034e6ca3fdd5b7052ea4d52b6d7c59b605c8dccb6ffae3ab1 +8ac2a53301d6df8b7b4ce1e55583c4b4014efc60e0176a84b00f483333ef3495 +b228650b0a3d8acd80d5290adcbc5c5eb88abf8a440366ec933e998fd718d121 +3a13b84ccd52c8a980e288a8dfd9d4f50a875b29679dd5db1449e29bdbe04887 +0077b6d503027c586ac7b3c5bccb48efc1d348c7ded74ef9ba8e890ffa5e708a +c8e4229ac2a130cccdf8c1e9b1e2fedb0b58b6b45637b2822827efef24555a95 +2a5db1920a327c4eba1e56e88d1f22ff67bdd4692784e114ced2d3ed8eec8e08 +dc340ef41c15a8b36f1856486d9141a613414cd5faf61083dc118fa329fa9fb3 +48fbe925f7e48fc69f3064bbf821a2885e0cfa25b51993afee99696db11ab4ed +bae1120a08bed985ea4d32b5bea5ce63ab930388733adb31f161eb0fb50f933c +0878c749aef570160c780d9519378f4a5948208dab0a9df78170aaa37f517c12 +46a2e8f0105506dd43201a6f4087c49e90687a1185004273a3cad90cc5c22f54 +14aea30a8d341520332ec78282bada90993e77c6da9f83eec91510cf532569b3 +514497833d6a9cd4fd507af0fc8e89f961ffa67ad497789ade659e5426308d8a +b8bb2677eb19b0dd6222a3a98b0fb92672d097d8f53b03b19fc389e14b025fd5 +0c19de03fa9f3e3a1cffc96c2b4421e870692ef8c68437c7a7c2ed4e0a9ff405 +8a24401cd304df5a5c5aa0548432d3973bf82429b8c58a7093ca43d44669a4a6 +9e4ba34dd952a6ae1e1b31bff31c61fba30e8352b7978a13e90567b5dd3dc9ac +b64222017c7f0b00865f0172824928d4620f87727320e8e4941acdada83aef8e +64885e504e97755eeee5341a60cbf7eef8e95c44c7fa6764ccf53319a330ba3d +a5455be20415268cf79fce380de8930a3dad1a0b2f990d6b91d897187962e0ac +138c145c8da2f410728bfceb8885a779e0d3cbfad56a75747b37fda7912084cd +26e69abf840eefc53be0e384ddb545c0a457cb289921547db7d3ebe0ad126730 +bd742eb41c216d22ee804f465fc4197f2abb0f02e62bf31a89ff76f4503bab3f +f1cbc87845308b38c23e5920bb27bce026a6908af55819029e8eff6f5beccff9 +7fc9ca97772a3ec2e6386aab959595ca41dc8e6923c928c48e900a14d2bc8222 +eba0c9735400d51c930803f8e09ef1347ec7aa6196f7cf07d94b6c798c53f894 +eca2daefaaed5ac38d506b8666bfa80f1b8b6b56d009b007965b9a0fe510e08d +e600e7f78fcdf59136c6dfc3fd0ed93709e1d34a60487a63f185edc4868b3c37 +fb871f3496cef623eb61a1ec19bb002d2d5ace609c8d0c149e88c75bde7737ce +984fcc52befc07974dd9f034c64da5d6eb3643b5a03f7c2837c5d2e9f24102c5 +52548ebc8b05b707239848c2499ec97d0d51f30cac220a6eddbaa96592f768ba +5d5f20975de8abee8e4705727aa03d057c158c0b109b83b2ffd129894d153340 +aa80b9ff6d0cdede7ef0d7b9867065b9a3518b566e9896e2ff8f7cd704f937aa +1974eac5ed40adc8273d38dc495422de5a866334c22b0047146e8698c91d07c6 +2677a04aba7700e858096ed4c7c47de8af3d5d640a2da148f0aa6a9e892411c4 +cbc28b904d6499b3df5b0a530e83dc55bf7d6011c488bcbfa3c7ccb816bd9aab +f5aa0b23bda60ec02c62e4b3f178362d29832d211cdbc395d0d0bd67b2757f6c +9c85427cb5dcd5fe999ce6eea89197a6402418b2e0640f4b865ef6a71ad12b40 +69110a308fda56a5610efd059c51e846ea339e699d1d51abcbc6ff61b0bfd200 +aa456a308b056cecddd1770616e22e60025211f51c109e4c795d359a9198987c +9c4623d5076f06756c524adbb90e55aedb3c4ed127815849f2c0349fd2b98058 +c17ef02a5ebe5ae92caff56b006f8ede861f59c4a0c38f60701b4650ae6cd57a +8e47e07beddf837d436d151270172fd066b9bfa822b0465a8ae41559fdb80506 +02f46529451b3e8f3c4cd322a539e098500a799984970622b31598232b85d76c +47ab24f48874615e34f6f85da320332b8778568e2af667064c1b47cab12fe81a +a7c6dad2f56689a1cf0965bdb2d9f932e9a504dfa880ee2275d866496dbadfa2 +79c991a111d18a5b3563609f3c0ff86a1bb889a67f16bfea04224f893db6be36 +caf6eedcc725b9373edc4fe1c7234db90c2c5f80e3147b533d40d1eba3ff577f +7bd810c7e99cfc3ddaee47efd2e42856ec7f71b558ee178f785274ed52092ad8 +9adcf163a897059b0324afc4d3b59376c7eaa67d9e9d91162e9263047f86174c +7a414bd40c7406a6ddf3608ebb08ec243444127c7e83b525b0f1aca349495c9c +a47141f28b5ecb8eeafa056b7851120343920aab1531eedfb4b0a2443d137eff +04ac84fba976b3310ff100a0950dd22b61e2c6caacd911d5bd98b7ae05e0f1d8 +c441bd47b05a8e7f912ec27f1295210f28c919c7cb74fa2ccc90c472cfdfb4a5 +293ba478cf22b0d5c073aab4793df0b3df26287306cf8503e1c894079f9d5c73 +d6264509cd178437c787521351aec7590df4e6da9aa643e839239b0c3dd5b8d3 +28b4181157e827586d3b94a01ea408e8be6b5a82aaf0eaa1dba9555f48f8b712 +32ea460876fdd3144c016f98be48be34362bd5a837cb8e6b74c28384da61b168 +e3ab8b8e536a2539dc06c077469997046c88fab1b81b69e60f0aa1a099e76bc9 +1531cd3c30bae8ad2828c73908e5f6e4fd2cf93ea8b8cb05d2082f6a5a50d516 +fb87947a4d8fbdf97737363f8f448044bb81b284e3777b312a97efb0d41d578f +ea9daa31c93cc5d3e36e0741af30b7ef5763fada0a567aee3ec64be345644214 +d26c05b4b2da8c4a73ea6938a53616aa4dbeb1cfe0fd30f6fb2a351cfffdcfd4 +b33ab87e368984b183e573ab34ed162236ee8c2ac5799932b9107424c4f78704 +3962373b6a3036af745f4a021a9fad51109467f134f6e5a8df53a604cead7fe1 +c6f2a9877c66e85baab55f06a17e7c2682157e461ed8cd999cc9cfd0b48686a0 +23a57612c33a79c449327fd09026c10891ce651961fa2c601d6754a8d2b5f8b4 +16f2e06870ad5027ccd4e12ecbbbab70c37124136fae21659c6a51f434970372 +9256de7c4cd286a625bd1566a331321fd6947e4faed363b55a2d033810f6b1fa +258c28b2f9ec04b0b2b04f994db353d6fd52326111a22d244a83be2ca76379ee +1a3ffb36afa90b6c6432fec515dac8434c057ae7d4da7117dce9ef007fbf3c25 +79b8be8f8e92b4182764d2412998e3a1632173e23c6c4202c0df99110fe22d3f +d85f8decc66daa3f4ac0604e30488cd9c4a99539cf38e84bae5e2cb9f22d2d7e +dd121ec99d7349874a3f7b473c13c216909588333be701d8762a83d77152904c +d60153f6cb28953e5abdb4af4a25b54f7209009d828d21b968b517dfc22cc391 +9d8d5e97eac02841a585312a3f0d9e34253b6a6127d1e95b7f79a75a6b5758f5 +4253177d858eaa3e3fc59adf9d3a794d4c490d8d759c71226809afc303d519f4 +fb6995dcaf61d8578890e20fb7d4f2abd17a6c39105d7fd85783293cf8a129c1 +d73ffedc5a6821b2e76c179b6ccec8b4ee8a9b21f29396a2d20374f16e61e460 +42c137fef77342e71a6762673081e07dfd90c459ed8241733732d92052d1c5f9 +53ba6328701bf48b73b43a92b5d70c050e1dae2a3a893b8697e92c7561936c4e +f8daa0d0241f11d5fc283f13e2c711f545fbe6908242b95ac54fc60d93437615 +cff7595ce8f824c9e461b7372e32dd01e250eeadd287967241babb777e4631d9 +d593c26ad0b1c2e5cae6fa5a63b8a86b7e7080378a827a5fbac08ea8a4cf3b87 +07751499bd6d21aa3735011ee9ec7a345510f6de9270f184f366ff8d83ece920 +ff54a0289ca41b795a8108077b72ca419285d25fdb1ede4efed1e953ab5d3a67 +d91875f00e1792e66a7c6fba8253b23b5d737e9c435380a652711d0128db7aae +bea99f7c55db98f5d215a29196fc7394732f176c016d2c9846238451429333de +5faac7103059cad8be5ba119308b267055e6504425599f58bb1f5b492fcff503 +34a93184ed203e5e58c5b57ed2d8b9d2fcf609f4e1119d4db518b53f3141f555 +ed6fe29f362ef80a604442a114ad262f7c31057a066fc8e4814f5d52aa65fe93 +748780ab2fa91d75494e716c07ad9c7e93ca4118623b48debd0f3f49e3178cc3 +8cdd15561df88cc649a87661a6774f80bb968eb1c9beb779cdaa98c9a538995f +d0390ee51da0207e9f5b8a90e32a34eefc8013314902f10a7ae525ef42fe3789 +7a50023d5e14b72f9f1ba23ddd04ccb534dd0454396a45f32df6dc9fce08db19 +c16a8b5eb1b9410c2f3fa5f9b080b0a4b12ef61288b6d9215776355567f62ad2 +d474676671a61441780a53bd08e9a56ffd6b17249306b5dd78573cd29e5b96a8 +11aa82bcfacfd829cd9686b609ccdf5c82d3e37415eb9651010c54be4db31995 +803793bb1379e825a62097e674d9e80e8ffe2cefc00214a3d0bb0ef7ba97e91c +15032d591f8fee033327e5d408987d29bb80d329c88bc128af6ec86bedb12c50 +f73d74daf74ba1112c487e4539e862964caae9b7ecd7f211253fbe4af1a2b6c9 +6d2c037af1b2cd82dda2c3b2f836fc44a6ae073eb9ef1a11d0af086ed9bd209b +50a2951d3ded365c19e7c7916e9f1b32becc6442e7398ab7d694af9e6cfa4ebd +5d401037c87a1655681e89a339f43c54d48ddbb2943bcf24b34540e86f829c1c +06bb76908f4570d78048d726fbfb3c70b51cb10f954368078909cf66644592c7 +ca7653908e81bf65f9e353c4dc777e6b948ec197f73adf49bc281095a8a700ba +dad0d3cdbc4cc02aa28bc84cbee50a67635864efd202bcaad46ce2bcc5b5869c +a04a10a5361400891a397da40b10d6c28496bb24ccbfd45012a2bcd7abbc7f83 +26a4ab8214e21612dfd808bfd8ceb93c2e4a838ab84764f03d5b6485c9aa1da0 +645047453f2dbe2ca51aa39298eab19e07d014ea9abefede5f8cbe87528fb7a3 +f0ed +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N231/TimesNewRomanPSMT 1 TZ +userdict begin +%%BeginResource: font Arial-BoldMT +%!PS-AdobeFont-1.0: Arial-BoldMT 001.001 +%%CreationDate: Wed Jan 27 12:58:23 1999 +%%VMusage: 29118 36054 +%% (C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. +%% All Rights Reserved. +%% Arial is a trademark of The Monotype Corporation. registered in the US Patent +%% and Trademark Office and elsewhere. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation. registered in the US Patent and Trademark Office and elsewhere.) readonly def +/Copyright ((C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Arial MT Bold) readonly def +/FamilyName (Arial MT) readonly def +/Weight (Bold) readonly def +/isFixedPitch false def +/ItalicAngle 0 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Arial-BoldMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44341 def +/FontBBox{-167 -250 1006 939}readonly def +currentdict end +currentfile eexec +904c5ea1435c9964cdd2a085e3457969efc1f06f924c0c2cedb5d3fb56bbd867 +ff33f8109b45e11ec8c3ec831c257313d39f7317b33e7a6a87834ad3af2309dd +d570b5b05a89d90d15aabae2ecd6614dc71e518b0a3a41cc97d0f3c7f841d5cc +185b426aeb3aa36cb397b88084ff52894dbeddac6128a2b8ff8ec53490eba76a +1279fd2ef2df0edc21d2b3a9b4b60b49bf10deaedccf43cd1996d3ac0927e66a +08d84a2d87c1b24dbe46f80d69e4861f789ebbef23cb10db72a178e4d81f44a0 +ca65a9e5e6e9a233d4ea1da5a2535b8442c7f2bec1da944a968dc79028143b68 +bb968c519edd03904b401f0cdce036d732ec3d2ec0b304da989d833184578e02 +17eeba59f9d57b06380c7847a01eb3f254cd82fe25c98612fd48f8fe49b6106a +21be0015227fddc5bee5fe409e2b749ebaea8604cd3a83165d85dd8b89b8a6ae +9d3ec7d031056df554971d8946686549eaaa1f691d739f9593d6ce5ec6f934bc +513eae56530858a3a10b971efbbb76937908088ffedaf25eaa6d4a94fdac547a +4ddf8a5e632edcf4c13b4289a2592958f5f67807800d4670a3579f63b201ef90 +820568e50bc86c6a4045f7f0897afdb6a2ae697669e4e7da13893dd538542a37 +c877a3677358a09a650175d1e54fe86e4ab465f6209f0e36d1ac191d76aa6c23 +d8d184b5e89c765d38e5782c5c53fc69195aa9976418b6a210ed132491c1b2b8 +cb2c4b7cd44236f75dcbf43357018202b2a6ee0086bb796d6793153c82ec0257 +d6a15add604823f2ff5b0d089098984d9756fa7d10e5190454b14be92afdb4b5 +6404497a99195fa4d9c8877aa8b653be9c9ff279c5f2c185e0385536380c694e +621881b18e346d495c37ae1610556e6d7dd28e7f22dd3772e679f85e0240512a +47508a7a0ee1e1628be8b5c3ff89a1fea57ab9eec06fdb6eb3cf72532b1227f7 +cdbfc2b0a7b682e67c2b4e20b0daa6e85389837ba3788e2d51ec274b3991cf80 +7e5f6715d5dae3cee7528c054fbe9e338e874cc1eae6144ba0c32fb8597a5f6b +0325d1a90bdd9bd0cc1f5bea118bb9a492cd9d46355760c62f92dab4773e004f +c1fcd2a11bbc547b08c859c7571be62b06a7c2623ad5ea59d065c64d218d9ece +c9ea4e7dac66c24c535e5480243cc85c5db385ac30f4dc8078672ad4c209871f +781f3abde767369950e9067c57e9be14d340cfd4029e46fe9d88ddfdc2c5c45f +e0d4a04624c6ccb5ddbd746e55353be62c1e40a4c5e08b310228fee2529b107e +12a5bd8f459e98c36b008968589e4baa9ed32a7a466de35554c1328173466150 +a9b552ec1397757df4fb9912190b271bbf6d2b3844795d4443c3d3c22b087a1f +5d66891c1319f532833d83fcb765e41e8527970b07a84546e8a1b2513a846d1c +8e6e3f0802cd1fe6403faac5de2cd5e94acc731777e1e30f173efd841650bdbe +b003ec7b729303cbca8ba4022ca7c472928ca4c3d2b3f591ab05cbd640dc4f89 +c62012ce599ea01c9d309cc5c0e521381c04e735594ca26d63705c77d07ee422 +4d12bd20f21d4c7721e79ca9bdc32b2ee579ee2faa608e91cc46188d6e94d682 +a18672e65e7c6c00a8de4bed9c2cb17bcac1b17da71c19027ccbf8d73b130877 +fbbd8a3a6e1515c3a5356f3f00a61cb224b609abf8d33c7e091c0687aa2c113e +31fd54aa16b3e0282f1a28ce343962871f2c2a48de4777a4e3997b6ad8119ba4 +34aa2c53bc31949e96a2df24d13fac5c004ffc9d66e2111ff1ebc256a414a15e +2e6a2f2507bb131da16caef7945ae6af7d204f173d3baa63fe77945c11c41a69 +566cd444154f5e8aff8bdb7dccd9a64a76ab9900d0479de60ad47fe9011e1018 +9e7a5869f375d0905e98fa91a9235caf717233a8aaafcb4e8d9271985395ab38 +443ce7613a5ba73ebd9a17525b601cafa5e5e9bae89f297d0a0b182d97bb58cd +baefd30846733dad7f8b22a10690ea34c4d435ede3d3bd02946415f82596e59f +fc8f8bd657720b2065ade950a4e2691debfdecd49ba7c8efb98f810b0df03632 +71fb0866db0567b7bb372c7ab2803b20ad604ad57028610bbfde5ac74d3930b3 +13c279e1c3d0c1c048ad0d35672153e49dd66d3b0bf05a7474d50a311fa329b6 +986eb0b5a0fca68bc57abac69a3a077d5a9e4ff57039d0c14c7253c8275cc74f +cbfac5c6ef1159f7085fe04754b10ac95fc010b67f5024238e38369213180c78 +e87f77be8851f190a24d42ee33ea460af2c3d075186ce9e736da8b0941458185 +d418c36d27b47966c691a104dc29c6154221552f1dbf1b7a9f8795ccf1642304 +3cac67973b383df736b2d2c50bfc821889525f84a6474c186b2fcbe8339f1491 +6d8dda0554e53e9ec559d525ebee198d6ddaa521cdf34a78081b4d5ad2bc44f3 +3718516b1f9bef4b9a183712f8ab7b860006adcc3bd66c029cc8e2f16d72287c +45f596d3e9aa10d92f506291b18d211e58943da76432596e14f8beb19d9a4f81 +bdea455976517125f8cf99d8db478e0b747895c95fc176fe720a427eae14b280 +409936fdc7b433de11773b64365c82d50000e9fbd952b4c0856b5d1dc09e1861 +10da66d52991246dab0c1c85a4440496d2b04c92757f939c19f4395d3d28cd4f +96263cff6cfb5bd411975a3807a6d7b05395981d1934894df0c0e9b5409b2d9a +15ea0dda8279899d1cb753e9a85f7cd0b382b28766d411d805c07a5991cef28e +b6ddf2c222cc6b78705de23c3720933dbf7b048ae34f51a671fce67ad547bbff +3c0118b0946e05361a8e4670796c6e71407377f66b20b6158ebed4d813d21186 +7bf5d7b92e2fde16aec3606e9a9b8068d5d3e3e42ca33fff03a5c6c987e2e257 +19e5330ad74f9c8ba7aebac33405eeeaf0ef678b12c9971cfa7e072f50d7da3d +af35ce1366e2fbf05677906c9f04a0822219be02a2a7f33facda252cdc22938f +2983577b3452bba9e66005527a871675fb7b76199eff20a2b4cd7fbdfc751177 +b9ae47c0fd7a9917ef43abd1515320e678df666836d21b418d4d54c6ff748ff8 +a0a2b7011298d82204f86d14d4e8ba7c6bb93eabb831a75565d97a5263ddab46 +5b27be20fb3f3541a44aa61ddd877b5e09b048cabeb786fb2d75308cc7d85798 +56890a2eccf31724e8bfa65f4e9d49c4f197c62072717aff3f3a63b6d9e4f4c0 +4aa1f2d0cd910f6d71f61d3d56c1b76bfae087c17b1e46de0c6d80d9b284cb2f +1d065193037bf051845b51d9d3f07e84c8275f77a8af594f07486f42b95c2b4c +8d3209007b622a3307a93e393144d56be7886d279a5ddc68de3e69a8eec8684c +353c8450b7d60d815860caa8af0a94e5d1938514e5782a3409af0e54ca9c999b +cf7048f6e5e357443fcad2c38c7ecd119751a44bb5259377955c0f0dd476cf45 +3f3c9412df5d750dd35a2907997eb4d6ee431578d38f50eead0d887c659d0137 +3552ca36fa23c7a680fee8d1710b7accd50b24b00aa6bf0b4b5b0cd00dca61d6 +55a1d06bb652ca88aadbc920d81433691b46fd11a61f1a3715793b114af8e864 +55660f11cd2b0e27c0f08f4963ea558bff1700940fc26b4279c37b92eb52d4dd +c7e9dbb402b8324452b7f348a45e6cfb16f24dd42bcebc344a85cdd1a1c65de4 +34aada9f625b24607d030f90733bc36eb1555cf5e40fca955e8d364a0553298f +86e53f01029a9b2bb509587893b982b1c6bf6042eab5231febe492b05cbd24e0 +509e998af52a2cae5ddb7450c0cadca13eae1d46553c741e5d144e8e2568c01b +5fab73ab52a7638deb7edaad8b4c527b5cadc036837a42b2a244253ea37fb6f8 +2c8ecf00f03eeaf9c4d15675a7fabd5700b6cabaca1387ac2cacf431a5e9b149 +5f3cadbd25e4ce096c62ad9711277acfe292200de85ad56f0639f7c007660d60 +fe41fdcffa9f8623a4345ee6c764f4e1c8203d0e1cee0a157fd51f31f6a8969e +4078a37fac420c7d9fb96edbac5755295cb6b99a0f68d171af7c338cf4380d89 +1ef58930c9fac0ed5e34f70561f25097822dca98c78fa4ab5eff232bb89e31b3 +7b8fe9a36062fd1c0b8da41c4f52c8c9a39e768da50f8faca7f63906391a36c7 +599c044c60821dd5e8bdd143a8e69f2d5f4bf1566da816ee3e168c9b4afcfab1 +dcddd6f4a61c2a489795a8b23a027c8393e78a8feb4fbbfb196b463cc2474270 +b48e4d56dba877ca9901ebd606e4a68d9c0347946fd33cdfffeed1281b2ade71 +79eec9105d2b9580296a056923fc48bfba1d0286a59446dfbfdb14949fb758e3 +ed113d4b7ad473e00c311fb961fe7dab3ebf015fa81e8e251daa7137c7f01c31 +d4d93b2a48238ac77f583c76c76dba46f7cc9768f72591aae9f898c0c79b6964 +764d294e4c8bb1370efecd980a0da83d90a202a65db5599e3a33d9e6c7f068c0 +8ce35d2d846429cc3064913625f2054ab1d9bad3c54e2c6f0574944083731820 +125c093b735475396bce415a242c407030a4287b08f19182ba7a3bfb703fc49d +08a039c9586e0184e702867a660486a81f988a6dfaf89dfdb643535658ad505b +93b3a884e155cadd61ec6a75aa31fee439139566de3a93d884905abb26151d66 +cb7fbed8f77ae2bee09eb7c4b95e424c888780db4844f2c3dda83e03286596fd +aae457342c3cd46e4c0c2556a2ce0365b9c92e7dbfe4659deacabbcb51c2755a +08b86982f9a0a62ef0f52e3f10b048a8e4aaaca6c816c74750d103ae25b6f75e +25149127aa461f1ed7241f0b3f4ee932609145e12c4e871b271dda33c8bdf01c +96bf1ea711e34cc692b1157e2d982eb81a8cb882d13780ada5fed7c2cde98e2e +7c92af2a2194e3a26a4b3897ebb100934f0c91c107006ef667c8a39a896c4401 +4b09c17ec8a373c6a17137ec5215e78c7abb99d16d4a179f5a6fa70c8fa2a229 +68bc9de172052d4f83964df6284127bb4a24d373968e9d0dbb9d8d22320a1918 +1999ce0b8a4d9374fd7335e67537be89af0e3ac7988f2613edf3ab70d339ad0e +2f82ee110b6d2703ab6a7ff6c2ef8950614daf82c06a16951e2bcf840f4af54c +46159ae608574f31f8ef331e4ec9adb2a14048d7fada855975300d0b717cc777 +366cf3328c063c84fc653eae281aa5e4741a23775e73ac45b7dae52a5f7a37a6 +f5483fa1775ff1cc3fdac5211fd7d673b740c302dd8ab9897f063a378727346e +892ea6a2205d571a62686b169c90f1ba8e553297d1556ee0255a066068cc051b +afed6f7c28902077fb118f6cf5736ebdae7974eb330f1a082238f854075f5751 +db23a8f721b06d874fed4cd8693a320942fbe108dc72e180ae5ddcb7ea411ce7 +bfa2ff75de6381eb7e8bc5122ec447d8fb90defdd25daee0fb509f34bfb799c9 +df27d51b10e41e12f271d8fde082f7963c8ff60859990db052a907905d3c179b +720712c2b7d6fa528a140e64b6bd0e3687052db3b48d85a02e87fd05ed4115fe +65c47155edfbdb55278b8aecb89039ccddc6437282d3a64ead2e627d42ef640a +0c6cff05f8c7fc310d5ac596e29b4cbe52c78a242967e1ac67fb55aed3eec873 +58b2d91799ff49d878adc42c2451f24c41617b250faa878f6d8aead1d55e6dae +70d67c102bfe6a8ba5a6332eea5040d39df71712106eee0fc195ea5c2f290d74 +8eff8ab2a2225563962379b399ffda04929440f4e40e0dc7c268e2750eaa3cce +ca2ccddff7df67f6d60a2c9e8707fad4aaed609ed9b1800a27f3fde7f0c88922 +f60cac09bce9bddec3c88a1d4e9ad1712ccc3c17a339f4d40fa67acf8ebebc65 +d268a2bd3c1e71172c0adc9a96b085970e19222e3c7f43790f3e7e6b12167f25 +c8f89409d75255793e5ff7478f0f530dfb0fdd482ecd913b4f03b824dbad07ac +c60c6e6866a44ef17b03ef0839e6784b604bc6f37fe38cf3bedd27284d4507d6 +faab577c1a3423f2496cbfb8a0085cb98e68b5a5154bc27a62f164ace5dc0297 +b61a6453f367eb66160a8fa894c838814435a1f70f89a219bdd4cc2b62257023 +6955457f9390f04cfed2141242589d0c283e11488436836f5af9d6a69804bf0c +ec59e649f57a06c068a65f81c9dd9f83370a2282e21ecca780403a425d20212b +1aed5e43212cfa595b72b1968a9fb43634a4bc8f443b933694631d593801011d +abf45e3ce31f03ecce95eb17ed0f4171539fc036a0e5059450b529d57f922b7f +20062c50af6e559500a3d43aca4db29c4fd7dd07d88737abaf09e31054ce15b7 +fc1a6da06faa42edd22badba7e92ac34567657e801c8bb7b4df977731645a340 +ad5790a4f95e5401384f415aa05789adefd9aa845b7feac78cbd1ea8f013f8e7 +53b1a91f21170ac6ad5a34691cb541f280e7e087164f91f5461880317787dec4 +2044813b8adcca509a72e4f6bde0963febc4f945a8f33ae12c08f6a8ce1d3a79 +254b54b3a7ac28a6ff2efb4632538c9c632d5c579b604ef5d208837b4265d374 +b1e5870f603f2267173a81573d1270ede575fdf3af37f86d3ec58e437cef6a92 +2048d070a0c938137c0a60aad8f7a4ce9370989071e4239592d253692f821089 +1a914d07f302cc4400bd7cb594da50057c2d55f384748c712d49e52227f63b88 +fbfe3bd01bd0fb4d23be638bc3d3814e240c2d5da610408294d3e72867710412 +143d23972887c653298effeb49246436211747f1c7947f4da3113d17671e157b +92207b0d5c5871e3ad93314de9d105c2f6871d60919de32d79e2bf7123c4e16a +307ffd0612a89e24125d362748991574c4c922f7d3b02ae0df881222e9b219ba +2e31b7f35d14a1d79667371118f115756d88efe743525f5c07f244d554ddb0c6 +aad2df108e8cb248218ebf98755417a2c55d9e6d8514ad7965a31f2ee5f7134a +89185f2b46f4f365c79b97cd5575be648a8d2f3abe20c5dd544484cb2e49499e +272dd68a3eb549d9f933d9fc6d37b43ebb52504d9980bbee61cba16350f6405a +263520bce644ff08ec4cb691e240ab8e832978de1a59975d4f13d7b1d71da3fd +1f11471a4205109b5b6130870d6975754975ee4e7af5afc95e7e72021cb09843 +818e0114a3c60a2f7f063a8fc14aa7949cd4e8f5fd2ad4e00f2500a2649df989 +7af068d2b7d25b1d8a6637eb1dccc49dee641ba04803173ee20d13fb93f91fb9 +957a7a6c5d6cdbfcc261b3c6147f68583414f518a91728c3ba06aa260bda3573 +3027860b91af5ffdc1ce1bb8516232ae20d6fbe5582253294191389f426e0c4b +5b2af5b217724e487dc5702ce41c81f209a1998fd53cc14ca1c739ab5ac27f65 +23fd37b5a3b55ada156fa5953b643a90432501f41402b1f3271b5345c44e1ea5 +b2c4a5171e4d5fa1c09ebfe2e4d1cd17af51d74644c1509524a73ed07f7f0b79 +150e4dad1aef92360738caae75baf1430550ca9898d5876bd543a77203bb9a9a +9969141f8c564b0685b9daa2fead6b0aeaf326b99174a15a37d80ae534033b13 +faebbded869c4d0dcacfa49b90d498d318b215bf9d7e4e7113e55fa4eac59b91 +a84e9c55036beaf6e12458f314909c55b200f32b009a9c90ca8d185e5905a1dc +f7a057706f80e1a0a7a1e31ac63611aac857d429cc98dc77c52dc6c7e4d0a335 +463bb7d3dac4de2b35bd6afaf997414bd1caad9e647f39848582e178aa6a6fcf +0e5bc132ba973011294abf360296e266fac72a898967ae5c087a93868c47f24d +5cb91ae7d909e2cfa234ac00a5ab134c7d36905ea77ee29fbd344cf52689258d +338a1a94bdc2e8b98f8996b3e87fe0fb92408ad3f786857566fe67f4977f3144 +a3b4e6b1ffa1d428c33eafc907d6d9948ecdfa5ef38399325c09133fdf835234 +2b66a09c2b22244fd50712d3d21172ca361495213043e4b2bef47830fad501aa +6a652861f33c07a3f5f6744c4fadb9e7ef9153005a3f245d8af179da515a7aea +8197db238e4cc4f2809d06e0fdeb52bb3c3b070e1e32acae284ac0bcd3196803 +67f8fa9971fad0e3a3489261a57c826ee3d6c148cc24ec18a366140107f495f7 +d85abb54aef57e8a5ca874ddf1f0d2464c4383f8560c7d4cce5c2d0b56898c39 +35576498baa98f84ed7ec4e45c05d61b292a7b2cd760e44685c9c91b680d4f4d +947e42c6da5cf0c8ebed36c99b54988ddaf1c1c8b657cd4fb802bfbbf01eced6 +140dae7089c28591730a00b52a8e88bc4037f8d0fb7a594a4d352351811ffe55 +5bb03ccf1615c33c2e3043b143914fcdd52d113539d1bf51552c3aa388a88aa0 +eed22ad41b2f50d23e951d0a45656090fa209d824476915fa93be429ef5a61c4 +7b27a73fd1b3318e9f99d52113fa80f158869960793cae18aa31002ae3395c3d +4c374f5f0ab2d3a2046492245b932e989e19b48d57268128664a8f14ebf848ef +e15cca8f46514eeb92d9063eb854d22d42a5c486a14382dac87046ee3e1072ba +0adc6907e4b5322113626af1a9ec082eb0d884e67e3cfb2034be9e84feb9bf2a +abecf966a05232c80742e78f0b22d2f41e1853e71ae39cfe3cd0123b0ec11204 +e34066dd1f12be2f4a076b30e3432bc4dd7135a1314f5b840614e90150a12211 +39abbc3ffbf7014fba0e66befd41f5952712b25582c415e084d6b97dfa93b51b +8f68651029bc6c34fac40779f5568a5255cc2a4c96de123a35c83d16b5c9dac3 +06bb5fb94acc38f871b5715409b56d7589d661b2ed9b2145c4ea90470c51c194 +4f5733c4064d8b66422e4c3b96eccdc6c43c90bcc5a234ffe6307a0bfb900bd0 +fc9beb77fced4520a0d3c8b8e13f04dd3de38fab3b1b2df7fda1d162516dd9cc +b6394088eaed3bd42d6b15cc05ea1a87253be931a00c9750689175de3e7fcce9 +07f4d7610c7589bd392ecc645672c1de4a2ef67d9a50b029d7546a2f6e044021 +6bbac6fd78fd5e4fef88ac5122ebc67ce17dcad67d573eadc1af0c9d8f523acb +b883fdc5c94b11a5dff772024c9b442be11dcfb630e9270734d4779ea8f99f18 +037239b03d2d16e07bc4eae677e639eb187625a09e3e06cd4347768c689d3bd0 +21f47794f7b0247901eba8c7672b5290a31bdd56bf2f5b3041f8d3b9da29c286 +115722e3b5982be1777024d56014fb7a7a254b2d5e4697e51ad73320c59a68a9 +7f7261dd306f52713203381da4ab2bbd9dc974b524363e09c4462fec1f70199e +c80cc854e4ca654981694863da19bd085d470dd09ee72f1c35c656296723c9e4 +35740a444d46188fbdc32a12afc594aea7de6f861012a109723eea43c0c29cf8 +af66994bc5d71dd36979c599cc174122404cd706650055930f1ab5d3784d3c6d +244bd05f0e7ac38e5518b94ca8d9aa65b61873fcc07d5a04f98c4e18dda9050a +1f5dea7dfd2a87cae5484bca81a231509a935552418ba6bdc736fabab10e5c14 +638b0b9ad736353ac4e6795286c4ae92ba4267a348bcbe08e3a6f1c4e9aa0b8d +90668ed326beda8797f400200d034f8a0ad0ca658febbd91a03071686aa89393 +720b679c57f3b90c59647e0e10b16f9733f0a7760770ac2388ced0aa7352c022 +73919bc7cbcd9f998a4b422f3e3a45daf7245bc5b7e4bb171e5d1ed4341d56fe +b26a248413954a68c06ba9ddeb53a30dc4bca3472392f96b1256b53d413db486 +91107932f352fb3915ab87e8e6a34b30eb630690c78a7fed488ca41929120d29 +fc5460fad9131fca28b77e079ed27c588ac22e5ad9375e53ac696eabe5c9e28c +fefaa621ef0c52eacc9a184d08f7e40e404a4b2d5fa12b29b9ebcc459dd63429 +e5da478bc0220549aa1d8952128cc97328c13b9d1d1606744a28c6ce928261fc +98c140f47e8cfa42f90bbe99b9f95a184be9ba5b207133efee1f92bf8d1af532 +fea512c3f54fbd207411f5a7031e6ecd879da1e3c891c13cf93ba2fb52eb7278 +a413380083381ff5550e8b115d0b2835003df0bdc24af8372effc5bcb1a126da +83ad1438fbf0bd10a74d4a4ce3a9e1251ceb11580421e4bb1bf40f85c12fb6b9 +90c4e3d619f50ad66b71ccd762f1abb506d7340e22076111eb65320b3edd8fcd +f7aecd364aeb98e6168b55679c82d66cfd3f216da15403f2072466968a0affd4 +8920f6ede8901e7e242507c5bfa114e3504e67ead55684f6e7098dd0f2b9052d +fd40ca61dc0bfd1be1ce42d669578642dabc3ad01eeaa743e3dbeb623d25d9e0 +c64ab48219edbfd82415e0a0177307e216f5559934d7edbb7462b804697c27a1 +3d72b4c703a893a59daf2df31b5a85add12f2a644d6d3a19378a8a805168591d +2b3c1591e60cb9726b2d0bf9103e9707e5e8b31da42c53bde88cc73102ad976e +fbc79c83279a9b1f89083a56c6010f28f629a33dbe464abcddf201026d62fab7 +8236bc9c7ea1aab0b4f5b224772222e371d84a631cb72652360ad1c964a3f9c8 +dc3194832be6a3f581cedeeb8f09a4826b09f9be6aee350d6479115f94813466 +7cd73b82175a52a34fbf9d6766f74e8616260e3da3a98fe78e79c89a3db4b658 +73264002a5d421abf8ead85f7b7f5375a836dd1b5a93e772119d3bb5615e3078 +045c77b131aa4dd4aac6a1084134edba635b1621a59954b764a1650e187afbe8 +c653309e1ef1f7e1753bd5843a17f3b9ec2188da6f6e2235a88d76eaf8a752c1 +b96f0eaab791d1955ebb43d2baa93ea3f3ed7e653bef513968108a34b39751f9 +267f79a5ec236b6e9611e4ea43b479a11ad2c013fc93090d4697ed998b388955 +f44459b0038a308187a556b2a93fddc13a0fc94b2fa55935eff35438da81f066 +0b44f359bf429631fdb56e8902250d68758df2895ada4f052d1c138707e27283 +afec86180147e53a9b34abe8f99918594c16eeb3d47c985d636ca5ecf506fd63 +4e8698addaad170776d5aa3b23d653f87d88c75595197f09057dbfeff294ca1c +f3a2ca5f9fd770ad75e19bd61d0f91f56438c133edeb1e399474e7080ab4a681 +52fc959e81bd444aac3df76f98062e5d6f6eae1f78faf044e7bbb5c220d0563c +153408a56be9132a8fa0452f62754d95c5c5ed4667c08f38a31202db725bbd80 +fc88beffcbc14486d1d528c4dab81d01b43056d4e0d6882d2d91820a811d1296 +4c0beeccbcfee6d03dbec5318a7d79d5487b8d3809b636324b0991eaac3f6694 +35fe8ec567d18b4108155dd994509a87ff4b68472e7e81c3734aae15deeeea33 +84fdbb188024a70ab144baca4e7126c370398e85ab9564f05efd457bc57d3dde +d093e4664484fecb80ad985c50c75891c94687278e3972f35c28bbfacb750bbf +b9dd59dd53efb4b9c8b9a0ef1f81a645f277922cfd4b81f8cc578c7eb33f7114 +0c04f0d0ff89736a099bdff36d0e05b446d5c6f51b32e4551f177bf355ea327f +19d8adcadcd491e35acf31cb4cf649c3503f0b7870a72519083c8d6972f746c8 +951cc328212818e1afedd13a5db57a090c00a4bfa3ce5105090e19d756e784a0 +4151ec72b42b4ef5d75e877bb24701788887949f26ac3b5e445d445ae45a70d4 +eff4f4dbb15eb3e3217b8fa37991137ae2614bc6e1e9389b4111a076dd898032 +eacc1f2b1c30dffc02443321327ef905d7504f626a4aead9fc4caa4611a1789d +db483307a1661dc805a65b9c7f5a6f39fa40b3a83a36dbb871fe24e6698e2493 +00bc398fc0c92b6a9c727f40042cb4deea3b79d00421ddcb01b9ba104bbc7048 +5cdd38e7d87aa8082349b0f45438db96759be1ac6e6367ebcc0fa305b82162ca +b1587ad5537f6cf5379c0cd0ae5577624f2442fbc51ee05b477c04a85c44001a +86cdd4aa359508e66696b5d9dc26b510b0ce747a7037f2eb54f2d62fc7f67334 +965fd1a256f6a40bbf747b3ca9110d124a0978dc39ab7caf6bbd15cee29285f5 +2409e8ae3ac52ee2c4c02de29306de66224888ba29a5a9290be7dc4c60ad2cbb +16479220dc5bba3000f1956d61ac5b354b183f1841a4d7dabc9d3dbb5806e94a +37950ad436c80436fa1c8df97f5cdd612ebb750bdd79b413f6dd285823904907 +7dd96dea78d556b67f7e1be52aa47f594d1c4d393d20c3827a384b554ea9783b +5332bf6be7153e2bf155f5a8427c1c7a3ca2ff1571045f2d6d7aea0d00d72db2 +dcc11d878c9e260b1d2316c09f61caf18c72931ffffb9390c36de3b709f37e88 +b2afbe0bcb19aba5efe4b10a70380775ad909a66138cd619bb04b457218f4bc7 +311ea243019b299c7aa699a785b15d0e7d4deef4fac6e69eda6a4f5261896418 +75c8189f582bcd5de3022ec1bd4bdd3e764b3d1a7d648f7b46d145436e721d15 +50a313d43b5e2cf7263735baae1290d5347f889b2f81e87ea80604aeeb2766a7 +b9144a73db5c141e82c53cdf9e23620822bace4410c5d13041cd48f2a53ed029 +9c199e76fd572e17276ed57ab6bea180bebc4fb32d0bca0d5e5fe423f7c2f76f +6d47b7700795e8dbe8a6cc29051b4724c9389b60e6a1c2fc60b1f3f87fa9cfb9 +bd19413f101b79f45f5b228ea5ebf6d1d017729242d118394f208809de3b6495 +9fea949dede61a4ea8737b9c838568ec96ca2888b29d965373dfa907b17d0467 +5f9a3c5c6bb0dd615150dae82d9917ffb1416a0b120afad7b77c159db9590273 +1cafcc0c89b698a557a2b1da99ec349500d336494364d75482e70985d1498c40 +3dd4bf218f3a58a21ebeb9f107d5fd2ba5cec4f6f8be84389358966edaf42e18 +d28f27636d0036c165d266db6c700cf9e60e890cf427c18c134e71d7428c8180 +cf101f11685c0f71ee150dc482bf8c7a7deb7b509bbdb25258fda34749048ace +7debc237de2d775899ca80076fb9a72fdfc13abc783705488cf16b2689f6445c +46145645d04df6dc9eea9924dd5850dc7694c99d9737a676367a64c7c20e478b +93a9f6da9a407f20d8be502690679a3c96a049eeb804b76bce28e8a3ac47ec5c +e7c1fe227f85749e8e5f3ae499a8d210044d0f464795e2f806cbccfc43c5a039 +5a599c06df7c5e4b6f9ee8605f23a2684cfbb3efbcd89e106bf5e8f53d567fe6 +ca74114c337bad139cb8da730f2f48c6aa261e16fcab4949d31167d3d0214c6b +c28d01a91b6a381e6f26b2dc80cb99a54a5561d08ab78f2e3990eb84698f2005 +675ff914fe82f59b7bbd7490a5a1450e3ca8274eb595d21cb37c994127355119 +d3bedffe88bab775b80bec3ad51ecce85d09836e3017eab06be1fe9d18d7bcec +03848588c3ad44ec5429e1ac8b5092487ffad6c07e7050d614450613bcc242ec +d53b667b6d3ebd436f5248576b3271551628941ea1aa95ff3e5bb49678736c7b +c50c328415b22061dfdd2f0d30c5fa1238fec4a2e0dca88b9f651a8453e66ca6 +c148c3999293052d97d3b9e41f93f8ee8e45a78a700fe2858fba0e8cbdef2498 +681c7bca0620bb2e474ee2f254dfed3ae5b58c020ff46f5d21d5919a5d264a5e +3e47253173ce039a9b9df5cbfeb235851cef0158ec84b0ab99d337e6076f2b3c +7de4cd3f4e3fc6bb777a18648ee75449b318f1573997a2851d184b30f5cfb74a +6804e08e2ae58bafd2c5a945ea687c6dd92feb828e6aeb22388bac2c3349dd12 +8dd1799029014500348446a6cbdd4537c9821ee3116aa779c8c68516e293786f +96dfae72bc176d2c4de6eed8f162138539aa448349dce37baaa57a302db7fe51 +1c7e46f3c9d61b446ffeec5bc73efa2928cf451176dc20adfff08bd037ae0193 +b02ef92fa9c2eb35972f887e4be2995ee851965065a887f2cc6c652205dd875a +b8ef0e0eddf48a5182fc7d0e843e329f2b2cd915a4fb5534a32c9619f7a6a228 +3c8a75d83df3885b65e5e742af9270b7bb0a870c3bc3f86fe9f295e55967516e +8feed23fb5715e6124e5ec9af7fd307487b8c1a1ad80970e67f97abc22e9ee58 +e2031461874360e5079e28a38e4a071d85d21f35e7de9d4b745bb5bfa767ebcc +1609a6b7440bbd2711848d89540ad1ced135244a792ae44a8f6ee602420bbb26 +f764502276a73d7014ac6f0646bae1cef8101ce4785ec3339065c974dc178718 +c67aadcf642bd1569441ec1ea35c0aeb29b041a032aa65d4c27ddb7f3db1e44a +addf766bd14a1af3df9479807a3a8e822be773820c37e096939260877dc3e649 +be8584bf3949b1cc8ea6d9ae945bbd803a7bc26cc56ae2a5cd9bc73f0fbdbe5d +8326e5bf8eac16078ac185e465aa53b524a57f4f05d3321d72f8ba2f83af7280 +b6cb2ba47a5e629aa7bc8cd0ab42cde6147e515ca93a07d12e6b157909379d63 +683178c642d772c63adb6cd7cabed861d63faf07d36f424b7599eeb4baac0600 +4ccdfe7fa07e38127a0b24e6423fe8a7a907eb19b291ed22ecda2e7c6caac444 +6763ee3c833fd93e1a4edd205c61c4c11967974b67e0e86ef8b6efe718d6f90d +17987273ad10ab462149889328428863f80f91e29e27ff7a62af10ab4ba791c6 +c8f5473743a197071ad99ad3da74cff6605b45b2b43caa37ddb64f56de5152e0 +85024177594d87b290ff12e1337f43d7a2a2ed7d0f58ae7edfad72afd59340d3 +6daa392c75bbfb9c74c36ada95b9c3db511f3267b1331960d6922a2f99d8d160 +5b4bf10731e5a25555ef5e6ed070b3794edae09813d40b3984b0b39ec84e16a1 +69d9423ca8adf67d1bf377fdaf4dac29a6ffa9ca97e370b1ac70538406eb17ee +83cf198e2ec114dbc91750ea9627fb7ed68e68e5cca797879285647145e6b548 +44dfc660d66ab77550d0e45ad7507963f6bd526819ecbd18e755156c041efe83 +1689b4cc52acbdb4ac0f11f7f60375fa781f8a66810170ae0dbfe228e77d207b +16cd1ba5fa28ba4433f7056bc01b816ab66f9fd75c1d0316cb6d1a566745ed27 +e0d90ee53d8313a7a7bd8f303172fe49202c8fd2080f7aecb24d5d525828b97c +b1db5a4075081b9bc0a820759960e8a7871b3eb4edc8988fb77d8e95481700a3 +00b8cf4acd3db14e9b4709a073f81a21d967877981317f32ce1c0795bbc40c7c +f362392ed8576375cbe0f6110a96af80599e916225c4187d1b3331cb05bb846c +3f2150b4689fc0ff88c3f70076689203056cd71952ceaf382a6950d7823ae878 +73f8755b70b3315895192cfe42bb4dec6663cdf09dfa898053b624722d9576e7 +900b430279cdc53752015d5f93d1eb0b5e1d0aaf25c0cb519279fd95c5e421df +f17755d5e19c91eb48e17cd79ae38cccaeb9c58c60899160d083d586a79cb288 +231e1168ae478102ede1785779eb047866eef4551a6cf2e04dd093cdd83f908a +94c2ee1671ed696171dbe4186954c59c172011dfb9eeaea47531a55a32834e99 +b0c07c2f565dfd196ac273236e621be3eb5b3293b5ba14b5cb421c5700d7115b +d56d063ad44ad1550ae34841445c234133282c8a794a51ad248801aa211a1ec7 +89ba6e42c5d8c1323ca68180540063a0d07f82911c7d09db5c3b44bdb44f2f1e +26911d749e8a0c265379e5680d4f02c02ad8911b30e9d2f009ffbe75ef19f716 +449a29c005224e1828ded9c88dd644aff8afd6dba2b93b78f7ce11b2db259b0e +24b5a4507db2023d84e241b6251a22e5adc380cef22dc62c985fe8e82cb788a3 +c88f16031c478f59eed6c1aa75650661a7b4aad824647771c8c840f9a7b4a3b4 +26c27dd476215fd1368c5168cabbe011703ae825d25892fb9cb8584cd668e3f1 +25668aca8522fb748307de1610ff970c7dcfde7e02897152afc6a2ef736b8103 +93564785bd5c1b2786773e8347bf5b6f6ad0dc17d39dedc4010a82bee326be68 +bc8a276623d4c806a80092fbba4d7a1d71b66a9e1d1699acab7c6054edf1702b +a6e6908560b67d642c883c533f51149b3a023bcfd5000ea306b5228198a1bc0a +91d7583a1de98249b91d6ecc06946d4db1fd806a1ccc7355885c35223903aa71 +4eced6bdc3e5bed447b2b627a0bc94c8fdd23b316da99a241f89a1b50f4d5709 +bceb4b1583b04ca8093bbb8ed59c419bcc6182df29c1796acade5108b894db9d +604cd630f581244925db84ee3159fc8cd694e2e591f996d5506a18fb1d806073 +aca56e0ac8d886f5988ba38d925576852cdfdace2ea2be48ce761bd8f27ae6ce +2431b20e6492b37b8f2882a6b826c1f8469a84552f9eba4ff3fb2f4353faa715 +59ffcab5d45bd267a6f8768bed14581330ed92bbcba134dc2b7f4a7a87a1ec29 +f5b27a1c1da467c77fa391aadae2fce11802c5985742fd3ee6012c360e6119b3 +0dc44a8e2b51ea41bf0c166acd10d3a3ffe5ae4c23925fda1dffc524f1e62557 +93e16d2b5d68d1d5885ebaaac9b04c1f4e1503bb4fa5d122f12963ca77ce74d2 +7f81bf73f6ca2ca8936cf248d442fe26af0cdc14a99d7e96f312e5da1b4a893f +78484ba909372e3331a2610761cdd7e94ffc74f95ed7d45f6642cda7443a3b0a +7e24888002c9a31d97267791e32725feaa6b36c4d29bada7c71a57e9bb47714f +dfb01c13c72171ff02a8f90fd0aa2468a8a4f79a8cda300c92ab52d813c3da87 +245938bf963cad6a943d34c24325140a6ac6b49e56c36ec54db6553e0c2fca5e +7115f42e26beab8da6613d0845a62b234e95e5cf5a381779eaaa186cd15ed415 +c216e6b252dc44ffae1a8e2216ac3009b7cb2e563d8b8b82ec656df099af2e69 +6a3bc4eafb48c048984fbec0a342dc4ece0f16f6223c8a72505da1475f1db0da +ac2d4a17370549787af64a277ebad1be64be205ee4615b6b92be4e914a2b481c +1c76d19f585e4c40cf4c8c399c1125ae057e8f759d835b99cbcef0ca651fe16c +d72ad2bf1bc86b9c3801b2b1de36dc0f500f5a41742e4e75bc4355a53f9a7dd2 +43c253df31758eea3051c4998ee23f7f2a071aeca71f707965cb01c9afb71686 +b0632fb5ca93ff06f8bc8ea1702b22b3648f8ad0d1247370c0bd03790270deed +b850379ec26c599aee97d9eb4792ed9d1973db80040a368a03d780c3c5618e0e +69e88e7203f5add6b964d26f33ce4a6c459baee634d03b5ab316ada245b6949b +57db99ca41e34e26604d2181c6260c60eed49bfa72ff54105090e785275ce8cf +c48329c09a8771e40ae8d85d69cf60c58b98784e5c075c73764a1c0c85a57b05 +473a67dece4156922f32b80ad4e6dc3856fb2ff0eba54b7bbf4604af357ff39b +2aa05aaf345714989e4afed0eb5d9ac4caf349890c6e333613952cddbe78c8ba +8724b3af63a8c6a79ba9ebc7646020b2266bb9882bc15fa7a47e9e078c8d5e14 +d5ce13ffb882864d683de4c0b115c7a0eb3575cdacb38f0705bd8a186e522a58 +3f03c66e388e6602af2ce3ffd35e666d4ad7c4961903a7a52d877fadae4959f7 +d58ec401000a4a74195a4fdcab28970f8a514cf0cb22bd5d9e3ed42d3fc8ce9f +c36f04a1a374a8bb653db869aa7abb58650d8c1dcc3467a901b30bb92064ee09 +407de35795f2b78d453a341dd639e6afc7206e628b0f1ca92a0bd86353595c22 +c22f63063dae69790fe376be118b98cea837ea7d917af615f2142631d52bae06 +8ea09ead09b20d7dd1fc08375c88825a2e5c249b4b5a108dfefdb10dac7111d7 +3b629e550a850dcf8c6cc9c874cf9637b3f88f03d746596dbf7a144b34f4eb2f +510b5516b3d9ee9ea125305c788ef6158026ebd3084b8376458edd76120305d5 +269dc064c096dad111ab870605edd702f09a7e5d5e43b4ad20b6ea3b44b5fb69 +758d1707e4812414b8dda52b9a176fda10336b00853a30d3573b226cfca49a0d +8c24d1080b96b4ad3e4c231894a098923cf77c20ac4350c3fb922c621ca2b83c +4430a34d5682447dd851ad71a4fb6c56b0e4141767091a7352b2e112490b4b18 +18f52dc7b05347312dba368ea7cefbff428e47c8dd3d7f3046379d917718a7c5 +f00472e9e04c74603fb507854f997699e1bbf1c280884953579e4f55a2c830d6 +c96ec58f2f94c7ad35364d9e3fed7c3fa5156bf917aefc59401b07132d5deab2 +47e2614a9e3974fa60451876f82eeb5ed78de40b64289b6e4e0babf77a7e9de7 +00dfe41fdff61754420a025a03db663827a5828de76a9db03766e77fef25b345 +a274cda607dda1784e2627120456ebfb0625f321ab1d045ded074b72085e55ea +a8ed156a8190edbcd9308b36011f12fd0cc75a8702673e7faff07c180d45a5da +79120b5595dd1b90e38939cc1d479fd86be8d65323afae30d2bc340bd05e86c7 +4436a987abe06b4a4aeb1acc5b8b99863c4a0f21c7cb2f4820e5e469b59db48b +7403296e658501325cf6d7ba375b8306a1c51b8a74f783fd25036ba8f70ee180 +ac09e9a52b75fb15d8ae0dbfb49f73e42e299b1672ae4fe51e4f179b94728bef +fc965a6081fbb09fd3daadaf10bf9e6726e8812069fa05bd27dedeca41116555 +4b9627eb8a68e8ec858d91e574fba1099ecf0c545c2b89b68bd95082abf06403 +601fdbfaac0dee3e87be016f47b9fc73178bb16fbbbd69863f100a36dce07acd +8bac65d6d1bebcda36b0cdee3f38df977e18db0102f54ebf1334effd454e42b7 +cb51472bbb9a0f751b40697999f3194c2aff0ba1486fa623039ca6b84110a37c +046ed0181e111761f5dae266900d1dd4279183d70396ce04a1e3830d666cd91b +4c6f3e860baad7fe0dd24b5d988a7bbf5526429eafe089f9002188a12ff08adf +30ce93012c40a9002b5845a223ae41f921706af987d83c54e8c784b65f935283 +1e0633f179ccb552740e20e9cc5b2c691e4f33ade7a99683cf32391db7a4b766 +52265ec917f900d2431cc98469dfa4bf408845ad40e751f68a3c419da89b2d83 +96550ed3a19974fe8cb0b879105c3bfa2f19a48758281c61481bbe107e0c61bc +9c87345c7d6af0810cfad075ec3dcd84e7d818a95886042e0ade56d1ab33791f +868041c789adcf1cea24a51d0283d78009c6b29441e4118450806982048967a5 +a9d670e42de5426171b37ca626519c75d820b3e95b33ef37f6e0e29b0c86e18e +e9e8cd286c26de5284179f77ed5d5f40afb7302bea7a245100b82e73ba0f9b7e +cf51297c0b22ce9d408c55f116a9221ab78765413f0c8f40d1da0b4f39bba762 +4fd8e34cf401d59710120a364b3278b47f04ceec42d83d2c35995727a10fdb2f +616bee249fe3a91d494142032f707c15d1504ad486d776560452be2b9f7f2c44 +b5d8da39e71edede02c1e6750d82657eff8b9efa7fbcad2c6dc9806ba4a0e2d2 +1976891780fd7b4b3c4c3cb643d123c65e95db3925218cceac697fe2578a6db1 +2566fbf49991f7916c3df6f000658fa9bf278764d2f59f7c5003e5bebab3a14b +0d1ee998015d263e5cb94e11b799e7a948c664f842215dc179723ef0e7ecb400 +cd6ba38c1f8dbe3cd3e7133d45dbe59449918cdfe8dab80addf18571e116f90c +dea72aaafb4d15bd7ca2cdce2024c774da5d4951db1b53d7a77c022a3eebeb90 +fd36ecaba0916f51beb4a6d91b3d6b9314410d454f50c34e90dd55337d22b8cf +4b5c1563ebe2f38cff488be43d13d29e631a750e02c4eff6f61d15361e6c2240 +e9a668b0a420477d5736d44bcf0cc0f4d8e4079e112925f574a71f7b5a7e4b86 +1ec76778c460e0c50e101abfb1e712aead0b394b826fc240d108a9517994b3d5 +73c899e55f3ae0ce7e2b21753e0b53ffaf6c75961d7cb18ee388afb85a3222a0 +8f51b8d3dd02e768bea7cfd178fd9d8a314776914e4aba59ab80abe1fd2aff88 +1665c922692eb66fe986f5ff197ee22a110b2a082ce2e23506e885091fb020f0 +1308539f5abdfa1bc0766e68b281470830123b47c9518f6df4e9b5f8a0ab4044 +a68ae3f5cb7e31095f442bd3ad194b5d60759067aa3f0520707d500eab802a9e +fcfe7887d915eac893761dd58fd9516fde9c3214f38c291bc6d30880c4515c76 +bac58ffaf52157aaed67d8708f7e89bd71555965b4571adc8dd5892c9a554db7 +f9827892de6117ada0ba0a57be8eb1596d5ab04b64105b8fb1d8c25bba41e5ea +2448d9c2d9db2774c25570cf74453ecb99bc2f1ff4ad4da7a15d588e3e333724 +a1a3c7bcd000ce256db79fd5966ab2b758fbc42e536e08bf4ec16191ffe8dc95 +ad79c242e4d99f873aebacb2942c91557789044581c9c2f5e5d13f7635c388f8 +91e277f81e618e4b8bb230d4ec77cd8246613d71fc6dfcc9adf0a78e9871e699 +c9a4dba795493533f4931b7f57eaf6f87cb90a82fe45223294a3558b102d98a6 +9adf267e4b09505111b995f42a4a43e822eb95be3347310cb0691ff101ecf97b +4eb383cc67c75b23f7992066739314a2d4cd59d1edab397896fd4203fc210c37 +6546865936365b62c9cb13cb2f93aec209a5eebe76f8c147b893329d48e3e399 +37ea94539de2076dda32e8d13c11ecbc4c06e86cfeaac0c547a7bdf8b544a047 +64be122d291e4bdfc8ef141c9ab8fdd9cfbfece11fb9ab06620edb438f7d159e +427d4388abe42f0ee20af631867abe957974db988c083607aa2379c2137841ac +9a9f5ce8572e3a12ab286045e71cefbcd8208fe0191e5ac7569aede7e0ddf881 +cee7fabb991be0fe3238c0155e9abddb6a56408ef3c4a77f6c6fc0ca687c67a4 +ec5cc4a82a1b5fe65fdbeba4543e204c64a4dfd8464cb4b546a64c6c444415db +10b0c7b22336551645099ac01d57afb7e171edaab16bf8fefc2d3ab4b1602435 +32a09d0af64ebf5d84d07e2f45d273004f900da02be210f6f01857a9cf544747 +dace2355d91e7ac3f8c64a91a5dcbfdae85311777ce3e1bc59204154e5a19867 +bdc71884832cfc1b74d44ea9d885106426da6e50e5c7a6f9b8870b6ef00b77d6 +c12965ce266e69094ddc8e71a96e105ce49667d7725923d8a66cb3796f963706 +3123a3641d7d35cbcac6dba37441b4c871c1e6f8503dd4b17d9894d1dcb36738 +9d07040515f054d5201e65a508141f9c94154c3939149c5af954aa3db34fbd2b +885e9f58edfb08708205356cc0ddd0511e0dabbef2d1c48ed0fa665664d8f731 +74ad47341d2eb350cb68a81a04198451eda5d4208552bcb0c25f12a4f8a94fb8 +b96c92c745cbbae6741f8485b4dd21811a293727facdf399bf6975b057bb54db +78056955bd2b965dccd45668306a54cac78c9ab167598de2e70a28531579c130 +74cf897dd5696717064d5fe7baec73bbe0e9a7746a0517cbe923939f8cb5c43f +f3e0972516047d9b3cc98f119a9a7740816c2ad2dd595455f0b4bbd87b029a82 +a6fa6c728ff33524c3ef2660ce1344f0ae12d828eb947dd12faf26be34289ac9 +4ed7f0f0d358901d7b49548c73269cf11de3791201fd76594d62c218ba838ab1 +2a6b7987e58ca8fcca31a9a87876347c3dea6dd8fffcfdafd9c296a53aaa5c03 +865813e41bd245897fe3b1552a49efc1bc2ad759fce5021f7a57dda2abb1caad +907a8790310b7bceaa8d9e2fe42c4a9920409ad02c52f0773fb765f32742e6c0 +d29bc361b9b006a8fa81401f255fe3a864f0b3419cc6c5e3200e9b2c8e3d7148 +dda841796f5a20b488ba0ea052a5731d1ed356d1e9f4bd5fd7df2bebeb73e8a1 +0ce63597dba3575b314979f1043c64f149eed1997220d3b25ee7931c50ac9ba6 +83cfc0f8aba6e41a14c96dd665e8c78c6ab047cf966bf497b09f633b9780adbf +6640831a52d94755950759b10e76c83db1b25364c353f7964a2b7a97a1b98c4c +eee5550ad445de524406baece1ccfb951a748f02588f0da51beaa2ebd4311885 +f6c11dbfad1fc03da1fba3f4b37ac63085078579ff5a930b94d470e37cfa1466 +a5a20c1db424e94dc12ae4431ac8dd7e59514eed8fefa893a0a4f872a9b17feb +f2752954121ee5b64290328c604eb79ebefc3134da7a3288410b5d21b4a1b876 +124d3076d8f9a3289a1380564244fe3d31548a3ac12cdfd4a62ae816891dfd89 +65ff9729571f89e1a99dd9ee0b051b4fcaee03bc376efe273abfdfa32ae183ed +e159302fbb222d209923d141553e0c3b2c61c8703262420ef094a8c263005e07 +441ae6d8f877c801802440f3fdc08884d759bb058ca028b01122c1b6867e8b14 +c9278810bb495e2af028ba6ef52f9cebc35d2b8deb1634964e542e3c501bd2d4 +dff2b995fff9a2158c326b6cd5cf98a3608b75ea5d6cea632611ed42c4140bc6 +04d130f6235f3c2641cd3ad1fb9c0d999408eed1c13f2456249f289aa8bcd244 +c0bc960665c1585a48c559176d2b97c18ce44b670007ca2f915d2585c68d655a +8c62b2d336aa44b09a36d0e7acd60858bbcf6972f09bbe1311159d452fca3876 +1e1b27ebceba35d249015c7f04191f69000ccbeede8353de56afe6cd2be51e97 +918907809b09d8707d210fcf6882487036d4e803b1ed877d8945aab0bd81260a +b34c8be6f753ed32045279bdde839b5834c814fd69c9111f1be690a395160826 +cdc0ba7359036787d4ebe89fdf86066c099c41b3034bd2255a3fd9b88c1528fb +c59a10ab453b24851e5354b5205dde5c43b6eb665d3f3670824df78bcb087a2e +69c56ec4ca8c20237791e73a73cc6a34a5e94c3cb0bd2f65e8f9a6d683ac8eef +8fac9f3311768b2c9a87308b3185ea9fa98c5a5ff08564dc4a8887d00ab27933 +7529b40a1e4310e421e3c5d2cdfa6ddc878e1528b5d44f4f6f0676d8348c80f3 +e2708bae07bd0419804c93c3c65b789322a1b4662211facedcbfb151770e6420 +a208ebadbb7bdb3631d3422df41732300fbb92a178f161481aac7f2ef659cfb7 +982e78ee66dab92b6d90498f56f0a2cb9d08de2ba50d72cfad4ffa1aa5b5a2cb +8ff17e144683b61361bd85f5600fbf2f7e2f4675913d1305dee32f3f5e00ce5d +274e4ea037018e65ff2da032d4bc6586afb577608f02d077456db73dc7885832 +017c755718ede53ce3edfd1f82efbebbe6fc0ae0232be60ed98c566eb52dc2f9 +007b53fcf39272a6bb14fafdf6046ee7d13a25c01c3cbceb258f15a91919fb35 +a29d012cf59d015f72175ea1bcf365d46a98b89eecb7d6dfc6aafd0989f731a4 +360d1db28efbdb50aa5868139c4379c57d6325959f61d0c1e6b9b648451f1adb +ec87cc8399b9e456b20affcdd9ba8e6cfde4e7d382e90026f0266e9da41dbf5a +c59d02fdf31064c41c20b49da7fd1f3a64b3cfa4613054709dd798355a2ccf0c +55dbe9cdd817ffef3d0cea077107391970a50246ae63e231c5a7a7b0b1a4198e +40f4aa8d3682ed819badf7f02c15738467821d70b6c4c1ef4316f8a3852e7095 +663591ea9d7f8bfd76866f5862b5682a430e68a057638dbfc8b9ed77e74b3ec1 +5caf2206423eba10099cdfba84c1b7450c62f8b57e6e0db3f35a43fff0bef5ea +1217ac9dffa3552940742205d9196b6b9949e9c77b750159019c132b6183a7ec +cefa9759f26273205ec896ea4cc9bfed5286918e9b88ed6cb47b869d6db95256 +55895c95c2419b8623a4346cbf81f37cf07a0e18ee385851dd1c365d59361c5e +f18f9085b693ba2e61b7441307721b2b534db66f1f1d183db172ebfd0fcdc158 +5e477a1b3e984675023a764c20c939ae337b679247e89ae00b383f8147fdd48c +413ffe414177e1f370a2a53c685f4ddf1df6cf477958d3049142da3066ac37b6 +9e4f0a9ee6fa9f162abfeee406f26274cb83e44d9e1809de21543e0ac2d152bd +679f7104872e924ba395f00c7fc223c37925517c76d3574c8f80e5dff8a6566c +24c2f906dc766cdc6917e488df6e6ded216bb26031f7c96b967e2b7bd732096b +96c3810e3e2eb65d9d0c40cddd0861dd2120ee73eecef82f596187ff805bc762 +7a9b4eade87a1bd865b15d6bdde0755bf22a018605a160f527955cae09020e29 +f109455466c7c0f2b57ae926084c07c7219937b8a15cd474892d4dd116352056 +f4bf5fe6a6abd173af874ad57772a38c799ec87b3add97afaf24776dddcde648 +24c04e44737ed5bd4fc458fce3e1e4a12eafce458b3da21bdc946a88482b8714 +bdc40a5ea9d0ed65ccb8d6a8318d4d30a6967e1878329baaf15d5d3c2ae2d1f8 +509c67bfbac93b924e49f72d767f974ba6f5804bf8f2e5dee5556ab8f347a91c +d88ca1216d432c0b3fd838218a09d6963babca01d2873ac63dbc402228ceb17a +792b8a6ddb86e70651d8f07d621261098b90a84a95f1823eaf4dcde7bac2e417 +e82ca7fd061f42e3d9a61bbf46c29a835a1d4a564166d9855a7a72d84e0db36b +828b00e6b095a8d45e21c0a6da98d714aa2dbe1ded2b90aaed074c7cccf6bd91 +25b54fb7784373574df1eab2f80228836fc77936a6d2741c4db4e59e00fb9b67 +a8dde0e71df22bd9f6feef7d90fc0226aebefb296163451c261741e56357acf1 +7e65b52a0fcbaa719ae5e15ead5fb38c5f4e94cd978c1425dd4a769219cba03f +49ab9631d6579b09f605f5c0844f30ffaad57931a43878ef383f5c555e017fc2 +8ce0f320ff91e28af8c706353c5924f7671b1e553bd49af070c64a21fe62c51b +c03751b46fc9d819954ccc3ce9a84c8fffbc671a76fa44bdd567950a8c51d517 +837bc772fe0edbf57f49eb9a72621029a1511437cbd22b5f89caf758039b096e +afb25bd44355b7e3239f9fcfd1627ab69cfca8143770b65d76a394d11f722bcd +0400d85399d10739deb606aea213346ec1fea38e223260124d2139a1051411a7 +180fd2c5ce3275685d190d874e0f8cfc2fae3e470b85cc00ca8b80b006a5e51b +2624f5c430fe3b938ba06a5c569c645202a899bea3e26fde3532c364189d7dce +884442cbd7d8345b47ecb977af92181c3100c13d8cef3e2650909a2177ed9b1b +cbc911e8b698eb788116f332de5bf82390159ea37dbc47c71ff5b2a4ac2df810 +cc76742bd4f966e6028a1fb7340be326026c0eadfc25cd0a8942f3770e543933 +99140ed3d583d8d62b875d5453d1c2643348e3590eec455a4313365821436ab8 +90b6e91670d58ea68c2d61a3a40760f3942b360202c279e2f2ce36dc1b416765 +f44824f7c7d97bf03455c7aa60fad754b5e9d435a50d84ce875d938e40cfdd6d +915cffee210a0e2a2ba14b32cbd86ec1a2c6a54792706e63b1c23721afe49a0b +cd34853c3140138c166e94e3d5cd6f6544779e588087259787a2de329c6f1017 +1eff049e14c5c144563cb0ba502b5507d1d7608bcd78f3404203e80b7f268cce +d961edf732ee964fbbe94698bf13c82796336b6edfc0aa6d77e63c5c14886f4a +f09ee90c614fab94c292762b9b48f526daf15f0d79605ae2f9e61b562c444bf9 +eca6cfea306b69f851c864abe511bd11409c79fdfd7e9b44d71f5df86bf94156 +c23940d06a944360ff7fa755b0974ad2dd52b8b4185163e221269d2d674d9770 +0223d26f763bd5bd97740d43620682e06762f619e98f215551e7528bb7275a4f +60cf719a3fde84ce7df6a2026940f127dd83049fd2057fe22808c3ec9190bd50 +303929d356dc515b543878c8fcb32c1171ae1b9e24af472acc8020f60506f526 +c949b44ba4f5b19597434065ffb69a1b9a8ee386181a0bc39902ac9bcc5b9c5a +462bdfade36b77011cf0acc35a2c16c0396750cf72425ea179989d5337befb0b +6b763d031c636cf899675c4a6873e3687fca7fab8c773373607aa0537fd513d4 +b84dacc2233c5399661ca2e8ad78203c039c74d12c26323b14a369b7b86e5ee6 +f176712a826ef6c03390cd2f2c6771d3eba54f87011bab0a89e98ea12d17d697 +49358478c27df81f1d026e2d0690a76996521b42e2aeb4614030047e270f65a7 +7da5482d410a640bbf66fffa89698f3546f055045cfac45d1046eae9a01e0471 +433fc07267175b5d717f27da51f8c07b14322f7242c58f67a95bdd79d204cc02 +574620295454303ced152c61e1ac979d73c20d418f96874e71807bcd2aa5b228 +9222b8921a8e2ab629e0caecf77d21fee0d4cdf397623fb40fc4c1b776655e7f +8fa91410c9af46a5de0882dcc450da2552b498c86340e6f07fb85c959c8441d3 +6f89737a223d1bfbfae7e4ab6e596e9a4c50e830b051a5866cebbcd2a829a289 +09ffdf79ce88861ac597dcb0ca1240ebf2c566d6f9e5f6b280cebc6e9046ba33 +5c6efba81616118c870698b653d4b55ae5bbf3465c30f58b0c9732d969f1a809 +ce1511583489fc4ed3d77172c1e3e7a6883d304f05cfc776c87b4bdc368908ff +f42a7807135cf7e78a3ac7eb7388f27c98542fc2afd2119970bf53f62637b0a0 +20746d9e05ff47da4412b0e22f0973300c5befbb610ab00b4e1ee142c5b47744 +cbae268782e5505471ad6fb772253a8d4d366559d94846851f6d5361d8fe9d6e +5d53a11f8fb3190b2e472cb4aaf5526f7f21b1648ff0c733be01f6276e6c5df9 +fd61f90004bda8dccd45818b191bba072469ef4c95c21eac514c8d8a647599cd +6be5eb9fa95ad96e3a58604fbbf423475b9832a48f2170ac14642c6a24c66c81 +f90cf6567e408da4bfc7602a70b17d394cb6866582d7a9f3d2e2b9e3ac8cfed2 +3ad65922afbcc13033ff7f56c3cdcad4be53e8b292f14c0d03e31c2f747a48b8 +9ee8941411757906a1ad105f0703c1cbc1659f80a0e17f5a26237fb72bd45759 +e6b0ad7d0e5a533181b8dc608ab94cbdec0c6b71e8e34a4ca1154094e3c021a3 +bd58204353689c5b67ff6a3cb0a352d66267dfc81ed1a843a62eabdee8c3079f +9a45631619392f1d88d1837f0c5906cb982d62cb20f4f9b629c6281e0947885e +aefc2fd8b53c1a92d1725203d96b8f558604d14b19fd1db063a6fab0dad6228f +ef84d1069e9f58ce31c9f8d808e913b58011bc7dee3a3d34dff699b1a5b0a086 +6439df2f226dbece6e124efb08e28f6730ede831cb1d71464c94bdf3d7976c4e +2de1e0207e24c9f7715fc1c3ab4860bec72586382b455ac4c2bd55930ddac621 +93fb970eeebdf95efae740d27ffc92bd90ec522138c3af3964e3aa47e1712c11 +b2f2f460ad47c9a40df54e53f4d36d3b0521df7dab0011372c6df08630625599 +0e86cacc45e56c303764e6b625a489ac2565adca992bb3dc3b76729af8558853 +2eef56136cba1dd74c425c03da11b5d010f1bf26dcdc8392a4a4914486c5cbbc +b13cd82ae36cbfe1ba759845506cdfe99b3f70915be14186da8ba2dc7db1ea3c +a6afb4e869913f2eb809ff2020bdc74865f6878056cf8e6d77cb2a608526afd0 +e1ca0162bf94ca9fd6d5c28dbc392abfc3f4dad751c64b1bf81abf63e4f6fa09 +f2e28f60234c2ad0c283f4bb1c43740b2c1209a6bb3610a8b297303920e92be1 +9dd76adfc1988a92464f0cd61186e9b458ec68de91c9de2ed8ac072be19cd586 +0f8db87f7524aaf7e30e99b6152b1cf5c4270694d86898e69f69ebf66162e8ed +2c21eaa65c78992972bcab8f3b57e5632a86c420573a861835be58b4b4cd26d2 +c02389a8668ca6e77703b57a8607c7dfff4d46f010b8b392f6849b965da7a208 +d004f43181774099746f92c2be6915297b1c705908e5c19e4e0d3fa08af592ba +9d774ecead1c8d4e0ceb48b6813e604d98dab1f21b3d0240edc4e1f06ab331cb +73f33cf97681c7ec99dbb2e8704edd093b0635453de0eab91a9cf3266b17b568 +8d8cb7a914f18b281de5de5d287a20ca1c994da5a9d3b4d9357888c881e94823 +29cdd7fac090387947ed239fe7469953eceeff696dccb988770220539137ebfd +da1707dedf104f0be05bb0d1e8022f5016bc93f1a9d86d48623e2adc23d86b4d +bd2f770b32e3b6d9ea012ccbc9b1c80c7d9cd150ecda6ea11d6224c62a1db6ff +3b59a602e57a2e4b1571f670ec92d6ab14dd9a267f6bb61d270f7d331c3df5dd +008f5d43574554d8722bee3cf93606a997c4bfc85bb7ab6050e11566e94e6e08 +ba224b16d1ef328438810c340a3a144b299f250e98bf66be0b213be185e4f6f4 +b54eeef531dec72ebea2ec043e2cd910b6aa66169c0c6595d3fa47435579a469 +a96a3f28cdf2de26a661cedad8f41fb4b858173ea8e50accf6903ba641738735 +2b438b04f449d1f307c4dd90c049d28ffe59ebea254605957a39ac47fef88f47 +19ef3c5ce194789b793a28828d8ee286ae482bb25f86301097891cf482e66bf2 +c99537c94c0a430e303de6609921e1bb6f01c506aa31e040b30632bebc242275 +5a81aab14a998ea82d50288c2d68b4925c748241d9f467dff3657721184ff78d +1a036eb2a2a764ab78905973b0d0fad1c0cbb2312bcf628666b721424582cdc7 +b0e56a7a981c0ce445afde8ae4324f9da38da3920bba8f973a15807fd43a20b6 +f4e3307d8a446cec728ac60dd4710c4735ad8c787f1cb89164fbfe0d156246ff +504b3b6ab47e036c23057e3646c927bdcc24211e63b0aa2f2f05cf0a53eeecf3 +222727438cdedb6c5c9aa689ef026d70e03fe84ff90b4afc5915a505fbd2cdcf +8a0964040990fb4426a860b47a0701b99bdd8a3cd961522d55acc45dc6656afe +731cc9e047a20d8c195a3a0591ce5a2aa0ad59cc328f4c555a5605af508d1a39 +7cb0990e0f31490b55e4fdd0f3be39a711949f9c0b14717970676c09d07276fa +09f9c0e6d2e344c6723616366292c92630d10813fa880f1b13bd59cfa28a6740 +ffe56616f5695a7b483e7218d215394350f398eb8eadecd760739b528cf44315 +aaeaaef70b2a8f143d4a49bfdc8de69368c25f1e0af1573574f5d321f88df61f +a9c4cca87b38f758b334ce8f7a86ea34fe951fb22a3214b6cbb208e11cdadaa6 +44706f73ff2ba56054268805c322c6bd88c40788103cccc3e0a278b76c25b8e2 +76df7110b63fe5d5529db16bc8a03f86382d94433de01b3f7c156cca7c3896fe +f29876ddf6bdf5698062fbc2fc98b39b54b13e87d43bd7241471f8a55131d596 +dba8ca540d3f39ec9c3217af4f2f1abdf6626172a7f0d1d7f1809c09c388033d +4cd5982d7e135defab157e004039b11d18c5d36f0ac80b46a012b1533e201b13 +a4cf567cdc8ccb3bbe6f5f3a92f1862ddd0fb9d37e8afea9ad3cb3a5e3c9191c +0d2fdcd029dba9f71f3c6d48388d6e30119909debf0adf27cbcbbe9f6b5c5483 +5708661f1219d0fff213e2abcb413f2f79bca191f3c8a9b86e8483bc6b27d312 +da6dd2c91b8c244bd4873737ef934fae95881504007b661544306911b730736b +26953a78ff8716744a56669802e272eec96404b0559d9b24b388747eda52c1f4 +e1948e822c99fea8177280d5569a1840b1dcced6646f311ad60518ef6bb26df4 +83e3a18f2e10d7fe4ccbcf37dfcb4cf16c237f61f66b675a45ee23a6c640643c +6bf59393c7f47baa19915fe98e488df72a9ec6bbd4ba2d4656ac6faaffc22e4d +5d867f1127e1607726921fc1bbd52860e7070b36f5afeab38a255e62a4de780a +ba1ad25be7f12ec948f41cc861b65705c9df9ff4636ce5de7bcd46a7f982e6d3 +465c9a0438f12a68194fc331bf3c5353c89449291b4c622ed54007063a62aae9 +64f28ced00669c7c03477e8a8b39ad4a8e0ef7e514cfff239b5285adc7dbfb02 +30e0f68c08b38ae3961dd56625d501080419e927d51bcec393980e1fd5d197ce +a3266c1b002aadbb5a5dc2b0596bcb68a90b3e75ae6939bc42550a7091d78e1f +32de33fdb6be95c2cf5a38617ed7a04ac3a86980dade722463ce73f2783870b9 +4506f4d362a7676d1243a616f1ce493304c47ee618f63b310756aea9fd582e13 +61d74a7c700b93210afa1bcdc9e9eb66fb13b784d78cab9150de3cae7dc79b76 +9b5733e2c9dba0f5d87a363624695a7cbaf4cc4f399ce0dd015cfbbe2a326d93 +106199ca8f6122659caff4f55668912cc2817e6f732b67ca954a0b789dc99a84 +f64f6a4d91c6ef0531d88ad18d65b847f364c22f3e8f9c8caf139ad52b22299f +444c429bd5b20f51e6e52f193d8c4b5f5966580c9699e14dd03e985c80094d64 +474da8c358460af6d3bf61e670a1bcdbacbc87ec628823a0299d39b2f07a4781 +affeb6130b0bd84196b5445a1ef9cc05cb11fedcc00a196a787b1b2cacf78f1c +e9857d8050381f86e1cc5785a6de2d19d72d7e83acb0ce0bd8aa1d8231c48cc5 +97f8f67ce229710b9184c34eebbc267ee4e2b8714397c214cbee3d8ce6744a1a +392a526c363e9950b58803f0b60ed9380cd93bcdfb5ac4149cef85f8b4e8a646 +989f751c18e5ee61d06f93d0a962f531011a9d20ca648b86463ea467e1d08540 +40e1654a81e67ac4f2e48ab19cefae796448fc575ef26d6f5fcc4d4c1611ed05 +fd01a7e78dc44a4d37647e882a00a07e620040f67cb5690ef86be3a255b28572 +eb4b065444ddeb860993ff6a49ec7ea58b226d0fe47f7672057f6e3d9b451b0d +0844654cd3b3f96b25b50ac0b18a0a48f1562d1f7f81f4e43e24cb59dece5517 +a6ca2f13c37ea13244a5e03887f0ba65b9f1b05c63f388a308a88e7f5f798c02 +ae9e8ec13f4f8caeca9023da2c22e0147108c0ea578f18012c2ee290381ef1bb +c693cc17279477528f870967f4548b96de245b88f6bc8e52af5d1436ba9b2151 +c29e73d23fe92706ce53ef4961e3ee05f03310026d42105e9d760f0df87c2ffd +f0b6929e375d697a2eaa119f7fecf4ed39ad66d593cf709b12a96825dd3df2a0 +d3c2f462f74095ce214af2e555c191301fe0e3fc02211dd84c9c168e2ff0d06a +e59b5cdf5928e6db861828334ef94194831d2ec828a7c6ffd7e21454987f11d3 +9b5e162763a5b43d1981eb0e04b6ff0d973e3f78e5b4e6b3bc819e049a04ea02 +0f44d223d8bc5592fa4ccebff7cca84308dac7aebe3935b877294c556f76cc0b +e062f26c7ae3801e4baeef8daa3941256bd3971a0a0d8dae83e9b664ffee452b +36fe206967d8061ad1f7a613c625d6d00bdd330b2bce18bd8b800bf91597dff6 +18b6456062b4c779f8be0774aab1617f71840e5aa25637ab5ee903a4d6031363 +ecfb7309536ebacc0f022118ac95cc6c99ca45c6920dd381e7aeb4b36256a91a +034a4ab9ab11683fcf9037881e1de2b450826d2162a761074415f54f75672885 +50639f7c2ecacc7740c78f58c6f3fb91bd76661cf6b658750412c4a8ac6606de +b1f3c5edb3e0dbc533e2c51793a17a32c15d428a936a84c6dc9884da77cb6ed0 +b3970cdba6ff1bd5503a6d99dbe83cdd8979afec0a3abaa21da7a6d0f88270e0 +40f0cca8826a89a3ce00d603c6e4cad0ff4039d2e3efd4dd5e6ec334af49e110 +875e475a6c0e034ee71af354803186cc9221cc96951aca99f527c5e2c6cb6b2b +96d3a207f856a72b2d3a091b56a1c30f13d27f9ab6e430d374fbc07a3ad1a0d8 +ab5cbbdf2da885f57f9dff6fb0204dbfd575cf9a85aa30c868790a3f366f09ac +1830836b97bee5437c7ea97dedeb52942fe135d6665d347e6a49c82c5d1ee773 +b7eced0aa85cda340fc112f7c46a8baeace6cdc2f7f7dc3ec4ff827fea123e17 +1deebe069b7f8c9bf1d2f13f32fddbdb7d48aeac5b20126378a0870f3e35aaa4 +39d3884e1ad7a6e0ce08eb5bc3699f1d7cd226faee9aa82ba29ec5933b6ba25c +baf3ed8d8305857a88bd13000cc47eca59d049370dd79f60b4f1e8e90ad3f23c +878e130de324361853ea8d24625ede378f6b0eff4079f6f06f7f5bfde56cb52a +89dd928461ee92e7775da2b96e30d9afd751ef04a883a84382416cf0e5c67ab8 +8d7256c0ff8272dc2617bb4658750bc45280a495caa26ab68d019fdc24032f84 +fd43dd40622bc9ca3757ecb7326254cf13c8581ae0eb94c477848cdf72563fc0 +543aa1b563c9b67c4d3638ca7442fbe93f17e8a9c7c14da2110090286c51df0f +5162535b3543b21fec87a08167d71a567b247efcceb9a27b8b41984b019494a0 +095b479ccbaa69643e8b49d678c7b38de00de7cda40727f1dfdcc761ed2cfa09 +5a5243040fd849ed59a353e0b98583d53e743c9027abc07fcf7bc7c5a62f4391 +dfbd248d28ad3d64f471bcac2be1e73b574f17a5ae95845f80bc201cb3a24442 +fccf767df0a626ef4044c2feb9392927cd094fdbb1b4eeb6acdf925e836afaf9 +38a471d8bc09b5202818682c49f41669f7c961f2d10e9e8548fa354ecc63e503 +5c8d90de0e3bff84937cdd1f6490c1d5082af11b9d309bc780b01c8d3884759d +bb9688317e55c7ef78ccc37873fbe00336dc1a25e76929ac2f31d57bbf706b8b +9961d150f1bfc7ea2a2ebaa495e28d26db77939f36801df283e0127a8b9521ff +c450c28d35f649d58959e67c3c78932feec54fdf72071b126bf2f4e68ab027c4 +eece5960877403d8091121db773569a5d9f881a8e0fda79c7ab094996d5aabe0 +8e178be4c984135b5ecadfad2592f0047c3bde2c9d8b4beaecf15eca69a95f9d +7d5354bb3902ca5e4e05fddaae7bb9503c214a40d0aba755a8ae4158761154f3 +7e6a58fe154135f40e5eae18f97563dc532d32932fac8dd9803cf7fdf6986127 +aa78f4f1fd6e4d83a88958637f34235ea9702de18ad27decfcd9ad329f8ecaaa +d496c97e33311da36786e44da480b7b08d4496c0a122d1dca485c96b7e909c1e +36aa8ed5e3c4783a2d8f868cf4ef2743428ad586ea33df08ccc7204416aa36d7 +0b38b9a0489a31c3ebd09dbf307acff66be202944fa5296afbf621b341d45206 +cae347e8971c3cbe34022d23c95817f34acb52e3caf4fc389fa1e05371a5a918 +09ac5c78ade49dfd6688360e9ebc6ed94324fb4b48a0185710064f140ed8a476 +730990181e93a5ef368c1ab0f1365d89b1a58d03457eb09d9b1972bb2566fb03 +229b52f2ac8ecbb5edbac17d47d18951f5e0c2255d421897dd9738f2a4bd3580 +2e230beb81d2e13a7772d27c6747f8bd7d9063e0c2e7d2919a066986f27214e6 +b5fe3aa6442244f80352a81e6ff11a5098e249931cc0ec95600d4a0b8aa812e3 +e6ea522c79ff08ed8df198f33d1ea9da6266a5a2a0a77141c7ba533b1da6158f +2cb0b431de2a8ce2e70fe19d9901bffc7dc3ed74d4e504ef06bf6d3a11e19034 +075cae57e6184e3286defec0b228bed03729d5e76e1ac7f385158cc758752524 +e3deaf8e9829b2f32d2a27f76c78541585be7d1ea96f703d0cbb96d363fd525b +ec335f9cffb193cebe07d1bfe0e2cc0bbfd3b634f29c24d30b48e2afe977f067 +6b19e7920bd59f7a810b7f8e62d7077404ff564f44c1142814145c5eb899b31c +45bbc9daf33202ecf41fbb8c048be0fe5a00a7ceed8a5ea49b4ba7135d140e9f +db98d1919b2552520934148837aa12830f1df0909ab2474e43a9b9e8e1c0a3a9 +b80871a1a9be1381ef0989a8acf26cc73e8848d3014054fc97c39b8dda001b02 +c04c1f726795028004132bd327a62f063a08d8f886cbfad24b7ee9142170be51 +94851a47056a928fc0d59fc39f0685141b72ae6555ab8531585dd33721c8ca43 +56b6338ed86fa13bba06705f4d2c0e34ae370b74dc64e14544859ca10c51ae23 +695b6fb1c9bb6b163e08f190e6a3e177603d4a21ea27f6a1992118b150a45c16 +8eb8864ab8c7bd92cf7783e644537aa4a7e47ced3ae64f560a8386ae47c78466 +03032f3e668ecd1bd6856405e115381049c2de2d2dda3555543561b73a5994c4 +ba3d6bba92059f8a8f9332f96b66bea022c457fbdcd91fc7e63292989129f5f0 +22d47ccbd0b49f8efc3efd45a8c93f8bfac2bd799dcf701df3e27766239f6175 +4066d37446793c60f7d0c989be174557b049e35487ff8b1959b20aa8325ca2fd +65cb5373ce22f4fa3cc5921d53f208d0c53521d2d2253816d27bab392c8d09d2 +6ed8d9f22a561b7c2b0af971c5c9bcb3d9257beae587f17c3161bf865a218f59 +04a171d547459611ec0b21f3e23f2e756ee2008f9880af17e413a63262e260f1 +4594691472b7832d06dd277328fc0fd9bb26432207a9e7ddf308fe94965eb6df +32926b9275678f94bac2489d6ff4c590ca5c8c54e2e6326287b60c49ffd6c0e3 +b49972f9879e93044d5285145d406a7b4acd27d4924dfea9f3926a135a41260f +0f9b8d6337cebe0a8ab5c01c7de896766aed1b542eda892a7c21f5f8f527f988 +90ecbd9027da583eb6dd668c0bdda882a7dd9e9a96b3a2c2bbb9eec0bfbf1f63 +0af5598b626940084030c2c160e3faa44a0f982c29686a4c3234fcc789b9d0d2 +6a974eb33a9e1ef3e099e0f4bfd1f906092990c84284669eaa43bb7c5360fe92 +6f41eeee5bd494b10b5bd905d02c1c3d29739fd67369477ab9ddde86fd818069 +d7720928f8a2f33b2f3b5ecaf3e6df25cdaef9d6a579f42b7d5c7c22287fcbfd +517edfc3b751280b1ac35022dd4ce741432f165cb52b934c1470d5819076ddfa +ea87c314c13417c44ec1be3a375cdd8764889dd1772be127d18752028ab1cc7b +33ab62198aa6164467f7a2ad1abfce5791333dbde6c580d7560bdc32fca172c1 +f6f2694212c2b4b5686e984fc663a6822d9a31a38088816b035a1d8dccbd9b4b +86a11db96c917e5ad3d726d2219ae0e1e559ae4ae8f58e5b4265018cc5cfb486 +2347c593e80764b9fb3a1a996328b1964ff22ba3d1bad489892faa151afe2ac9 +46ea9068c593d5c1a00e72537bac3672c80ed05000f454dd4e6c2f3165cbb074 +107642afe3aff0cb5c9cc72eb6a499008af4e5bf43bac34278d5e4fe5663f385 +d3758710bbe52f1a1d23be21cc6ddc0f3e78c6a0d8a6733143d1b840118feac1 +680c63484d3d7d6b1c5bb146426032472a83cac6071a3234454d228c049d2058 +6bac170eb415e4ea093fac752a13f8965749bacea83218170e739bb9279e3fd7 +6beca247a378f6c64ff839f1f21421189c55257488099a20a7784429d97e67be +a2bac0ad26f978cb6a09feb7bfa22ddd1b05b153728bc16157cd93d0509bbe63 +da03725ffa7c31078e0d78666248a90766307306ed68f3ea3845fd8feb502d74 +a13e4cf852da180fc6a2b1c60a53c975e7941764c7a223675f90941622d575dd +100a86b5f9550213f63ba5ff4bfde474f9cf473cbd66f8de48c66ffba434955f +60a185c01485fca8439798e8a9172e8e75dc0405f731ddc5317ec89c09b10b03 +b6244fca6f052a48ee8ce286caea7b0b4828806e245dbbaaab908999c1de7341 +f474805f216af7879a49440fd70dd7734e410d86e843c89b5e87068e4d96859c +f0ff08878b6f894a468669f7787167a507e94f19d048d5b50bf2508559dd401e +544c6d5062ae8a7e3177af877be29ee9c6bddb8b8cec438373ce43700308dfc8 +39f3329aaf79dec9b03462404eee2940f38301a98dcb3a368137da7717c8fb2a +4eaa07b81506c01fb145289f3fb0344afd0c792872c7226807a9bb57e816198f +3fbe8b14c3cd28891685fbb821bbcbb442b608417ce215f96d8b463641ed9e97 +51467384ca8916b86fad4e54b8452ef0ce62110fe1c9cc5ec664d07696bc0018 +df0343130f19b4424a1d1ddb052564fb713f0c7c63f3ac6704707bf8eff5d606 +d9d3ec208488030d43abfa818fe252d9b57f447d1432b78542fc9980a46832eb +ea3366eaad6b5e48b833c67c9edd4026e5a1060a5bc7467d0702235fb9c6dcee +ae26697ca4824b297472074d268a44dc6fccf70fcb1959693679e75ef3b4db2b +2926a02867b9cece676e6c82ad8d33ea98c0bf9ad4a5b8e7ea50d107d24b765b +1e6cc40ce11ad94674a23cfb2d77c8db30dc04f63e874cc1cfb9044ad8d98153 +3d395957a2011f063125c08f23e310736cefa8720d93130bc3c91c0b8748de6b +0afe4d0590b45573994f8dc0e3e6912401936da36bc724e4f8b9c564f3e12ce1 +3f26e587a60cfc9a19911f04c4c5b578c077e2a78c4de692cc53a61d7031804e +c86114d478c75b517aea3b2cb3f43f4504fe1cab480175fdb719a23ebe3cdd0c +ffee9a5744f8c8408cbd6d2df6f3ba03579d62076f5e7b181a9920c75525353e +13981f813c51397c2b84576f3db7b221a41b6d867bd7bef4831255ebcc17f154 +6ca4a5321bb939a1884e013269c5c2dd85e10e1e4c2fe5d3c435700fd4f9ccfa +6183b5112781ea70c09530ed72d6df10b16cf85980a1fd1e8644f8b10da041f9 +e70aa444f915697ba01e7c52abedc5fa5e4721afb0f8f7e74ad3d0eb03b50983 +3dba9d6fc85cb2ac10f87f0e3504aa0de6bc349cb2edfc6c2aa448feba7c3046 +128461c0027f997109f0fb3ee0c100c1bd5b9d05a83a50bec25545225f8f122a +64c847e1fc06b61b8db63630a82b3b4903632220fde9c773f3712e23c8026ad8 +78804faceadb5a6546c95bae3bc8ccb3f0b0f6e1ac2d792bb7ea78bd4a201560 +f3a82f978cfd02b270fa22620ecccd42939cf4b29ce8bc921186fbc15b7eced3 +a92c6d7bf9d3c028ed44d94bba021ac06e889cf141ea0a4c42b730d52d942f89 +9a1c337cece8e32592bc654ba0fdd5e86b4447ea33eebb56e4c4fc2a9adc56e7 +d86ddd1cdb6c172993c3ca923712233eff081721dfcc17054f1fbb4dcfbb9554 +45288232ea055543e24873607ad2345c387e1fef5d6223736950a0787bc789bc +6016b2f9850540a04a807f2c6c55296135399fa595ca25e3f8cbe2ca72d89c70 +8a6070ae0cfd950394813a633e655ac643c3e56a3b865d6360d106738fa90f19 +6d2b35abb8a36c2effdf9a65278b0a885ecdf81fa38ae1a28f24aa046d103714 +511dff126aebbdb283464c49b5444ba404f7d21cd9770ced7f674c58d585f15a +96123e1b1c909283949edcd214e3e63ac68261f1867093b9ecd079a644f1b9a8 +54672e99f74440a64be0d8d37a61cd7762fc1e628f6563ced57bccd86068db74 +83a7fc325103f769babff63043b4ada6dfe02d01e1c38eb8a1c626809c6b35bd +c1ea9a27cc8c739a9db78f8272c8cb887d9b5fe3f1381bcf0c52dc3b2eaeeeaa +21e5b6ad515324ee692b0f7622d70415902e8c320d33db0da52b954fc9c73d2e +ff36ac2ea2d61f054626aa9c5b80816a2cb9eab69f6bb6193d445a0936e760d0 +04244c726d13c79204d398655889ed878be9b4e07adf1237b423ec7c16df2a86 +87a1a668f7b4887b45295b8c2faeebbdec549d1cbaea9b8c2241289906178359 +bbc0d6de0f135976cf0513e7f37419e99801d3c6bde51b086116fb70a9046f00 +b54ac6b319336522949ce1f3a122862c0091940ce90de5a36d723cb9d4684ca1 +2e827b5030403bc0715f1005bbb3d281d14ddbae8abc7b980ddf114d64928334 +dffc1985e008f32e5ca8c7bf44ebce3009cb8da6b1f3d44b6eb808ae96254871 +c5a7270e1878a9bc7f6203dc09a28f5db826fa6e2738fd40d0868ef93ac92c9b +7d6e4742b746739c3a5311b5bab767e92afa47b1310da3983d5de02faa4ac290 +10af2d37f42d1aecc93e5c08a2c9e85c3682c75bd2e9a23d900443aed3e02ae4 +81fe3567613fddce1ac2a04d7fe0ada7d168aa247158813a49b0c471f4a85d43 +b30029273b20678845ded45119eb7290d0b99d28fd7d6c28c4b0702be3dcf7d4 +d0dadcb22b42d8e1543dfa4cd362e9953394c46ec7c13fa26547b48a54d7f04a +895639619cba9c3d344a558e2d6932c68ead93d3672ee504bc410715926e8569 +86c1b89a99a1249127ff48d4912975535518c13654be95afbb9cf4f4bc8c2076 +9d7d0b331a6a5125ac953a7b7d519147e1ddf08d905e1bc14211f04b3e341756 +000e82d3ae4e89634e6da1b525baabdeab6d9ac4915fd8cb91d6a4c1ca959c96 +79e13b96df82046b567397f1448c19167ea1f6c4bc8db3c16ed3bfc1aaecc7c1 +c315b0a96bb833055a412346d63abd366442a8915ecee5c71f8aec85945583e8 +8e1567ae9966f57a72e127a505ad6dc8ef6ec4ed69c25e7ccd986a43cc590d51 +6f4b0d5eb2df6eb3a8eaa72e61c6cc7a196919cb5520e7b80f8517babbf15210 +9a591889eb67c022ad3cd5e405da5afdc213f6f025a4ebb6e0e5dce3048a5722 +2edc0691ea5420110e047249243b4cb280d04941116aa7a8914b24869f4debac +e50dc73d065ddc71085852c42e3f8bb82c7d9b0806ad100ef8b1da3281032292 +bdac5c686ca50957b2348a248af9c0e9c5c1cc2099c5a7a15473e47fe3bcc261 +1cd9dab99a9ad22e124626bd7bb7559db2519857081958de4df4f8e93b8a48c3 +668980b1f9dd8d627fb228c7c0015085ec565d82940bcff4dfd056dc2638ad5e +b14973bb65db5643c0ecd3e94b028f200d3a09c670bc02f1f3e655ceeedae707 +3c2aab9eebaea112e32bbb88692d9ea31b2a203b57f452fa3577047998f3fa17 +82672e4533b369b7cb94ff0d776874d044103f36513179c087b1b4b1b935e990 +421ed025ef139938dd0e03497909a86ff3f85dad4b4e047e225871df114d6492 +8e42ce9d3995a3d5cac856673f64108a3adfea10da4e16f0b2c9099316a81d33 +dbc7ca0da02c559bcf367256e3077c2af5f4df35279baa00219d1d6e99ebfbe8 +ac4a6912a20a3cbe2a5827e2cbfaa803d32699b1ddbe95eb049984b55214deed +f52dcf2f4c63c8ce2a6127819b34278c4cee46a7448ffb3569487d074d85e269 +710fe473cd3fa63e80c750088507a8a54d423e434bf3459301d6d3c3e6cdb9f1 +6ca015519af673690c8843c7d540bf2a183fdb49d14fedeb98e377d9b9dd43c3 +6cafa1b65484eafea092a0d9d4a0892b37e4d52008ef4438d3320207111ab0f1 +fcf9c4575b822a7f11843aafb0e9362ab2d785728188b820332783a083ecaa5a +9653e8622a2870ac4f79ba49d79e06524d568e85b4a61e4c593e610a0436eb91 +978bb0b98aece66013822d48851bc8f6c9b46833f33ad9d90ee3ccaec218595e +f40287a27dcfbc69875a58dfbf7a0656441cd16bedb7c4cdc5566514fe40ecf6 +4faa19efd8742351c43ef623515c405a53dbcf451c9931988f880a998c99e190 +8467157782747eaca5d8ddd5606be7a29665a44f91d1141902aec78d02ee3cdd +9f7ea87ebbe05728db8e9ddc23806827ce2cd40a9cad5eeceac8d371a26db3a9 +8cf7d313573c8f0af004d9c253fdfb702ff7f9c142605941ad74b803a5c59af6 +d282030968f10e5a77bba02709248a3f79115f14af9535eeb73150d68d53f319 +af3eb2b180be229b127ee7363772d67d526a15b55ceaddb7b24d7f7bfbfe89b3 +d16e6a85a0a5aa416281214c27b45bc4a6db1069e1c9e44b22ed0e7b495997e3 +63eb4c81a4793b73d2aad0c724efa490de374aefd4b3270ea73ad2fcf640279f +726895ecf4716c8a4182bd65cea1ee3b54b447285e476f529245621c34916aab +a9e9d6cba696e85fa982b9e4cf7873294867ab8da10a4ce2868eebd7cc95dc23 +3f7fc4bb28216a03690ce71d244b131f069248a9b765be1d6b803ece9d7d2afe +7cd82e47b2e35e65a67db5815c5584fbea10d7fbe821b84bdc77199898215d65 +ea68ecc66b2945347b5138fbb721e557a14cfb0677ecb044b8a8968383e463dd +f27225a613ce686f879690c9658dc1fde07dd8a67cc166deeaff10c34c89d444 +c1ca32f36b14da4bcff831fb2da2fa41db609a5e8015f74454d4a1a842cfb35e +a56b3c9c00ccd5bda165a6a6d547976a8870618839a4da804142aad903e1c1eb +d1b8b277f97916d2c09edaf62f8adbe58b398abdfe01fc99763559c5107ecfbf +2fc685a851755c86cb2718aa9dc4dc8e891e275d71e097558969d732a9112f66 +b692e7ba734a81bcb5dc219711e9f7b118eaef1c08a8caac8b14558c35ea0fab +a0c4ae03677d33067e38e4413bdb8f305cb2fd77144516ddb699865f2b905c4d +a7e336ed6f9d89f463f44696092e2de286bf80abe514e5a2ee1f6f8e014bcd09 +63cf2cbac4d464ef0599e90c431e456c17657a876ec2f68d63606a672da47615 +a3f0cf32390e981ce83e75d071fb63c4abef37676da30086033e7b6546918d9b +876865bf77108848f165616438ad8b1c8c00d7c76ed09fb79d6feb8f7b3153f2 +a2a0736dafa1c59badbc32472fd0fac3e51a48ebaa0a8456573d52e7a0b52ba2 +f8ddcb861ccb34436e9e64276e920f564c3312b2151f433536bcedd0802d7096 +cc981f2a3bcb426ee0c212db794fe2c83220fc60b282166f7028ebab5e50efd7 +5ab5d9f81c97e35ec8de8ba1cf0387018c7bd90ef28f4fa359f50470af0e3fca +10e73308666ee51a52ed948db24b7f753f92b9f61b1bb036af1e5e08f103b780 +656213f9e2110a4b60ae0842f84ee9976349305f58e0fc09ca9d75b5a13b1721 +aad08a73e46a018c2e96538b085befbc57f3535ae1643116a42322d9669bc88c +b899dc63622970c41776dc8084fa78403dd8527f8a4ea672137590fffe86543c +1c09e111d03e6d1c6d64190aabff987371cf59bedf9d352bfe3d093d411eaa13 +9cebfbbd3bdfd2f14363c2e2b7f2568d48065fac2edd2170e9690b1ba38cc373 +f75a04dc08bbf676b1564dc98131c2f8101a5dae532ca5461b7d72f52391033e +ec2c0d853c7765db67e3262b528629d61ead4ca7e66dae258116d542b0f6b3dc +f1dcb49a521c443c762929e9945acb83ece1bd3b35da0704f81c64dcd9986a47 +0fe60bef64d9d4393172ccdd762a3e14aebb06b286b1c934a8a7b7aba22dcb83 +aa18c7f6dc45b11beef335a72b34dd0e56893727a3a664af8204e331378fe8f5 +dc2bd9ccc942da4c30047b6554793e9517ff591f8e23fa03160f2143a31adc60 +5abd76bc0c24e7c339ed103294a3b9ee2869b9d3e1eb8ba67e3a001d6f4b5cb3 +10aa54deb88156e42a619eb0f79b5ee87119e85a53d40872ba05d74b795649a8 +cdf68064e08b35c26bbb9456877e33ff8fda6c2559ab9177b345c5b13129e610 +9f56ff6e11832ae668f0e578f2ac95a55e0293f8d4831d6ca21eb5bfb17f4940 +b1970339cf136f5480806086d3d9d5e67d8e6f502883129ef7bcf94f45a147bf +c6918c589968f31199f0b9a4bb2a625f3cef815ca4aa17be0c4b0da0e2469a8d +f201cc5e07f42ddb3dd8e81747862f18c08f75f921287ef1ef79d38e751528a1 +aea047e874768e8f5df3aa4206b65efaa2f6661c5a48a17fee31e2752e7eacbb +ba2ed31f1edd0d3e44eacf902cd8b7b8a977b21cde9d62f6a65d824d3dd5805f +a6c0f7d2621adef9b1fc12b2c76619c752357ed930174b5909099436a045a976 +e6ec7e7d83142a3c2c2694e560294920eb9706d4054239859de0956054a259f9 +b241fa4c0638a4c5bfb1bec7cd1187884139440e86d7358daef742a7786537f3 +b0fa06d09830149b70ebaacacfdb867dbdb81bc1b3dcdb76bda3f176ad55d1f5 +8981a226d4df58ad768c7e0187f1a5a82c36cb0ac029227dfd7a092e9082657f +516659bc9d64e4226cfe6500407f865c9ddcfc510fa81bbec82599e19d7a10fe +2ca13f604b4508731a7b191d91a488c783d1f70326dc791bf5e3eab6698bed6e +da6cc88f884c9ca52b50e405ed318919835d94de70f6883d0d0cc01863c39519 +23b72afea44fe09baa33ef10b0fc4b2d76907a85454ca02235e9e24c3f3a7dd5 +16d03e4c58be075a46c9308cd8d722ae39aa29ff7068374cde0bac03092b2d3b +54ea1fb5d0fdde30fb21a6d9f3ede69d0cab94078736004d2b76d1b59a3a6ff1 +302be376a435e19c5714489a89271c34a15eaf51beb34a6997ba21d2d85d6d61 +32715d121473146abb749a2009baddc9e9b980dac86b4aa64fd15b4db70a0568 +117353b9f5e905ef41ad37ba746f4a7b34f57f23c30e82005fb52c72855f4b15 +9d1847b37c320b511db6a7de1c4f83c8228be923d6bdedbf4ca752099c083e29 +bcb09f1daec92cb2060097a3230574c3eafaf41cfa68721a67826af254c20d73 +f03f304b329ec4dace4e9fa556bca180067989df01a4954d418f27ddd1d33cc4 +e296c5ca3f4cc7a8c64ae128ff1f6ac21242afdf146a9ec395985f085d9549e9 +92211779028900e82ff34d428b2e19e7ce0c214309d7c4f302137433ab6917f9 +36fa5d0354c550efc111d357705ccbb25d8c85a1c1968f730b5d7d6ed9e32ab2 +fda6acc809c2ed1231e0cd986053d8add062e1f2d3a152f018a72294e391395e +05112229515ea729075ad018c87bfdd25fa95252b2561e1138158a56362a415a +a14628be8340dff0319e35d8d65075af2dafe76f0006eab63f8fc63c6dd4506a +fe8cf93aa68b60e92e814f1bf4f64491d548d7dc8b721c179b42de4eb1513379 +8b9e7f600700acce81dd999c36870192bc811a3ad4eec36ec12d9656a0902a3c +4e7ef3257546e4c64535191eb55b9d31fbd7ba48f5c930d25ca6f23a29b2c411 +c2f8372f1d1e35bd284e3810df1a8a87d61fed0b372af1d72f4194a76a836b24 +a9beb0f44b92a99ffa30cce6a15be2aa9a078c980d657fa00ec46141f7c59d12 +23cfc04b1691ca95169a69f73b156a07e236dc02abf02c34dbc4833fe725ca60 +88dd3a0eccb6b41408008c6c61d5932523d861202e73f713b8439ce8d9fc690c +7934144a5cb0db24abb7a5426a3979aca596226c07b6c40b084d69c738ea3d99 +16561e824a42fcfac8d8a9088f62146f1b2c91b910fffc0464766df20cad3791 +94c4e79c7ea3845aaa1ad0ad78984aa6508789dca5a5a1b2f315f676a01f8a61 +3d6018dd2f023b4b6643f9407b6499e49bf17a738276084a65542f258cf7ad2b +7512f19141cc09d4b3ce04577567eec4805bf9006e5be43989b8ebd8d1d97505 +a26f10caec5134a6909902a4db8b0a2d234bc172eee26818a6d17eb1b5176d91 +457d62ea4e2004d84256084bc74ed711251f42d075e0f8a8627722886c47cb23 +c878c0f2090eae139038b3bfaf36997ac2e7c5402f08cef71ede83a9ce374fb3 +b08b80d37b2e6ff03232473f9f33b01f00d70b435a38d8ac0ea651fc625b4d4e +87313c6cdfb98d7e8d92f4e39bebd8f4fcf60ba9faa0999aa2cfc51b849e5f87 +663510ea6082e00f9140bb61c6dccde1bfc679da211b4459f1b9d8a59113fa6f +19ad599fa7b54ffedc34cca2b538ef43cf78cb14f2fb67424dcd810ded406692 +59749728ea14013e824966bb477407c55d45899189583335f713a96353410ab4 +645eff9ab04f4fa53b7c3f2ef4b926cb8ee65e1024a657ce078732f9782905b8 +1c78f7430a08f35a85240358cc2423feb8ddcf32d99d42912947672a46b0903a +d67f9f768e6e2918b4a63cce53b174b6b7fea6ac428905b62a29b496ebaace +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N223/Arial-BoldMT 1 TZ +%%IncludeResource Courier-BoldOblique +[/N177/Courier-BoldOblique 1 TZ +%%IncludeResource Courier-Bold +[/N173/Courier-Bold 1 TZ +userdict begin +%%BeginResource: font TimesNewRomanPS-ItalicMT +%!PS-AdobeFont-1.0: TimesNewRomanPS-ItalicMT 001.002 +%%CreationDate: Wed Feb 3 17:59:02 1999 +%%VMusage: 33490 40426 +%% (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype +%% Corporation. All Rights Reserved. +%% Times New Roman is a trademark of the Monotype Corporation, registered in the +%% US Patent and Trademark Office and may be registered in certain other +%% jurisdictions. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.002) readonly def +/Notice (Copyright (c) 1988, 1990, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Times New Roman is a trademark of the Monotype Corporation, registered in the US Patent and Trademark Office and may be registered in certain other jurisdictions.) readonly def +/Copyright ( (C) Copyright 1988, 1990, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Times New Roman PS Italic) readonly def +/FamilyName (Times New Roman PS) readonly def +/Weight (Roman) readonly def +/isFixedPitch false def +/ItalicAngle -17 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /TimesNewRomanPS-ItalicMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44336 def +/FontBBox{-191 -250 1031 868}readonly def +currentdict end +currentfile eexec +2d3c7ad1b40bf0dbcd388c64ce832633f29bdd5069549bd3aabc3fbefcb30020 +77177ef67f11a29bb889b282b0528bb2244612e0a05776cc856bf4022dc0693f +e538451aa195c313274266a8282b681f8f5fa0cce3c88f34c49aa26a0f96c3af +0ce6c61b32004e85c814d6efb6900d57395a19dda079b5ccbe2c66e14473ea92 +f3ef59193b602e5ac92e16fb5d3b969b4891431562e34324d2b7bc4521835fb1 +e86bebde24472a1d2a14b04100b6995a7add284bf4a4207a70b5d0e75ab1abda +65837db2bc5bad099d98fb88a92072b099ee1200890b5ff32d6aac99dbe310ee +eca2a8df30a3b26be31e083e00eaf3501c9c0b9c6835374ad07b40881ba12abe +8478d398c31ce0c18ef9972f451d2d0d3d84606f4d93cfb7b172362994e5d440 +7230e7f57c004c9876dcb53e29066f25bee164a3ceae245ce3504a5b34b9ffa2 +d2dc6bb1a8c14d3c825f035517000f97dde27933952973478248f288292d9b1b +0d1df60cdc10da5158068f0cab6cf24c831ea4e60e12da1542b85dd9f9aa4f98 +6153e26e96d4337467438b1c11bf4ffae9b915bfb96fab12764452c2a6274c30 +85c36159138be457910a12f000b1ea763df38ac43475a6896c59f3742e16185c +d4f1b7d8c42b024b2576f6f3a3e40efcd3f3af9662ea8efe0d59acbabd0b2733 +51fc57fdf89824ca5a677c7787d00ac1579ee460bb02cc10b1b1852f0cb410bc +ad4aeba05f769cc49981b1171766316f914a693bc4b2e34adb019c4a6e51eb46 +d97e75db75f1f05b93c5b45e5a3f8af45c8932624365559a462c5ea2e37da500 +c3bd069762040555d6c6d28e1b02421a311f4ecbe8d43e92eeefd41b0582b801 +36afd48bb91e972f46dd7e0b2df58a3c1b83483c24bb483c851b4ec767bfe102 +d204ac98167a28fc8927919a28ef5b59b594b2f88bedd99405158c7664819a2b +c9207ebf04278b6d35db892028cf501697cf4392f70c7c16e7c6d4eb0cdda081 +ab024166fba78f92bde3c432069201f1fed9d4f90c3ba1c09759d337f4c833d1 +1b649c1f68457b35dc2d2ab859f2bc93cd1b35c31fb3a1c17bccccd7d2ee61c6 +389c470e46be5e656df9a46d8541fb17c41319667ee1db32739b82cf85963b81 +d2b39cffc5d0a80c77725189e2749ec49fc4605fc76c8dcbf1744b5d6ca97032 +ef4a1a877675d9cb2e69964ac3b08efdeacf7ceff35e6e78d2f6027803578556 +b5dad8cd58e8dd95fdc655059d17395381c32b1e9e1d449ccb619a4bc23fff77 +c80eab1c50e0aea4f666ce6188d7bbfe85dfff6ca0c813deeb83a1dcbe6c41f0 +d1ea7ace5e423bc14f8e69a52a74833a30e86ffa333be7fa450c5e302d6a4e7b +c003d70fecfb27c811075fd2d4f8246499b9476fc173cbbfe9264f40dff4e607 +f1247d6c0625cc5ec00a1d8ed8032427add21514ba033da3e40091e814e2ccc6 +4cc65822b4f070a27f4632d1586d7576a447d320f07fb92158ef4b5cbfee66d0 +92e0bc685cdeed94b886b5d01489da5ef617a7bb2d5cfa2aaff3f7d08c1d4b2e +1ae9213a27d1baceb01276f6cd5efcadc3a737a814fa0f206c66ef63e95117f4 +99c05faa12c4e4800c182deb19310f745160ddb7b3aa8f5c12ae9ebeafd1656d +7b8612f5c700029c23b514a566f97f64cc768bb8f138d512b368d9b0fd788f4a +3c2ce5f339e8de7fea4961e413ce384b43410bc5809070756fcb355c6a15e973 +1d8acfef043f7b76541fc9531b85a61a64f15357eca7228b24257a2b0e16365e +5fa406927bd06b3c464bdeb5221d7d75928364148b72f8c109bd55cc09606284 +5488b79680cc2d40eed9d88d8b3c79925f27ba4eb084f260967e563b36da5da6 +e6ef706903d5eff8c2e083bcd51987997dc0dccdcf2110282fb5b1a98951e4b4 +277c9c7caf0d5951cf4e47ad48c93dd24ff8f7cf6d0490827deab840570e6852 +c191dcaadd39e93da43eee56aada1166be41751f032c41aac94f94b89e6d7bde +25d9a1402014022eb031922e591b8131c341bf047c01d1cb5a1d1028a2923a91 +b2f77e596fe04b9082aafffbb0dd20a703e88b208204a80941ddd3b40a778ce0 +3fb02cf00f3bb8b3bbd8beb9648fdedc9058d7d54abbefb1af03f8fa3fae371e +acb31da2902a407b62c8929ffc1fea0ace90e1305cd55b008cddcfa5b8d498ba +8cb184e3965acdcadaaa23d22a616012ad590c7498e5bf349288a1e3a246711c +301c5983e3030f574682abd81279665cafa9135cc1969cd4d7799eba0ad020ad +305bea20dc3f28f0d055886c964e125793b6cc58bcfc7c6ea8ad689b088318b2 +0ef8b0bbe31601470d20c56c4a6e4c2e45885c5cefc48d1b979c1af1bd4de2cf +a5b054dca5f0ce0756ec924638f2926cbe15315883902b4e1665ba62be40c692 +f9e55eba0a0c6a98ae7bf4d2ac5fc4e971bd059a64c6c6b35f72f9f28c1f1c53 +b187ef4b7fc0374123f93d25330226157e608b3d5a249e51a2ef2d0434abed7b +aef73ea0c3728f2a27c11919370df5109d26f60d7aff12ddf8e48118aa435972 +199fa302572eef6f4f2c2405c884863d9ea2ec99fbc4f5b06db32e87929c4b69 +4fc68202c11ed8889e434997f18db8d716728d86c48c5c3cec2a0d8e8b67e27f +a0d26b615e6c2ecdfc72c01f8ccc5e16d8035c2b5ba98e6ae4d9106b26208039 +4de1a59ec00d91a717c2938e77dbe14d7b11344fcc82f66d063e55202c68bde9 +102dfb0d45fd7c50971528c4b1471a5833878a4512d94261f436d5543d4f8182 +e9a175d22514cb325e34873bec4960ea0336c6306f34b7597bdf8949be1cd70e +91de277138d32d57a770dfa3949baa805d817cbb2b5976d9f47e8d1d2af7b53f +3fb0273823d2d84c85abc9d04291fb3e722d7fb1be7edc74ce7079f2f4b16e9b +0128f4f8e816a1c0c91e41e88b83e331d60cbde06ae0d0ace8b879bbaf8c63db +6a3b33551e8f5edb443890f39b2306a63566e4e07096d2634d1482cbffd3d469 +a563f8eca5b7b695af2db9235e734eeef91e7f41369284ed4372364143953f23 +26e8ef1237180e2821864c622b37bdff67a1828abecde4f1c251cd09651499e1 +500db442044b636984b39e3dd926de12d88c3739a60ff8893ac8162a849630dd +baa1a939b4455fb38bc88d8895ee75a168a652648cb2018a6d98b158daf35b0b +26dc4bec474c22b86f9b65a8135c8e1dc6595588e907813178841536c7d37dde +0eabd13c42147a08e4626fbbb8ec3834974848f78c2677ed5e689dbe34cbea24 +dcf0ca9e5cfa1d55d4c596c312fc372c401eeeb46bd6d3290d9a13b88e869a88 +4540d282049683961c946845423d059948e68cc151b331806c7b655147ba3fb3 +8ac7f597e0010ae3b13727ffbabe1a991730cb8cc9d6bcda470d50ac18ac41b3 +b6c0f6084f48a29a5153869eb497024bcc913da3ad070bf267ad422bc6909c86 +d2dfca5002a98a59850ffd439330eee90565f325c783a70ce5877509fb326622 +85e8851d003b363bf83097668c1cd5a3fd2dcd61748f707810bf773e727b9d81 +7749c44a012c11199de371c0ae2e0ee2840e81ec3b07f11e115ed8a763048e9a +b2397f1e6e50ffd7a41fe03faedceaa6deda1b7481aac5d10bf6af3c39511342 +a6b4b119c596038e62ec5487760a52ec2ab96729c317e60cd8713238e447d1a5 +322cefeac03cae084dc3368c3d7346c0284defe9c19dec2685b72c2692041c4f +f24ff8af42b40b4df500f8bf3467bd21fb6f1a55802bf0dbefb7e8c7821848f4 +bbfcd65c694b504c39936b61468abd9d9bdef7a56a284b78d81261321a2860f3 +31b613442b58cbe81b99827b320707d88bc15426ca71a37066dcea396ebb1ebd +971b81af0458bcfe820b4639940cf6f3bed706d633c2c11d49deff61f2927688 +367d69cc7782ea173ece4e8fca97b5e0c1a4710eb3ae6b0fd0abe4fcde7b1145 +a453cd5a3c21fa2f55f2eeb2e224e7e61553b99ebfa7a9c78bceccab9ab2dc22 +ecab3830519246c63b85135e70512342821dcaa372f1ff3840183d1e32348a9a +843aee593601669aeed19bd22880a92b2fa8fd823a49bd17b250694df5107113 +2f93123a1d2bab351dc8a002d883e9e042679eb81b33d21558fa185e8e2d9086 +c2b4889f67a2e82790563928eb7b19d1cda3a22ad9a18b1cc8972ca365715a60 +8d548af04ec685f447806b6554618880b4a972c46efd4273cae7859b7b7ddcba +1887eb722804477147ee5e1579038267b6e31bc9a983b76520b62ab593433511 +6053b4d91bd0902cf178d645bc07baf585fd4b5a8bcbd4a5c095f463f1152b17 +e8d51ef46525a73c51b8b94c101f319eaf02e454071b617d922ce89f4b101368 +33356abaa21a23b8ff9380b220dac094e2bb46a79aab8a7b1f1cf7a9b7014489 +9189773c12a807399c68736679de161f15d478d29b0bc556b2aee341c3fce019 +5c3ecdbebbf9506718e1a68fd4e7691f44880bc5ab86275e8a6c8dcbfbafd7a2 +967b9b954f8532ca099977dc03cf6c27a22b47a0c315f20d9ee579e5bde03326 +1290fb02fed5df0a7aeb213a92541054c545d5c4830ab74810513fbd10a298e1 +2f1ec2a42958302f91a3aabf51177ba82a8b403a387289dd4c38a1dc5d6840a9 +838f884a1be59056b2dd99e0b3ea1da3e94d6589c9a14448a997608e32615ce5 +ceae0e7f8987f680625380a4dabee170a34a7c912788951e40f18147904fd5d7 +34481d376074607c56400eb1c26a4f2d25e192377f6e31834718ade6ee4cfdd2 +5f5477d7a8a3feb54495cc5c9bda60734ff19f38d16949bb8a55e86f802bc8a7 +e5fe9fba5aa80615929384d41ba55dbf7e6c31469a147195998ce33ad2d062c5 +9ed0a1ba8d8b6a341fcd300306302fc49ef69809291ccf340898c54e70045b6b +2ec3cd85ffe17a42f2a3d4a303ce70b22858394bffde32de84b5949cb923b09a +5ab7252c749eaf88621fc8be7f197d259e86bb60e2d5d8aa21defca46d9db74d +ba7d325b6dc564c4d26ee6e2925931181480747d6c51fcd6eeb4794e022edfc8 +b4894fdb34c805b1388467397c52b5eddb64affb74d7518db226e8e23b4812bb +c09f2321d6908fbc9ba2506775829f8d0020a5995bcbc653dc6e93ed9d24223c +b9d8de3b463cb52cd00ce74ba98d484d36f3af72ddd4f8517dc197d12019c5b1 +d5ccda01cfefd1ebf9f62562cda62ec96ea7e0b7aa925758588213de4d84ca22 +9dec8eb54a6352925297ce916d241f4bba11a1a7c2cebd4a6a1a0711b4d32c08 +bcfff4288a40306ad86441b582c1554f3a8a85e8b1187a496256e23373ba454e +b9e3abc1069a9b4e3c21acef5c81afc2b954c4d4c236ce74bb5a2e48749587a4 +8b0754e65b196d23f8933268ff27e4c8c3db545c56ae621ead340bda58756fa0 +d72f27b5331733b539d95f97184764c3855e5c13ed702a166e78ad2880a9bea2 +bd64e3e703c5cad6cbe2d73ac814c550337e47b99f86044b4c00980dac302912 +ac116392ab776b260b8792ee1adf59d2ff21870e3080e26a3c6f3b6fb570a4a3 +3754000d470de91486ce84dd796f4678897b0db398623213558095e8fd202cdc +5e5a1befeef512eba360013dc817655de21041050089cb831a72c66c81b3bcd2 +e6c97383b092cab32d548e149a4c7533d0ddf9c86377b4bb23a99f4009138694 +10b0d2c135c45e80c27937739fd0c3f89010b18da6cba63cfde50ff587849ac8 +e729b543b60d1bdf2ef7932fdcd721bbdb1c4b33c9449b38c20cd89c196f9e2b +9de1f7a14788c0170356ca2975d76eb5dc820e2d7302c9a10b8448a4ea83aaae +de3e123862b0cf3df001d1e1374b82924031889a8f46f4b78d910e195bc54574 +6430a9ccff49396ab12b273a1a45d8dcff082a7842838cf33ea5a33679f447ff +9efb7c691a752cccb0a6fa58fc447de070e71032869196a7cb6a82bf7a109014 +6458e3dccfea2170226871f4b9f3742092e15c725df295daa0c8b8365178440f +8f07eb08e6f42cdced4d74f4b168708b9c2353552d5d6a065db3cf184468ef8b +39d2637c7345118706004fb7d2635c326a70af07b5711c32e17928dff9474367 +d45950a8ceed686240630fcfb3e3a764f194a61c9dd9c4208bde953fb9fc60d7 +e95f36b34e896d418fecef5ea2c7cf592854d1c9e670014bcd3756f980b1e0bb +60eed446a8dc5a9153aba58074f3167ce83bc476b236547f6095eb23f39985f9 +4e57e86c6aab1f2be23f44f302124b02b177441fa281e6714a11e8c856bcd30c +e7bc8f826fc6a6b6ff1ec56c0926ba2dbd8d092ee30ca1a7591f3ccf344d4254 +b42360b880ac46c57f6ea7a163254c06928a061b1895d3bc512dbe90c79fe24f +1a83604e95e7b4c4c32671962d34f4bc63947b05840209ce2bc2aed25c30096f +41747285e6d7db663aef6b9e1896efec7bf0f2718ebdcd4f983a3a097091bd4d +274fd42bd85bc5c6a7be019529afd45fbb7762aba86f971c1d6d5949ee8ff8b6 +638ac0dc101c4cf552ec2a2c631bef56ef63b1bf473f103e4490c4dfb67fcdef +c1c02130b506fb4737b899e9ea366d5103c1a11938bc36cd037e97128210c0e1 +21f0a34bbc440dd260181f986f398dbd8af0b43c327fc58fcbaea1c129e94b8d +b457b549f3651aced3b0453ed7271b88ff27e21ed613ba5fb196de359d11a67a +7e17d12fedae6e51a2bfe7db9c9a177324d45434a3c298c96bee33a90ae8abd9 +4ca648c47b203433d6e2f61ae80af5cbbc32d381f0e6bf6ca0c7a2dc6500679f +9eaa4a47cc0afaedace7c47fbb97086750e57c8b38c4f068dfdde688640f7739 +65e61c9f9e3cfac20446ce7b23912c0d26becf578682b296d9f1561ca93186b5 +b0615d87ebc3412ce748f4752069f603df5ce05940f5f9e138c5e9b16d3882ea +4a2a264403be45fac7298a742c46bdbc04fa76e56e372bddbdd7e9e1202d7dcd +ab9c145667c8c57b6e43b8d297318f1b732e5689360fc6068392e9ec1019d59f +30b0f65888b283bd2c4086afc8d4f971d7dd650b311c38b71941f20ae37ae6b1 +bd8a28798bc2545ff3e305bfce3172a657479b9455a5cd7c2e29587c79811f2f +a9e742d40c78237d827a4b6912d5e868e7c143791fcf7751a24059b7a07d0dae +2b7451ae20c8c9e024d4199228ce93e1088baaef1f78725f5eb770f3bd474562 +476b0629817b44d42c6e54424362226051f20fc08e2f22a515c83cb59c82f65b +4fb658b2e66664b4d7f9a1ecd016435f510138c56bd1f2779e6870b79ebfd04e +62d58fe568c2ad65480513085526e2657051280518bbf10bc598d9227056a34d +04d35ac5659fe3cdaccbf35ab5d53b40fae96374977e6cd6da09c3f391dee73e +5fffd26f19046402486e374e24a30744d25856ac5eda613947aa4656e864ffd0 +cd5e933cdee624cce37edd5929ddc1ceea31752c4a1eb8aafc59c53f7e34f977 +fa7991c3cb420e62d52dbf3b78966bb191e29b2dcad4a10a90bebef45b7aedd5 +1eae4681bbdf7ba25a1de93c4c210f1336b8bb73d6562579d3eca9c807d25743 +29db8b028342d5da1dc28fb26a51259a858f8fe3f066ce1c1f6a5a9375f5dcb7 +edffda5fdcc8b012180eb1c2bb99e507d055c165096e31fd7dfcc5abf6c412d2 +8377defebe5120b39237bb6e42b8f92eb8a5cb203bfbcdbd227bb2a1ba76ef7a +62b833486cf10b104c88b71922834df194765fa7bda9ab779c0feb6717ecf9ed +c59d5ce49b60e60903068fef7e31702e9f7be3d10e55b22f5b0b74c6f54f9a04 +39d359f027c7c16fd5479c43f3a0442e6383c39405cb29e40cfda1478102ede1 +7857c4942e2989c78845c64dc8ff9520b7eb2edd5a71c7d6b094b14fba7fbe70 +9768a40ca9d3cb6c6b29c419fb23835bf9a98c7445dd6cd4c5c7bcf719e5568d +a4da4c29f9fe6fdfc513ce65685ec7715ca36aabc42eb7f2b3daa4f870c818f0 +6fcfd5299ffab09abba1092693c14db2e8e15b8cdf1e1f4f5f663a87a2024028 +e7ee620f06e751d97b207aaadf134f45489a6eafbfdc0734721f833b4888fa63 +23c21aeeea96ef49f3081119341b558100d7cdbed77623fb56afdc5cf724b975 +e33fbc632403e14bb386dd3cf88646bb77c90186f11c5aef4b6eb9a52b5407bf +9b3a59e9be0763b4b72d20dc6817d37bcea38854d2bb4e0bfbee0f595764ff78 +10f32f1c3dc6e4a7c0738f3521b82cd72f72057279efbcfda9a5bd4bba27af4e +5e14ada0acfa9f1f6a0059fa5840c25b2eaa1f683d53c93dd38f18f77a31d381 +3eca6b78cb17896ba7e7e98fcfec0a9797af32ecf8ebf635945b51383b1363f2 +a5f9ee5b00c1eca89216e29c701442ee3105eda23c66740691ba505a046e91a9 +7ef11c588936c42d80d23cff82245403ec50105da9894c58c3b2d8d7c39e72b5 +72a62e148085375a99d771e562b6b69636b6b879b826e5987b87463ed56d3fbb +6df3d21fd62edb972445723d58924c5da74ac7da8ca3c26028ce56bdbf95bff6 +c1949c8b05bfda6e071cb71ed83a216241d965b685739017a611c46fe69e5c0f +54b76f4dbe03908aea04fc9c7113e2f3816983d1f2f3ad8b403a2d53922b58ab +38eebc614b2659e0db07452bcc7d99e344714f12f04ead7f45976844fa18ce1e +7299a2f8fb5d0002cbec458d509130f7495f9d9da1adbcbde04a8e1a57fa8c4b +06d87b43b3dce65e7c6963071cd9cea8239cef110d66a9202c67cee9eb32b159 +546d5b1bc6aca0775e2379c1f5cf49cc5a34476bd6f666b5e98ee43f280df979 +5ba8a7055d0d27c4d6872144757f21aeccd846700d537ee9d6b313f1e9f97dce +05200c0b2da123c0c6ba83586880bfa8c44f895af5d23b272616962c134858d3 +2af74eb53b670f204de3658ee27b46af34d69dd70f7425a3eaa902420ef5a746 +af45ec956acc76393f4778cfebc3ded14115a80fcc31a6c483affca6979cca0b +d31a8424bda27c29aa590198c595733155b42dc4f0d36203b8b3ccffbf7a88a5 +1b260bd22b2e70c5ad48948e4c4bc4a0a97d38ebf3d647ba5dc8117887f44aed +2899aee62fb15e00d60782c11ee19dbf11eb76a0a36335a444ed2049cf5fe246 +f49d311009c6433053fccad7a7d6856a9e410135d41edb1453c4bd86e44e9b25 +74741084ada9f1fe59c854c7b91165a4013617ad337609a02ead3e829a70f67c +63f934aa97ed5dc20b6dbbf79ff5e7d3826760d21dd9076269ea9baa20815bc8 +d7971744da02f5d382933ae35dd091d150684e0b66704675a05e9167cb11c641 +04ca219afee30077811c4c5f0e0967649cf628ff1efa2d3fef35250aded707d2 +51a581820d5438294a8bd979d0e18912efdc4583012947c8d338f5ef91bcb9ad +95b20ff31834b45781ff08308009de710899be14cd508711849ef3c25874b276 +daa36dd1d6e7a90058e71aca8165cb92b591de93cafecce361d1e5cffdb31864 +e85eb0f1699731cf3417d6c989a6c71560f2d4bb9a516027a9f3db33e92b153f +562f922a87ee4747982e324fa2fa5fd2d19e9d659c7a521e5903d3d248768cc8 +e8eb4988b9cda0ac1401e0542235c73e555d8c65b874af2f839fe562f8ebca00 +16b88887b92fa9ece0c669c03b8aa2064a9722fcdbb9ba64c6fece03f38e78bd +bef8dcb47f030828439d6e4fb7bc2c470bbf16706f11bb951ff1f25225566b9b +7109bddfb72806efb99af75178d7ec024affec5047065db57c19b866d833d649 +c90ef2dc0cdd6c1ee3c914b33f076ff3dfd0b794dfd5ca4ac0fa3eac58e90c90 +829652f0335693dcf75a37c691fdfd2abef3ad2fb0f50e081847c6c7ace2e9d7 +ec467d08973b6f372fa66b14f87cfb22e94410227722d86638324e5c18b4d2cd +8c7d2ba51cfeca7420bc0ad114740e6443a6feaac1513c6ea3e5335332c8ecc8 +8546659017436e3af06d1120686561928e4e34aaf12e40de35f1d02536d30747 +6befa7b23198665bb9bd642075d5a7f398099df77f1062066cf520a6d0b3f0b4 +f97c691a752cccb0a686062755d53d2d257bf20051630d4c36a7c164510a836c +e183d432f9659152209943eace79056b205aecdfc26c6b211818798dc688577a +9b225abb1a6684246a2eb14264bd59c28dd22d7c7d7e0bdb4fa7f68bf4b2be68 +4b749a1e0e891b65b52592f609f877ec2de56c7ad75a70740ba5891e2c8ebb44 +b6bdcb3b2da4bbbd51358b9b02d7aec762a93ba168409a14ad4347d385fbfb09 +95df003b77e82773fd5c388a18d1c926c387c836486b067b29ef7a8c9a1009a5 +5a9fe95256196c4a68f342c80baef8619987aaed27490bcf2f8568ad27673321 +843542113fc6b57916ad9a632b89478e006986c845d29434be612791fcc48787 +02d1a7ed75698e8d713af75f01c6bbb5424b627ef916b827edc988b853c52790 +a214db2bf9f74627f363adc86493b717753fc26df26a7b731d3d7ee6215051f5 +9e1384ac3cd8e3c771599b518c00708a5bc1850fef582768835805776a2514a1 +c07ee8950af9e4c21441ebec1b969215b810fd4ef987403fc81ca42d36d3c1fe +6169be24cdc60e3fbf92afae0aafa54c06b94ebee17285cc9f46ac6922526165 +7f7e8ea04d7bb167ccd897b6499ce736bc69a349bc066ef916eea198eb300685 +8c400d1f0bf550cd990a68a52b343c5477da020a9a981b09815fe03787525f1e +87e2051e1dc230ade530d3b1d4193a868b76fa968f79934ef3ccef0a928c3edf +2063e995d0f3a3bdc2c59560429a64efa06b6dac5282fab743bd3049d46e8d50 +3e9998ea62bafa7530d577881c84f7c6c79f249c88b13d65e4fc2c52cef0fe83 +39639272df50ffbe1337089724801b9fd4f7569d63db60bd0613376aec9a6324 +cb0d0896b410ac375463c83ab861b9231ba59d0a6f58f50c3ad6c509e363007f +b211d4682db3ab6a92da041a1f61f9b556f2d5212fa7a78d090b091b955381d6 +fb03e01c35504c414dd05eb7d86f49f7282cf421cf1fc93cbe7e2eea80cd7b28 +71b760af1a56a83edc4d51e7862f6e8d3e180530823f28aa79c8c685ab596ef9 +1813c25dae7062230f10fa3c0faf71e9180653dcc842ab7d3cf17109bca7e9de +d87fc5dd2c3fa1d62f3468976650e05356acc42693c0210961a401f789b73d02 +40cc5828f71fd761e77b4b35cc4c8e0acb122770728862e3445ccc0d5539d618 +880e2bcfc7b2ff8089fe553e004e6e265b382e8052b8104183fde9a6ec5c1dee +87640b4f3d28bf26c3585973dbcd1d780565c943ecb9d697640f021dca0d03c6 +1205659abba04e59e2a3937ab3873b1cba79332a0445bccb92f2f591dc06a59a +80c0ec90a825e7c5f11d52ae8f61663fcf9ec767c4ad36b6b7b4f0ed264ef4c6 +4ebfdc822711e5eb464484fcc75da5a51605671fb37c8d17d5585bd10c61f3b8 +1f0ddb52fce0bbc3e1e4341db87497307f39a3eb68549f666de7996f5e72eb6c +827fe9b5aacb6a23ca2e997def512350e10a8adc77993500ca11e00380ca640f +3202d9fcefae7080db08f79a5c4410b38213f727e8fd995fbfa3af9149f07c18 +994ff414abbe3f3e1f3cd8465036b1880bdb20784e3132e3f538147570f63a48 +92992478d62cf47120e7d126cafdb4141e4154ebce926bc08d31656a00780e54 +78c24cb5b1a2ffb840f5e20c88078dc9124ab295028a8e7bdf8b24572a2101fb +b20df7a997701cf13b14b69236d95e5a023bef580b568e85e7957b5b53404107 +532b4f85b1a070fc9fe4d1fcc0b41578fcca6b21dd10bbc2c75dd9bcbb90c4b0 +ecc30852131dde1b17ddaa148b7e2cd22f11cdf2c076d7e96b174a14809feb2e +994118fb2f4f10328b77e78a6f52c9fc7d8983edc4ae40384d2db01cd2c45535 +055b1c0096f2dedc7a2bd24365143a65ec6a11ee570c7be139607b303bd43b49 +9a847fede930c44368931d1c7dd0d898c63895e91ff6a11aa3890d30e4d1aed2 +2c2eaddcccdd759afda6856d3485788d281060646ebfe4d51db8d3f2209c2623 +7804fb33719733e393f3a6b1f70f0c50d6563796bb5be8876dc37f1a5fa233da +1cde09e9232d003d420b4b56c7f6c7646b5f23228cf1715a77114800ca82ed59 +e7b43cc9663414dda8fece830ad49a9061c5d58a8d06615a387ab0cc233dce3d +f86bd6edbf602bfb11b54c2100a7cec275440d01199eaf69f51c1fcd5e8ccd4a +70eae0379b84b98287ebb78d977cf562f21a4a8b77f1f14e660e35e3d3ded6c4 +a3ddb0a11a792d4466f0010d422afc1198d613c2e743436d085cee6f4ea1e2bc +272704ebd8f504a782e8b40669432a0e15b1775ff3b7b7d94aa29625429c320d +a5a92812ba0806db742b1a083b35eb3868dc84fe0f3ee958749831a2fe7960c8 +939dc72c60d9cb2aa82f0a9d544047d06797c5e5249c7725a81275288ebcb397 +1310cecf053b42ac8da5b7a471da20c3d6d81cbf4b9169ac781cc17d1bfa4f63 +3b49d964f02ad46b18ab4cf59b7a50fefe459946c4221fe407bcb5de5738106f +60e64872ff2e7e74742b8ecf79f069b732646525fd39b22386036775190463d2 +baecf0215afb646b6e6ba2387436925e989a3ff03febc3720e77b2745e80b1e2 +1327ecfa70703963703e8e2be2bd3d8c41b5a242edfa194bb82af91eb5567530 +23b59344ed65e2b15c493e66995ca73f108a3cd7a77156ecfcf3ca543a4e0fbd +609e69ef566c071dd87fcb4909b53579cd6e1805f2effa0034d8660869b00e5f +8bcad06f04de96499cb677043ab36c02cf1330e28f98b6830c299fc16de7a4b5 +83e48f8f66420172e32bbf645c0549d542645f9262f758cb1c2a36e2e5ef89fe +857a8ad5cecbd2e421f7810e7b06ebe6eb57955eef1d321e7f3ce53247dd6c20 +e7df6067ebd3a191b87662acb433a3e324a91b5c94101d0e9693eb7971645824 +a1fa281bb7cb583143521475aa789c543ab37288591e3ed8de119832609a0058 +ad5d977a53f873f31a3b59a88a761815e5a7ac8026558dc3fdd4eae2a2f0210e +5a92a5ff01ffbe6403e0b60ebd17e643fdb88e8ca560c80121d077c84039742e +a096d5ea9a40e6588bea37449446159f63419f5f3c804d0a719cd4e8f672cfd9 +e69fb973a5d77fe11a104da0b90c17a3c5020de5d6de844d1f98f1ad73ded2f5 +539dea65c2c0441e39bc3979dca4b141c7da80543b336e0529076247520f564e +8ff9975755aec30139b84964e38caba71c14dec8069f97f566d8d13a5ac1ae43 +6a24163940c26f0a5df57ce8a9e513d665f41cf72ffd0292535c5507d3fb8989 +08bcacb3fd8d0f5320faec238f4764dae2c634d55a9eeb4f6bc4f670ac8a5db7 +95afac4324cccdae0f9c420f7ceae492d6c50047c62d936e632fd549f4a40328 +4e8596255c4e37d58516e259a5cd8389818622a7645601b9b87c6d861172d2e2 +c30c4248934fd2fc59d0cd3b642c0a17f1f6d64594dec573402a2716a2bf085d +7f33e529a0967537a5bf7f74929ff7957abf161d3d416fc962605c451edab35b +882dffb9ca06d49ea4b1868aba74fb824fbe170d75b5f0fb90a00d91286d18bb +3e40066763af294389e383d6f029a7275c128794e8caef34c0a6146414c2b5ef +63d4603f6ffd682a74da98a7a5c7d079bb24728edc0ac5b559e9d2c4fabb9d5f +73d4b716db9fdaab4623d5503ae3a29eb3824c2d97e3ba26883f3a0f3ca55b40 +3ad7c62b6d18efff8d07778bac640216c0b08f12b26b839d6e6dafdd297355ab +443dd82dfb7cb05180e9b41e5bbea7608fd6f73a5b46f5b7da83ed8c49b6634b +108bdf0395dc137376b7234a82cb65394cdd491d6a2c0e5aa12f63eba8ca900e +2fc4e6f1cda08df815ec9f2b87b2b01c2fa6f338987d7e30c1cbfc51062235f5 +612627fcc821059af9c3e089b07b4e427875531a71c2a8e7e35eb391752d6931 +9b5e359b60a48831fa7f86b25624eabfe24b42aabfc878ddbbd0d87abebe7243 +a9aa722256e23f81840d921e92bdcfdd374a6970a81eacfc06b31e8061c61849 +78257f60838e10b83ebae65dbe3ebb092fe8dea4af42e6858c46f75aa822d4cd +3ec503a1d0762dd661e68cf4887897cecc221be474e13280a0020f904493989a +cc9fdec2eb73977501ef0253a00c20ea5fb5efdf7d4dfc0699edf4a7d29a86b6 +2ec3982508d865279870ca837e07c63ad6adcbfdc1a7456d35592bf1b8d770a0 +459c6a405c7f76293485ad7cf80fc86057d66fc84254fbcb3e1b93cffa1dcf69 +3fae1d6fafc6b42b3a96f270d3cf095ae1e8f1522cb4943d5b7e06aa5be21bb0 +591daeb5d07bf5f3fbb9797d3533575f883ee93ae2e85fb09bd2283e5e1de69c +2dae7e927252857fef43b16eccd4ad5f4ed55e2cc8e035d74f9b27fba482e99d +b596421da684b0f00080be7f07b87b1c2e17a4008294101c4762d9ecd209c448 +12917830595b04cd2fe2245a6bca0f22c6f615b99972dc758771f7db827f63a8 +1b393f3d99f882d6b32fe84b88360e8c379e33ffebb1bbdd088fe2334702511a +51eb1de561a7bc1e41aaf676230c5ee669001a86ae6e8110f5644e2bcdafd6f1 +2dd34abbc5e11c30179a5cd9da0da658006e6ad131b85b9def243a5b05db6c0e +132a0fad9deb4c219796ff195a602cf2102d61c44a8e99923e3b9fcb40891834 +4d57b3816641711a54badbee6a328f84e94d4fa6d6d061f431c1a90a9dcc2f45 +e90f6bad0458e2756ae96fe106a5a7acf599980bf129324a80179615717441c5 +639c83e8975a4798369709b529fb819ecbfcfd5ce9defb011707cce029739ecd +6f2f8d7e28b786f5ff6c7aa4b2b50e6a86bbd423f274bae43adc3c84f2907335 +1e4bd47af01387ca919da759d8e6d5e783223570c4682d6b8c08dd3242380fc5 +8835ab30acaa636e180968ad15c9cd043c5fa9305459e53891ecd3e0b0a04d96 +1da52c4f3cabe30aa8dae60e40535b9265d9a1f4fecfd1827db7e7722b655d8a +ce3b66e429e14c4493794cb1f9da0e1eb3f314f7c2a0e49be22535c2d894b69e +e47221303d0f6082930a9500ece26c5afb7b6505ad7692084c9bbb352abc397d +bad9bbcd8d419f0d7523a616be831a3e4e555ad8c24c69affef89b73196cf54d +9dd7b6f1eec15bff2ceb018f94bdd96fc21a72ff61769917a9941883962192fd +f3588d85411700ebcb18691455f2d9afd498b5c73dce43b8c12956f34b0a7d8d +0f7b19e9ceda95950ab1d0c36ff33a880196aef0b07f3525067e4c875869c7ac +8b835d4f91a83d862da9a679c5917f70230a8a147cd8cb28507ddd77014c2923 +1af01b30849d96a6a5f4393cbd9c6c71e05074e9cc36a9fa406a195488ebdebd +c245d25d3ed9f6c0dc492fb267d1b2b6ee38084fd50c16f332a17ad171e92458 +04a285cef250c500ca7c0861c0d304ba04c8725480b7064d05a5fe6c07e2aeb2 +dedf986ce5b56848350cd2a899c420d9c498ed3abb1286f3720f2e21609e5c44 +7c73e3350f3bf7b8cac30df66d2263309d3459eefd2b1d7a20fdd3a5d2f6fbe7 +fedd74f2400f5a18c6322d2646003c22c14730004ecca1f530675631a0747e31 +267ef59d9d35ec399bf4aa776969acc950a6a3131c0a5bb4282334bdf9a390cb +242094d408f4be136ca01e49d0f194c466ffd081f28477250b8123fb957fd044 +5eafb2ddda82d1eea98874cb04f29b0a4edaa171c78c4ef44a26060926cbb640 +f0c8c68691f4f9894c94c1dbeb1360f007c1d9b1d7eb34df13c7458cd28f44c3 +ec648be23fdc3aa91a6521a874c5c0ed138de60a457941934f1f93907727b4d5 +eda94fb2ef3c4bf8913832d6562808a34640f97153639ee81ff0615293b2c940 +dde716237e7d4704b2e1ce34402d13e910d1897e0471a580ba53fb4a3df7cb60 +afbea22db3d648918f1ceb826456f9a5f90ce571ff32e4747fbae7006561d0d6 +6f1914f5365737b4ea8a1ccf87930d7d197b63f4b43b193a4e333fd6a1432606 +bebfbc53a86634ad41c4d24bb944d0d33f7f2faed62b32bcf1b0c2ffec65fa4a +4b518099b9fdd55144cce9d97a6af346370606aa7a2fb0c2f96e0ec89cbe8aca +cda8f44b5cf234af37df40e8050824816b6c181f2c94e5ae052261dfe467cd2a +f0740a511cf0ea082281229df547d12fb66668a185e599af0f2caaf21baaccfe +f337147b5d3d8c71def4738fad795b3ff0da11be7557a63afc63db1788e6d4c4 +49c34be648114343523b1499aefc4cd1bab4095d48b05c07cf6e288fc97e430a +e5edcdada2aa326c8944e3221267dfba0aebef86764b7111b8f8352d855ac8d9 +2567517cfc1e41a3e4dbaf2e2068502ccf78bff30adf55d12bae3dd25b8011f0 +2a3912de89bc88aa796d30f37959a1d9036aed2ab3b538c021270bf1a2226d8a +9b7b9fe00022f0eda7eefe58aaa99420d22054e0674a81a612887ee12159929b +0f66bc41f60122994483e7328ec9d64dfc2f34cab6f0862fe6160ef8542da26e +31b2ef67d61a06bd1263713ec6a70f695d963f485f0cc608fb1be8bbc7a9aeac +1d0d1a64685fa4e0656f88f6b499013d533345ee6c38df2b6b54c5ab01d02a6b +a027c6ea41145ef84aac701871814728c2a1f1c743bb54aef57e8a5cab855db1 +475d9d7d535406b577cdca4d0993b13a8f9e64b6e0ca20d5927493b2c4a72239 +b1e15602ccad01b63fde7be40e5de99f1f9333bd6c9a9481b0013eb2402ee02e +1853473bba641fbce6356f9be8f11811c0418ccd14eca051dd538ca632b1da7b +0a4608574a233f91c5c213a951ce117006ed2c03ee1859781826d366ec7ff292 +325214fd38270f61366d66195208055e5b922eb499478a87611f6e79e8a94d7b +b595bded7e586e75ac946c9e0ed107e0759b36ffd3af8fb47afc1e732c60ffa8 +ff168f4addce1337dc4b4fbb20a6e1a1672d56263797137228cbf0455e0b10cc +6eccc2e6bbce3b73da6211aad0b29c4d8049859e8ce8899928142c0332b56aa3 +79732957ac35e114c0566842d63c82a71f50be9bf9f274143e04f3ae4dcd10b0 +d4df37dbab5dcfe602150815166acbc8f7aecb6fb6a847b5d11ea0165f504704 +68079a215be7fc1d40075a18bc28624ff2a6d9767438a48ec70b6743902ef13e +90094780ee709da9c9d9468defe4e70ecd6b5d624bc6d51212041c916c4d0de5 +58a17c7b06c68cf898fe35949b1d256ff9653bceb7a7be3ad39e7e3e2fd64e29 +fcb295402cb7dbc5683aba1f70a1ea85cd47ed8be97b5bc7ad54493e29cdbe7b +eb5379400f2c3e0f12116aed48ac675b773767c2d787cf4f770c91aa9056d5cd +5501d810dd51d5e7e10b17d5a834a5094b6d371fd36c7fa57c8e78e467da1b59 +38efd3d1c6bf12f94822ccef7fb0a8c690e8f46a436b591ad38c52ea2bc72113 +50c474f8846625d4b99fac3a85f18be0881584fb014f250fad1458b798ffbb11 +e9f1e4db4c325f5e5e23e0f8909d45ad8a6f19b754d5ffbdc8aff06a18cdd8e0 +f7b8d4af3315f3016f55e983a96da779feb4859c820afa1b2abe8c79dbe73a64 +b5cab323eadc3a4905e777261e8db1c5e4bec946c0b6133405055bcd611aecb3 +77cd16814e39e8729cc2cd0d51094475704e3d3bb8e6245cc68619f197444325 +220060fe23e1dc71eb668eb24fade5541a64363bb24e0d4cc27af5b3b40def14 +a56ba198f2fff38f4bb68e8e97cca8a88310e16c80300d28195f5e5f5db5918f +f5abb2131c206c182f35ecb41a08da60190a168898f04c30e476c57ff31ae6fc +1415bde8eb7a2b76d8ac0dc1081b4a4f84d5066ee3692f679444c284e42ce3e7 +51ff24d3c0579dd02612a5b823da7ee54784e7d48414edb4c93ed04495df9629 +f6358db90efdef9cf1117c0b09eb7f877e1d310a82b4fdf841ba4f83b11b5531 +6103c521a92fd4bce28a767a4deec948584c8e0399936f6d56e4b97c711db46a +513922caaf7dfc804ba5361528cb0bb9346c675cb8b183b5d08abdd427a51c40 +486a3ef4fe7501d7788e8b8adf1cfaa042edbcbbacbb6e1b98446a94d751a491 +c669281b859b9bd776826c373249c997dde9d49917f01c5aa3b3f72676885c01 +fd6ae0869d6373a6388c6db6f2be2f984073af62177fe7c9eaab2f93a4616754 +7d8c5eaf9a660127a9bb191d6529f37af98721ccb10ff52c3787fdfab565d715 +1ad13ab75bf181ff6ebcdd58e7380261119d1326c9d3a7343a2cc572cd64e358 +e612ee713f70cbf3d220d4d5d284634e40fd078ed081c7fe413c8f54a56fa1e2 +d96a35324461a07feaa41cf5aeeacabca23bde8f3d5badce9330e0e29dd2b105 +885d7d0844fafabfd5e954a4793a548d490ac0bd20dd71e82a16f805c5a60c80 +4cd633fe56ddc7e2e4b5d9810f2eb96d44edcbf74e15bd8b0a538c7867edc6ad +e75298d261eb88cfe4fde377348214544bb601ad59f55e8282f943354b9ff036 +97b9f67ed7d14e071e85b75ce8c6288050e3fb3b7ed4348886fdaf4fdbed7d07 +e22c853e6cd4aa6dd7a13113ac3a9aaad704c8174522484f3547898d3ad0dee6 +de8e4be232146912aa0553eec61d3ce24224b3f9690be3c9ea1d3573853d30ac +696b9e95100d0d55f06afcff07be9e0949854a919dadbbcdd4512f5e4e295de5 +7fb75085445a66b6a4da37801ef4e2ca73bc99512cf51f2d6fcbd45a50de788d +eb92bf15824d2d2b30478791e0ce9b39735719fd59685d4b2479725056fca899 +35457462edde8b75498622da7874ffb58b71505a4b0896d1d8decce54f81bcc4 +ebade553879e017f1412734e10422715f6597c59e28cdd9f22dd0a1cb4e71b57 +eb4d596f005ce04190a053666a98bba105ede6c36fad06118efb7c0add084be0 +25577b4c36bb1c81a489e08d536ffe351d40f597da5811cd47cb65b0644746cd +e1ff85f7a499d364a7a8c00489318d0058ecc4e243cb3e87170927e8bcb4ea4b +2caca4df0cc14b97e07e0690c1e54e225cef0a74e7703297e04fa7d5ac519139 +0e89bc7af8dbcdd13ea431cf62b9df6f39d245ebfa0940d559111d03ea72364d +5ba232d1fd5b5179e7dd9e48c3e89de1fea9032456557259031a705ca01d9adf +dde1c1863dbf17fea486231fe2c6fccc866f1414b1cd09bd911ee8c5336bf47c +7e07e90bb67e1e34d33f3b293e2985545aa1a2b368d8807ab454d60c1f7bc9a7 +336497d81220765a190b7f660c5bc5af4acc6bf16ab0f9164c9e1598583c8e17 +3de308417541c2d3b593765328be022abf80d80a18c4c0f89eb415c08e440fa4 +515bb13bd53c7d629e27d5f96365f6c9640f554a6e029abe91c18372cf7158a5 +ac8aeb5e41b957da3faa5702779ff2eba6b06feae0935dba234778ba6757c39f +0c8665935ab4f27f971be0a79c5cc2f25785db6e69900558bd73657eafc74cd3 +2233566d0eef4f34b308698bf496798448b930c5fa0ae3b9c6e474f809617022 +ec80288732fb9a9ea97fd7ca820540717abf0c2a1aeeeeabc20a070ebf4f479e +28de3888508df139152eefdbf176279669592c6f70a9f87b0465adc7963a1c2c +da74db0c41c6237658d609f21541baa539fd8e5a718660bcbd00824a00b857b4 +4015113a40c413d5758591eacaece96f839a8ef905229ebb33ad376e03b53e36 +3eae7258d84838fdb4ca00a118e831134dd247ff0e161c982649a95b499ce16e +d126ea5b0d866411a20a70d15bcf91303e2012f4cfe8d393e30c1d157a487e07 +14eab1957d0167170e515e37f23e063038731aba998726fcfa82ae63253e10dd +f66b69fe95e7382d8e54d8eb3065175e0ee218aa88283655ba5bd8d365d09d38 +95a5e248cbd929084cf11965b2ed2e1639a4984fb18f0aba1635407a81a57b15 +05d5e2018764633daa90b577f7eb5897e3b84eade08d2dde8155406ba05b4284 +82d66a81842e008dc01928b7025d6f98a95bccbd431ce65b417e121a33d3a9f7 +cbefa63d8cd58faaa7ff112eb9555e7ba31721f4effe581420f2ae2a7cea2eee +94ef6e72fafcdc32618e0c33b2bef1e708d5a74bdd2e324612dcff788e4ea266 +3f28297f465faf9982b447f7dec88b9e147e121324ad3dc7ed0ae2e286d39d06 +f9abca29384462088dc684720285d0024b6a068839a7781390ee271d2ba5da12 +4bc34cc6f9bbaaf7431f25c9ba7d55b0c78b9430dfd010912c5358431a5f9eb6 +8c7ee947d51f51e8bd99613802c9986f5207af8d7751d3135cabf96b6de7a9fc +4949ac77ab42016a77192b11dbb26c9d816102a633e7fa993c2046491a87f006 +dda48eace13ab809f0821848f4bbfcd65bbdb5681a7a89107e115b3ae992e29d +21a5a30a4f66e7691186ff93b9564ab4cb45779a62d9663fc16d637d5f019491 +ee16ac5f96a3cff1f33ef5d896ae12bb2dedab0677902bf44328073aa09ce64f +30ed8c4da427690c56ea4027ac86485c0e1245adad0a9752a35048c3e6b58390 +17a697ef0b5b37e51bab77463fc28cd90c9b0e863aed14ff9a3ada3556298366 +c7639d416e9ebecdbbaf4af3019c540d99ca87c024382b0c84b72b2966d16b72 +fc664cf4a1a4838167eb67a1e8e685eb931b5a0992b8eadbf82b978000aabb4d +80623ed2e6f312402ab6a0d5ecde7e663af38f4ff1ed472c1ab4f5231f70a229 +8f19119a3dc65ba66d331b48d266fa8151d11dba0a399a687032a897a1d06480 +40571eecb83c0dc6818e841ed247870a401f96f39b179b2657f97cf695508455 +6280fc0c00e39ffd5b08d1519fa503b54adb578c4ddbc911cc5c0d0abf97b500 +432c2af2e86ffaf0cac2da1b9e0db1c2b8c37fffd4d59d8a271dea09c1257322 +b65f89af189e9316edf597eba30e7e8247757063e3adda2c082659d25bef1cda +e9db8931f6a2e69aedaef72f0a6e1c532cee97a0475cae700ef4a13f00eed7e8 +0ae4f86b5dac7c00f56568a754f85f3e1449245a6258e96e6d3aca26d5de1ce5 +5eb99b4a76dfba1488cb3d618756c5f47598c6008c5b5170d2e028f61ecb7120 +64fb39354380c39ab2109219359f45b5d7dfed47eb70cd59a24f68244ce100b8 +e24c4da6e2c634d55a9eeb4ebd49c17990910703eeb6b378547e4f88567758bf +ecf218ac241e58aa1c2fd386d066cfad35b06d51b4b84df567166fa96b6ba82c +052170c7689973815a3aa979fec0eb4b7775922e35aafc31f60eecd2bd60725c +2272ad0964f4a4d855efd2b13e8905ae17911e830ea429daa582682dd1f761b9 +b8cd111c4ab5b9d07ff789a0ec95453b2da65659ffe499a8d210044d0e9d3480 +a0e89c7a5227d4f7bbd0f368044cddebdf37090daf5630b0c0d706b5b97d58e3 +45fbb04a02c6ee756865f0d4cced8c95c2882af637bf22e6831fb039a064899c +380c11b0d3d8c5b517a97546d032d14ef38b2b8d2da4247aec6547202af8c847 +c84253f7a2c0cdc740484ac18ac1075fab57e5cd61963060b5f31d2cdac16ca0 +64379a55463667a6b43b5f5a356c70b76d7563f523d33d5d9caa91a72965f1a9 +7445b479e8dc3fc1003ea18edf4117fb1e30e096a4219dd449f547c7738875ac +0e6c26711c739429656ace4d51b148a8c6ea3c105fec8dbf26785b26e069a733 +6dc5d09736beff603a28015ab93e250ee9748bd31a3a61c2b75928da2609daf9 +10255149882deb4a5961d1fc30cf447f580c7b9061e542ceecf4132d6c5ed017 +d393a512a077714d5abc275007adbe32e42611677131c38e7153f6c76955bb3e +ca769bbf804de511af08ba10d695ffcd757018150d48fe200f7210ed94f0ad45 +aa6859a4bb0513af9ebe003453658f62e35977356eb51ef1dd990a080a065658 +ef57c7d3c91334b1e09e0c1f651908a5a53304766698a5f4eaa13497faa7814a +2467d04e7bbb99199545ba67c228bb1d77c6f2dc4924f4833956fde51917304e +8349e2c10be316390bb556981d1246268801a7242a1e71b6dd2c7635fcf62c94 +a19f36b36611a4c9ec9d1ad33aaebd90d6c8b22b497f5084a0fd4fc9b467d960 +58e68f91c50f180d58114d218d961121a2260246e59ee8263c55bb1a22692efb +2ffc47e0126cf0aae1de48cbbb991eb1d8226394a876e4a5a571401d2f2f69fa +8fdb4ebce8ea06620f5e005a262e9ce2888fb552ae6043bd2d6ee94c57502695 +44026258be98092bd69dc5cc45420f5e2a65161734be43b8902f7daac1653072 +c42ac5a9180d4e1d38d9dae81d60526e100e42dbafb19a74dd1059f349b67778 +d43d830bd5819956be283d0a40cf21727239642eeae214606e404932aec26e00 +5d2f80d053ee49532c56ba71b2a12fea791665f3f1caa33e5aff94fbab05e93d +ef36d69d6c1b91d0b26802e50f554ff369f94d5d3fbdcc7f6e22feaa6f73b683 +1f80a4afcd2d9a68056772030d70e883cdee9af8becc45f56b343488494fc08e +ad2f111bf99037019ce5d4f3e85dbe56569df9033274d8fe7d560b1479e2759d +4c595d4ee105280beafe08a38dae862e732ad35f9800f5103e31a7533fff8553 +83f390f3c4033e17a3790ce1ef5081a2f2ba167457490ccfd0b7d327137dd680 +f9ff9a4b265dd8e74b6cc90fb7e4897e88e28524f13c5f59e8afeb97479c1510 +97c62b21c3179ff9503b6081100d116756c47b868bc94c5783be91f6a626a586 +3221350d26d2d73c117677a62f5ba067e5b6873f5fa6219138a9e0f4d8deb348 +645c7dcac0509996f36e6dbcc16aab7bbf7c463ad0081160723b219c671b4d5c +cd27b0fc73ed733d2b285fcd51a9e1b9263b109c1ac9db61680ae216aad80b51 +c0d92fecedd0e8dec1405caba0d49e042f4133585ea7a20485c6f664dede1f37 +8225b9dd7337082c907dc9133de6d236d30ea303a35d9c73fe58d0896007e472 +c504945f5f5df74d4a1bf1c4b9fe0480a306eb4494b74dac1931c1e0acd3e1c3 +c86b8e7498fa1f7183ce03ebbc83b0855b522877ea1ef8a702f598866dd4635c +008ce025b16f5ce2c2068f809991e401eda93974a73ad18150d434f51c8be026 +ffe444cf5f465ea6e2f119a824847706a0b74653cf685a80db445d11479f9c3c +bb4a2f66ee8b1a0a53a017780635a6f4b51c6bdb8cd79cc177d6d293de7d2ca6 +68a078f093d7751f63f65cbd12b37bc85d94f10185b0291832aee191bbc1d24a +3029315bed132fbf18f13c28236615dda9a4199b7ea29d17a3b665dfe910791a +f54cb7f8935d960c1ce4a8fb1d88cea17efa45b64ee2cbf71b866b98fee1fa4e +f440b33b5001589a4775fd21e0fe78f46698520a2563dfc38b0fbf3329951a75 +439ada273fbe73ca20347138186e78b1e0610e9b2f2c99b6152197600e98955b +9495df01c3edd41254c425a8e4c8ddfbaa8c1c4c90f628176450b285346d3b73 +6a6ffda6a4a4385eb7d00acdbf8d31eeef3368ad4553cb79632839164ad53455 +b0f4911fd85fa2f6f64c322b746a374f9da07e0b06486735b80e119c9a31c5a1 +a337bed9a2ab182b5ae331f84ceba681a298b99a16cbbf3b08256b58947aebaa +5d337bb73a4f56b159633b7c5b09e5fee106cf7472fbe8f11a178e3ed94c95c7 +c79c4ffeeb6c82f6f5e1fffc8f7df529824ebf94ed70ab6a3704d053255d9e06 +e23a51bf0d19079f9d41a27e1d1ce5f5f83a196177b593d13f2b0086c3306290 +1e458fcfc2302f6137d5e7cf117eb3dd671c66dbde1b253a68824fa1dc00f53e +6db57cdca58bfced63026f9705cc856c021ddd0e0e685e29b635a630c1309b55 +9e3442ce12d3c053589262ac3c1d86efb34fc488ff3808d11aab1ea6f8d9728b +c8d02498f912c01609e4720bdd7867fab921dd7ec7b911ee5e8722d008e26fad +1ad0fe844e45f3fc2aef246fb72788f99ef507c262f12f1fca23ef40b42680e2 +ed7e996b20ee94529e72f4e47833d96823f0f91c49e0674f9f64dd608eee0434 +ae7f369b41add6811ed8efeb218ed192e80dbb1c1a4da57b98c679dd755b6bde +4365e9dbe40cd8b7c67248b911f94581fbcfecb3494853f1cdc8cd9290572315 +3e3eb463f6ca94661060720c607c606e82c84504cc60c49905e38c82987a1547 +cf72b2ac1b24e32bb61273728899d50c9c5ebacfbe50b733a2dd0adb8c706e70 +9d01cf88a1e08b60278fc5e38acac7d5e0be43b907171583a5760ebd9b58457c +b3befbf23f2dfcc5e6b4a83f99e478c611a096788c4f8dc394e184381abc893f +5f62d6ee8f177f417450653b03e64bf3b35a242af211286eb4f9e859b69d4869 +8da619c23ba2b053cd0d6aa02f9db38f2d95f8c133dbe9f2f0e3b9bd2f076c95 +3838a99556c6e9330724cbb0af909e909d4f531e5da43a132c110f83aa26f50d +6be63e0f0af0a169ffe1882c4b1639b4854b46416beb3c29ad74b2eae33e660f +6984afe5bb05fe6e2e36ed403c67fd048b97f086410e85bfc883a9a44c416b63 +6f4314e3f9296bc19bff3a491aca8bb4bdbf6c2a5fb6939f00c752441322d947 +d608bf88924faea24ec8f8a76398144e42a992dc3af1ac85c2a9a266a1575828 +ab8179e7ae2f5d10d13325d6e71ff7381c74de32f01130a689cc60b0a2cbdd61 +8e9354c0f47ca2a38f4298f8b289ebfa1f26a2031b476454cff3f4fc6631e86a +17407441be24945af71079c3e9ee832c58c00f9b298ff2e4251f0b3206ecbcc0 +816926d8fb94c2e8ff4c09e62accbb77790cd1f2c5d311b23d533cd9eacf0d8b +ded9fe67460d833f4b272c1ddb439927146a73d0ea7761e6dc64189199501c65 +f2aebd6be9a41f6ce0e4352c88df6386d6af2cfb296b891bd87971b7ba6cdcda +6e70cf316101b35b308acee0bdead3b1771cc14225e5442fe8a3b609b34e8a04 +4df225946ccabff0a6df2dc63d40c37bef8b4aa811decf6d2d22cc9abe696c51 +5d6a164488e9aaa3eb83e7ed0ce7bdf7adb018cc91d4e6ec848fd15301db1d04 +f2c97891858b5781a6d342a5a55bb6fb035e698943deb73d08074f389f986992 +8b1aa05593ccc1967523ba665a32337a8fb972d593757275e1c5dca899dfd0aa +46b2e28725777ba4dc7ab224d824d364839a8a9d163f75b80c9c91de5ea9f3ed +a2eb20e4a549ae81bd38418d2d48db8463c2cd27438989314a35b8cf4b68f042 +bb3de23d541a50a7e833091a859488b5d09e74558821280586b78b894bb9f40b +5499ed891cfb3a25ce820106507fd72e610d0339d741b10f557df76dc5888521 +3afb57cc2dcaafaad126c3a144562ff8aca51b85b393f7e3c1bb3f550d6cb1da +83f7b1674aa12fe7df4eb3464cf06c24b428a6e973fb42fd5997743e17b936b0 +51a31a9dd5f4b3d62de9d2a4f18e3e4042d987502fc2815531e3ac3c8696e794 +e7027f0ab10576efa0d6ee658c8bb479875c75fc7687b227476430081efe4830 +77609bf7410a30e7e397024d06f281e8f57d2da6481566a710cc6020db2ac626 +499f085f22c8dae7c571797f9481c212d0539add668ed47e0ea266b26a2e73d2 +c1deebb212c67f99aab7ba1ea98c1047f034f51c11cb571f062c213c7e97d3b3 +142ad9629f47cc0525018847b36373ca5bd1308432a2c6bb0b4f3e0d4ac5f5d1 +36ae451475a4d7bbc6f8854427771f67734e3e36408e1357f395909172c35a44 +8146fcf32f32bf06dbf473374d8c002cedc04924e32b18a7a6391d6d14c6505d +e5dbad8c97a9c0fcd1346e55de38ecaa509bf617825e3fc06ca79610068ad7a5 +b28e15ddc63f5c1e887102ff076c2bc05f0b8b5c3813f84c01c4fc524a99c86b +33c91d438fc553348ad902199c5e4ab3d942a3d3d311e17366ab1f684f7d3125 +28de691426aae0536d844c1e8e000c9bb21f930ea59c02d6e86eb7d3fe8a3876 +24d0095c4863dc46dce9ba15c2c12e0874e3ecc291d121813ee1f91e7b18423c +1d441ac5a80caa81589c8464169bf45c967d6da095091a17cc52185277b0aaa5 +25f0557e1a163d5d13bfa2075cbd3137db0593c7185792607d0943253b175eb0 +805e4b0b6cfb276a66a059dc538375be9a79ffe4a4186a1f0bad524a02d22866 +c235740294d2ab44fe7d45ef442c91428207fcf6032115e78c4202f17a91429e +906e12e55da329667b2f127bd1060a49b6248552283d048bec369410d2af6b13 +69a9f8984cdb0dd8327a5830578596211dd710154767d4b90ef4c89b39e54eb8 +d2bcfeaa43aa7a5f57a7ad0cef81335738119341280b3970acdda182b819ff63 +f5eab2b4b49d756dcd211b9e743f4f40b12be0733ef14b4ed83b1d76214e7bb9 +bdf6299c1acec76647ec07b81c898928125bcf46af323dc680f95eae423b8925 +09e589204899291f10ab5e384e10e175dbbeade6f37390900a18fa9b87b7c249 +9ec97d18701e3f7e489a87c771e6cc071899c86529357ee7032c055b435be1ed +24af24debc1609ea75d51e9c533e21b34a2a88a351e6e3ec0d224767d9ab04a9 +1ac2fc104a68328c67e5000d60fa64d36cededc36f7799feccd6c0fd3844507d +6b3c9b67af7e60c87832c034f9b10870d75e8c8072f72487df4a470eaff36093 +0e96e886cecdc1545eb239ed6292a86e057a5aabf906aed85e5af55074d5a42a +a9c3731e344b17ede4c1ced329923ee142fd7b0eb81aff2a464772a5395ed99c +db1384cb2c3364c5dcdf636afce6ee247bf61338ce25367daf1dc5912e858906 +aa9f0cf239215de2f7f255bc12466a7f42bd6254f606859a44386f9753e89e39 +fd6086b8e6734dcd3782060e8609f847e1ae6b4e6ce76d109cc0171110ad330c +d0e41cc3b4e4132bb3d29df32ede3b3a0bfa0c4d3797c6bedd44f53a6491f014 +c40a4dca2490e4bb11ac65697142280acf3063959762e52dc9a625d4bdadffbc +8195d29a676bf6ffc01d39dbfd8636bf7f14bff438761ad6db6aef3a2da98ccc +dbaec79561f9cdfd58cb36d1956a3b9f78560a15ad805d76aa9b2c108d6a6626 +1063fa59451f659342cdd6c1192ce671764ffdd0327bb4917603b42ff00549be +a32b12c3e759b4a366fb28750ec5fd6f69d2a538af928a785f0c54f2c2ce0752 +abb22af833dc0e36308c889961652067de46992def0c30db4540695bd201c455 +63564922e8d0fe43e76b3fcd43ebf2e29062c49d9e73faebdea95baf27cf0ac1 +8fdf86c0300492a709d069474689f7d1a4707c87e5ab33c1e61d85ecabc7644c +c31978ca246dc994de4f85bab122a961be3daea942a3a70e0ba7feed8e102bb1 +0822bd0dceed2026e355a2dbb881a43babe04292b7396ef30758eb73dee1e135 +c521f99e0c601f5b51badd48e2a3c4ac4aa1a1a1b71c2708654ff10262bffd60 +ec4c84f5034420b69a8d8261c3d3231e28f39ca7d01367280184226cb212959f +6e3fc684e880768e6895c9735adb616122ab292ed374cc0c3aef61e3aeef5b9e +9f2b55d0cc3a9e2744896c0a57fcfb14da1272d97c65f1c01745804b23945b85 +7ab8e4457003fcd5a9a5f959a89ebe900165c4e5c8e465743d559b4ed504d6a8 +f7d4fa8efc14ae9215e2d319f70f136639d5c92cb4f5b5d91ceaac7cfaaca1f7 +54f69cfb0df6f5f93e9ed372239cea3acaef800fef99fdc17112cedd9f15c359 +ab2bfcbf6a6f9f3be35c49b71ee11d13222bbb64af164e2c0bb601b9f0c6a930 +fccd3fec6a625ec370488c03319bebd6bb2d78c5012895ed29d01222c40ecf39 +5f5a29db74ed587f9da37877cbbcde4534d9409eaeb34085bb705ca2ecdd93b9 +25a11154f85ff81a43b5b2602546ea9d1367cd6f81e976b1deed3e78bd1712c7 +ecaa9a454ac3e681776ebb30fd5d58321323f8992c084216d437af8195aa1212 +8318154102bcd85b822b441d46362d922cef54f5fefd290e833658aa51015b42 +f5b11081c1328b41fa176f8c1aa2279fc4ce699356395ddbb719bd270183e750 +ef8f4a5fdf75e38b15ee149d717a2af622b9d08af35721e75bbcafd9c8e3f29b +d71275a0074d0e7828ce8407c3a13ab19ba5b916de74f4f609b6bd8259cf27f1 +1d12ed11252d2cd5421233aec79115bd74668133dbdb585b5ebd62528ca5aad3 +1195151f7dbfbc4af280e0877eeaf959acd945755086650a81f6e19bba0153b8 +13890b760dca951ba6c9a35a041b04904c66d9bd421724cf97d1a5d7ac972496 +b62602c3ff624202b21c7244a55736ea6871f8e6dcceeae9b5c8f9bc8a0c59aa +cd17cc5003b13237bd599f5725c9c6e2d99b2f97258dca79e1fe2396dbc9d10e +603964aba1a53be70bb214e3c9556dd341148c97a9615f492c494866104be677 +e1bb551a2dd5adb3b349d28ddd6ca700f7367303e4298ad65f47055d4ea878d4 +95a52c863c46410e1cf7194823562567557ea255314eb230770a429c122fac85 +c28ecdc3a929c4b4bdf67f69f055e59ae2d3feb6de0bb68632a1e6ba3369a4f8 +257ba5192a8b8bbe0e0eadfbfb188fd5bfd269f5febf847970f5a61612f84f5e +8f71299b66413d37bb23f8ecd17871dc52267d45b13746788d4ae5e231ff1f7d +34ddf738114cb4fbc59fb1fc629000e86bc55be5ad726660fa3c151e5d489718 +211eec744281d7962bbafde3511ac0cdd9404459f026903872074b38e0f7af1c +0ac25103ff396ac1f8dba9731be016cbad5335e6718498cfa6b299a693df0db8 +0b203dc874627548a47ee4de2cc95853ce703c26ff06a11f597792b330eced0f +147f2f9a25bade18a35622545a5bcb0511470759b8308c4040e679d1f31fdc34 +96a75f355c2884a79379b78ed96ed7227bc0ef987ab9019af26596ac5df13c73 +d164e6e9de4467fec03bfa8facd047a670f9a93671cf68dee1d970ff339dfb07 +d0ef7653eb665b948dc452369591310b1458c51bd65ee081ec52e5cb951db0d3 +aa6255f19e787c8267111c311e5a190e39b896e9c7913c526f9e8edc91a3f2f3 +1e711840db26b9659c9d5a1e9bc867f2452b28cd0e8f935ec2e5c52d7cfd6911 +b1e4814231cfa3cd97a8ebfc2d0d695d4ad10c23fbfb80b33f72d2be1d62d058 +b3c4b5190d0eb7fc8a142ea86aa5d36d98cb8f4075cdc82331f5805534ade1ad +0a26bf8dcb68626fa3e81778155251fb7757f3acda9c4d90391924a9ce42ef56 +aa95616a04d2e5517201da4220d01bb0a65f199c7ac521f21cd76a0ca72c8789 +9a15af165ef4cc9f06d334986229bd9cfc9b1b3ffcbbc5b1264d5f85c2ac270d +2d5c436cd982ef32ea36259f0bbe9b698fd8c7af520051f4666c48ac373718e9 +02b542364f29c9f7c9e24ba4344c2a8906ccf6d27580ae8c84d732c38bb8dedb +af3f9e09c535f7b2abd53dbc0341493de19774ad87017a6b9d4e8ba15dd029c6 +fbd3d88935e2fe7e8be70e3cf49054dc128798b4506acbf3de63c1824941599a +7f08b21f6c0e10cdac1c973af9bbfe6340005154aad84a7b8207d21b698785d4 +747585e632b045e92ac530a1842050c4f9b163800d4ad2fa057f0af9328f6263 +9836853f2177b6d8c6e5841c4bab92e768d66dbd900980be69c3f1aebadf4b9d +a7e0d6e937085a1a929420824d21c80963aa49fa67694a1db456893952224fc9 +f68e7bfcd2148fb3e06ec74ae8dc440111b7466148a86c0bec9d191b3385a014 +9a05efd512ab66289aaf2eedb0d3ad01ae473a8526acdd5b3b5c57d7586e9acd +c849913cf2a09cf9df483bd6e82bdf96b8503967242ecba52cc860cbea0eb360 +139ee68ca1c52e4761e0de897556447fe6501d349509cadabf2d6abecee612c1 +4865936827e95fb553f63cfb95b9850bd5bce2874c4b2985a563da114691d026 +a2199651e33dedfb792760882bfa5cb6d42bc397e6d07a0baf31efbef093ec03 +de3e39bb1f6d8bf7360e534413a9d8bc1fd1b2d22cd48edfa1512cc2a42e30ad +e82fbb51d05dce16a8426a392bfc6d54f0a6909047e903dcdc47f47227dcb332 +2c73fb67d7adb32366c16cf1a896bf85b600058fb58d5f7a72a9c03f019dff50 +ff129beff0669c337e4e1c775aff5bbbb53cbb10b674ad75f50d435c4718a58d +1625398e107f8453120549a490ac1e5abf7bfe00f84d328855c76e4f9b2f0984 +437575322ee8f23f014da99e76beb1073fd5e928947c91bf91e2d2844a575565 +c648ed0b09747420bdfe1c484b3c770a23dc8b4803f8c22fa19186947508b1e7 +b8bc6aaae12291f0034c543822ddab5298cce47864ae92e3ecc2b054c3c1cf7f +d4b2852963da2b190f53c490183fdb76f880ee05117ad965592de5bca697d5e0 +186faf76bdd8ca10046f39946a56bacd6461c7d2a3a4f89a0a709b95515227f0 +47ae274af6483d3a18fc4cdb43ea8370e24f8bbf29375fc16f6f64364d435ea4 +bfd65fb33082f712fdbc91fd6e342b8721ee428822d7e356d2c0bb0b488878df +ed05b8b074709634f35a9f1410d5115ac630fc7740aed4d24d0807ee87afb65d +619c349574ed5fff0543ae3d3b71e75f9a3f8852b351925120ec5638b06730bd +3b05df179fc094fc6ed8a300bb65907a68fabc430a82465e80c5c324eaa23aee +dc68950ce81889ac11fa264313a7d4a9586fd875ac468c38980fbb4c07375f6a +1ee65eda3f6b2c3403759a9c2a97c75cff69871179aa212f5e737bc2b16b8d3d +624bcfc43a3b04fd71d0981d509184c76e2c253c7258b2859d7948289cc46dbd +8e6c62affce4cca99b9bd47e43a9931e68e9f5681ad88f7e36b0abe91bd44421 +a452badef36aeaa986ad1877b4b3e7778a70c06e313828d247ee16b7a523b59d +3fb9ea991ccc8d47cdd4a588999fe86c9d8c9459313db2cdb89eb8a19537821d +af6044f7a1a60d142eb71d5c4cbdd2e095b940281d705500bee28c087e66dc9e +8622d9a39a1057e95ad0b7f79b76921a1ef9149ce9f55e758f8813671ce98cdd +3778559ec6681e8fe1421de41a30bf299c954c247cc6e3ca9cdc6b88e2932847 +b486724a1277bf8c4e26688bbddd3975626855452e13cd65b6752a2e58c5e947 +fb2856c96415e8c59cd02774955be000363be471e908812427ed73ec6f9daf56 +d7018d80e8d761e114d9c7d18873b9b4fcebfbe9a9c093ef5b5d9658f7bcb2af +6671279263e7fb873ab8abd304a56177d7c8ef6eed659e9fd1b10990d30abce3 +fe3ab6bd98fcf2ebbe3cd1fee488aeebd3f9208f4b728bea1633b5865dbb9954 +053a46d78788c5610f3a6fd2a0efa46aff471963f45ce0f2bb7f115417c85bc7 +f10e8ee2780c750cfb9fe51abc86b2e7b2f502a641ccfee21c726a8b48311d6a +ce038b41c717eb7dc0f367712d7819d294d53ff020f68dad8db9e5b9ec83d6f9 +552ffa1ea3e1c71f632c64bc46d7e094365082fea447fea055a8aa849953d4bf +1f1fd05156c50a7cf968c2f6ca8a78bdda3a45fd9b00f11ca734f4a97852db2a +58cee8fb141c6aaee923f32213cf7b0164c4afa0c2a67333588ef152b95f459d +f57ce56bf101c21102252bf550be1a60ba9fde056d4875baa8eeec18d44d570b +0089edb8da77c688e56fada6d08f666c79ce0b51ac2bff1169549830dd2a5de2 +aa46b046deb1e74b5a779e79483b0b944cbcab27fd4e8529807802f808b6273d +d33ff092739bbbc69e95fb2d2745aa2e184875aba514a53ae0d249405e23c0da +a80712ae90c646b669a6f7d16299d61bf95eaf1a6551b17100754be13f7df7e3 +d1cf43942201b95623499e6e3d7647615faca6aa031bdf03d635894b2a1df8fc +1098898d549fa387ea3d542cb3b67bc3b7b9de8900ca26f32598b576c9b5aa8a +7557a7da55c10111e412eb43bf4fb5ad5cee8466e6fe0e34800b6d49e2d02820 +7fee0db875cabb1716067d0570213b7239ff230670b687d8996bdd5aa192a52a +5d462acb5568669e7d3bedb433f85b2f9a893e47ee9f8c4b3606e87ed8fd64df +d01bc0826e3c7700d4d0e8d9a771ca5aeceb9d599a899cc5e8f8c7084798c847 +2ccfd7dd52945d264471f63bdadd3e8adbe6e3d8547cde049d8f354dc287e8e6 +83a5ed0124aa29942c337065f85f49ff343a8412f863b3f505feabe2be881c79 +cb9cba2ecb55e66889844a4a7a270e126d3c234fee7fcfa4a480d94e45305625 +0229ef8a83191ddffc66ceea0979bb7ef8a6e090d58909d848c3b0faca6dacdd +c9b14d73f370c3d96a5c61305911b574bb4b38be6808ecf6ebdced45a31faa39 +dd87c5ef7d16e8d535c0f77d9095d75acfb997311cbb41405bb1a4d4057ce7fd +e2d81213e4e18603da9913a4996413d90fad50c5df695ee90da2092ffca30975 +e21b5850cc9e26db8cf016b776a411b46e77cb6b8e7fc0b62b370996633d50f0 +b774212509aa057712a9a74f6833b1fc9b6c671b96c735eabc082b699aba70aa +f8ec3e7318e4c86854e42d1709e3ce7407815d14434828e4689f1d37195d381d +1aecbc93327ad1261b2a80bf9b6db5e4e38d544a68149ae6d451d514458bf00b +ecc47ce8a4ffb0537c1a1604fd47b6dc740ccab751358d23316de5a31607ea90 +e8c86a9ed0fb853dd3d5db63a9437df1a05ab6307d42e8d51aa6763b70c8207e +27c65e786b74a3d216722175a13286e88d57b9dec885384a90a74713b82e3a42 +fcc239a07352638eb8b6025c8b2b86a806dc715e2025a732aac0e6723e5ef4ba +1e2cf18249b1cedb414fa6f31b5c59b017f4cb1337fbad43cc56fc312054552f +8e5036d1f9804c4de89f7cdb4d38f8c9c9a70f273401d52fb5368dd155480b30 +006d6ba9cc63e81b8be128f6e41b6ed3ed8bf69be5125219d2c1bf9866d10c21 +76717d7374f2c8e3c13b46cadc433a4e899ee526d2f804e9f6f19a4fcde068d9 +ae66eccd54fb16cb941198da0cd1da8e3beafa56c0a7b4285efaa305c13d1502 +e6b4db145b12964d56d94d7659e1bee66ed2b6992532cd0412a767a20199dbf0 +8751bae109f1443007de8afa46b4fb1c3d1529c0a5f4b2b9e777f3b31ffb1aaa +21b3e923087038509093947c90a6bec66ae47cf0692cda06863aba8da5a4dbfd +751830352c379dcb32951927860ed26a30fbb37fc5016b62ca0d106337a5f0af +4ad28f3bcebfcaad13c9979dcbe6cccef9a33b5431adfe0837377c6545dd3503 +9405ab5e839fd9bd2efccd279cc60112bcbe7a3eff3503bdf9399d8d4f698f36 +4eedd52c6296dba82b548597da6f90e89fc45a00edde5464dfac1310ce57847a +f51a43cc916de9e015133444ccd37aec167b15bc584969b68cbc9cb10b4934ff +d8687759fe09b11c6e8431d80f5a45a9021aacf422b324b9b9bff1632f5f730e +d817f0bbf6e2ff0c06fce9465570fb3d813dde9a99889acf1eb0a4f0bd59f486 +fe28ab90c02080c0fa3da635dd1af1a939380efe11d271c560d664de79cb6d19 +30f9df79a1a0f48f7b7e77e220b83d27a86edab40790065fef83d1d1ed921c31 +e3e455271cf4ce9edb99458557f877c082acf5bf57f41d70c67c3f95991c5df3 +aa0df8c98fba4e027c741b3125ea02a7dfccafe63e5a3535653b34d412ed3c58 +01abdeee1d09be8f6fc6047ecd2ef80b1e282c647f5808ceaf323b798c92590b +6b9a5ac72399f0062d5fb49aed0147c4bd670f013bf7127987cacce8f432110d +0e4f9d16d1e4a61d02e540b6e2613222e149b4cad196966ece69178911a37236 +3e2896769498d929cafcdf41e232f13d21776f67a1b4e8f19ce65ace09d8254e +3a267dd8ecca254acfe8d0e5d3f6b9182cdf4329598734f238084ea761a3e952 +07ee6318cf1ad95a287a799959f940d492901bb21856fbaed512b6c62899fa96 +174f7b7ea0e837bb47be35029a0f4b5e4e6afa428e4a00864e58da114bf7f07f +f0d427fbdb40f3ae74d18e23822805c5b3e425bf7bb528524f49a8f428d5051b +d7a119d25dc7a741825ab8e1845de2893eff596d718e9d02aa4c76693897db02 +aecf8433f26ab003893daef74fccd978a33ea53976487aece48d3869d752ccf5 +2b7612be6c261adf0c81a16b41aaf768c71c346b009895fcf8e2efb05ab79a2a +51f9d9d9953780734ce8624402a205838fff0e52cdd3d8f12be91583d214fbb8 +9f210a307fc1021327b4aad31e8a6eb130ba68ef41436db06bdce9c88c5b25dc +cd29015767dacca8d0a37b109e2972691210b2a36efc93c640424dd2a78e0b11 +fe9435bc0a65e5c25cf7cb75941d5aff9a971b84673b2164ded9d1dfe7090a1d +469732c177c4dd03c190a20aefca1cd7e048f73e828e9b92d17f3383ed5e17e2 +8166f29ee8cfb51771619fe97870bb72d07706830db5e6c5e512d9694b18ef15 +7bb17440c49af6b108a32186e90499d298a848151fe80d46b1c1b55f217c7690 +3bc3b7366de1f3a122860f8d470242babbaa9de5cb7cbe29dddac6dfeab9638c +162c8cc3ebed23e2665db34e008b4eb17c92d35e06649e32d892dc43d6ccf559 +cc520cf9b1b5fe529b106640ad803ab7a9b922700357dfd96d854eefbc1bb68f +c7bc74441ff6c599cbafe4c668b517e7d9fd2d225d7537d2ba44e3a6e6372911 +77a31448b12188e0916a0605eb52e7b238cdf15486832ffddfab7129581642fd +d941f8380c623289c50b930c098b432c86750928714223de6d7cd4dabf02670c +d2e8ca122deaaf32de9f36685b5ca4a5f386cc2a1a245a24ad144e8cb669d0f1 +6ef01662555352ffbfc2658e97169cabcb1f03f252a14f74ec41c63fea7aee65 +edf876cc922705b6572ed670ff5ad53cb4a37e6b6d6b1553e8134f811b618eca +5fb30abd7b38dbc2eb382a793de8a243eebd18c929785e8e53630b45f6e4235c +c10c920a7b6a2693f9b4bcd1933c90b38d4bbe65a896d7e07805f04e5413a809 +de95859c3ca156b03780cf118844e80ca1623d5639e64d25bc940d52fca09d9a +8c7e20ed48ce2fa67b89db430102c223145c635cf6ded4975204f1b8fd255d5e +88f2d92d5755ea8a5c10aa20e0d76b16c609f029bdc7393954f50cd841479391 +39b2351b818bcce3db599acc91e9a27707891754c889dc96720110824dab212d +dbc9a2cdc3d7fee4d4547f9749fe086da7a0f24af058f44f8a8004ab0a7e93a2 +0b732a9efe3a7a8c46859b653797d28cc0130cb2591e3f18f9909f04e57c1d9e +b62aad9959828f67b09a7858621c5b1cc3b75cbdd304c3e4a9fd4c1d8eb48a5d +55bf9c697361f2d108162b1a95ca55f78777a0bfec472e2c099a901dfe9973ec +6b90409e8245c41dbfdf774450f207511dcf8426665e335d80ec895d5050624a +d4f386d6c305f954d7e80726b02848746feb55e98bf5dbb61302b28c769c9f88 +34782b0c480fdf5dd635e0e924eb705f6146e9de5a74db5d10634fa1f2fac878 +8041a1feaa0d1fc58170ab41ee12ffb2f055e9e27082d9c45cbacc290c498f89 +4504a33935f09635fdbd04de1a0d5ebd8648f8d118b2154bc650d137710948ad +b4e429e7ddd8b8a3f1f960dc59e0ef6fd21a3ff1292e5f74d055a77a274a8a72 +86f12160752e34f1f06391644848b2e5105034ef50f50d4d8b2ad1c07cbf446e +eae72e25adb21c74b368ebdcd297a1ded98588a4332a4bc084e184e7cfb8be8c +1165f910864d8866a16830e85eb45312ef00057dd51638d100c27238369e4a2c +4bcd9702477a438e6aae75900963d5eaae2d8a5f9e25f677f42b9eabbfb78c62 +40eb456ca60cdf5dc7ea405b601f06ed4a9ad3287749fe09fa6734fccdb5db1f +dbd37e0533fec689c17ca43489e414f6ced598e3da596b339e9ccb6b585f7c92 +2d2189985023f8cebed436872d921468cb1b7f68f98f44e9c160c69fe02a482b +a3ce6add38b00fd205349a26af0e15104e7bd59db046f8ae5dddd6148af71f40 +c5d170095ef916a9bc07355ecd6f14f7170a8a185231ff074a5a697437d142e4 +738a6cbf8d15649eb432a6a8fc195ac3a9503704f4b93a0ba8870a63e1bb64b8 +8c604da504766f63ce4ec6f5d08be764217aebcff5e48e402569e454c83cee53 +ccfa425c7ad7365173728688e4f91ce56348d8ae998a0ee066ead8edca211ae4 +32873817b8dba7d4e1fd51646c63dfb1909905d7e7d84918cce8536ece5b0072 +8195fc635c1eb03dc837c2ce0787371efc83a64196d4d6124aa47eeadc6d79a3 +87fd7f594f260ea3190392256a95ea00e5496ee31b5630a8b56707225a411fd6 +1cbe67ca8c06ef6cf9bba82c859dacb5fe31edfd3784d5f474fa085d64e6d25c +f178788d6042113a1e4ad1825ffff539f3f70ddf827214d8dbd60240fba6bb04 +7186ed4d8c2387de399ab27fd12a5f1f5bb366b1f276126e50abbe16e35e9516 +9445a587ed3d5e3c558c813cf476209b73adac3753445d480b584b4a402e04cd +6cd0fa3d6cc3f885ba1a450937d8857276857306c954e4f398731ec18238932e +fee5f029b4e3a4ee58a1e8c5f0831806760f55d4043e4e0c24580c8e5341c137 +7707f96489f514b0614e1d5c36db1eb4415735840b44bf764c46dcf324808348 +3a633e4d10f1b6a34ba34779612296dc4717fed4c88b3c1258c3a220c26180f5 +4e86385093f01ba576a74241759675d1a0e8c30457d3f2f68ea237808c0cb4b0 +52561287aadec43afe4e77ae63ed35e6c564ae138c5e608240bcaab8e26660ba +7f55ed16fdf597450120967344fc00d8532ff06103c9d931d2b4dd1b51da68ce +5a5c31e5e1ff9f50f62cbc4b3405102b093a11badcc070351bc5140aead2d802 +0f2da6baded7680be199fdc6e1e631b82964c823e7f73a6957c9b40f5c591383 +8fa531189cc51b6e37f4626b20d0664ee17396b6cbc9a1e02cb138de60789463 +03726b7a57f622945936bd06a42437fa7607c328874263b610200126d984bf96 +7eae290fb5efa19bc90e54293d791439e05ccd90dcd46be46dc2af0d81a8e691 +deb164662dcaf93967009ff9347cacb8ac131e8219a72205a277f1b9878b9776 +05ebec060beccdb7c0de0165acb354a8519b2545b280d47b4bc206959c854971 +bda8717fa2153fa7474f338dd5f5e2b9018cedb9b0b5fb7ae24e39cd9f2f360d +ab74448c2b97ad19a99f71b5cb6c957fd6007ffd773476048d00a95fe7011f7b +dc03a344f9b0ba23802f964e753cfe097b55de0387526e9fd9713c7f92f67e0b +8ca450a047431443e66900e779fb4c395e1fc1e6e2a2f2950a8ff3f9d14712dd +11dc488811cd42de8f503ff509f72968887c099b3bcaddb50754cb30d1fc91bc +d9b4a8bdb187068b5231536520a5013cf3fefa5479c4c1901136f5bc48e60674 +c3b446f743200a39fe4b2bc535ad52db17eb2a0a513525fd282d3a3eeab3a2ed +3112aaa3f9e559bf8ed72447e6ddacf006117cf0f42b2a3de6ac58bbb7e8a35d +97f504809246fc66985add1bbf2e8555a1dfb1244a6ca4462918ea9c484386a4 +71e64a53ebfedd82170ea05273e4d2270a371b4fa9a95c23b5edb2decd3aa6ea +88fed68cb76db24b163be4d9a0d43ff0707c32ff8437456fbb8c69a2faa83090 +66d11da9b06a3a2e659bd445cb671b36f9e54c34d5103bafa00f71c59ca9f384 +e02126daa521055ef8ab013dd31d1186af695a996c57c2313135b0930a617b88 +e4b1bf2c51a031fcca7f52d6c8fde8335277e2bfbe0c36b9f2c16e254724d6bc +9d7378d0f6e4d68ad58ffd7456dc3ce4a52013da7f10a9d95ede1dabcf62b3e7 +fdfd733c4f68fda8181d3b339f904cc4947ad7316b6f33a101ebe8f634ea665d +534078bfe84c8594577080c4364750f75f2aa5966cd3f95f2c4fbe9c166c0b8c +bd27e7234336288d8710ba447372095e866d502d16e6a197b53931ae20f220b0 +b8f3858c17973590bc47d8e46719f3611e653f175314dba25eb2abf3ff3d94f9 +3213e756b9ba401f543687c04d95027d80e447606791d3aa234411679225d265 +fc42954071ba5f5b69451be5614c64fe0e47e049907e806f4e595a9f965a056c +265260d8d3b9e4050ba3aa77c640351e239afc00088ab2960d766b36a351b37e +2ed852f0f15e8a6f4038994263923766c36f8449a443cad63a6f7603940977c5 +e2785461425d00ca84acd7bf0b3f886d9aae3c7dfbba7cf0277aa07d5f9da482 +505f0e026f168d1acfaa3e2ec5055bbb80b85a48d09eb22211cdc9e03b930b8c +6240404f2b442c5f2b9796e150cc1ebd6b3a6f489e175c9a255f27615350e52b +47143340df4487e11effca8d9a7837bde5bf566e6726dd90fdc32daa737ae4f9 +a33a612455975f6ffe8a1bf53dd246736790b6897e0113ee0ab2cac8fbb3a038 +1e843e57bd110635ed245a58419abb61f01eaf8b1fb51c4da1e861c94ea5623a +abe123f7f9980b21cb4cf3daae5d0fed82f52f4094eea7e731ea99a1e4f0f380 +dcdb264f93b13a30d42bd33af8e0ac12c096de5c3e4dff74e42111d0a321fe75 +9a65d78b6e626d0d9a92d0ab62acf8ba8da633fdf6aa0af4e57a2738322f5f85 +813e35fb2dd4ee8687846119aa49b2ec702769ec07ffa3ac38166a5ba3be0ce9 +ed0bd6a22d789d3e16a9c7d66c387cac131615283eaa56ac798e3a17b2f467ae +5e12a6902ffae5f30c07aa761a7e4cb3b4449a7886225cfd6e252389df1efea0 +dd4da1836e00513da08378026fbfa05db7a417b1a1e81c43439cc58081b75e71 +a9090b1d12f494d50b3c0dc98539e95d88b7fd88b5eebd151338b5e06dc97b6a +db82d77f3c0c88a14053d4582c231f2c2f469babbb0882f8dc4745c4aa2a4b05 +55dcb4de8c8b647bd38c3d409b015722d124ec2ed6135c888f94c63674bdf72b +c70ee657cb70afac97a258b600002cdbdd36315854a4299fc6ef078ceac0e97d +5cddc4ce78573d6a12aaf4ece3bb942f5e0e12a4b72a5a5c64adf9884a04506e +65e437a289f3b558e46ca330c47d432167472d05c4f15f04147f26b57b85edad +f7012d1aeb119aea34bf71e10525470b022ade7913bd1c38f01b235e5d0d4da0 +389c3f3a2285ca0af45a1139c781b69b5e4d6244506d6a6d77165167bcfc23b7 +51276ffb4c311a2b3d7890110b876f843d2e0aa674cc574d6550e1f59df294a1 +40d783fa8147ad3c4d3c6eb5c2da3750385e0751e11e5505d027a706050974b1 +b41713e1af64b7ef97d21128c494a4d4ced22af0cf0b1eadb916bd6450dfacc7 +e568abd941981f1ba58770fbac943191892a0111895fa8e0dd18506a118aa046 +972c4c7257076ff52ed47b8d1e5e7756c3b6c0c329c1c7e441a467a8202a8066 +b36a29c1c574c987f9eed6b92c4153989f8c6954e7922c3a46f9d14b594899bf +1642e6743ab441cb530cabc4d281d28b2b2e9b77d4727b14e909f6d4087cd71f +b3986dfb7f5f8fa46fce45605fbda72cc8107524f6750bd8073135d8cf6b089b +6ef5b8ba49b734f9a7bd27340242b0326f10a330acf893e9c6cf89d313d5cbd7 +3824f0baec5a60f2b9268708fbbb21be94726fca5e3557436ae09903e7982a8e +55e529bbbedd8adf0c0b0bb72f3393fac34dd312329d359a380104ed4ba093ed +556b13cfc2b4a79481d10de5f4f1cd2ff9c61d6fe24a1b93fdb2bb2859f6542b +9fa86975b9be7fa498c13cc5701c8de1547ab2251b9e0f558ecd2f56d79ee78a +3dd6b1b49f6d0dade871ce198e51b99c6612327c804a771d59c561f615991cce +99959410e0c1663476e2b08bde680296abfc83e99e91a47b31896ada2b875145 +bdc007bd067124ec405a6ac34220b25a233d8de92d6ab3d64c95720bf9b9d09e +da806aef2bd202161915cdf19e95318852d3dd1c285641273818c359de6fa038 +86d5f76126698eba9b729ad74a2b4f290aafbbc3e82e3e87a3ee886f2c82f406 +038954359242eaf9cf999409788b125cfe301bb800ee1ed78c3fcc95147ed166 +d2304b320e87870f66cfbc9bb05d844e8cdeed778f28199aaa1ae7a1db3805f4 +8c4b05cfbed5f210cc30c230c5a817aaeeb76f3a1ee8442a741572f052a760ac +982d8bc54116c4f822e5c054691febc8b76739f3723cfc5cec62be69becbd8f7 +8ce23ea92c7069226ce0dc04ba8284eb4e3a75e09ec5f11af277f8da4418e24f +a71af85fc7646f8cb29d4ab2d9a84379daebbcf129f0ff89f72c029ab44b3c96 +7a475b8b4a3477e7a11866e53ec308b73b2d9c8e89c37c2c100250d5dd9ea453 +0b3f1d853f0a6e34699667223c73c87c11bc92ec2bfd380397b359d4ba09831a +ab9b61687e86020c059f1a0ddfacc5a3c905d53a8ce683b162ba4d5dd0ddd6ae +57b026cb387062dc4cb5139a18c211588fe7f6342e065fc8ca55d4b753b08c44 +515a474389bbdac5a5ce0642554d028663037f1d0adf7f9fd6061cb9272bca88 +f2ffe1d5b03d6660a1aa5d777596ac864162de09476cca47875f709e2cf821e8 +a51ad2f21343b03f3f7a648148f59bbf8b6d5730cc057dfd156c6d9526894961 +adc8a0017b98c70b30dabf6ace7f1e1fcec7b28c56a2ae6317ddafb81f6c36e5 +10c5ce0c937224df3f23b775e04a4c382e5a8185b5af8bb6f934aa8e0cb34966 +cf58e0761da04fd2b4a77bbf3214a69397eeb5b264c64abb0578589db1e24efd +03d9c9e3a875af7c6a63c82f7cdc13ca282524552f53ec3d6c05d77df922d852 +691e1b0484fdddcb30dee6c1266549e96d028618356fe4b698b8054fa6b4e5af +ec7d3fa0f97d3b4e359faa90913c77c7eedca290caeb242c87b6b5d636fef6a2 +ebfa8c828f47ee51aaeec8081e5d379024b47e95a02a79c5f901a032e3a4596f +d1cf13e6f61c9dad5a0c4ed166fa9dd427c7be30be5d435435d9a50bdce54278 +643475fb4de2a159059a25a0f62e210948f173c2024a2e627ee87086b4b3aadb +21a9f43abe2d19fa9c0b5bdca80f45386235436c13234c6dcd8c55019f897325 +b9afc49829f96c75d646831e6d0020d3e1b39d1e136019521d0ebc1554651cd9 +232d1b54fe4a4835defa496b6601891eb71f5ea33b27550d56cab972e61b9440 +e8ac164c8706d8f040beb9952a5d0f20a1fc580b1a22309f3d70c89d98e5580a +ed04010740c45e88ebe60ea021117d27aeaafb75245898ff84b6d0b9ae964d21 +ee49cec1f5e1fc262fd3dd45ebf88b371e58bbc701d3ebffa72f2bcb2c079b88 +5cdbd3d883a6d7e8c4057e8c8028e38e156c7ea06f18d4eda1413db1de161108 +a0e500d802e741c62c646c74a506a81f0a275210b6d1123c1751f833675c804a +ff6016691a125bc031fe3077e7a60ebcde31109180f4b7ab81af08782bb2bf22 +f52a2f86c5e0455ea79d05bb25175f6a984f1c1028e3cb6133ca3f484eb75ab1 +0e262026186cca1524eef16dc73e36438279c4a1551d563ea5c1c5027aec8584 +7db2b146bcf786e42829874359e7b4f4941a9c5702488a131929f92cc5ee358d +95462362d25fc60d9cefff0481208a18f193dbb6bccb85d16ba25efbfae660f3 +875581707d39a5e5676ff9071bc8949d87e5c5c282b2382b3b190a5715f52329 +598e2ca0f1ef9697a34af745808a511f7a87188baa2f711483498485821b8cb7 +f3c67f79ee6f2508c70abdbd433ee10739727b7c403e572ae1659b425208daa5 +e0ddcffc2f2382a6ae2fe4f8c4829e00d2d76449dd1e7315b3e1227000bf6965 +2ac4d1f4aad81546457ad603f8347f7661b21a33c106d57e0ec8eb0f1d2c9ee8 +bb5e350810eb8527540627ff790d19a8f4b1da5731f117b47bc0ba62b90463f9 +87e2701a56fc6015a4f3ea7a32cf4830fe630fdc51e9647af75f92f221bd6748 +7c66dcb0e67f17303809e53154b1dcca41e11f5c39e0aa7e2b4e4a88de4fc41f +83b32d01340d9c005c03cb3154d5f66f92ef4de4dc29522f9de310cd49e57a8d +5ee44b6d99248ebd2560e1e5bb9e6c86f8ced900e4c131ba83ff0f08a32d2768 +1d3f84bbcecbc57bf1fa2f9800973a1786d50666a2bfb11e3589417486a77622 +fd821e73b8a887e82da3add7fd11d8d6d77d90ba8171ea057ef9a40841cde229 +55fc1252460517209708b04f7217614b125640d718154b7e92a2ead58f2bf447 +e240c9101e1cd7057769ed5c4f1647895683d68b83f24c91892a25d891859f4a +a2c98176b8ea870c29318c171d7f0bf4a025cac8c36bcec254f0eef8d1bb2e40 +0f69f063921ed389636d1350e990607aef42fcf6ce9625d76c7ae372899f548d +a439912b916e0b942e71f04682c0a9eb06dd8e2b955824360d9c2dc68218ae17 +35213757b3090b7caac3898034a462068caffc4fb9834bbd2c6d40b00e284b81 +012e1cce8d122ad486197d8abae494cd8cf7b6c3dd2cca4cfc62489a92a184a3 +4af93fa8864dccb4ddea58b0d32002c5510c8e746bf9dd8920630cfa484d9a6d +72eadf76e3cad374abc68841efd56cda445e43669cc1f25cf504cd0b8234b13e +7cbeffe28c7d23a0aee10a218c9bf7ac45cb8135da5c6abbf27773013c0195f6 +ce08523dcecacf507d8cdf8171cf6d39eb94e0fa50f33dbcd0ea8a3249c8e537 +6fda6b72963a29126cd00d333d9fd51799b1b4e03235a4dc6a04cf182cebf0ea +ffa9199aaa1ae7aba820d5d1825682a7b38634f2d8600b17211d36dcb5665df0 +3cee76885b821513bc770a33338d53260abe8c70c9650b1665ab01adda368ee0 +272c5ec360fde8e73583932d37259c2b2859fae01eb07a016b06259fb1e67ffc +65e6a4d85ea119d4a6694bd762d0fb5a49ae2840a11c21aff821dda4f1dca320 +ce211990d514f7c2fd6ed7fd16c17d673a303334ac43cc76ebef6b9e445d8161 +b3ba83a2f568d15fd1beccee3b8bcadc242cba4f7dac7b13a15a9b3a2945fbb7 +d899d3465f8f1ac787d1b97d2b60741489f4bfd331b51c37d4aa999cd0def49b +093d6ea63649419ba41d5aaf894e945d139c9a5afeb1c8f2c62ff74f16482dfb +d15d6e9b0c8e593dea0316fcc12ff462aeecd5049384aee49d9ce98833668254 +e3b431181eaeb6a04c8074735239be66d2c09011612033204f4d607a2e64566a +c4ad7d951a55515e54e0efab078043be9b3fe4d3aa2f2c02eb57f20fcc663a14 +1fdd11ed3c2190ffe43c545041bdfec29501fb4ed2807bbc1030b50021c6b8d6 +c3e312878709f14ceefbbc61089121af0daad9cbc3f87c7a3669b88e82d9a4bc +47259b44cc064850af58624fd33f5150a4806d6d2c6c9c7ba1ebb54a0e0a791a +ea2b095a4702a16cab7fb8c0d4216123102c5198d69874c839fa70d58fa4d41f +f3726ac43964960297fbe9fa5b37c5dcf987bfe347c85ef503b970d57c7e17bd +cc85a0e1c5c0f6987d86f5aef28f76155c80ec092f0b1f5878f8b97d63fbf829 +824f3612ef4f91d535e7958729644fb2f424a4aeba3c46742d57d2d2f8e8212c +12d5e5169eebf7400bb23cdfb923a296f658f5438344f4c64749387e138cdf7f +88ea4accc0ad6f1a76d538a72b5a5f2e449d0b5984ab2229f0ef2cbb36f4e172 +39f464b6eb732be3dd16f28238d26c25c27b057993691e5013bb4ea755400f8d +bbe836befc6825ae225046a8df954edefe17af26c04cb5062a4b61809880ac25 +336707a90eb4f89021ebe8d8100a7686cac0f1553d6cb3149f628c17d189e307 +37fbd77e71fd6032f91237e7d0933e096098b0890408842d537899cfe7c41532 +6577e5cfc5b94f9f76ededd7bda459d4da2a1b76e5c88ca71ce3a820b59f7f2f +1b6396c841afae7b492f9316e8e272d39dbfd477e18d7855751a6e9248b6f4d4 +a0a042a8e9af953b6be389bdca226705a8531e3cb581c1fc556a2934b523d72a +a79986ccd0a8f30012582a7732a6f1ea8c76c86fc0d3a8135a992dfa2039304a +aab8e6a85f7c5d8fdd84cfeb25d5d05a2b5fdcaacf479d0fd894df48bfa46a99 +2b3cd1d23519254abfb43526a796ebbb29130650da4047713e7d7a712aceaf90 +b43caa4d34111558208dca1e1a2873397befbab471214330e60b383d9a823235 +1bee89e327c1a36ee56daccc35d9c46d929809461845424f36ab9fc6f354c24b +882ad0b8f4f9364b1fcf7ae6f84d0738d53e4744e7af73b194683c957a20ba70 +9faff23c41416200d2d1cd3cc7fd5a685b0b75c78f0dabf3a56a95117e1a1ecb +5bd69d83c55f3974b5a8afe2811ebea990e4cce7f197fd6082fdeda0b4e844eb +36524eec5d63aa60b16e47f78ec4bf0edeffe3d3751ca292f288b8220a5fbd34 +a36eb9237fafd2b093228109c40c16b3f24a23ef770885a74f8977e174b784ca +a7a0c2973d71254eeecd038839ad89a395587d3b0c43cf0b8f6e8b2f68faaa78 +48bd188b4d9f09b6ccdf3ebcabd999bee4eed725280f08ae36dec6c9f5891ae9 +da26e56ccb188175b298cec79d888992ed2ba17932b56ca1a744f84a2d1d3b90 +ea7e7df147f572317a6543f1cc3563e90d6fe9c634ec1c904242ef2c3a1c80e2 +3cad4fcc7e1c3025bf342db972b08e4305bff900d768633ac8ee93e3ee277d2c +868d05e7b9f5d3f720256c1da2629cd9ee7cebc0bb6729c38cff62b62c73ca0b +e6ce3e8b0f8fb86fa79aca853e3ed832222712cf4bddb1537c8dfb9fb17a97aa +7389636ce705d607166da2bec90bec63582ee4d756f0285de03ad0b0c0175dd5 +d7a33a1b3fa1209cce9a7ffcbb322b19fc94aa022b0623c75cc344e533c598d6 +905d52f459b945a4aebedd90ef62e03c860a2218a404d5183ccbfaa03280c2f8 +f0c2caae5e2225d6b2fd495a24e61e1e73c6ef57b313a40ba9346f1d66afc6a4 +15e3d31285f788e6bdfe2089eb9fb90c18a0c25e7e808346879fcc5608248e60 +cf45e77e6fd418e703ad7500820cb68d9608e84655f54e8ae19fbde08c9af965 +c1f52697d537b286572ca750aeac11da9455b18b21298346cbdc8734a09be913 +1676d5cdcc71dbd731ba002d89c80dc9fb397f9baea3c8e7713c6372ca543549 +a781c5dd1fe11d715bbd3d2e4ebe43019292769fcd839da1c70e0de51c2c5c50 +ecb8747b4a99884b23ce33c7bb92400cf7657b6328fc12e59cc7392545fb3ffb +ebe69c81bde30beeab8ece85a6c528ec4f3cc69f13f97be348fc5a96ef075f91 +35493d447e538eb0354bfe60372475ef2cd9840fde59998dfecae7675757cb37 +42beb255dd31e043353f56cffb00376a3da8b8a081a023be915d9c9bc00a85a2 +2291dd631db16946e3b502a560c0c1b9b47912d8fe0a439fa139f086b19b9576 +798fd459e30295d7018b95ce209724753a0d28de9c3e89208f3e567ce6288d4e +bfbb4be1f9d0ce83eeae3f677be20ec9f1fa9d0bfa59a6ebc41b7b0612d6e767 +aefa021138f39ae0b37244cf80880e4eac86387f195f13a05b15c547a3479bf3 +7089568e04412ca24440a04a28c65b8f414f4c3dfdd08da055445452de19c002 +93630039ffc53a61eaaf391193ea7ac35d2bed9353b7548f6258c6e834dbc71a +d7c90736dfe32f7f9d0899c53b5f499fa5c94364a6bd7c0e37a9063f60208e7b +61ce357301fa10046b25140ff053188322ad515dd20282da03b82a8ddded02e3 +a2f1de3072815d74194b34e6fb9f116cc4e664170e79f961610dddebfb911f7f +8308c2c41c2bf8e07cf3516bf8b2e16ae70a7ae49872da222ae59aec4e14d996 +39c9c388628ee70ebdb97985a4a78679734730d1da1b2e15defbdff61347659c +4cbbcf9a69c73f69435f3e4a40709c0c47ca6d8d94c2474fd6514f5a07a0dd79 +cd0e6aad1a4f4fb383b1bd9fdcb8243b3ff6db5f81c34ece6480f63e2146daa8 +d982c2bafcb01a28d00a9c9b082511f1b2dcee7894efd53f69bd4c6ee8ba06da +c3d921c22c43839f88654551b86dcdbcdb4d762b4bf79809391b748f5fd315da +7caf3f009ec4bff6246137b88cb6f6555a3bce5a81555ec30ed1139362ff0cbe +abbe1aa1bc445a90f77d4d0a68ec5f05a8e89752795c13b64d3c9871ed092203 +2ce8605da7f727ec357fe20e19215ae2b1759f72333b078b916e0ca7ae6a54da +2223e6f5de4fad934700ef001ec57b1d6570c8872221820153403a96ed5e2d14 +47cb1beef6d1719050467a74501a245c8367729b7bd38ef67eb31b824dd2c6a3 +04da138bdf58db20ce424b107b06964c9381f2ec1d936683073fd74808c11004 +255c063462e8f547376bdd946c8a7af73a0d51b001f2be236168b29d67f9e31f +0ef099763a18a5f34546c205c98b6582895cb712c036716d1801b70b5d2fb3a1 +2ddc85703f0c163c2b8e2747b45b3d9f9149aab695468b0a5ef4a1edb1fd4ca9 +effa142f1220cb7b29abcda99f1cfd17f6462d0f5c4699d351776a6eac8680c0 +3f0808ecb575ef30fa917981d80c5a2936c20708c6108b3b415c617624882830 +0e14d71c75b774aa78586519a57738afb9814806f1ddcdce44d26fd55ff3c725 +c72694c74e31e1a3b59c9725a718ae5789e6e6dc933beeaf42833488bb0768e4 +2395165bba29c0092c6d661175107c63ac34a8556254f45060bf3fdb8eebfade +6e4303cd7559e49931ea97150abad4dc65065d023d84e4ebd0cdf5e8891b6955 +4668816d3d934ce7ccbe69d044e336d87bdc2b6b3e6f1be3bd5d5f746753e883 +ec0a20f503511b3558b3c2f2bd5999b660f0415e4b002b03d2f19681f16f7f21 +7df64c83f1af92ffb5ef4386ecc04f9b5846b7bd1f3e80200dc04c74442fbb68 +d4c94a595244667da4c3649e232904414d52c6757621837166afd0c069d459c1 +b75fafd60ae5dfa3df73a3aa5173ccbea5e32310ddf0d28ad03672b8c57bed90 +5d9290ce0bb0b80a4b0695151e97f8005561beab88c4607c93d66324adf7912f +7399a3597ec9fa41fb92eeefdbfb671e4e8f84a11c3b33f2e5169c6859d7e9ec +f7ee81b4d927395ee3f1cbbbd5944d64cefb71bf193fca8423be6bf556367e03 +e57b10b26938980140cd1929ae556462d1365d2bd0bf704f9d7fb400a586971d +83ececb2f8180aed435d290d76430084e0bb31e68c0550d5bcdd46aa19263154 +71f63438a06e0630e1bba73522bb033494def3ffc74b55e7fb8cf7f67d24be51 +e638dca700abedeb1da5e5032f6e26a22c3e23944b44513ff0f8599debe76394 +f21e84b8eddb3bba56a8d35bb71cf0c88bb35ff841cbd52fa4ee1d3af1c64d1c +1d9fa475d547925a594192fa14fabe0661f2a6b2cc39b61f7bb7e4fbef08d58e +3ecc0724c82901ba0c58bd6518e8d9376a495a944d5d964dc2c71e2fdb342dce +c1a1ff55ea8a01dbac1cb8dec5713083c21c68017840caab392537e101210a4e +a3fff33452f48e455ae679b88646d77a2ec3fc9444f51934226925157da5c045 +0695960d4ec16de39162c5c7a0475bd3f94a3ffcfa607a3ba545ddcbbd9a4c52 +7ec6d3f63b22ada19cb6afcbf3c31ab7c7f668e90d2645424e52318816fdd6f9 +ba0450b6ba29d537698f16871eb3cde5eaef9940a8220b2622b6054106fe6246 +a72747c2e0ee14ae94e2abb5652af38aae2e75fb0b46b1e82bfea39ac811573e +1c1c581a9a547f6ce6e6b888a4628b1a36c4803fb597124faf447d4456ecd738 +255a394b651f9315e7b24053e30a2b55a3231558bcbb27e5732e246d093a3d04 +66e755e897c4068dd1bef39f7c1b54b4fa31d633a19ba49c92f76be2fab052dc +ca69a60e34f0fe8f5d7069ae05269dfd1b52283ff391bfc6f8bdc0d9081f9ce0 +bfc65cedae19381d0c048813c055a8de79c86ec0e3e1e276178dc15165eb841e +6d50a749e163cc0efcbf65192bfe53d67354775282d8ca0387839f39adcbcd35 +43611034c568d11c4d0028a97035c4139b1f3c7c3ce634b8a19f9b7726115681 +7207f36b92d1c28007c2ae23d9d6e2a8629043b7531f338c824ae748b932ca23 +da6fbaa987d0f4a2a524e32c7662a734a4f3f097de5d361abb573f5caee263d9 +1a111373aa93914ae3adf09eae6e4dfa5f2e194cb74afc135f9a5c5989abc23a +b2447f2a5812162b9844144db85dd250955f73dc4e78fe9b02ddfdd0ca0e9804 +a38a2f3ebd8c517fcf8cfd588014a3fdeff9c7a426c3f6d97a9d0aafdf159d09 +922b43d5e3cc51e22154e86a39b622e500d9d821227b158428ed9a5694affd3c +e8ea5a0783dcf36c9f5864d618811c336e2af493bbfd130c16146a90078a18ea +6a97bddaef53a8cf13e8c9db9f614830da0c593e38e9528a078039412f01c076 +04ed620229d3a3732c30a7d2a5cbdae5dc6ca373b1c746af57d55b6d94868d61 +7dc9a76cd1558e5b8f09e8db01acae95074854a4322fd6623d16cae6d446f10a +f48f7853c7638e18a66ec94e75f8506f808e8ca257d2c7f56dcccfc3afd62384 +02fefc78ff54b72edcb39cfc0aa18665776d39adfa9b9bf0c74865f20dcebc3c +a26796dd99bd2bc03bb8a3b80980746659add54a876a944f310716b5160efb71 +f171a7a586f616f39818bb9ce82f1d20b40c34b1e7424313eba64938fbe300b8 +d20babffb3cf0cd062d7cbdb9b4e0fcdf5e2fe0038222bf7b507863e2e930c05 +6503e483a8f2a71df69b56375dc3d923989904a6dbec93894578813f43f96c5a +87d75834b04d43febdf5c505d04f9080de3e77c90030df778d4e0d0d49df6cc8 +be59aae71ae47ce651dd075c8c38f588d26d6f84552505b9cbdea5c677f9227d +15dea7a970e721f66f7af9b77d55c87af40719073523b199712656f1b7eefd70 +d1d82302559f1f6a1cbf3ca9ba22407021a1f45e2abf1107e2d479bdac47d7c7 +24a368cf3e35e26560a168c7b3b27392276847d45f0031be926190a204f5b198 +197f2e719babb6c35b6632563e0beb70342be71c4db9ca1c051a093c6310a753 +69be286f03df22daf97f14006d3a9ddd083f7b223b964d51370b5866a6a98d46 +8c616e777440243da0afc509d5dcbc0cb399f739882234f9a7887a51a1ef37a2 +29b8eb10f694af45f9e4c02387b72500b53149563c0397787fa3cf540854425a +f4a4bac862d408e79b303ac825bd653431e55ad312d33ec202b74b9167778db3 +b2781ab84f25f25b5f931d54778e5eec42e914a83db677e81d80a48c1a37492a +b56ed359a44f2687cdf87cd7adf364d530ab05a514c62215ba79bd9cd26b89c1 +c9f8aedd5c6cb07fd0539e6ed1930096779497e9038ddec37f62db70fca826ef +81358c57cc6093f3e024c8215a044c2de5a1dff4c7ca49e9074ec494e7581374 +3ed94bf02638d8d81ce3745139150f613c30e0c0fa41f8ec56e9f64f4057a35c +c5c39260b5dea537060550f550d74c1dff30711f41805b0fef791fa005f76899 +006cf6adc0812f2c696f89331e80b38b679baf00bd83b7c64e9050b2de57393b +685daa10abb271ff7cafb3401b17da6ec12274402f2dbba7c9869ffcc71f6099 +761e2a721a9776a556d8065966ef0be6d59d629a08c845b05ec4ef5d818d1460 +bc88b8be2c77ec95960016bd81dabd7c6fbd7fd4331bcfd99441760d25f2e466 +bc432448db7679f5e4fcf198d3da060f08ca7ece2c32e74614448446cd6235ca +fd004c932a59157752bf30cc70290e14bd7bf84cbaa94dbb7b80805cdaae107a +b51c8bf7b45c59429ad489bcc1a1241a47b1590db9b9cc5eddd3efb514072638 +864c92e79e22e61bc382fc27b40426e08a50f722c5ee1a1c203cfa88bdcc9f10 +cbd211964fa8c10d1b9ff47d7040de8aea46445e09b154a5182c49a1ced320c1 +39fed5bd9d93e40cf5c800f6fbdc5c5e85fa07a431aa572c2568b395cfaebad7 +fc5bc8b71251b59c3a514f96ac839e98a3fd763d0cb7dcd032a4d0127c6fa2da +a1882c68202a62a0a3aecd400ad7e988bebd46a6dfdbb5b4fbe8ae4580767585 +5aabf9cf59cf8acf427f84c35f40f8875f2b93afde450c1e7c9bc0019f550b69 +e0efe1e365936d7d2737bf3ec34a8ce96f09281d06a1bce31f8259316124b651 +c406bf29f94298646bbb8c7ff34393c1215f3d31dbb25f895ba44ed374061472 +e8d612a9a64089b00f07f884f9aa6ce85e0d0bd973ad90d1c80d44aeaa140842 +ee69bf761e9ca57d21e81ce7ad6e4eb2ce296c306484a2e1d8b4ecf157491ffe +63c7ec79c58b71e06ade3986f4ba77f8892ea1e886dae7306091f4555309bdee +7768048b02b00695b78a998b8677485716ac947f5842002a97b958923dda4d83 +2c2d45507fb93c02a9264ca3d2d5e3f046f7faea54685d8ca9ebf200dde054ca +3aa58934d4d12e556a0517930e6781014d166be557942a45ddd11c43e59fc823 +838a2d95800aeb4bec66ea144749ee62c40179b2735aa4a40df4d924a295b2f8 +681e7c9bd4616ee373652cd67554d3adb5306ee012c981ba8efb5c41dd91a53c +d64793d8abed0e49015e3270c4603ce74d701e0a39b4974a400cf767737d9b93 +1bebc81f820362a23e42dee4f9246fd9eff54095c7c59ab3c114277a6862dd9b +bd194b5211ba26380bb0478b11f967e1b12cd9a518770c2d5415eac6adb32af4 +efce66ce4301dcd05396cf6a093f71ec4e0c4f15000aadd60243511dca12c170 +a049902bf37b7a14f463f4441a7a8fcc83e6a534f18b3665eee3839463bf94f0 +d07ac605280f083e32b39f87e6d90869d143289ecd221681251960151a052d1b +4a0c7a09f6716ca451f4d3bba361544821bf8228c5769b9a844e205c2afb5c32 +dd49b799a2a8ddb81d35d2f5d97c0d34366026080b86abc179238b510b4930ff +73ee8980eb9000280414147eaa36f5fda84e0ddb4ace17905d205a68dca8e466 +eef67b57edf4910ec6d0bc1e20c41125054cb488fa9c6ea97eaa71ed9042a33d +436a24a6d7967922bf192c8f0692d330d3e2728175b597573e48dac2f51aaa8b +7234c8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N171/TimesNewRomanPS-ItalicMT 1 TZ +%%IncludeResource Symbol +[ 1 /bullet/space +/N172/Symbol -1 TZ +%%IncludeResource Courier-Oblique +[/N176/Courier-Oblique 1 TZ +%%IncludeResource Courier +[/N175/Courier 1 TZ +userdict begin +%%BeginResource: font Arial-ItalicMT +%!PS-AdobeFont-1.0: Arial-ItalicMT 001.001 +%%CreationDate: Wed Jan 27 13:00:46 1999 +%%VMusage: 29187 36123 +%% (C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. +%% All Rights Reserved. +%% Arial is a trademark of The Monotype Corporation, registered in the US Patent +%% and Trademark Office and elsewhere. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation, registered in the US Patent and Trademark Office and elsewhere.) readonly def +/Copyright ((C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Arial MT Italic) readonly def +/FamilyName (Arial MT) readonly def +/Weight (Regular) readonly def +/isFixedPitch false def +/ItalicAngle -12 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Arial-ItalicMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44340 def +/FontBBox{-261 -250 1059 936}readonly def +currentdict end +currentfile eexec +414a410b61422d8b318a61dc82494e91375088127193097dff4b40f954c1cbdb +06df5a6447b29e244d99532efbda1c91b4da09b270387dd68ea10797b34c4fde +d7f6fbd76ea82f0ae2e6a60e7ce44ffcd750d999f879e672a4d13dc29ee81f7a +e2bdbb8a4989207e7665af94b043404d03bf5a2aa8c4a6c960f496967a605f61 +3d68bbce3ccf36ac3df993da02051a41c34517365cc7edd0f1feca105d84cff0 +6c9e1f5663c4a4a7c946d353d802577017594cd6c9e8af4163a00e0cb26969b3 +448be98e348012dc9e709e4ca8e013b3704baf7063e24a276f211aa8f05896e6 +8d57f1decd16e61f5e942915d47085cb36fde6282fa8e0bc566d6ad4e4b9a71e +d8dae0e142f5a23f81bb008dc7d91697c86f48487dc81f7623406b2c88321e2d +fd66960a044b8dfae820c580b17336182f66a9ddfb4516e4b7d11e0921de6a8f +fc2ad4244782dbe6e2098a275cc9a7cb6aaf723fa21ecb3cd4789c2cc4b3b35b +02d6292c8acf12956b69d74578f6a7f5ede45d7bf6f21c9b4bc8e8c8b960441e +df105cc5f3db10f19d29c46595bc292257dc023522c8ae757eb45dbd053f85f1 +62b45ccd20a6f84345dcc246691e81c322da907259061751799f4f8afa3a940c +a1bf5aba316e2c6a241873584571230b8a9084b700cff49b5ca0787877936da5 +bd7c80139be663e3f54e4defc316b4d064bfb01ae39b97b96a40d0cb69067322 +334ba2f82217909a0418465bddcfb3a3adf168a45c1d1b441de64e2dd81362f7 +0258effbc94ade9dde91671292819be47629ba2d6cae25bd463675b3a60ffdb2 +3849686190afa3f257944abd855b3e0d8844cf264c2ce4dbd22cc3ccd2d6fc6d +d021fe58ccf617979995434dc1cc08fc71c0247858e4e09600965314641501cc +bc9e38aaa460329fc8ba9d6098b8cb38d549aa2413e6ac24b2d70f15c6d90751 +02898edc47096ffb929e7c9d17f31b1f935d2cf118fefad78dde84c5608f7108 +4f1d5e9942b1126d64818925c8f7dcb422031900b00a0e62cb0b65f1b6c2b53b +12aeb75bc5c5387592c37fee98230512767f6607dae2f28f2debfe860df5048f +8d567b1cc18dce3ae36e0745d45492a57a87ba84d39969d2465233d3bd4eb8e4 +c214327a2b8299686aec3a35f730ec3799b18a5d75582dbe24abaca62acadaa2 +5a05728af2c57d8c3a631e19ef504dfd96a03b4cafa60105b51f65c371449bf0 +dff0cc50e15572692f59e95e9b5782ae4ce2dc22f27a2ea2258a384cab48b83b +d69030980286963fd1f9ba98a22f562d73d44b07a90f446cc21d4298bf573b41 +4bc661b059148b3911c20fd9971fac61aa5b77b12b31078aa9a191c2b2a3b1a4 +83153d7d485f9533e2d761abfa729cb8bb577196f24ac9283124fe60c9c2be7a +535018afcdeb50a7d93133a589c0dd6ca9a641e36c2e24aba4722962647f2ec8 +36caa2c885b18dc2c879989246c01d7c45d809abf20a60127635abeb4fc66016 +54fb8273c4e152cf0b43b0ca08fda7d83d3aa625c85602de9f69bbd6eafea748 +b51b00454d48aa7b421bfab40b108907ad78bf63efad8659719e7db3938f21bd +b4679e431acec2aaab1ccc12ad37ab236d6257bfa30bb553ce6342027ae0440f +728d8a64a61d531f0092c89701f553b32b6f24da8ba3fe385a7724321cd8ea32 +0096137214fba345d1050e5015decbbd1cf81875683ef4ea59f851eb1d0be972 +ccd453f16fae7f4f55c4d6bd5ade583027062e320652722aeb0928d96938ba27 +16093a7baf735bc93b644be3669f3748ac5ec0b4dc2ba4249cceb23b574e7969 +dc4473b146404c6eabe1d13870cdff45f792644fa8b2ed1b399dfd1536dcb559 +f7c5e760eb6a41932bbf66cca9951c359b610eb41e913027fc17471bc33e26aa +66eb683534602c5e22f74db2af092f50035966e237f37fddbc3467ddcfe4c158 +5637dbc9fefc35c5536fac9e2c7631798be61e6d9337ba75e6159c3fb9b23023 +725b1f55cc03c4d64e339e72eebbeada7a80d6aa94b07a744bd9a667c081821f +b759b6e7c6645d0b5ba196bb74ecbb93d4817f4909bd992ff90145e40cdcead5 +752b2ca27c4cdeac8c99bf90733030a32babf7cdda3c2a8c76920c2a8ed9395a +e559fe9a7380d962bcc3fa72dc1b32878ea4c1a4cd196c01f2daf6a6655d1db0 +9b64467d514dce47e51980eec125c6de56f6559396a797f4cecfafd949461d3a +0ca3e1b7502ffb5c4db188f516cf4810ef700a0ce7c4b5f96847efdd657308cf +a7413529a1ecb652adf5effad85c6f2b273ac71865fef06a32985507cb28e19b +aefb623fa2c8bec9251e4ad405905c70c77f795f1a9273a91e232d0a35f33901 +0c75951cbdb31a8646deb04bec7b0106e228ea3ec379b972d6f28473c237457d +9ebb7b835ba2987d0cee1344d47e5c18b4b4beb3fedc3197bc5da32f5f357617 +feaa066d5612ef89f9a37f161f53a00b5773647bff706136599757d4533ea7ee +e9d188fc2a99498c2769757de0866982a0acace8dd1550b21e3c820986739f22 +fd55a08a76941620cfaaab217adb0c0af2c0cb7b4b15ecd39e1a3565352e1a75 +96cd19eb7fc4ab516df00cc1af9eb1b705eed150c8995c7031555a44c3fcd409 +4711647f25fac47b2e89bdb6546d4eaa0fb032cfd30f2382f21cd0c6e091cdbe +d21d160d382d41412a5b93717d4c84e3ab2c3230f3afde778c34894e1d63cba3 +989b0459dadb13073e7291d6ab739b7e4feebfe522cce061ce706505decbaad0 +95df348400c339121cf687db52dd8be5cc2c65f5a911c059b873854002f89079 +3f7f61712d7819be91f366fa8770d4daa5dab621974ba99527245a00d294f249 +7b841bd8d8403ab8fe63f85a747bca8174448e6353b0f61dfe6f39368ef09e00 +9433f21c477a894f09f774d70c7453247dc1eb699c070f3684cc2e3ddb659fe1 +f0b07d189415933615210b7698387ef543635d43fd2aba03144509c98058b68c +3a72c38ea94850c4be18002d1160bcebb8ef246cca279a7c95ad201801039cf4 +a49d28e56ba0a9f2e1eefb751be4ccef8e79defa6f65475ebfa9ffd298456425 +8b86444090b7cc908aedb9f5488d8b67912ccb2f0e52aa2981cc5ef5d59269cf +6e76a9a57d3472f4bfa99a198320298d3e9044f6bcfb2984be78de4bda90505c +2ea74903ec85455df03e4d2252d9eec7db1c30299353f4a6edc49ed5e813aed0 +901661ad78ba441477618d73740c943553110efba5a8c572de044dbd4b92430a +bacad2600a44dc6c461820581ae00272d12752574b6b427ad5372f6aa8e4e24f +a7deed7ef1a8c452c7f241fc39ab0fa039fdf3ecf330d5cc7b7911de1e389cb8 +9863da568642bcd5d0a505648740d0e711805a7d8644933a1fee43266fe9b070 +78beb8940c458a65ff05fc1b505590dfe4642f1933dcf815893f49346e310451 +ee992047236d479ea8bc628996b0b1931dfe22d44af2dcd24862c0960979159e +1f9eee5b802175d9fedba009d2a3eb8960ce1608a9d4cc2d8e9b95a200014cff +26a85815141ce3d3a4451de8874aa71e488094a8d6548c1829eef6aaddb6e53d +dcebbb54b3598c92664b23a33b52dfb33bbf008b9568569e3d070f68ae5a3835 +cc078301323c9baa3469f73dbb2ca98e614d8ce077bb143c31ce52a8daff0129 +2fd18ec036f6575b9ee5387e47c6f45c8a2eb58343a250a7d450219de1f9b422 +66bf1feeb3456903706f1b1674f986c6a31560a7b8c0fb3ce5d9d404dcc6dad6 +5c6efc139e2c0928b5e800ba13f6a7a22b1e79d2e00eb2b090721e97ceea4a79 +1b04ce4b54d72281957b46b46623d14ac8af38f936e27fd9d5763eb7c78594e6 +6e405b3b62807f0adff384bf1d572c4d5b39eef2abe4bd017b134dd642b446d4 +0202bf98b60b8dfe07408f2abe9d5154118eba4cab92d1c736e2ee6c98ed66d1 +ba0541546793605d22fd97739f8dcc9791da28e06e109c3fdccd65865d0a260f +c72fcc2e5038bad105c6cdb7f0b8a20317ab28b0b81313561dbe5bb7224525c8 +06aa3abd1024690e97efcce22325bcf1772729566fd5d4d7fdddf502a78cc406 +b6c908eb2c9b157e27271b3d3b1b967a7e233b7a7da70d25cd20bdb11caa18d6 +0fc28b080726cf3f4a312596813773129220ed014a091dc9550d366f4ef59de0 +933dc3d1be928f72786c1e2a33d4b021594001dc5b6d341226039ed6428c8180 +1ef27c67fcc21754ae589c732800c10c6dff0c95fb6def75b07443a8e1cfe793 +c70367750fecee8e9a05a6552c222623355e6d81a5a918ffe164bb7392d1d506 +eb9ed5bf8f5bf136d430251a1448e6e6df562af39a32a57dca90289a0ef11e24 +6f450c5c4d2f749380ead9b86f65b9cb50977bb8529c7026f6af5bf4bc4b070d +e3abe764e92b5dbe073416c103f02506bf9a4a1a48ca799a5f7ab68494a5c110 +e1804d7d4ac1b9161e1a7788b83c1aafe14a4230eecabe496d1264b61fb4527f +4d92c7ab797bd7200020379722c07579eff496b54d7560ef2fa838f3adcbc844 +0298061c8b771732c8165e36eccac20c2b945d3d3fe047c72911860aa71d5e33 +f04d7952608a16a2b18a8db61835e389ce3b159971074b01aa410a537ebd05d9 +128d0d21f8031d4e38e54080fa1152b90c299bd55acf00fb186732b118387c4d +23a7a4f546081666dd427c47dfbd78516c00f5bdb711625f3761b98b4cfd45d4 +6a68d93d2b39be2404fca6c8c9fb55ffe818e62958782580d351c23e27cede3f +eb2316bcfb07845cfb84a4f8f6c1543b353721f6ae28d5efa3ac07334030aa15 +c66d51387ba1e0daa307856b6134be7556c2dc651b974cc20b298f19aaa9ccd8 +aaf29905ecd4087554098510f72d92478881a3df309b9fc986f5e1554541ebc7 +fc6191d07ec62ac3a626a80e70edf6112e2d4420dd9c0fe0bf32b8c42fa6c716 +8c952975201fb717882f6a342fafa1ff79c1b27f51a6eadea08cc919df8216b5 +91111bea340349b5d5cbd01915dcac06e1fae669362ad918394f2059b7065feb +ae628028816d5454a9760beeceb7794b2c3cde7ea7b13489b5d9698670952beb +c53ebff7ebfeb9910b23752e3f685f8d5ed5e6e69cee6a8b6322ef1ed5b2e86c +c0a0dd3a6c441e719d8635ee5931a69a839bb77e0e654969cf4552d59c46b151 +9e48e61f9c3629948ba8947ceada76780c39c152e51213ada1eae655d3bd0ad4 +1adc9f78bb5ec86aae955f197f605eb5178fe94f1f8b52a4d7289d95bbc5619e +955501847a1b104f6f0857f24fd194f1af16e94987b86efd8574e8d8e87aa148 +6de001ff3853b4294607a0aa0ac7d6822a07386dad712cefb8feec6db3b7ebe4 +85f0df0e29d2f08bbcc719ef8f9ae89a2a3d9c268a543856ab30991d278edb3f +e8408bcc95266f6b1c389ef06c6d682f533a5657601a2dfa48273edaaa340b29 +efb1c71b30d4ff5cd217f8ffa5642f9873dd6b594173b13faefe2120defaae84 +528654d190c0857ded28d57d9af153f5875f8f4087030cc6f2a536e46a0a80c8 +58c15d06b1e1247fac9052fd1ea5f3d4a47671a031602175e07fd6f6eed8b414 +10b04f327017e9ce55f5a90243888c8bfcb4ba46ad975c3de327e9df20a2408a +b4d0767dbca4438e4ffa4261f41e05ef8b0d9c63daffff8eaaceaa7bf984c53a +cb3926188997da76ce38c8b01e22f8c20ec662f279cc08fceaeca2e6cc9ef93b +f2f35896e5017b279e6accf7466729aafbc7fc0962c22c781892ecf6c77b3890 +92d56d548149745195f2ca959936e743827217407a1d790be7dede050f30d073 +ffd932d848a81af067b6b030c5b9f2b94eae5f0fce310da92e9599ab54fae852 +2fd7283ba587f3f4a741e47d8c012335cdf488192e007e6f8c4f4d31ce7febe2 +8defaaba76ec22331c2de701fc93fc964b29a09e2ba05c886b2e7dba9fa83a34 +ed3db1c32532f51631d4372ee9dbdb86b4083682f0c84f802b966b79765cf868 +619fddd041c7632b9d7e7ede3cb1b9d35c6d37f5b715dcb93291b037cb6d54a1 +9080cdcf7dc0d361968a6f8e4e56323542c7001a78d554f14f64fca7ad09c039 +c1112bc2a39ed37e5687977db15c2fa3ad57486acffd505df3b4b127533d55fb +a9001f15636a6a276bfae3c92df528e9e19c081eff5febe7b6e855156d95730d +32eba40db56ffc7a4e21b2bc7261424c539c400517c03f68fd6b2c56002c694a +556d483164e8e5843da6dd2486ea68ec57893e82dfbc884791820cf20a583592 +a8ba2fe23325a0a1f13ceb0b276e1a02986e1d5ae0f672bec79998b8c0034d1f +0fcfda5ae5ae794f5ce38e840d944358a970dc5acf9fab5cd3c254fb1c88101a +37408b0ac5d6f4a1e56518cdca1711e92a6c33b6796f4b0f8cbdf2b8edc8f501 +3da3cf2a51f68a32fef929e326ed49b3f77714ce544289b84cc2da025731db64 +bb4b10cf9143f3a1a0fc629120acb92d176f0d235080d8ee1ab3374bf6f5aa72 +43eaea173078117e3505e1c2073bef43358685bc248071494333e5cf3898ecb3 +88aaaa2a522d4113399119f5364ab1a23c475061d8900d17d9677ae7cf173437 +919d8c984a035f9010b9db02cd984c47a2964cdcf5bded70df217d0ea0772d70 +58f7e8469bea165417956b7b8d0b785760dd597b9561bdcdf061c7c1255585ce +ef4463eedb83dd1adcddc734424cd7d350bf322478104211bf9aeddde20b991e +8535188b49fab7d02b0cd660312bd6e13caba635f132941c359b610eb41e9135 +3a03311938a796b6a18640c667a338a55b44c80769e446c5e9e947534fbe8ee3 +6108dea8e4efb60a055fbfd93520ce2674060d9460a77d052cce37622256a965 +7e0ae08aacad5a0a2544289e254dd67cbc096c44983f8de58e8097de623b004f +895459e7002a6f451d6dcdb3b4b2aabae1c985d834dafc14076e79fd9ba1897f +ee39a7774b435a4efa3ce08de5048b6b96d4764133f317e50e68dde97aba6b5b +915ca1ac98f00848da30a807766982a3d616dbb2504dfd3280e415574d4d7272 +93e78a4b3d1805678a7cd99bcaa0667dfd58b5b6ecb819d781a7fa8edef6791b +1b45b2e6ac1684d2c33541663d7689bd4a88daef9797bcdf4a67e3ff3d800c95 +5dcc96ac610a2001604ccb18704c1d809715bb3b6b7d19a7395503af65369fe9 +f41229abf18a3bbb9709481c24b910a0dbd662c2c88b19fd8daa18c7f60d0ffe +48970acb5eb130b449137b9cd80278e6a22eac5a3f9d962d80099dbf658a7b29 +529884802c81038813508a598950b730e33233a4b6c81b3dffd77be1711f2ef1 +232f30f79cff21ad53803bf53f679fdc86abe4bd017b134dd209034ad2b8fec6 +20eaa78103f64ed4ce13ff909c52342ed3d57b09ef8ff6abdd43b0bcb4d69ae5 +642c5eb9bfe4e8e3476afdcf46cb4dc451f9c6d4ab386a0c93bf55321017724f +920a46ae189b0176bc76b5aae8969459f69686215ef766545f78b57cb9b59468 +21a9bcf18210e6c7ec319a2ddff907fe3f5e364d05ce46c344f6f2fec694b463 +912f7d734950789923c1ddcc0994130ee76e8676dbea2e034968501ace49a942 +c873e6b14f71e963c11e7f66957d4be9ce8026689fbd7cba8b9c677596ab38cc +069e60aa8cea4213bfa596634c2cf442169358e4dff89b38a24e6f88f3b7c43b +2eb12f366084def6435a466f94e380571d3dd14d34475d326c0d38d83d859c06 +af76afe7cefc3196dc7907ac58bd6d987afeab1c631b64fce1bf6307cc722e54 +ccf2c3f719a8ec53a5539f7503e062298dc8968a744f2f5c931b83bf8bba4450 +2065bd7f65d06be9ac8297ef51fa8c06a3ec05987ec81a38d41415c87a612807 +db249f01fd956a1e204c11b414120f630ec8d94d88e6e41eaf1734094fa98ffb +dc84c66d011bb61af8321660a06cc7e7b22c37e2265734327c4d21a6529c50b7 +d115567e8bf55617aa9b28e6ad9c75c5d91dda5fa2efec0dc87bc7c5a6fed9a5 +ce02789ef00c7d280742ed80acbc137c1360dd9cdeb73529604fe76ede921d30 +c2c4baef68fee83a49fb33443d76b9db239bf7b4ef9c75edb10b895df7e74ae2 +ec3067dedb9b0a6965388621eabe8997f8b0889a3cf59eda5e6206fb714a2ba7 +870abdc1497f3bdcb6e2b5da137c8560683a9215a78aa8e58b5ae4eb0c6234f7 +f45b18d85fce17a050255cf1d65b4b5bcf5d3c8af70de3246dfcbbd6e445583d +fd9c195fafd65900d3a0597b7382b339ba0164d71b2eadb5ec0432469393588d +9fc1e251d1f7e9dd4be264ca4ca8a60e5e7b635665b6da5ce14e1429142cd2aa +72877d6bbd696bee61446a8f1982969f05ab646eb2a032ba0295c337f16a90e7 +8bd27f7407a61d4861e13509ae325cbec90920866b8ffc859d584b04a48ef622 +fd72228ac15e38575c254a3c21606825e059c9a33f24670cf195761c1909b838 +2ff9ca7779f5021bcaec75a3e9fe11dea1a5aa6868fcdaa8116e48e64647002b +ae0876ba705b60ce1e836b7af979e8805119430674d211ff16ba994fa366628f +75812cecc1792a819fd05ffd0c76b4b7b98f0c017d8cd25120ff314940a24bd2 +93115cd15e4da178f3c36ea40a53adf3564006b8b96e0e0458369b4124c93067 +a6b43b33f566a0867ea87625f79b1e8a0057b21e4a91534575454d8a94359ac3 +595baab9e5f3e40d9a6af7bc5ed468e6cdb3045df1d7a9b7e683190f569f98fe +a8ddb67ccb161f806908d0c344f8ec310e2c98b22dc1f95f45b85074a6b4e0aa +3e0e616685ee8ae41f583a288434333539dfd01f3b16e9f98f20d7e77546b26a +aa433ec4619c3924d516c993f5a9354a38af069ec6410e41a1703ba240101560 +52cf297ad1d71c3164726133522021c33978cafadc8465b5ecbb231b205056d9 +03e2756045a62b4c3dad5398c1ff63b0105cacd719a21d46700c8e5b7c3f8337 +2df726a99b9af12762858fe28aba60346758d9bca3387c78e203e7bdbb1a1998 +cdcd58e5c2e9db6e5199a356f0710c6a1c628494d611d109a764837c4a960506 +9612852932c1cd8752fc70e2ff6e4aea2f0bcf6af10ef5fe8da28ba5375c402b +f786205cc6dfc997b78f99cf85638bbd3a18412aa4aa3e61748d36095c3fe9df +fcaa5a70205316bdd0706c4df71ba087f73da0951d02b7db72993d1030e5436d +5f0857c107b57532aabe1aa9568b3b836a9477f6d0b8cc5e0bb18bb7675179a3 +70910d88abad2c99a8c639e5eae869c31fcf1d7621c8abedb39cf6eeaf223b56 +321b2223c8f631b0628fa575a59ec2f0ce8584aa8e08596694cd6bb7fe8e2dbb +e732e13a4d4ed0114183da45b498dd00cc7777cbbcde2985cfd287b0debe6e29 +f0ddf11781d5ee420df02cbc20cef5a7d98541ba9b226135ecdbbfbc983d9bce +99a0b4fa4bae8509b4a69ba804b9adbeceb55785312ee695b297c7b16b713c4f +ef32eafb90fa93771cda5fcc78d9bafb6f1249c22697037eb48e6354f82d2d9b +c3123309281035121be3aba28b3d6b983ed8c992268c3bfb4f08c44a42d40614 +3046d6e4038eb39cbaa6a322a99a1e33fb4633feb56d1c30259d9cc2decd573c +8360e7be37456710c57af371dbd3954cf74b70cd858c9b6041483d86aa03cf82 +dea12287365290fffa9d1ee4836314697b1a5a21bb9c210934b0bd05a57e424b +2e9c4305ea838d677e076cec57cbb3d357461f0b181f47a183e5c5ffb79455aa +62706bac8ea6eecc8806c10deef835f93e6bc7dc4c7fdca9867975f2e0020fb4 +d5f3ef19ea9ef011ab28051340a9276afa5498f010d784745d290c27121011d8 +162d300bbb4f2977f2668f1dcb4d8a6334f85fafb57c2c4659972a641b005d74 +6cb38c1067682b1247ff699a50b012a16bf42c3b97efc948ab9341dd83c85136 +297d3bf806a0cc81c354fbd63627d51df0c48938a3cdc5a90c554b95622cf985 +f959ecf3d8adb82856459c8cf38d7ccc6aeef123ce75044da59750a1411a2094 +7bfb1c3505d450dd42a6cc3f4e6b616973ea714455e211e675174867b037d933 +d5762ae29c3ed8f8ac1282ce2b8ee58339108f0636cb074db3a8af54ad21e5d9 +ed9eb7b86faaedc94f119b6e5150838a1ee984015014b0c732c6d850400efc35 +c7cd0e2838ef7e1bc02b1a9ccc6587f9a4c520a2ee94edc582032da7053e0c6a +451513963982132fe1ffddcadae32c65572fd0d4afeb4b8053fba58d9e68dcc9 +1c8ee58a66d604b1c1db1d7564470a42f929bde69dfa6fbc2c0169f4995af414 +56ea2d43636a5394c406cd562f85f5b46f8ae65c7791c0a521e46da57e07e46b +0dea35cd5a7576a3dc797531dab1bfb71d4837c632a1db92d2876ad5967d01b4 +f4729683670c094a6abadbb2d7ce100b8adfbdf06e53497e4e1ef4c497df43dc +01a3588fb3504df1bec0b10a12487200ac047294de314305712ab29f740102ef +45983fd13e8c68f1d258df6776c3d445e0c0d7dc385bdd1cb32951c3b40615bc +15de5deda9edc5aad1e2b51b032d4674ac16e515adf3f1dca4a1037b84cf3275 +d549c4a92ce44631d08ba1ec88c14f820099916171b2ddd937805971b6230d26 +10b63463cb74a97e3f2438a48d9a448fa31f1f319a05883308ec70cf324eb1b4 +166f4a7e66a98d8661645e77d4709b7d6690112ebd47ef93f49a6aad5639a7d1 +05ea34220d780721e39f666d837d16f951795c2bbd6186d49e3e67d9ee60342e +558f193e8b09ba17e18d164e1a933817168828ba16862733ee0ff9aedc4cb7a3 +76e63d593a411f83e53b4b37ce858a37f7ef3308764e003d831817cebe5ca2e1 +63362f1abe1be08e6e913aa6ddfc014a436fda405813509f9506554fc9db3f1b +b73d48aa4052e1d53edf6a1feaf0cbb531cd80fcf174ec8edff7a87e38b64317 +2e185186954adca213f8eaca7734977b5b82c929cb5a9752827c85dad50f7a4e +80a7523790f79251d652b99d55f9237cfdd8f480ad51d3a112c48ffa971bf1a8 +352cf97ed77d48a6e14bec689aa26d4e287a17ac5a2f2312d5c5e51b808eb2da +26d8a7db5943ec796975802e9fb0200185a372ca4dde5c0634399736de588936 +5d60726c2a2c9e9f3fed433335c2e529d3408375509ef1cc250c71cc999a3486 +22d7876e52431d853d934d5c58dcacffae7c78b074a28c9a73b3e64ea12bc3c0 +d21dabf4bf031ef02bf54614ce2ed5b376c2f7cdac3c136ddccd803846417d93 +f27426ddec4f95c3aad3e4ff13d8c6b1f182c6e692148912d241625651428e5d +311ce9b958ec927b3a4cdc471ecbe9e1b82208bb3228d608de35c1c246c549b2 +3e5b23adfefe919fc17fefe28bae7e2ffbc89ec67442b907bb40d9d571093ded +90ced66a698e65973c8b6f44b2dc63c1aa7622c8bdda296013b17d54da761e79 +7f57216f9128aeb191a12e773e3f02329ac8aa6a36ebc82fed0c3ee163daccba +63d48b11aee7ca9c6cb057d5a33e701ea4b8554107cbe495fdcadb38b6ac78d7 +aafdbad1418967b7fcd21c20cbc734d80223ed9fa9f708558679126074388251 +49adba0c9c75c5b1a7236a4b815d04759a1bae78c2829248f36083f7fda217dc +f43a205931b4842d82681648c9e431077d2d71a2cad119d130242897df67fb6f +aae447f335a4b28462e65c2a7de4ab639859a6b20983dda81a7fce794557088c +bb1b4e36027c562243e43227621c61c90a39b3e3c336bff286fe08431e4f92ad +563d52617601f4e8c5782ae42d9a3958e6e86824f23f69596b811170f11f3a99 +bab44f074d68b8d11d678212e50be4e4866b1a6a454b745938b98b0d02cb0d6e +7ed7dab3e4962ba1c9f9104583aca1b10e0c955d6d4ba96b885ca3aa85186ee7 +7bda8ebed9aafe5b46fee081530f5b5e04cfe236f91ac7a8689cae7464b0044c +ef7fefcc2c83430ebdad0c5bf7b36a04ce8082eda6960d7eb2c00ec3372807f8 +2ea1eadb7750031b6ea6b25b067bf784bee094ee00606d642f154dbe2e975390 +a268e97102417b09747ec3bb0b1ed05fff442e2fb661f6afa79a732bdf7b0980 +fee001d4e614cf5c54d6e1b7000a660906af548eaf41559a5e80fb4fc1aa6ebf +026ce2811daf1813d494101d0345a566bed02431c37fcc2fd843e5ee484ced65 +826c8e515e852c63ba9b6548fa7ced7aeee2cc85d3da8983bf7a09885409c390 +048a08f48804095ed25b860634fcb2d3a14ec9272ea02e66eb1df5e621479131 +85864f744a0fc3843d9325e346eaba5ced4cdb349b9acdb134e7077f19906116 +9dfde96d7319534e67f49433f6059357756d0fcf7a3ba3805a859d2d5137f0a6 +48f4d4c0015e3571dcf3b48edcd28ecaab7b20147a73068656e5ad892e35c889 +d74938f733844b1b71b8592170984863a1087ce5c9a9f15404c32e6e625f62e7 +2f2cdf8a88b77f74c8bd96fbc8994114fe16bd98713d01032d9e0e26b3d2b23d +ee6336562104d44a85576008eca8aa9d22b6c0e4db2807334f439b07ad3c27e5 +06685a30502c94c54c2bb25d5716b920d778b095df8d77f388c6144c001a4390 +f6f8acd022897057fe51705136ef2896c8158df344a85aa033b6f139b14a3715 +c7f4c6a38045a848829c67f8f1f29388eaf570e6ee1cd430a8ed18989d0c1b50 +00fad7b52e99b27e65344abf44b932ccd0295a1845559e0c5b3fef581d318448 +0bb0627c309af04f31cf8df5bec6a0a706a13eeacfe0665d0597b0bdfbfc5759 +4d138bb6ba1613191eca0d604dafc41d015bdaea784423ab9bd50f0a305ebca2 +81bc604bb19e7b8872ddb2b6a58985b820ebfceec7ba9503954618135e7aa991 +e064db3584b30bf44bde46177da4cc2b5d90a303b9b2881f9eb0005e6cc145a6 +1d68e235384157e746fa0487dc187d43bcae95b62301feca034c12fd0c73b8f8 +206229dc3d19773510224328b4411819eb0fea1012c476fe332073a7e9d09aa1 +0ec8903d011d85ac2b27ccb11b5d7b3fc064433bca9349cea973def294d64e93 +959a1db2a7e90efc4ea7e05518c6adca17c9e623519f86eff557d1c0350baa4b +e8665f2ca1ad3ca2f684c44f967a4f4044cb6b0c8802ea04174f5b2cabcf1351 +20f8a039e2163d918c6625ad3ca64fabfef616d20ba501dd63e4c9a87567f12e +b73b6a51b3340ccc1ab021b8ede5955d5b2af33ae6c458dc0d5b7cd688766f12 +7b50ed3691480b1e09e0275f4677029d8107089c24af3e4496bf3168664a9837 +855a9dba5b41564bc46883fbcf261f729a33e11ba7f332ea6fc827c30c3398b4 +9238119872aa8ab2cf4d3a39d72e101f79ebc86efb36bfb5829a2b98a53b98b1 +7dd0042adf6168f6c6d635d34089d289a05c079b8d85631e97dd2f619abda256 +e6c6fcc925be0126a54a42cdc7cae6c0d0dfc6818530e50e80914945e458ea44 +141e0301e6c3709cec5668a4ed15bac298c5e35d9d556d354ba34e94ecd2e014 +78881f66dd09e915f547b5cdd318de201fe86e04b5d35ccef89d97ce7a4a9c54 +bc0d2af6ad39d2d146296aa6ab6c033d3b9c77984700fc7352dc4cb27d844b33 +772cb3b7fb860da15e43bb488560bf7225f45aebf5a0d440a28461b0d4aa5927 +ce1c0ce705f9a96e286a4eaf3da89831f136aa21697537fb7d89ae75244ac4af +0184f38b6a260028deb7ba972f35698cfd5644619ea99f09c0f6cde50a759f4f +7e42e9c75de34f3c310f19a2d1d7f775bb0248c6b7bfa7779b9b1d4d6bf77eff +3bddb7be8be69f1ef298e92463291a25ca4652f700c8a7a52bfc7ee8edd994dc +0626e6f43d1a3d08df54d34cd43e3a6e77de9c76b8549b254d5fd58b69c36dd9 +b19755d84e02f4d575b21d2fbfd64775994a1507329cf609e97697f4911f2dee +c1299a758f47c78224598173a948e59da721f7dddaa9dd6996461b327b150380 +435752cfde4504064003115d7e7bf755f88ab2d23a8e00a602dd789516527529 +102809c0dda486d1da739c99066b35a9010203852796b0ab2389d391bf61ee30 +8ac29cad165b9e8b9a62c3854ea646f697a81296a73d11c3e182fcffeb4d0d1e +09e89152240064dad6ba178fe22c18baece9eda4f0f7c0fd7801f730cc0f6cf1 +d067f152b483b5d6c2b60c91773056972bf7f0266db63c5250aa4067fe1613a5 +56a25e924f344b39928b1fb9b4a7fc5256b95642f1b1340da991e30fddee7fd7 +6e3d8fe82cb3b4e3b69d4c0d878a701a7f23142e08b61a94df0f21fa169bd2bd +0a9b6a992fa9061148087f9c91073112f1c681b57d14cb5bdaa4124416ef0ac4 +bef0252f89224044b5347d144e8d924dd2f599713c5537fcdd88882dcdf1a9cf +4fcb8d9a3bf371e7dcdd95c1789ac3f1b8a226f25050d8df0c9dfd0076808443 +acf10389782a58238b509940cb654daad68982a4d25aa797994ac42af5c9765a +d222e21f7373bbb1d05f2040f1a77f73748ef9e46da432a2ce3f0256c84451f6 +1997b23d3dc6f79773812d8c50bf07a620d063e0ca1a08b48a0a53ea3c0ec9fd +34e954b80b5a7c8653252c7e77754d19d2c0cdf32b960566fb595552977f211b +2dc10fe3375ac5793f9f58c2890599a3c27127b6401750897b03e91d0b04c9a6 +3d6aab101d9690d32d8b1042de5ee99e69c7ca9f576d68a9156e6eccda400cbc +26fb3b01762042ff40a96d9f9bf52d21799aea86f9c7247778b83d4d738f6138 +e406c62e32f37a817155e3ace4f3a2642cb77ee694c486d4e80b65440b3b37d6 +d6a734b010f6f8a4cc82800f19571a26da335e77963cdfc1e7b1dd3c1044a34e +643e607412343a39a6fc4949ac1b597c3a80a7f656d133de58d591cc9c24140b +9a46619e0cac5ce913c0186c9785b1cba6ed80ef6302e40ad6907ac8d732d55a +53f9dc88efa74c3a6a92e673e6887eb366b73ef9794062201b01f008f6044569 +89a6588dace1cb18b2010fc177e60cfee7e5cf59018f186507190273b6105afd +3911f11eb379ef9c2488499b8326856bdd3c2f8ee6cb858100c6b41ed90879ee +5a1a325b55602d3440cdfa73c1c522986b9d6cfc6f6a469ba7a302fe2e0df7a8 +b4f2033a85b65fd47cce795bd8228ef848148b5f41c46ac6e3d48d81d631625f +4278869fe9a1417ab05ce085b18de912094dc081442b2266dbb78981a234ebab +f7a7baa47e269e5b00b155f1494b23e9e820c676ad5972ebb505866bcb6ddc5c +ac9e234280b100a81112a226f1928a2f34fc6a3a39324bc14c95c485615b3df9 +17ca4ee59c1f2c888cf9762c7b4e285744986cc89cdc4597aadc90dcfb67f1b6 +6a48df5cc2e1a89b2e48ebd6b7d0bc51a2d9ca3df7f7c2a9a5ab9ab0e129afbf +d148900e639870165870e96923c8a991815b6bf2e32e043fa4c587eb1098294c +95b27305be8e9b047edae73e5fffbe2a6fa534cfcc5519006c81f92e26e96b3f +42a40d3dfb0d9d78517a359d7cfe8a9991174692b552efd6e8ef95a52ced2a78 +25066b6b049ca73dc412b94105aa1820db84f05f806b8f5982cd038380cbe1c6 +1ae97d67897c64376e820f0b8b478d2749cbfb475d0d107f79861c6e8d63442b +dbf0a30fb4df6b4003e637b76367a8d52a7543a84dbbc24abccdb2f4fac49d84 +b88218f6d757e9d7a7967daf5cf2b60dcf62b326e7f088affbb473e6ad3820cd +5937fb915f2626e7214dfd20995c8f1a7f45b56b8bc306f6dbf1928ee8a8e695 +7c9043c0706187b616c4f31a5bd9eddf59319269d09ed913db43b62e2ee1b57e +ad0a0ff826060036329d2845cc0f62a4dc224d329f462ca4c89f9f981bfa7b36 +092ea608623e7679ec9c1940b0b2a212592308842740f59872a2858c71d266d4 +eec61949552f526f07a107e8a9c7988ee6c88d3821334f7e2bd8ca78b52d93e5 +20f1d21067af0b495b877db5ec049853e42c676aecc267c1f61c6ba835d3787f +275100575780ba98f3b19308c7344ecb3149aba1c93faa61ae4996b3ae4462fb +4547c3bacca23ae20c8cb226f1bc76482ded1588909cb001b1593457dc1d7fa4 +8797f1584ccf0f75e8935fd09d1310397ec1184d119707492e3d5d8e8cdcdb0c +7a632bf87ee042f4bc783feec07cd78599af42c157883fd48634d41fb98117d5 +8f5686a343a72141ea551b11697e60c98af181a9e50a0ae7df5d7a75730328e1 +bf9c094ff2a774b05c254136acc3e89aa579215581be12622b2e4b6ecbc04c02 +fed6bf2dbc1d4c249f9a4249a484592db6f6637202eccd029386ea87a46d7075 +2eff8df768c7537accf2ad3e189af91cc9f4c317ab714719065d5c173f2d3182 +bf5040689f9700f639c1b9682a2e0fd8a539efbbb85ace6f306a846b52652ade +73f886bbfd3e5b89d0f68b5e56f0d6e4086deaf2fda7e7d3dc802a16cd1a7b2d +2ae19bc756834ee9aadef38298966050f5147a47fde8a91c5b29379d5f73ae1f +f31581b4a5a7f639b94c2365fe43dc58b216a5fd37d20ab9a91b370ba12cb532 +90ab8401f7f225306daff48ebaf2f83dbe2f6599233913e3587e426add255583 +d1f1ee7ad6c8bc4497de94b3d7bc6dcffac86a69a44de75babcfe1410b1328cd +fd49ed3362c706d374d16965e89d0357811cf6614c4ed59343dd86fa8f9c06e7 +61c54d6f734a69ea290e5911c5b7cd535730952ba0bc3438b73a2fadd22b5bb7 +d219086da486c57228ee296ce7d82f06d21da7c4f4511b6dd9bef17f44336ecc +4798a5e11272661f2feeee759355f459ed097b05ec241d49991d2ae7bcadad77 +1697274a557fdd4c850d1eab0295dde5b5a0cca29d27380dc9a1ab898be8d727 +36ff9fa6a4e43ee2a447ea1f2b510b19e9118dadcbb2b0785dec56c065b01924 +4c7ff4b3c2aa7ece36496cf869da1b5e557a214978957340cf92b7dd82c91efc +c0f794b0768c84e3160d12dbf4192590f19306ebd2f8b7dcbb595a4b27a67e6c +5ac22ff10ab919e07d21f49ce4970456ed8017c063a865fc6813a6457f72dbdb +bc7b17654cd10635827659ad014326940404c464473ab46c4275ce7d9d2fa8fe +ae8f83576ec88741f48f6a8466479be400326e4486bbca2d67edd24e68878504 +d62eda8ce02756dbb2eb67230e84cd53ed828f0f44b8f9c111470144e1c7ffd4 +94ef512b6bfd503b20853f5f64cae44f56910625b13ce5504b770b3a2880c407 +72aeb44d3964e341981f20a79c83316befad5d428febf40812c26c77b712ca8a +192c11fdbfa19de5d8c974fc60334b8a5a44371f8abd613533f65e569e7eb692 +185c28916976bb898ebb151c81dec89beb9bdfc827f5f0f81756d87d8b49b5e4 +7b83ec8bef987e513edba548200a5cdfe8496ff2296b15bcfbca92d2dcd574b1 +c3ef5aa82558ea407251f133e750d090c4726da21304c77722444984c8402866 +5a131a15316b549156b7a680bbdae0e9300beba6805bfc34182ea1fdf6dc456b +082bcb0df6eb094d1f290be8b404922f1824f521bc5651b23129c3ea9cd583ba +5961259dd73ab330124a951c287e844518a9e9fcca44238be37e8bc58a198e42 +94858267d4b435c939f7a4e5e3d2c27be9e557fc77448efb56b5202b77266228 +c131d26a096769599abf09309bbcb2bcb275d465e9650519225bca9d0a568021 +4e38e6f28389455c57e813d1500f35c5bfae243d4abb4fe0c3f759f66ec3941a +e620a93230a7eb71f8f65f9da70ac28e6098b6825016221acbecffcbe4745390 +16220349185d3c431e9b5d3f0e36ae4530c00f2c7769fa11da8d41a749b74c49 +23db4b1daba3336674ef0b77fad7e717f9a48fdbadd767413db62f0846e6a1ac +2d7c69e2550d4192f47e652c964550c177b2180d1f94955b97805dcf5138c3f2 +2910b0cac9f9bc122e3d5965f29d3f39c686d47f997dc08bb20f75ba16cfe207 +64ed97cd0ac46d25de3ec67725e3a362677cd0cd7dacb46f5f6351bc5f461334 +a54c9aa270fde84745c0b2089dc7a1a9b98f518dc40fa52eb641166c259dfbe3 +567d08656139eba3d76ca8257b2e717be6d4ac62c6e72b503fc336d59c191106 +783fba56ebac246f7c89cf31c49e3b1adc017e12d0b305d980bdce6cac66c861 +8fb9c4a06baf5f1059ffca385d18160dafcf53267082933fda6a3fecd3a2a1db +368a34b6e2e61d58777ab87479c29b6d3a744d36eaeacb1e80c21c900b9ec508 +d4c0d36322b31b7c9b94324a0d321c3670f935a85e884799bb97411fb534d825 +685721a7a2cb7baf0c164852b581b8f0cf5dca065e11300fdf748ba1b38d369e +79236d32ee2c12820f6307b1b675719f841d05808bb1182fe8ee3f03d00404be +675c2686630d078845ea502a827535509f56f201edfc44c2620630880322b126 +ee0ce080458bfac364ef27774c114de08c49586fe2f7a5651909a2782dde6cc6 +20de9f7de4f7d9d534687dba12a32ac6bbc7786cc8bec47feb306aa2e82d512e +13861cfc428ca7330d28ab9cacd08eb701a010c70caa95050d34f1777d08769a +2402a4cb15e057e4265b079a015aec062d70a5fb4f4e2a7410db2019acae9f48 +820a4bf2a05b24ff1482a53a5ccbc784e9960015deb7c8081566995be23e53ef +ca2885be6d6a8b2946ca69c9387265cfadb7b589a7e5ec6fb4626472ef92b18d +b990dabbb5cccc52c39fe329ed93d3a5d23fac802513a05950e42cc9f7d6793b +32d31f56bdcd1ccc615a0c68fc9ba7a28007283d1f11f4655c59907bb7d6b582 +a3934c78586420880e70eee2ac0589180490cbeeb168b351d691939a97589d3e +ee16e7be9547d888674753eba617b8ec58e9a047cfe7f384fb633d669619b8f6 +303847e278ba1d4338c60431e0c924d77a51606bc0d979207958b3929486f343 +739461b64fff745d5944eba8c8df58d3c738a87bac6a7ecd7132e2dc9434d7e8 +8f831da242981a63adb3e5e77bdd3596b8046d2868e4b74935708b4818f0c160 +1cf2479fa77e700bf116e262d7a5116db769afbea1b488b459e8950d3ab7d423 +e705e45b4eb35efcf832bc4c45c2b17bcd3b081fc00c979fb3ae014bf6815d01 +1d444aa60479beb401b3fa62f5d48e9b2d694de956192ba7977a99f01ee80176 +0bdf23e8300f0b833dc3ce051e2464673e851da92974fca322572b30af6b2423 +4d9229a964f9a26b9b63312793fcbbb38bcdfa3e2e881f9b5f3891ad3df1b8f0 +d6ab5d8b52183c9ac3e652be1b0c0ea778f784d32889e5a2d0a84e30cd782461 +e666f8ab42030d678dc0afd9ee9bb38a14a93321f5fdbfbbe00e3e6f0024e880 +bf43e86d19167d51a20499d1e77320c58bdcdf604dbfe51d8dc47fb790fcf236 +67f8a78c35c7bf5a1ee02355381715b506d75c974a419537f748121d4e5704e9 +0d2e24678b028ea41760aeebb8d0a13b6ed4a1261389fedc5af2bed76da9a351 +bbf7837339219d58729064849fc3421830ae6e9226df0ec3b23cd47642dde117 +d52d46592479f58c7a0bf00e64447a01954bd967b711d3cec51a0ee25ef63156 +09b2d56b4232a1a655d63e20aa9e8980169b425acb20b1f7f5b76888a250b420 +16552ece25c50515c75953ead5ca5c85a137eb130c5a410e74a32c505a9eac98 +86f91bd80bb87832d6c0cf3fea94265aed5fb7a1ba5d0c2bdf38c2a43f75cf73 +0dc61f7e99ff92cb13b03d5a4758a067d5022dd572af332765e648fef922190a +2ede1e733166ca3f0b9982aeb0924efe4e94c27e12cdd2cd79be85718caa3f1e +ebb6863b0210c41359eafa40523b05e002488fe58e1d4202e9756555645a102e +d83c531fc327bb0d4b27ab5bb049dbaf75a230caf2ee4f95a826d7458b45a5fc +53bca1bea348896be4db20fa6d07b288baa36247c54e4641c40486bd5b92a6bf +c3ecc7f3fdd6fba5c4a410cd1a898d98b22dc24bbeb96c877ab9ec4bfe972c14 +223f4ee6c702650b54dd6c6301668f182f2ae0f03499b7b7a579cae77aa9a294 +b824b4f0766d730e4746c82e25299b9c91fe523b0e557d3ac01b4e0b2f1aa3c4 +8494c414e7e60dbb17a4ad8b519248befa7b98db52709fda9008e7d35852026c +65bb3088b4bcc6c0117fb7f263ddfae0882bf179ac79ea290c358c7f17660746 +35b4697324822ecefa27b69ba3c4dd257772229f306378f0cc745a01b2f98f2d +3b07c9be07acd444829290f82f037fa980031240abb616edd881e5f86c2b5d21 +c07a977f819154659468ab38ecb02d643bc7cf4fdcd6403d9d1c0bd99b1959f3 +3a8bba18b5a2da5e198bbb3e3896936f14d4ba26570ac4ff425a6a067294bba4 +61afe05e66e3f41e0ca2a0e24226f8b6ea4be072a1e4d1653e2850b6b606ba06 +e83eb3509c9da916b18827b204cb6f8e396f2dcff53284cdfc7bc585f515280d +f31c0a3b72787a78b30b082c38357ebb922edfa8207d069b7632a5da53536c3d +537dbddb409cf872a29e65c9883bade6c96f2680d41da15532023444668ad62e +e32bba0e3404e63a04ec28c22d63cf2eaff49edcf49c71b62f694aa843031833 +60401c3631321da8000527d51c7580b83f414ba7400c093c0a99d9fd32a8156d +b0856ca08556541ff28b5c4b723ff7d5a02cf642b608d39bc2733ae685a932de +f5cdfc3bc17669035eff7dc0b2de8b08eeb0af2c4fe233c142755e76a20a9018 +e6a40d169d340abacd727b75e61ec30f7f0356e00963913aaae0e456bf9b6a4c +9276699b085f1bcc1724f75a4b16c4a87b9c7cce93336d8b24fbb02c65cc60e7 +e49c7a15247afb770aad747ce481155201ec21486b9649ff47a0e593b253721e +86984dafe527c458756cebc671e071d2311a5a3bdbfae1de2d0d7bc317934180 +a8d4cdcac18d365e82c51c442b6c3fb4d4da4cf45b58d630038a0895b91b75b2 +b15e97db4363d860ffcd953f7b7959e51ea43b19e550154b7e9a4fb6f951f847 +67ff4578f698448395399aa54714825b6ec0a5c5204652fdcc2bc5d1809c52d5 +a1ed0615c2521398138bfe69fdc897c150219b437ab01dd93aa1f3b1537f35a8 +7a72598875df9b1af85e6c19fdd8c9f7159708ed8292ddc55a7bbbb015791ac3 +8639ff6f7abcbb21f3d2605ce696b952c9be9c01fbbaa4ea0a12ea6dbe380888 +a4f1013a14eb693bde7f4266e059837d92585f4a062de2a2e9aa0c668141a3b3 +b2a6b9775168971409a17063b57cb786a2acf46cba6bb385773462c2129d9e38 +5fb97f0083f6673a5bfe1c48993a352648d38601346a6ea8ddfd05f9327d460c +01386c3df63cbc29f72c9e63cfb51681a61a09ff2cc5b7eafcedbfc3cbaa44ec +e184c6b29113be2526ab744f82230b47e46671ebe87eee5bd13d770b8fe3d13a +6c349cbe11a744efe795ac9f7f13b5f6537aa15b22aa547ba82bbea2b0a96ee0 +b706d51b84b1ec15949b77c6575ce6b469c115850e237c39bccce257878c7fbe +4ef41574a6d083e3a59d8ada4fa51436bbea6afd8bc58aea9a837fa16a4347b0 +b12c56782639f587791d9f6d0898decd06b5d430d6651a44c7c5f80886377bc9 +4126cae9b591441bb9b85ed26d2fa41275539e3be279c669104ec381678b74d9 +ba7f0b7bcd002fc475ef593b4981428ca44c719e559ff8251daeb9b26447717f +92ab3f08374433c361708a0ec849a1326eb0005083bc51c2cb5ce180ef76b870 +b994588ce0cee5ff29e23e76b04a1057c56df4594a5a9ca8d10fad13bc4ea12a +5ade07f541aaaf6486c6d86ab7cc684bb7ae76d45941c1421d75b0cfa270f5f8 +ec8819612bdb0c2dc8ee8ca62e01478b974be07b202fc6233483adfd120b2622 +2589ce7e8a42750b4a244cb7975dca0b4408134309f294401aa347369cfcbf12 +d91c7e1201a2f69b0e54f33df8a12c55b7af30ed64f44cac4afc163885ad2d67 +6c14b392a6f55ffb9dc13b575e6123aea594d85e81896f616da025e53ebf75ca +354fd67c6ca9b7b0dadb05d897aa8221a3d3a8e31b5984e51e1d320b46b9f913 +55700541701d1d26ce6d847ed39219621fd4dcd2b26f1e52c3bc85e8a7d67684 +f953fda2d5eaf01f5290eb35b2eff44d27c04709a4694c66d589e2f038104e40 +8d81fa08f8677901d80378f2d36127abf1fc04f41b3f7eda993b432b34678fa0 +5c3deb83d8cfeb0a88815eb023e580a742267c3ad4497d4ddcd4b5e4995d5c04 +e60a38515ca36256251e89ef9fef33ba9d6936154586b2c31a88e8e425c7cb86 +61a68c32c1e3bc07d56b11fd192856e13a4a3f2dc811a1b8dcc55fd7c9685bc2 +544f3398b1d1e8c9034ae96282bdeb2b805746325416d699df8807ee89e73965 +ef0c58dca75f8283501251fbd57ddc38c14a0a9557be68117970ecdc70168401 +320cdca9ddae92db31d5dc80cf63c90becb813d511ee40aa9918804ec56fd283 +f7ddda9409dbf8e34f26d851183b35958b3563f02a63af518f32ef8c872fcfb3 +4080800e5733b82a2c982ccb22bab5b0f9d67e633b7505be4157d688b244280d +98f627a91411870ab6d84e50a08c739feca7e003ea00047feae3125853baedda +d6924defce967ff77b40b2a0b1af322e0d6db27affb9228b17cc9a5fb8fe20e1 +13ff252646848f5cfb825ea009cf78bf36095ef961e1e5280bd06f7849ac8892 +7bc2abe5566d6c5193cf203ea9a475ed5b0d0225554c9c170a4a20a1fbf67bc6 +bda3e0629c85e9ec671e21b444a098527837f9b57099309ae9a9559b662d9c46 +74043ecc24037ab6ace80ffe92e07de266a26af87520a7349bb726944076e0a0 +71be2b29bcb9cbe33e602674d310269e842cd78e2981ffe20a873751f98eaf21 +66a5a9db7a9b7369d01ec6908fcbedfec09007b06c1f457add7424f8e0cbf77f +86e1da1224bdbe35c9315097b3af305f2128a652dfa6e4c38571716ae231a47a +c1e353d966f32b516041988bcb6ed1fbf6465a125411faaca2ff572f8d80cff9 +2d0394765194fc17a78abe7bf91192c73dd1cade297aa05666285ae7dac5cceb +efce0cf4ead36f9ffdd325327dcb9ff940a8bc85e9e32b53a7dbf92d2f995aee +69b3a94a32a7a40945d67be26f7193f3014bb6b02bc587501c2c65db9c4d1a8a +90c711eb14a4bb16d2db8250e2b58e8ae887ad08b6130d79ff76ff647cc7b91c +11abeadb9960df641243bed0770e1931dae588963cef78e3abde1fb3863a71dc +e4b400450c9927369f7e1e807b136908c3883d15e83b1f8fd378f420181e74a7 +b47376a5bb647c3e6f10aaa6a88de27163188b1b0db48e24eaf7042d61f5dfc3 +6646c7945df1290c7af8b9e9971a356007fea8b7904d05930888a48a591d22e0 +a1f0d8c7ac0a0505df6ec88d0b81f6a30f1a41390e85a46094b92910446cd60c +9d6624c8a42777b7617e5a5dc69e67e2fdb5d5d5f97322d6efc8a3ebee3aa079 +51045e4af73257ce66d25325b9d0698fbcb43b6fb3a41abfec533a63bf2cceb8 +4dee826cbba098df245a7496063d8ca6fd60adb0c1c082440f87ad344b981387 +c2e62034aae8f7ac11c45885d5e31210f44b1f305f69cb48e620290c5f2562ea +fa1afbb915e06fbcbdb3570b93d22c4eb6ca432170b8aabb624894468fe5d034 +ebf8f166427cabfbfc3710a717b42b402ac1ca78f5e40062cfcfe62d72dfa6d2 +2a2ce066e7c89d325ae0e874e0a80032a1adf568a44bd47ad9c7b94c786fa18a +5e2c3d7484900076791079e48e28ae7be41faf087fd12b05b54e3c2038a6c150 +3338faff00d4efd7649bc995a2d09109c504e573814e46eef6b5d1f9a70199b7 +2c3d5952ff69e59ff77c068e76e065993586928b1643c43692c760f9bb672f23 +af05d6eaf4e16f05923f3c24a9de3e3341efc4de4a8b3776ab14c759d29a2c6f +79b78e9b8ae36d271100fc8f9ca9f3cf1fdb9a35be6fb39287e94a94d0d1b22f +28edc31a1627bbae247c3ad54dac6e780101e8134ef7fe57b1da287d1827423e +976b0d4b8bc722ad6386af68da5688062c8c07650686cebee24ecbbbfa43eaf2 +fea0f603e8c02588614539ed4d61a8b76afdf87c128c51c8c2b18a974e682272 +cd4bf9bffd083a8a6d4829eb672392bf2e119717762a06f7c350fd050a4d998f +a8653c60b2a9cc3cb3a5370aa8591e115b1efb79843035e20a38cae387354db0 +7011cbfbcaca62482d582b34138f8886926572d6c8910b6036fc92db24bae605 +c883d0f8d90bba79b636271fc1e9f6b1d5947b69a15c32db5cb9d0e2e160fdf1 +434a925f135cd14968a579c59d6752ec5e48da86c1e51b4c35113962a609f1aa +8bf29771737fb77784ff9e0959fe72aa8b65492a30845ffd3c897aa7c70e2384 +dd4a32c05e87adfed587722e2824b7553566a0cd1a39d6ebda2b8b0841b7ef0b +63782edca7dc63902cd8b4b69a9fae414e5bc7f30322e58eab26c36403955228 +6bfce84cbcc49456842fb71c162da475ee0a232b13228508d7c3018073a764be +db64729d14b62375ef30634600785fba1ebe2efdd4224b29313d5aa3face6ba3 +b7af948f1111b3a1b068659e3044dc007276826d33814c6014ff9f3f5912e2ec +69bc0300097099bcc958eafe2cfc34b85e870f4e8ce6a9baa87dc9958d468e2f +6fc1a2b9ab992ca3f96fb839da2f8d72cb81154b2e06b5f2224449f9fb90475e +8a4a327da0f25cd60e288b5f2ab8d98c61c7cac9c63584c130018dd93e9bb102 +1241fc991cfcbd7c97f2d1ad8bfe4f9adb5b3e64f041b4b5f04f8d3095053502 +3a1cdb809343195799d02c4cca185d5a9d86ebb8124a028422732b7d3f630f89 +2b457f4782a64c5f4ffc419f2659f186162155dbcf61e995c8d7c13ba5577d45 +a8d9354043733cbbdab4add27cbf7b29d94f4d5f733d3a8bc3957255c25e9efe +2f5c8f0cf8342f36c3c24bdf383b3a02aa4de4a1691b183cbabfe7ca2391f6cc +185d3d1b3a01f74a7b0316b8b03474f7cb3acd6618962d0e0cfd0272c7f53e1b +ce211848dce537485324fa99ef572ac2a21f4dd4b089e0355e5d28afd89c10fe +21752fb8cac5255d0cbc08d066f60906552400fc7d38393721285b1bc26b0a8d +be28e239b75f5595a64faa6f8e3fe191f5eb07f1076589d4c62caa5eeff313e8 +45cb6ae316fe0047ac597aa6f10804c75411dfa2db3d9c9ab8b89633fbcb0f2f +b8d184680ea31a8a979406f8ed95a23474beb6da0780e776b654d59a4e22b7a7 +8050eb711a78c1aa62b97eaadefa9be820c86ce04bfc82d336f8d6e7a482fab9 +654d4fbefc34cbe092c9d55fd3add4efe87c67f767514bc01f756563408d2444 +1fec3a5e53bf4fe5f7cb7112aabb0c986ac8a63c61e52a6384be22dad2a0c59b +fa2afdffa18d5f5da075ecada29a91a2edc28dfa25b026cd36fe6c00ab39f9b8 +2aa0b8b192eb84de1d4544418c6a7045b3cc44af1bbd1af5d6d5c0b834343003 +a78f876f64aa3cff80df51278a57f204c7de40cc1efa3d80f6fee3d318f8b000 +c2db2c930c2451a65063b97dc99f9de04b2e01c2da4881b82faf474afff8a5dd +f9db24c9492c0d34e8149da91a15a5715f3c38d3a2276316dc7c376fcf602cee +01d14b5903365bb97aa93467c612ed5441a2bb5ab03c9a3ca4224d5ccddfbc07 +f9703c872f0193460dd6cb5c79ede66ef86750004b04f0d1e4d3fe8c3a92e9ac +629f11725469b38e87754b85366ca694a2c8029d977b1f6c99eb58d021295dd9 +ebb649faf89fcf0f035a5162628d77bbbf2552c26d076684cf068d3239ef7d69 +646cf0320f3f260902d4b11e8477219263ae556d150aaa3b3566d7e27fa5c40c +0c6893b3368e7af9967b06d4698013ebb9d55e3e1b593e7637fcb5b4768b55d9 +9e44b807c5db8edf8da7c795126ce714ceb5f53d25042625ed183542f8f84630 +fc5986ec6c18f36d5faa70b574b86ef634abfafea65e12f1a6936f0d86dcea83 +ac1f87c4ed72db03b5486162572077c3732aed47185ba6ea3dedbe7ae889e5f9 +84ee3204625c5c5a451c415a9401aca754f7bc8008a18511a668e46a68210f2d +ec15872ace763cd900d0d68e3ca2ad8480f2414fef99d23c78e4654b91b215d2 +cfe45d7327e700401fb4876b667e8878b403f0d6d7fcc16c2ec9081b09d856a9 +ea679e60a42506104b2cc381ac60451197682532224d1c3cfb0a20f6dfdfd0ab +4ebfee1e0413a1f8649dececd5a95757612603bdddb43dc58158fbd899239eb8 +04dc2aa7d4784d33a58e87f46e9400e9f6c688b3d626673a8966da71f07f8cb7 +12c0b18840a79bb59c705447a3a24dbce7cfd23d055a95fda0205e918b737f87 +45b77f69e3a6ae7dee545ea2e9953f2271ff331a25f278f7818b1f7343280ab8 +77817c241e8d3b5366eeb0f3e0d46024849a13fccab4d8a1d825ad7180f8ec6a +a451c2f6960907e51df46d58e0e49fe40d95b81df688030762f7874e2585bf40 +16cf24837425816345cc142ebe092a8575b38ba7d27c42862e8866dcab0fea39 +69a2901b01c95866ed246c01a8ff1ac36f373f066eac9165a02d8f73e99e424f +7b1460d7e7b629d8eb4be52124186841879357556d7be331b4404454328c6b96 +f584e44087f133089176c53831f21a289d0898f9062585c0a0d2cc81f285038c +6e8900a5edf3386f6a39e7da1962f4092baa9a82b09e6d5fb8ff6c718b5f7695 +3f72eafa146b90b89f0ca8923d4b8e435465d503265dd85accdb80b9104f72a4 +a1d30eec91f6f700b5314bd1515e41eafd286714626ea9b71b64d0a3b6f03961 +64e84fbc66b101425af92f78db052d1423efc219452e47a6f59d0c2e01d66f65 +c12838ca77a1da49234f8241229d41408f4a059f8a96e7e01305423c7876e8b9 +c30dd782de97d9788ec6ae5b8f281999b0f284af2c4e913d752f0453d08fa311 +56978f3a7a8fc1c9bb5bde0b223b9a0b34e4441315632305e99435e11c8ca565 +7822f375f06c628bd08434a97d61a25cb0cf9cdadf05604116a93a1a20aab6ce +61644aa40188b1c71a18535dfc23a60d47d5f13e83ead258e0cc76bf6a6c2a9e +d507c1968a9d32f72cf1b05d07f14decd8bf7719c1e8203aae3cac86ac5680da +56be79b65125b4af16cec475c0cb4770f4cdc9ca7743bc4bd1fbf4e6694dc63d +1e25b5a5d054d1d8c68030dbfdca48d5d81d54636514b5cb8e1213fa45104f7f +e7cbd4ed6b6bdf9d86e385f9d9f9fbc309692fc6ce3ecc5d97200581ef49014e +2359ab109f7929892db1a63a9e278d9cae86276ef8a2cdfea4c602b717dc9211 +a285a7ffd844adba5137768e71148e2cbc1b64539341e39517673ef980e66f2e +8dd95750151937ca183194438fc9f65e76355d6546dbec33017462082a6f39f1 +c7c5ae43a2074ae00802b5f50c766beff912d9f3f73d81296aa159cddfcb229c +d3cb3afd6c1cf9d4415087dc2a7749511d8c173f6009685b73859f0acfa42a46 +190431f4e8a52f5d6c1ee031c7835488af8fc5b85cb3b92dad27491e3ade2d4b +3f55b31f8b0a2589283f7369bd9112ec7abb988f7e8db94e5cc1e688a91d740d +aa45c6e1f27feb43875a8dc952472588e2e7f4910239ccda5494a3efb56cbbb3 +7cff3e999061ed6f634af108230cdb28e4671e02349b6d74ee29a5ca57a493dc +b6565a036680d2f6dc2b84683fc3c8a54e591673f6cfbc618b3744ad8b883090 +a35269b33da286c29d926ea214a7d371640deec976a577619220187778d9d32f +201c2df6dea28a9fafdef53e80d942b390fa761ab6c7289d5b5df59afd712a42 +bccd958fb5432ef156ea47e850a2c7ca3d14e0027e0e099aed792d5965878618 +0b0ce8d809d7f38276b16bf668ad0f39032b8a31854f6545b700b0b617d022c1 +b910ff9718b91a49ae19e883ca357a09c0ecc29e9e51171e851d97098fc6b9c1 +4a98f19a4504472e0c748d2817e8813675b9177bb210f5e434dcce3cf6b533c7 +2ad64fceb651c039d449fa00d1a23632789064a511ac137a7409a59bd172ffca +a86b3d5c68f7eb548b35e57db2c79f31b55382ef031d7ebb5737abe94a612ccc +6b5c31a02ca2389686dde57c5a6b58a43cabe2313238944f93fa3d2309cb12c3 +504b2af4411ea00895fa49cc105b248ebb654edc09354dc3ca14a04976bb12ff +7b1aeaf1e08f4609ef3190cbba5f1d9f60552e4ac4e3dc1fc5118f0c0507bf52 +90538dc1e041a63a5609888c10cd7a2b5ad7e3a602b9c3e39e39150802337bed +0bed7d50c84c0caf96de68df4bb101e15001922b31718d42723b4e74a9508f88 +8de666d9bfac09ee52233977a94abcb862391a1d62fcdee602ed89022d618f42 +61fff4e5cf72568a9b59f85b3113ac3147721b677edacc8335e3c79a7e3d4c00 +60c835ddf3a16bb8d6cc5e12b8f5763451ac654d580ba795ba95f9c075318aaa +f9968c4974f7fa080b8a2682c15db72bbf5ca43be8dcc5c7e9ddca9c97e2cb91 +67476e14f58dc8a7c28d4473de5fbb7fce7e5529e3127feab58be1448c77cb44 +138d207ae53172932b1001993d51424cff61f7956e3b7e53ef8c344b414f75bb +eb09f06cba26175ee5127a45d81d4ff207d1c5d3659aa0a2b7daf03e685262d0 +6d2bbef6033f574c0f42a3028ce2251d571b739ed030da4a0cd24d0aa0071a62 +502722c3c27434f1b3cb8b33d51069b03ef86ab7dacccaf1ba01dcefaa8cd290 +70847f79b5c25beece73b0b2276405fef125f245ac2c0ded526bdf176ade097b +e0429604d8c4f78eca62759c30cd4bc7bbb141eccedd4c51e112b599a0baaa8e +61ccd2546e33fb93e6321125b630c1bed40eb5b33dd2f76c0ae2d78e583bb616 +8f547541dd0e7c7aa39e5e65ce29cb57374cba14ff2c19bc377115058b5f3824 +d003ef571254be782d86ff96912924b0e3bce97d075f9a59f2ed8208674a3036 +a9d26914a1890b5fc00a4b8737312f1811f81118478dcba135ca193481e22c4e +9daab61489a5723b5fd81cfbc98e1ab3bdfce4981cca35c41dc85d7dfd6dde48 +04c797bd2b628d6c0a2bd2aea05a64ad1d5f0879fc021c4ca6a88e6cc505539b +923bfea614c1977b8f03b1b40a954bed1127ac3bc976a5cb85359de68ba2ec54 +62a4b73224c530ff4ef62528c5cdd6d90713c54457b93c1d661ec5426127d877 +39fffc8068389bae2fca594a7deb46e9ee3583c417a6c86b9bb4ad125a07a30e +908e8dfdebbe20b045635a804435f4e97d39d5cf0538050ccf2c5c41ac21cc1e +3e6679884301059930ffc95a453d5c775e8658495df5c144ccb6862274fa91a5 +960069bde465e5871b620ee189e3c29bdb003f7dba7fc24d8626229d38ea3c2c +ad6fcbda69d994c1cf619cc6800c010e4ceb251e3a0ef0d539cd81230e00575f +81fa125797523c1e7b7c3dbc8cfaa12068c71685a791a4ffa02dc31cef15d64b +40af80eccd35f497de8b41f6eab0a1ee57bd1da3028c9d7920fffd4e91d0cdad +7255fbd0285deade955b8430cc72a564e3f5b9b919716c2eb67610b5a60d5f3f +0ddf5e07e4a2b11d033a2008046389469f26c10837385270e6f6c3898ef34c03 +258b2431d28d75851b4c4b39134f25579bfb51bdcac4bed96e6965f39b50e598 +879fdf2fb0d071cbf61b0a12971a551febcbc540e4c72847445e278494b2a348 +bc59e610dc16b333eeacbbbebddafa146fe3a4cb3fae15af846ed28ce40730ca +e1887821df1d02cb791d2623dd2762bd9917dbd8e21709d54fbeaed7c7fcca4c +cd072b501753f4f6cf7e17e55aabe45271c734286aef4d0461242167c6ec39b5 +41156a194ecb6473ae1d583aee5f9ade2c7e3a88029ef1934cea0a396df9854f +af924d8f67becfc4b94eedf9234a83b2dc2d74a465537c97d572d8f83f4658b0 +b6e9dd328c66b1ce0835819ebb60590b80c6890fad1c9f752f01d74256026fea +752c27ba91ac116e50c8664acc7e1b05cc6f8f2da835a954fab216c12a14d562 +feda92b7f2aa74a1376d59bca99b0dec1d58352dae026694bd36fb800ba4c243 +3a72fa8af6e6ddf0ad6096f07efd60ade87e765dfea149b605af8cf5f5e7e584 +ff55ecf1bb8dbfaca7b5ea7dc4b763f25b840c94155cb22220e82217a00ce44b +4425929934fc2bd757bd83bad10ff6f035dc73e635963da7a3bb5f12ca4a517c +0e721866d7244a3477085a042f16a356c3c549878880be60f0ad94467bfb01f8 +c9889d73ece5749fd17b41f5dc124a36f37c44abaeffbeeeeec50b84320ffb35 +c2b55f244b9e816da736e5f7bfed32ab039541c2637cdfa01bad58da3ae2b239 +63a3957c1fb595140d473e205812d107ef781ee58b04188d1b47a86bf056b89c +3496c4f3313e9bc79235e108c834b9053d5a3d96f48035195ec2ccb7275540bd +2a1b95a4ef56a97ee0d7637455f185b82bde35d5433974eedb20fb2cfbe9265a +b60c5d0436e6d32e7e6499e81a453992e9c7cab6f9a2893f93a6dd56357e4f2d +3da86f9985d1b70f79a6e6669eaf0813e0539e84b4601a62a4ed8398a9592de7 +057e33d305dab1df6b1aab18583cf9c6687f2019d001e9d8e77f63befe79dcea +9d322c217abf906e6d7ceab21d32f0154fff0ab14fd1930896b994dcf002e99b +719c66c5791703e0cb229c9441197720d1f68cc9237bea74a75affc0b6e28140 +5981c6e7a39012bd338d33a428138448404c0f369bcdc009d99fa838d121c6f6 +a3a588868873992584d92dc5ff05652296c2efc8226547729b7ece0b840d0157 +0560de9b6cbe22a792d2441e1da3f4af72381addfc5d1564e5aa5e985f36ad25 +c6ce3f75d725d4908501c928452aa05c15a3ff1f413ba1e91eacb9f288c4af68 +548327a6496fb4c66d4387c54d5fc069edb28fec3e9e742fd30ebf5e6be10d9f +8ed0b76d0c99b1afcdf0d8db3e73eb049b77e4dbc4c2006d6ab38d4586d126a0 +d5aad88e6f9591a13bed264a8c3500f0968c00de07533a8950db2139b8c5f6bd +84360dff4d3aa76950b9cd7255a9775d2c5fd695b3372385b90c2f9fb00253a7 +37810201266930e1bcda9f4fe3295944644b2e62cd322dc8f7bdfb4db33efcb6 +ef0313934ae1d638007a714d9381f5774f4092b66cd67115564279223ee53a51 +328d2730492af0f7312a471e5117945f7e753afa240757d6acd7ad3f7ff083ce +f5f6762a9748a53003304571ee20043128a824d14a22c4cd742f04c7eeecb354 +ad4ef54c03ee1bc1279821ba12174273514f292317eb097246d4f586edef4a8f +d44676fa28545bbafa63d9ee3aed67647d349583b300153fc438476382f7800a +92d9ca6714423978d61eb3b050dfd63fd6ab6f5b7b626a31b99790d37b22e3b7 +97a4fd5b6303adfb9f3f1d38ef6de6030cf3a62978db1787173498cae7531134 +90f95b777a9789cdac01f00f7df42bcc397e47b468078202d3a283557b385e70 +24d971100fd11a2cc47229a78bfea1348d913635d5e9fd6a18c74d5587de67cc +2bb78e3e1a854e38c573e6cb8e6e03d67fb6a49cc428dc1873676ca48ba11865 +6f998732c5929943d06a877964e3feeb809f7d1be48d663a445af4fef51b8bca +cd338212fcab3d4d50e087981ca12fd82b2eac30e82f346fff02c0b4b8fbe37e +0c56291ca81c4b333b3d3e7b1dfc10455f6670d91c688253729731dd3e7b0916 +ef98ef55f491da6ec7c7584473527125336631cb77db6e28f26b85801f5c2a6b +0e1869a6c1402c7effa7e9d415374021230ceb6d9006d859bfd9ca5ee140f10f +879e6b279ea53434f825f76e6db87aa7f6f8c41e77e531f58994121eb46e9352 +4d332d804aa1c862decdc628770e027d278ff68fcf6670f76129eb9547fe96e4 +a2c8683bcf538331b42f168dc88652f78bbb01c4d0d0c234ccbe2a16d79e41e2 +83da8c7e3637e5c38108496fd450893c715e523ab4f65b863195c27566f3f97f +d14b294ceea7754a54364eb313541ccabcb964f77ed61033b9ec083320433255 +b66b50184b7e5cad0eb03f1d2476ef6032e2851662faaad77a3dd00799f3f167 +2f3c949da72d0c9df2b9385e5529b8140953729d22fc48fa1b8c29dbfe30f036 +891e024d8c4244475a8d4fc33214d9ef1596b22913dc174551b46a0d35320af6 +b30b0e7e183cf826aa7bd984ba50a96a8162add7cf4e28da519e3ad4bd9d22bf +a40ab84162d520a4f375796b638b5bef9519a75448677c54dd39a0c8fbab457b +3d1b22b2b36ffaa796c256bc95752c5e55a52c5d19a5830c5a88e2de864794a3 +cb9f1dd31318213b2c6b2dc2ce6f7bdd1279d667f78e0dd69d8a7412215e996f +61cfea0eb05c53397b758ea31a0ba8397beaea3e637d8e9983435621950b2ac4 +09b1a999140825224f5d36987b832c7dbc9b59b3232a4bd72b5485435aa0d83c +3c1cdaadf81255f4119a1ac08ea59223fa960ccf7447a966484255d821fcd461 +5d237f309c9295f3a81fba2b232a63ba4710d5d3aa18da029befa901fcc58e81 +523cf986edde8a20413ce1bb22a4fd0eceb0a83fee4c59728bc2553a656caf9d +59803ca3f9714874a7e2bb44e11441d3b7e4a5a2507bc86eda8de6256bfdd778 +2ce56851c842641b9581cd2457d68c8f082b85dcc8a045801c7bad48948e41d8 +6750f1cbb1eb9b87cbf10345ee8979d6b019bcfdb5fb48f6ee531a8e14837aec +7360a68b66a740f65100ac06faee9eb164edd99a3625114f8289c1c4b860873a +033fbee2477f6c49db2a3ca9c4844b54ec66ee9321d750eb5873b8263d47323b +327a5750e65b57120bb519c478a042f133c74b6ea3f0cd4bf966233db96478f6 +171cbaf6abce6ef8478d1f4ca7aeffb348f89f6e00f4a65f8f7c6df715d64f2d +00c34f38616341dbf55064595c42acc1d8c7c9c2c5073cababdeb36f73858721 +d3b16ff58694f87fbecc36c37e42769279c525151c3d6d7108caefc9faccef4e +3935c8d5c518658b99568f0929a3abaed820ae42d7bdd8029f1f5c9fe9c11397 +8165723dadb72852d676618f3a627cb2efbdf4d167f7b46836ff95edf621fe92 +e0d23dd1a2b3a4e22fa4844c7aa1d472681fe5f64a1db80a1b096a52d8519478 +5e14ba2e9d456fd54004e5a1178861cb756df45ede5b6b236b3072a943456033 +8de126b4b0313bbe693251604d88a8c8083d3ae7ab30b6c900aa8e1ca5c4d12c +47b9d0041c264ccdb4bdba50728576a176554a4f5f8ae8b65836b414d39b0317 +cde91bf8ac3d6ff01ba6195c83aeddfff2c0df9b6522b0e238a9ac1dd25c6fe2 +017a0b17e9fe50fc826a32524e9c3dace18900ae8dbb6a663300059465776e6a +bde46caee51c0b230948545b8cdd683d7f3f332592a4a3badb8bdf5b144848ce +805fe257c94d06046b3728ac72648cb9da1d7f07092543e354dfd19b1bcc5ce2 +28fb0f7f66a93edc74418602c2f6311ff75a5e64c573148abffa3713ff1b02ed +2c06c787468d58729c07057e0a5c08913aa9ebeab58cc727fb7d8e9d426431f7 +704f513a25bda4008eadf0f00c7963a658b5deb90a622b1bf156b80b9aab8097 +9720d5e261f40f3927e1677dfdca996e736cfca59738ac5e26db44707ed10617 +a9056c71b64a9775ded12a1e76c39bcd4449c274c78abe2b2035bf2af8f30c6f +cc7b4adecff52ea9269b7a2fa044932f492b81ab691a1f11dff2e5f19049aa9e +1af5ab0bf0530aad5e361a9e6e6417d1bc4d420e967fbf9fd8fa268f34fbc58e +1f4d32a16682d678ee2d2cf771f2aa9f716dbc29257af4d24e9ec12a31a853b4 +765868bb46fb2a7852c2f58fff2f79c70d047e2867d46d84077bf5db970158ed +32ddf849e87a11deb8ce5e4aa8230cc6220f6842ded20aee746f6a0f94909df0 +5ca9b4e9ae6a20b457111845c0f1cf4f4388f121b7f4468e4ee5f8aa89aabc55 +95a868b6869310f312304cc00ed79f092faefa26185ebe6ef1866f28c1e114d9 +8c8f9533816184f9242719f3313f000517c418c4745b678c4ea96ca3e1b4eaa3 +e25d0644c767f25db90116c2acf5ab6703d9e7bb63d6877405982b6bdcef12f5 +3fc75507bc69cfa936cee5629aa841f80ba467253711285ad95c165afdc8edba +a66385a0441a0a20027a751698a62b2cfdaa01f65c64dfb3fed654373f793c78 +538efbe4fd81ab9577e40cc6c01f045f1797d94f4e15edf2badc77ceafd3ec4a +7356a7a18b66488694f4a51e0d3a70a62e0b2b02d0e49d0cb7fb68010c3ac999 +ff9bca672e4692f3b7a3853d02fb6af00a31c0bb15f39171bde3b526811404c1 +f052977c802573588a7c06002c6eb6571abf3ddaca9a8f6571a6d3367e0ef503 +bb1185324ebd8aced067f8d1b8e07a6929f2d1ad0a9ea949d74ef5fdcb0811fb +522303b91da3819d5ab83dfdcacf86deb353334a323ee42127977ebe0d97609d +99d1777cc36bf57f7f4172111651e47c05a8f621622b9a73cbab65b9bcc01246 +328368e58ef4355d4b7b0aec304418f1625d462f3b32f5221286f8e854446c60 +41f22dca2ddcef4c88797e14d722eb7d41d55c185c146e86f2368899f97be599 +78f29ba2ed4cd6e93c45e1878894541734f143c119cfc5cf5b9cfffe2c5b751e +426aa6cf9077a1ea54fed4f425e21bb7aefc7b97d45950ce410f31ab75565f1d +87af42b8dd67fe2981807bd295b0959b181ffb0e0068d6ddfaefd0e81ba716f7 +6c85c4922805ea04a4b66db39ca7edf603f0065a2be2ebb7a24d5ab034752d2c +f28d86dee4133f580b57e5dc087c9fb3f2bc015d1a1af1786559fa53c02df068 +8601cd10ecf4a9c5a9230d0f078643fa057e68789f5a2759d9166c7c68b77a0f +6432e4402d7ba6bcb21c14b7617f340015687b0e5657ca9a580f25034a824ca3 +f77d6138966e39355a3e8efd5ba16b7c3be4d2d6fbfc2435cdf488192e007e50 +d8ab05443f0a8bff8dc4ee78562fab2b3f620c2370b93f4e21286f83e5322785 +5c106aa071c3f9878ad32196685d3a6db8f8b89bf3968451d6f325dda71ac647 +52fdb1cc7578180271649ba7acac6096ae37e79138bd3e88d3b263afef853931 +cb9bcdbefe805d4001422a34cea029673f3e7970345aee221e2e4ddcfeef9f59 +27e67847b49ec6243a35fa9fc7d62e1c91362fae2f9c03ac7979766fcb1a9019 +a26f6ac795919af11acb338160d15433adcf97f69d8f08ba801a06b8bff4c270 +3936560ebce72669a89b3bc986bc2a25bd74bb5101063a8fb3662741f17b5da0 +0d63ea48ecf66659e94e46d9ec76c75981a8ed890a2c9a1ab46d10338bd3e088 +07f0305a3b2f51f22c32955255d5076f20d9e114a7d7c0b74444b2408c06ae1f +b7b77895536fe052c2cd278fe3c235ee39fc09c21d35944a91e4f8b5a87959cd +f7e9e2f4610f7d69a9e2347ea8719d0fd43bc6883f7df67f0180dbb3c388a204 +2d04aa4cc0e5c82cbb3cf9ffb1d7975dca62a5b6834542c29cb9738941d25c38 +a20b991bde115fc4945a609036dbd320527ed57e2a3ba6d26ec1bb0cbd2aa61f +1b5000116ce4ccf77dfd35c6544c642bbe078b0f0d6ff198cfe5c35714f9da70 +cfe7d945b4547fa367311a07d11842fc807c0a3bcedcb80d071cc2f1f703242b +f571fe56919e6fc0d9fdb95890b0fe4ce3ce04cf778b92f22f526e8321b700c5 +4a0983f150682e6a5340878a4a15a8a7c1fea6dd64365743c0d241d23e2ea640 +745cabb62366fe25e1f47a4b46adffa337a6eb2bd45165c20bf4bfa05572779b +8a32336d2bd1b680abaaf53c138e7fbe01b754ea456ab6c900c5f150985341c0 +aed06c6b34c0b16a61a9218a437d4d4798ab14ac63fac45b7ce7a28b27032aee +de9fabded48939becea6772bb87d21030bd025b73ec68aabcf98f8c8c69e3553 +f59cb41ef23286efc607939b2c5835354c5d24efc301fa0e16fccc696fff9b36 +4c39cba039c01feeebc382beb53dffd57a3cacfde84b7a878c565b5b6ca0396d +d86f936b1d82b35161c614015ef66a9b864e4399c3c73034fde73e72cca2dd45 +293e0383d734213a00ec40f233c44b743e7783a16f7ad8344f4c56ee8750e690 +765394ca6a884d656996bec66dce2262e6ae248efbde23996bb48b0a43731d9f +b4ec6d1bb4b64a712a1ccf155e2a179a76480c04a78aaa179d727f40938f39f5 +9e7500e9830c5a02c18b5c227b16b6379cd6de4af0a3be5849e4cda3529789d4 +08f91235430c6a93a75ac889f3559dbb59bcadb15bfe79925245bed291f85dda +e5b273535d5c535776ccd6a328dbeac7148e9e92d4db7da139c5066c7b6d6fc0 +64a9b3a28f1bc2bd541a20efb336d92ec5b21f10fd0274f3edd2e13c978a57d3 +38095a5d4f1bdf0243710e8ca9e14ddb9633de16eb357ffe9ac468705833c6bf +fcb4411e9307b58150d4324f2eade9123cbeb27c0fa6eb8d56214887d67bb2df +cc39a2d787d8825dcaf9bce947985c9b7aeccc30bf0e8a2dc66dd9d8db714fc0 +17d1d96567c4a2dffa062e5dbeb221ec088a173571a878b64feba76299f400cb +266589acff2080afab3290672fe8538f6c2b4b47a7a9a88b1f6a883a4932a976 +bac540a2ebb5c5cadb4cf884e87be0f7fbc5c7515080825014421240bd4a6065 +06c4d3f0935138a667a824614317246b35803d14347ac6e84b6b909f401b012e +9d1003058d822e48f9e1a4acae63f325ed48d96674ee254fcf80c7f0a77eaf50 +8e85b0b13b44161423228fe68f7ea6284932a4bccf06b2b0357102e2e4f6754a +d4d42f65a32010ec4f55363f42edb82f74050bd4ca8a15134d52764a3ee8700f +aa87e13e08c1124dbbaab1b6c178ff342d07e6fab354caa49b9ca3c85a15092f +ba13b502691daeb8276a69466dd394c5152b206bb7e3eb85e16f14d3ef934747 +741e199ac17db1e4171aea9e2f63a9a119124cdc2c56a9606512ec53d9abc9b2 +101883a4fd28001e74c6ec898f26bf6e1fbf8528e18c5441225ef41ed09b5c23 +9ab9ddd568620d0634afdc00f6a8af5d870cad7d10230759a887cd428e1bb099 +ccffc063a76b6f4f8119e7ba6b60ba098aaaccb35a3a620674f468d09930041b +9feba9d485f1beed1a1050c5bae99df82387afb73407e6e8c7c1ba0b24a327af +c6ed340e2249cf31d1f4b010a1d2b93a8271e1401f779eeede5462e3ba253799 +2c8b59b4d1f6bf57b38c1cfd3bd65a13e0bef1d56bdc9427ad0d42b99c8cd56b +539ff78d3ebf7def0c9b9f3058ec0c282fb3a4b0a52cb9fe525e738f4692fcb1 +ea48aa55da9c7cc0d3e77e04e585124c6e06d404da6a681d64767aea325dbbcb +3457bde1a8b97b0bc3e9ab432105ce099030c165727a8e18e9871dda91bcda08 +3684e085db0b0d442587775d590a17a103c8992a40f6cf0141cfb6814075becd +a22a60918dee16e11856f733116db3405b55b30fd5e4a9c2ebae43d7adb76d4a +1e094a7df115be9145821083edc8161698a676872d876334db2c1dd472eb5cbb +e48350470b043e46550e0eecc7b82c06d165315a5c719f3a7198d8988d89308d +5dfe03305de90668e10bf64bf852377e9459c6a2a2f5bc155a8e9bcf2f083f00 +f196c84078841653c6c4af3a43f707a0c0051c2fdb09f414a395f954dae1e008 +dc27b785746c292b0cb656d830fcd16bfe7b25d1bb70e52ee940be7c71eb0dec +7ad812b9242cc5b0ad0a1a0acf53e74ca423a0bc104aaba2aff9373284d674a1 +0c8f7b3f1b46ebd3a3554c40e74df8b92acddcf5c15508042231660c9e76671e +70ecd6c7bcc7d3771a34f7275b9bfcb24c5ae4eaa3e2fda5c25c40dfdcbceb1a +bcb0c5205689e6c1b829b46dac8b2b9dcda2097d8941f3fd0edeb32ea865593e +f77a3897e2a8a491ca64f1dfe32c898096c76dc554bc0457a442fd010136cc28 +2af61d255d02cca4684f54bd28d14e445efd82b13d4952c9991ebf50b1fc474c +c366ea6bae2367f58995b7ef0c3520dbe31b670a4c6f27c3e6f8d0e57b6e44bd +fb51be1c318bd91a215720c6bea4b9a4569ab0243d73cd23000ccac1e327164b +29adc24d434ed5d9751e82aded26e9aa330fba9107b88c83b1a31870c7c81080 +1e385d381e576bf32cf5cf7eadbefd2d88ed3a1be074261f42cbae614357a505 +2af5ba5e1b9bde2b8dd5ae0884b018c8d155b849d1405899f0ca55fc669b4008 +73bbb10dcbde6613541498021bc1e6cab8a879c8e4fa8cd2d96b7b016a137b6c +866b7401df82197c93c58f75cf4d5310dd9eeb8555ea786363eb30835c59ede4 +92d944b60ba852b312b13d1c5990c5704e2de6d9b5555593f5163967c7e6d9bb +71d9c916ca0df401fc7964a3d9bccf88443a4cdf527e6d3537e8011b55b07cf8 +3e24ca49592f96527ab710e26cee8d68b3082854c1d1f4b4258c38ef41bcba5e +297d249c9368e83443bb80fdc5f49929e1e551c70e97c9039d8cccba67bfd179 +46967b766e09360dc7de606c0a7a77dc31e93c7232acf4279103edb5f0550bec +755f4f6d1f2fdeb845ff0d6bde0e92938f6a2ad320c5dc2422309aa7cabec63d +ced0436a7538c6e8183288103086cb9942f644c702c1070c94a17aa27cd0597c +da2f46924f4f6849e930105849323dfa88681a91c020da42f537517b29583430 +f03b7a2926c826b0330b07a801fea2777717533ca7f43252674210e99adf1c49 +303cee75cb63593345c6ef8126bccba0949eea85ffe129fb5d310c2e072cec0f +d0ebc635b145fcf905fdf0c63de1bb1e6f1880960dbc85ce8d58c48dabaf6f2a +66eab31f2ce7069d6ba08cf4b7b74c20255c2063ac883da8b171c60d53232a26 +f1a420f067c98af4b5102a96522ef80aed22cc87687fffc37f53305e96cc4b05 +fca10959c44227bef6c8468702e487def7d85c4552b35acea119df23601b4986 +6702e1b4adc5f22141c0633eb0c764941c300b171acc02e34cb8791b1f5e6511 +596913aaa882335dd1db0095f9a9493ba5703f12a920940d6e2748f0691d51db +1dbb4abf11ce39183188252bc0f0eb404b5ac2c1056e8c179190448993f7fa72 +6a3d7633be4d126502d32c1a2cfbd9f1655987d72a5e76d0f49c670d84c6db16 +6e8e188242004e08af649c34cb760fa83398e67a044a71bacc3fe2790618f620 +5f8daf472260728d07641ef0a29e43f3e00388baa1c290e647cdb51ca07c8a3b +a024121fc48d7b8151f3c15605ec24c14780d7b058fd4ff7760ddae14d8b1f5e +9be7fe28e7effa72d2ac2bd317cd4d560bcec44fb285f85d2949350bd4d58285 +7ae01dfef4f36a08b75bfe94d228db7bfc368acadc58843e7d6f68bb88dc74ec +6b04fb85c93eb919bcb093f5e654eac021bf0d335d0bb982d606370a823251ce +47bad54f5cde731c6cbdd9faf240c5a6f51f5d440a6cdecb06446a462083e550 +40865560638ba77735b26f9732baf07fc4cdd6939d46f215442689bd555fb98f +ed72e4a98547786edf9cf72915288aa0732be6f644f34bb8e7525470aa616723 +9bf10b11e1fad30c0a6868fd247ed36604c81bfdf60ee395e95bec175718cd94 +4c814fbb19cf9a2fa0e5bb682ecb1bc8d30876ac31e8667d0c4984982065fd7b +a3f46ee6edbf319f79506aad596618e534018788603aa105a439cc4ab6ec5a27 +5c546394ae9e98041a4cab03fbfdda1087727ea620eaeb3b72365adb3859703a +76f243ad1b33492789fa30c0972eb2e44cb1602b686a35106dccf2a65158e453 +c0d2b3ab54786768069b68073ffe1d2e797533ffdd402b594b61b41092995a91 +22df66a6c1f0a312414ec790e097957da5557932f91c23e431cf77387c4e5355 +222d12f6653eac00825536ad0f0d37e96b1a8e6902702495825d5d1dad56b44b +26d19e314cb08ba5687625170f9268a5b989aac65b7b73e547c4316dc3814330 +b7f3c183468a943cd190708fa85756d27579c6ee299db8a78b8409af9a174952 +4d93fbce87916d7d1324121f61a1c78cb9cabc9d63371fd36c137aed854d5089 +b399da52373f40614f4bd8ea9c17754dee448b67cbfdd0e145f41bf0478d1e6a +616935f365aff7523bda1ca61db53cbd2565f6b0a055c1a0d647f2632b515c70 +e63427909ea4cf1019a02c9e12adee8641a38a1baa39096388c083ab2862c79f +09e1875a189dfbf9aa5a0fbf1aa093a3736a265b77bb8b9037876be3ea594f09 +cfb2e1ffb80d9efb431fc1d7089063e7f434a7bf423af81869afa3d9d5510b3a +51c859c9a01ecf2679967b4f2ff4f2165b519769a4d9ea3d1a22d3ccdf3c4d52 +66463561a0a21a1b879969cf27ff28e3273311a7afcf0dde8a97d1b327deadb8 +2d28277e56232d4a8f747b4b264ac8feda5ff20d497e6c18f1cf1a9f211ab19e +470b76de4c809f0a300a21950ec5b5ee75a1122af7f18dee3dbfad8f85a44284 +0d20aec8f29fa6820a5190869293709d38d4511aa89598e70361ca39f3d7dc43 +f7f0340d2032cc6cb0cdeb9f5099a783608ce0aca9bd074f15d4df03dd298dc8 +e3aa3b1c16323ea925e5024247a41a7837dfea1223929dc269e9b71ee7939f71 +8e431502e8780c6088fc4125e1c7ed7139bd30e4b54064571080cd1fdd684111 +77f32ce1a09c867184154fa1ef1582d94b5ff54aa65e2001e6072806deed2127 +8cbac40f8ce886ce4f29b7198204dfb4d6abf931ef25ac83ec3af033a3fac282 +1c74d0b8e3a79cb2dfb976a64565b2052ec691897f99616ea480383436fcf329 +80dc56f9bfdebe5eb838f2f2dc2b3e0345ed15de2723f0a92bf7e8e96cdedce1 +fc3c39dfa662519e11c00ffda4df0c3605081d5a42e885f668fa484e5b8a024f +98500f84323122401fa31982ada9177422ceea8e10c1dd37dbaec89c2a03aed6 +64f4ba7a3baf51d2a150951659198c5f3b0226108f575c8eb8cd39f3a117a943 +26b86a62c011a4311fea1dbfffe47ddde489e291c596123400e49380c51c3bb6 +88f2ca725ac98f84ec38384043aa4f00905d2ca34c02295d4f0109a2f1f38ef1 +2f5a649585411bff96d925adc5e96ed91a5f3167e99b4904896db2a923e62977 +1d4f9424c91dae6c3a50ee68450f9d5953f70e169dac7e412b1a1b7079caf42b +6402ebf3c7b159a429b3d86f49f74495cbb7fdbc7e3046c941a6df14f14014ac +3995bbc9dcbbc79aef16a445a0a706d3c26702814581ea9a6619c0b6faa53032 +ae963f26f959c8c1f124552c343ad68ba2d1bb4df600e822a0142c891241f046 +db5a0f77ea4689ddaa357001d7005d720c6c72ab980b22efd4449ed48d6d17f0 +818551b20ecc95bc46b7e1e5b44f47c9aec1edba140be2447a8fd8a8e9649dcd +caefc584373b780ebc9f0cde0cf0194c61bcff3e1f5175d6cc5240bab13fd3d6 +29942fd198ef2510f3f068a0bb30c5c1e43086127a19f251f25a69bf2665f479 +a8d2a19045f74bd02af5d99724d5bb7c89b6b9a18f7fdc01e7f20d80705391eb +4def06b21d49d28a2099ca7a1c8da414a66eda6aeb38c692fe7d89ad5c838d6b +2ccb01e45ad7f13ee06db6aaa498caa2ed0ddbbb9bbfde1d529ea3eec3c17b84 +43e151309c3db1bea309376baf9a678b7ab53e554a4cdab23f3114f264e47f8c +b1e5e70cc66ae399ca19b5650bb6a66510be7aa39d67fa76f5a456d14bdca1de +ada3cf27d618d1eab87f2e4066f94545316d09cc9c45d5d700cb333108db22ae +a6264aff15c3def98d99081743491e8854fab322658f2f76ed3ba044c6e8649b +3da9a2cbff387e6495823712d367cec74022490ba750be2a3ba2b5c343c25c04 +28bcff431a145edee3b31c9d486590432da6b808b5ac224119bb57511564ca99 +4b3832e63c81c996559567b8c7b1a38d891b3c853a7862ed52ff2e61430b53ce +32e95fab8e5b0cb1854a448e3c205c46fdd30c2ee4556144618324cfc740d624 +e10692673ce3092edc3dd5ca96d4a3dbae427ec7d4391cf152b13d5fde4fdb14 +729cec5beda3b42a1f9ae98bbfe99f04ce114f4ad62d44fcde9edc48cb345041 +53ad128311c277f4f56bee3994d94036068de6dcc6dc1ea8bf876fa2a0d26842 +371e891ea19d6899ef26f3b6c65800ebae6bcd98cb7824ba7e47c8e53e38e5a3 +b8109de9143def1ee22f5bd205f95a7128ebdfd7905b7a36fcee06b8e9fa0a50 +e297a15d53b8e357cd12c469b0d5e453c86b3529890c30658f3d7ee47f7488e0 +27747b0e535a3c41689bc5b5874770141f8adeb76fd11898c4035deaeccf2422 +e16f46ba244044b471c6d6c54c6cf871860914646be86e0622b532fd7ead9cea +b25f2a205f1b4e10ea514f458758cff2de1311766625670c873f5134deade261 +0a6e64443238a829985ab5f5393deb90b95fd8b6fa10f873e26ea88badc80283 +bdedef13363a06f9aadb5ae2469faec8f224a56b0456106892649bf6cfcb5c50 +caf1b76f08dadc7cce533f86bc698d0fc517d96eea51501202dcb8aeaf99a77b +a33e3ade7a0ed182822c0c7981d7f72f366194cb32cf58ffa5f57b211fe40066 +1a21851dd4061376be1aeb986f773698458d75b03998ba97f143e059f8c6e54d +a72cac6847089506ef9841a2bad26ccbb219509f36aa7637e2880a2e2aed1d0f +655d8483e48edcacd6110230d8bfdfa7af2ca22d280395815be401cab0aef078 +f14ff5bb4122671a076a58047c673febdd3208a94321f1662d93e0c117099d73 +f9ca8b49f966f2498c0a9fa7b0ea24bf427191c059556ee66dca8bf630b435e5 +766c7e5fe301028b4dd91f68cfb28a91cc04161dbd635b271ad0499ac82ecb0d +8e1a2d7fe33d80113fab41bb67d196f7f8347452d8655bc8d3fa0ed1d13a0558 +8a7e2a73ab2876177dbccfc60d8dd073385ae435866ea48ab68b1e1c0e1aca4e +7e37eb8bbda29e4f1558e99bc5c7d487a31bfe2fca9a555c98df2b75dedba969 +7b866a3ae1dc8fd64659a030b676eaa97516445004de32a38e2325e7958067b0 +f97fbf7e40a37ffc31ac3fa85eddab4423b69f6ee6a7b6201c0580d72d989d2f +216e659c8cf322b0abcd7594f0028a3f284d5759e222750cdc049e956ace3465 +6b2ebff515c01596d7db3c60aa71880b48e8d1bef40f9c58e6d0451d9323b5b8 +23f6d4652f142890ede74bb19614c3b24cf7f139d475ddccb322e368b5da0652 +1194fcacf7dd526697aaa19a280e924028cc36aaa19209ff6e167accebbbba77 +9b1460fe314a09ec87873d8803d8ef3f05c800fa47154f275b8ba4be6405bc07 +9e2299e57c45d101b64c93491c009c3a1fc9528a9576d1a826de46262b8181c2 +a019d02715fd6117bff5b4dd07dde0c805e67d921096b5a1d84ad8044798df1a +b7727b49a1621f14c3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N174/Arial-ItalicMT 1 TZ +userdict begin +%%BeginResource: font ArialMT +%!PS-AdobeFont-1.0: ArialMT 001.001 +%%CreationDate: Wed Jan 27 13:02:03 1999 +%%VMusage: 29179 36115 +%% (C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. +%% All Rights Reserved. +%% Arial is a trademark of The Monotype Corporation, registered in the US Patent +%% and Trademark Office and elsewhere. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.001) readonly def +/Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation, registered in the US Patent and Trademark Office and elsewhere.) readonly def +/Copyright ((C) Copyright 1991, 1993, 1996, 1997, 1998, 1999 The Monotype Corporation. All Rights Reserved. ) readonly def +/FullName (Arial MT) readonly def +/FamilyName (Arial MT) readonly def +/Weight (Regular) readonly def +/isFixedPitch false def +/ItalicAngle 0 def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /ArialMT def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/UniqueID 44339 def +/FontBBox{-222 -250 1006 922}readonly def +currentdict end +currentfile eexec +76ac4382df5fa30f598262867033f1e140ca4fdf95c2cabfc650ce0c7c4c85e5 +4fc2bd92f4b2caf745a129ad266a29aebacbcd28dbad78271a7d2222231c3571 +fa36c53b990f1b7489f0d254320d1c3bdf23e2c1607cb3c7218a61e692463cd6 +c97902eab1b0ad9978b80d2a2263d834d17ea2f8028d0b90404a665abf09ee12 +d3c3834e47334a47f2c514ba2d7fdec91826385ce2c61d9291bc49d0a6344042 +f5348512d1f65c54b9940151ab0d22422dbaf65cc6255414ff6a185697230a08 +23b2775716184143451194638c15ed5bf9cbc45ee3f2b1a9331f838b75ae7d72 +70bd6d7623358dc127d682401e3052156940186b1c7edd7ccefa7767c0eed29d +f2be4687ff0512106cd2d703a80cf940495eabc7e8fc9ee13bcc0345fb7d90df +559e16f2fa5ea1962d7eea36a485a2ac9801c3e6c91a88d342c7dafc0f65fcbb +454eb47042d73b438545dba65a971ba81e672c807eaa18feb4a8f93c7c884d06 +1f50fc6157ce581f44febf55b8ca883b5217e1e9184433c2f3a1ea430b17d2c1 +0064bb237844a53c4aa0387d166ed241deea2e000cc6ec2bfb33ad85f6871f68 +ead5ca6d7526cc38f7bd3284332ae5b7b4f0190d0603392507fb6cde9dcd4907 +01746b846bb7061d7c1ad5b641dca7828404ad8627a8ba3ae84f9263f89ef32d +35fc96dfd188902b7de82295734ef180c64f8da4b2a1f653fbb4ccbe4c294428 +62f5e2508ac3153d64defa890d67be42a6e835f856234565554f6029f21338c8 +5ac0b17b1689786492bf4e9640106b902693e4a63aff0d50ea83eca6d92ec55a +879af8cc8d6b43174c95afbe1c16ed1f3c12936cba7255f03da34a0d220f1b2f +18f4e87aea7d283b99a70db78b429add489ae89182215350800243a1e0f94d65 +2130d35f747680743a128d315f72703e787a1ecfa0deb20eeceaa0b895cadbb3 +c1e368f76745392fc0a3dd4fb29d4bd55d14306b838c033f1d5807f38594df8d +45f1432b343e3835a0917455599caa5da13d501a6545bca9ab2e43c6189106e2 +b9b1354d07110fcdcc1de75cf8378a851d137f04da33d6b637fb61e4ed40c03c +7514397b0252535140305b5c53d98d051a9cc54b98c5ae256754afa9ebc80ec6 +1dbb6112f1314ce5698d6bc175d37b369645582f4cbe3e267b3992d3c4c37314 +220cffa562a76571c29d5be6d626bf69dbb59413c8ec8c3ea963349d4a01f828 +1d09fb1ea06d72c504fd695b52c65e3ba30334eb0f7fc21368bceb9194869d09 +8eb265a8e3d1aaf54ad21322fa91ed654b776182ecdc5f6a7bffac1b589e1bb3 +ce90419d153b4626c8f45fdb5ae790546da694319189719cb01337a2ba6fdb9b +57a75801ef639ff13db3f3117d84af2c46d03421e929fc4b36f4a79daac0e50c +6d10ec7e0232e8b23479916ed7be07c01ba1fdfc9284291779ae7e8c212d1d40 +a7749e8457b87075be99f21f619f58ac7f2ab0bbb40333aaf81dbcea24ea5cd2 +a4e42e4f0eabc9d0d9257893743396e2b5fc6601a0e1d822802654c6fa00bc26 +17baeaff6abe19a3bbc0741fabf1da240d770f060f4097b2dca1bc67ed697a8c +4821addd0cbad55afa549bee2739cba9cc47212e21c91cf9f9170c45316a3633 +589bdd37006b07eb91ebc7711fd415eebec899456a8fce41a43d93f484aa3483 +30446b9066fb846b733a1d91a600e115e70a7947aa4d2b78bc5d492eaa9db46f +aa80eda23c82dd6aa0bbabe5d97f727bd3c814e1785cd32267747ca2de19858f +295a330248859e126821814fc321d85d24cbd171ad75184b3b1800782668036d +a3de4a6bb6721f613a59a3ee7e319d79210a110ed7d52dd4588a450baa0a0dc7 +1a58fed2a37473db7e5e19af78b16cd1648d0a711d52560276eac2d544710e35 +79b2050c0fa4f9a575d8abd7f78899128a390593d016f19eaffbc7f6763f9003 +064878cd746b91bd08b42e1c8542082e12ee9bdefa55363fecbd90b8365ef29a +38644c2dfd6672ee69fc3de997c1017da8c81d223fb490346a778e02ce285544 +1f8a5dedbfe52b3be746613d9d02d83e17d0fc679137c2d483eb9fd542313905 +7f7cfaec0088115be17055dd2e2ccf64d5a302f2e4f517759b82bf99e11bfc9b +dc3dc45f0881224e184e4148c46f02c3fe90f763ed0fda652d9ac0f16515d57e +544989056660e9cffecb78bcaa430c1cacd44d30facb6c9e29f617bb98ab5287 +6ce8084815f566dd204cdd0efa0ff775af3290473c4d656f6b16dfa504c31ad0 +79fb0e4930600915627edea4f5edfeee468f487a73411efff8f0852e07e4a52b +7558d32cdd4d4e28acf714266f99b19e87aac5c04d7a3c34db9cc84f24fd288b +8ed18f19cba04421d95124ac106b8344f1682938b79e3fdfdc23bdf8eece54f4 +6c8a18935865664516f4495c4d974e2c82a523a0c68f90f3ae3482775940c0c0 +174633d5112352c35ddf2c7a57ef4f7b6731b506f4b5e57fe4bb4f1d33b01107 +0cde4e732a50c96e09302bed5d5bd73b44c69f4f3f0fd9623bb02c378586470d +308f8bb8d8d4acd132c6b2991d852fc134ec6fd7e69c4d4eeea5a4e73ab2a48e +4d119d7a1f64682ec648fa51a21038a95b73f50abf9850ad6b3abe2f9e0cef23 +6f3fc5f9b86273c9a0f9218cf4801e5bf908adb10566acd612a277554559959b +f5e2baa5f2a2af68bbc6972085b01e8a8954526cd78c24f24c6dcf8dd799c37e +b4943a0cda6c6919ff10c293720b14a110349ca192d6d358ac5d3efd8005c5c2 +610cd0f7156859f149713358f45e228f392754b0d06dc536fa12c8489d402a3e +0d0bc0d653d0e77d9071466adf904fb973d4eb2045d068fb53152e0dcac2ea2d +7d59a59a7c4b826aa04d4354e1d423ddb2dcca63e225230377bbc7539d0b249e +9a7d5538ddc534d181459a2519d59b1416888eeb7b19a1fd296c180c59eb771a +75f5a77ecacfcc05566bab9535bceef74699d948cb671bc9b84007258b24eb8f +07ea32edf2503b4d5dbf0f726ac9128ed8590a2c81fd7ee708e728fbdc5fc03d +4eb6c2bf36112db8df3ab2172ef68851b18c520166f7adcaaa8bae3244511da1 +e83fb8f7f2f2c0047602e7d578d08b87d8d06ac0b36c82da2593df2899870368 +d8e75814ccb9477d825804adbf5bfe0cb5e437f21f39bd4729e576e93592d896 +d0e2e2267f546fc91b921fb8bf67d7e1ff41a622dda81b0c9106d7aef8726c1e +2e11692c7b8e2f1a25d33a959681609db5525214416ae0c584faa4ff4b3233d0 +ff8565c6a569e60dc1ddaf35424d9029fbe655342308797793b6814bb9e1aee8 +fbb162bfee3b3e4ac07cee8556dc8b0650448da184fee8cf966e2b8d556ac88b +f96725c2874400530173ea0b96db624d208320ecefa2e2f3c3b81e3fe1c0bbf5 +01e3f5b4555ebd9c9224d840556854c6f8020477d1246894aded689ea474b131 +28535a3ffc6a9c6ca4881ef3502d209ca582cf5677a162bf177179f8b9606b06 +d09a9a4ccea3fb2ef05b34e90552df6ee75e0e0caac0f233cb5dc84affa71351 +f856121ca7e6eebe334622545962ddaea67e8cbb39eb6c73a519cc21cc0275ee +982f6ee9f99866ccbeee85c378819e080937b2f2217fced42e2d522491a9e63b +bcb7513fe18eb87d4dd62e3f265ac62e5002d7cc47961bc42d99e34c644214cb +64c1d537d102ca0cabab78d517591ec99ad1e85f07ebe512a28bf6c6211fb3c8 +7a3200ef0330a2d4b4f744ce6743dbc1f3b3a13622406499e264ec8b8de42242 +b091f76292acfe0b1970132783f4b8cf8f3b552c0aba2bdd69d0ce811770835c +b096f1f7105ccc8cec057c827404d4768f3832deaff0988c645603e2ef3a5096 +844429bd3b5f2577b5b00b89c619a25a3087a66a4bf35f1a2f2f43205d25c54a +336717062078ed4644dfdfd88e6706b5f8b3205663cf5303a43b8c47156d6f75 +468a79a0510be406066f05e9cfe6f597fe68d92ff8107366a6ef60d7ddd5b53c +f569a6040d8a2f0959da594526fba26021b06131a388c12f769781be703518b5 +6c988ae9129dbbb3b0d300274c1fb10c640a23dfa6be42acf12d63a8ec0d0cd6 +dc0dbf16a0d9c9a36db6baedcf6b5f025866720f72259e18d7b966763de87b61 +19cdfe0b208a667ccff3e0a6030b5300998ee8c31b704a50d12d8eced2880154 +be88b63591d8b09ea003cc5f33872418c03d28418684810f1bc58cf16ef7743b +ca3f21d3cf9c2d9660ffd0c08b8c76549478120793cb486724c5ac95216f81c2 +e6daad931b79a0a3acbb0fb087e05644872ce2190e3dd86ab6395aa7afb473a2 +a5977c397010bf244f7f571ea1d80c429ce484de3f00f21f119b0bbdc2ee068f +b4710c6c324f9e531c037f947f9cc09c2351ba7a12d9bafa200d63de0998f76f +f59b90c9dcf1c44e390a1e4d0239a8195abc71f25f0712fe592e94ffab89137c +1aaf8aa341c0d9f4009a3b81600ab819fc248cfa3f59f355d1d92612620e1cde +126f20ac7039ec7f198dfc48995afc73ab55fbdf59b1c31d37139698d08262f2 +91191f7307930d9b0dad0c4181744b96e4d6ac908d355a5b670c17287457ed76 +af1820772bcdc438fd2e5b08ad3bccbecf9614e848ba8cd4875c7d4e67a3aab3 +b90f0a191230ba3ae1061cd0bdb458093aa73406ec5422087fe762d7c30be4b7 +731d7c80118812c9bb0ab2594db97caaf7a6a941382be67d67dfe7117ad3f153 +82db3903cc8eeb238a115c2c4dc673e6566cdf49a17062e44267e94c363113f9 +288d899ba776af872e17c13f9448d07ede0c145caee491130fba1a5c27af299c +a2a49d9abd7bcb459af5db10ceed9910a945a761892e4a88030b07620eddb303 +fc39845e445924f218dd210e3dfacf2d7a0264578a27324a51d9fd47417f4603 +1e9627c6a937fe720d7d8581c2ce062a7248c22a62a1bd3732482d403d2741f9 +8f12241f2afa9e269cb9b03674f440d59a39cc3aef95b71c7cf7cc154385d0a0 +4140b4202af5233027d144a433863dcc314bfb1eccae90895b396c47bed1be1a +b169a312c95c6f207e9b86bb188f2f58ee0b2951c2825d88cc97754c02fb90a8 +dde557072bb673b9d49874e517ca226c593710de95bce0c58b80eb29e0124497 +d299c29b49146fa3715be8ebbbfc63637b82b126c105700e73b7050d0a77c550 +8be01d9ef53d624f81cd1e6cfcee78145aa01e7474ca2a8822f17ee165bf26ea +d772faa83592551275d4978bc0a27d0fdffac77e2af73abb8a6ec420ae5d1c67 +8292fbf63576666158744bc9b4abfebeebfe4903015fc64bd92fb94944bf9f6c +081b65b84e84a9ccd7fe02309910ab350422fac82c3747a5d2686b53575d59e2 +7fe069ca63c167e76dcf7c8f4d389acb966dac17d94230c074fd304c67fe4b53 +1283bfa7e7c163f261e49dcdb80641bf2bee668837213aa27a723ec10c0383c6 +c15bafb44e6f020b681ecda2d3870ec51e4a7fb2723f8ba4d34a1714687b9e35 +16db8ec0eef533a5abbbb1d511d42f65b34b1435576162131a5891a1ea821200 +3b09bb6c6c48f3445f7a6185b38dfeea1d567ff0c90ce46e28484b76aefbbc94 +e8f7309480b2d66a529661b4cfb7c0c43cc37b35fa4f160aa9ac48dcda5b6961 +4ba67ae9b8a5610ee7bb90717b792aae7216e1d9661d6099c514c73252649540 +7b1af622e86dfe84442f1ca89cecdeea9bd50dbfe30a8ec6b0dfff6856e34ed4 +04979a508d7653b6f92095f6577936b10faf06ff03e0ff5a319245f425b1a284 +22b99f54308019cc2c60c5060f4fa2e075b9f654bef8a41c24756a34af39f0b2 +fafb1123de4ee420e438990e66efa4669d78464b9668d1a73846a070dd146ca5 +35d4e04c7904b7c69fb1847fa7b0d8962578954c73c42fb31957dd3093d90b5a +103ac9269d0f2c8c7932a794bc8b59ce03c6324420130306a1d42dfa56fcc967 +68ca34335e54be82596dace11622d5b65dd5a9c50a254c22e83f79871907bda4 +62f26bc7084067d8b5f20588c855d2e59b0b676d43142e60486b3b52221ca7df +12696766f599a70fb8a2138e2db585c2270cdc28c6664b28475e827cb47d259d +c44186fc217dce173b03beeeae3f41b0d8380c686329fa85932746e9af2dfb16 +3addaea7053a5e14c2dbe5e553c4a0642f789f3c6ca9e8e36bdfc21e86833631 +04365eceeae6eabe63cdcfb9e328e672ef98e047d7fbb0a4e859d283503d108c +1edbe6c7f393451b042e1b7d2b746d36e0051099cf58027d834250e2bc151bbc +46f31261252400f85fe00e68c69e6d3cb56ed2861f56546ec3f441997113ff0e +c0c03ece9bca781b98c121bdd4085345f81d2979604965f7e14022f16ae57a54 +19556d0170728931183d4401aa197e216d095258918d227196dfe0170ce204b1 +3ba6a2f90ed6a01b71a190852852de916511e8f93dba157911b80797f50563ac +0a82d60719d9ec4224f95b83fbc0eb1a103c64bd1bbd8a674d4d1a8d8f778fd4 +590313af0f8aa439f193e4f28bc1067bcaa5ea211222d68c87c375113c6af1ca +9b51552d31c7967ac4fa5f1a86dfe5b7e6efda4cceaaab7569a03ff5f44ffe77 +abb1bb65062685421ebf77791ea2be4414a354be99ce0a5e0355aa3179912154 +9c945abff2c85b3d7614f83a0666bc5349f3955e6804f1a008275df1faa16248 +1ca06afc703e36637e0b1b7f718691d11603fc52148b296d39eca26c00c6a491 +a29c9457ae7489beacb2f60ae03c29f9738a9cb0610f5f1bcd42a76d7e572172 +58bae25fc234eef68f5a3d194c19ce178c4bd7a822dc3facecc035ac3361ddae +53afe07092d99a537f5c924423dd7cd7e10c3f5fba9096b2f76f28e1325e8ec1 +89c334c577f7894f7fb0698bf822c98488d890eca8de4cfc28069e06faf6b7f3 +51ec4b30b4fb4f329405e4b59946ad9ffe7f60911ba90efe666b26ba3f63a749 +65d05509efb912c13e072d4a417b3cbe72285bd5a48dec3df6e444d8bb2d8388 +4eaccde239687aed668b406d00559c88e400e64e16649e8100098b432cdd7139 +1d363f816ecf7798f1462455b1781723ed4f33c3c6eaa81e2977977bd09b7765 +41ae2b94c5556f5149b5b4143334e73bd78d9711862451e855c465978aaf5686 +1b046ba4cddea43f89e7f5969a4d29da69c0e22bcf7ccfb16efce0b042c46194 +076353385118b2bab257752b47c4d47fb2d28a670ee246fbf5c9e52169e92e95 +9468e9a6e9116b5414481e276bb43c32359b28940fb5106cf3f3ae19458ccd49 +acf3b8c208253ea800763a2074ddb3d9d6d6a3e7b3fe9bbdc6ed50a2efee514b +22dafeb6dbeb3383f142a72b95c9084a8425fe56025d1ca18f9af41eb782b26f +1a4cbeacd1c43dd2be71fae0e61669476efc46da149bac47cd6e9523855bf596 +41f640e9008b2c25734c3517f7d639f8fd935a6e14e0bb6692496bc0830e7d9c +2203e44021c0374e87019c19613cfee78c509ec4440d89aa1f33c5131afedc61 +02fecae58d22e7a033b012b9186b9b1b4ee69c506cdcf02b3c134afa8d44360c +77a93522b8ab80908253dfc1c9d91c7ec2033067e021c893bb449b1565e1364a +697932c506a622a1c767537cfc710306616d93555a2a63f8e0a047d67d5925d8 +3700e105b04324cce8714449de2ba7ed64b88d3f414dd1a1e63bd717c6a348c6 +edee5c30c029e8d91b2dce9cabb3b13691365f9f5ddefcb7f692779e5bb7af02 +9617d49f54a22f8ae6db50a03b5d6ad11645f625c39c7b37072de8f3473dc618 +03e7e185e863c14643ded7706f17240f85747282757deecd774fbbda0f7bae08 +b08242c5bc26363a42bb1fc879048e72683fbc596c3f1d4fda0443a5976a1573 +04ef66011a9f8f8696a0d3cab4fa556ab109a0b0b5dad11161763dd155d7ba54 +aa28185d92c9efc4cb60b0bcb03c50391a5901a869952c4f65fd917ec08becd0 +944b494f020acb81e231e7b98cbf3db5f1703f040a6145763a6fdb6396aa105e +7f12aad30bc06e6bee45fae986c0faa4ce3952c6f1ec1926012b4c5493c5d0b7 +58d9a4f6c1591125d2ab64aeb47ead21c8971e649c6c9c18a26153253e30b4ee +95bca9762051b1cae932d7132a3d4c23fcceb4e5e3c17fdfe2a911961ad55158 +5de9eaf8a729be4e12327364a4ff1738ea372fde937c5d04ef03881325876bf2 +0b1bb3ad407b8beebbc440fd2c99b6e13a055463961f0741e52c77ea3fe22e93 +dbd608b2996ba9c25337ac27614e83fb4ecbaba464cfde66f0f949fbeb3b80da +6e68749e47f0a10a141b4886fe0e92992d726d86ed681e2ca97c1577e1bd174f +5d03ac639772d263aa1bcfae9ab6472ba10c5a831f729847c4dd334810fc3c3a +759a3b33b715b283718e0cf6ac68b57d068d0a476db61a2b340edff20224d23e +8a8830f33e9eef31f54570527ef41fa045451587f3b154f3121790c585e0ae5f +1b012700681b083872e2bdbb7f8a23d3bf97bf87d7cde1bed4adc8d7e5efa913 +5714f9df8396d728b384a6f0b019fb02adcbc0922edae7e94d1ce78a7041f779 +02624b4c0e7f65ba52056d76d61fcbf652e9ff464fb5a2c21e9ee53f01029a9b +2bb1cb4bff99c25d2b4e1a0d4c1c9234b7ed78785ae86cda8102ff357c6d1818 +9441774bc20aad8a9b543bd77ba2604dc5ad5af5fdc42b6f301d517b469c978a +0efcdb7cd6f43157faa4ee97a60b9e9ef240990c8f1ac132dde465e0a93a0f98 +27b7a1b70f9911493d82f4b2bfd3852d68726e82ff2fe4f4148fdfd125cf9003 +551effbb317412613d7eb4318e64694fe3e966a742e6ffa12daa8e13366e78cb +bd1ff80672e67c5d28e562d5adce360c174e2211eaed34fb84f3aad3aba241e6 +aedde1dd0219636d891e38ebe419f46035fdc8ef6606e95185b7bb935ea6ddaa +4682753a0977dc00845ed4aa418e5f73817ca48efd365a9277fcfdb14175c3c3 +099d86738b59d64a9cffd6a1814a0a0112b0b2a553443127920d60fd79607b7f +a9bcea5f6a4c6fa0950ea1822e686f3d472cd815f35ca5af6dd40b21c18d8f6f +229e214e457d9352d5e60d3ebefb840bc7250d45d2d977560c0195dbe8067898 +2296064f13c29daa78066437cb4d69cb490bc4414cfe87cc87e6331056040947 +d4fb66f2042ddc4615727ce914a10270ae1598ae690b64d97e1410f16f988fb8 +c2a02eb9b4cbf49bd6526b9ead29a8127a3036b2f021382cda205781822312b0 +f2c68884191082bb51db23a8f721b06440f80f2de4fb3c38ebfe5623330cdc57 +bfec2b15b15a570f65bc5f1533565ee49eda9a5c47dd962eb0aba2525853ba47 +bd920882570b5d9f398ee687cfdfce67335c464c8de841813c3240583b6120fb +d6080881d5036c288058f9b020d5afcd979ca578670630341f8034395a1ba4ef +149e6a01b9c6fe42fa2c6fa8aff9cc4dc98c629afa664247a98bbe6ff7cdcd48 +5ad0652fcbd52bd087ca7bf1c78e5c9df0be76927db25c2fab3b89ab6bb361fa +b386c8099a9beaaefb95b1dbbcf636caefff730257f50e61a597875c3e52aebc +0f1daaeaadce926fad05abc3e81563c7bd44234a23bb51eaf6cc11467850bbc9 +fbb57458dac9ec5b6a7c2197f586266c201af0de0c31e04f300ab0844d276ea6 +d29ba930bd18c7c0bcbd860fc02762bf220b2292229b74cce1d5cd5605f119e2 +36bcee7abfcd3a1928e568902f5533e3639151d67648f05f05f1f6d3b52ed05d +706b72b98355df2f73f3b0b5e9cfee93075a6619f5a05ac92ca48a1f69712d18 +9719ee36a16c396f840fd00652e358983ff431d17ef69b03914551f0daea24c8 +0e8d4031a54390d248705e6761a0787216d86fdd15a7bfb3abb00e393f919414 +9d1217080b7631ca959b15948d8bb423336f36ca4b61b44023b9f3cb3cd5ef19 +d896668dab550740f72d50fbd58a0d4f9ab56b8574598f5aabc08b6b66cbc0a3 +db7525b11bdc4ce96c9cb5c59e498cde229018d22b7978b87d68f127009dcb1e +f1a4425f9aa97057bfac8b11fffd6ac911f5901cede814fb58abe2cb85d4e9bf +15cad425335bf709fc5dd665e73b55e0a177478c3b9f574bde40c8f90df04efe +c23054c0c62827bf0e37e450455d562023465c5a51cc67da4946cf2b5db47e40 +726a1500b94db2a40bc988c48eb3096feb6d66ce90d66f704d84158216381743 +1e7424990a8c8d2555e41ade1443f8abbaaa2fa6dd96cfb4e59bbad563278185 +82d0f4a2a57fdea7149e23c014b72658a70ca496c0c1c9771286946ddced2e89 +c61c5766bcdfb7960c7f34b581c047de0c3ee8bfbfcad3eeb0a9e3c161770e1f +d6dc30874fc30db7431305eb64db03351709b701e93d8414a8c916422af06423 +010931bae935fefacc0189f374dc36f087b8917998a9e56b978cbfb965c82a64 +d5bb7b8d24c67def296bead21783121acdfe44f4d0ef8660d1de94cccbb0cda6 +b5a2e6b34ff94437091017ba70ebf0aa2f625991a978ed8eb6e16f8d2217a318 +ec823a5d4d602cd0cb155c8434d640e09e1b5c7c94d0cee16d0c13f1f8e1ae90 +d59fa4f4d1c99603ad37d2b9fae4adf68891ffe9fa11238a86e92d910f6dda35 +b8f7517d4c084df29355f591d31f471e3fab6b0209ed067a2c5f2bcaa85854fc +be16ce1336e554b315c6b061ef8216d3cbe5d4d52ef3aabe69dcf8d433a43ef1 +4eaed5ba5a6bcdfd19e4fba9a8c1bed3f5f23f4d4448eba5e86d409a61f6aec1 +c40cc45604c3147facb9f2141faba0e10605c82c5dcc753ae0c43cb345eced25 +0fdba58756c4bf7c83bde1fbd68522e062215c6389db548d908d2bdc7cc8da1e +f95dcea6c2c8b022a7b5bf37480fa3621640b706eb4413026dd757e470666919 +acc8d7972731505639dab152498317090ec20540883d8016d40df3bfcf52c380 +c92010f2a5cfc94f1d6b7ee9a7fee210d22a897f3269e83f6f4d8f36292470c2 +83b8e0d261eaf8ea77feda02de34b594ed54545b6c761a2eacbf7eb1152d6c0d +c98ff221f67b01d38e141c4818d470cc8eb4d4e3f0518a229ccae5f3d4b55dd1 +f85e9d68cc188f85570f7ade39e08427c6c80fe6c3b8387ee5709f5be70f5c36 +edee99f7ae459a219dcc01e2d946a04df07d1dc2144e96770542e72f8331f021 +081fc3fac1a9a6f5048e897304308c7f99beb17c23c5297880713b41628857b0 +58055d51c43d8193c5e291e075a1077150ff7e9b89a10cc437510e96401c22bd +2920ba505dc548dde86789878649af3efb2814c4c3d274ec114867d9eb9c418f +d9f3a7d99d62b85e7721e93465caf4c69d5890225257e050df73f45956cec7f9 +89707b924f8ecb8f921a4299e84b3af4016601185c0cfd8fbf708a5f313fb7fd +46ae32eb71dcff73f0cd44fcf79e6214f747478d96b0fd7edaca7693552a2fc2 +10b4700c977e0429734028a975e2decff695c68550d919d4730a33db14f364fc +e1225b89dfcd7f95bdbf80ed26c503686f93b81310827340cf7abb92ea493ec7 +ec619d61313a2d590997e4d8b491df7716906415c66315f28c25740f87c4f1c4 +ea8343669d9d712f378c49ec7d9417b736b3fb3fe4df7d536993f0392dea2b5c +60a3d4bd22aec479b953596821730c80a3c8396aadae11088590f89ea6a65944 +e0f21cf44ed451ce11cc36efb4e69eca95c398ac5869ca556a2a78324f444f47 +71306fef7f3b20ed8d44666e2cc6e32f0e920a1cfc6a59963ee3cefaf00e37b8 +9e6ec4d8b28dea85790e5d340cea808bbd074eb9ee15d8c445ed519d78ab29d6 +50a8f93933d9b5fe07449869f7007a427148ec4d6a053a193a1dec3db0d97f30 +e508e80c4e4ac613dc91253f5564ac596559c2ee0ee16094139d61f9c5685c78 +b27f422569decd0b332de32ac236bc94f04fd4f7e8a433bc50164ccff89d04e9 +078f793fd5eae15c2cd0f3e28f8af614e77801541a6c4d482154a5a4779ddd22 +d80ef4e6381bc94285e9041b45066eb8cba51a5faf279644df13e0f7474d2385 +ef1b1c7feb9f2d57869545b7038b151ce7d80cdb1b85d46007c8afe66dd4fb28 +e72c3315faa87966a762a2a13d8cdf09ffd55217ec55dbecdf48cfaf5403a7c3 +6a5478909f8cdf9ea4b5dc80b1cbd0b238ee70053807762e42b76eee377a4dae +834ce6d73379a9f46425309a2946c48a3648543ff42a2bb99f529f6e5151fc5c +fad03d923e9c91a2a5804dc3b3356b76d9dd0ddffdc526ede0c4955ac1cff7b2 +7e104b18e89251af993891b0b499d35db9e25a932f94de1be4ef12df20fe1200 +7bf0b6bcb8f2f4354e1b547ddfac06ae408f9a3b686b20b4284aa4a4897d61bb +3b504e0f689701fb0ffe8c8282517294fd8e01055b3208aa64345350333f0431 +4e030c7591bed22ddbd0c67749a6f37475a25ff4b4707220b395265c60c57587 +b66b97f5738860726c0bb60f70ce8181824873e6ce2508153f4717c8807fb87b +faa3afbdebe74a55587b6b723d9579761d3680bb7cfc8812a29d3f021882fb8c +e00849c62658623084898de89d322c214d9c7cebddada615efc416f5aa607a9c +f032a8b3200c6c181ba49399d335ed76ea8c1ec08eaa242009737dd90b81a24a +a5957fe4b863c3fd24789ebc1d8afb3e5d20b1f39a95658d1653fe8b17e1052e +15e9149c5f221608a80ca4a305aeee0a5d5a2b38944c29f326ffd39df3c0f366 +472eaa5cbae5285b062dab5ea7c76fa67ad72ab46d4581423b58f44fc043c02f +adb55e3d888f3f2b858cd24af4c7de480c8bf8cbf2105135c67ef3c22233364a +e03a053bfc8cfe2c9e37fa148f0866058781c46bb614ae98f480bcd232de11ed +84ca44bc2c4a40f9e2f87be79a2c1748d0e974b4631b1cd8bbf4b9f6c453f9a0 +402df7991269f64902c7c3e99b490f5a65e2367279d5145492c630ee77b438a3 +20e71b4ffae0b387387bdd3c1962a2763fc6a02205be81feb540e13c2b845e63 +2ba4676a24f395133709ee632be861bed8cf705597f1c3dac3714f06a813de46 +1bf6fb70e606928ec10e5fe48ec7687fbdc8331181bdcb85d5085e7731996463 +9cab6f9905197f0b522bfa692790c106f95ddef4ebb61009510e98137ebb6467 +93adcdfc16aa623f96f1318401e2da2d3a767c63be170a08aa910518afe66f6f +b35b80756b4e3056764750bda4bb7d31efcd46c80a60d9cff6cb22bd5d4aa9c5 +0b3d7905a4b4b09c2ec38eb9aa5b0b6d18c206a3ada110a4b89bfaa1424ac565 +817e2a79787bac4649d490044110187ccd1a8fdbbace444195ad90d7abbb2f9e +84370ebb249c6f71a18fb5f93399add2d599b9b9e99c5f99c1d7be5ae8906564 +1b369e69773dccc3d1526a423f6d0166aac88e94ba702378b31e06e27bfb6184 +b7606d8fff89f53aa309d7cfd45a7c88c2ec3e1e889fd2aedda5ae955dff8bae +22dd647523b1b9a32ace2e1fb2af3197d95d4f18c289951384852048bffa8efb +1f15f3c47eee42480962aa40a36cf20d40a2a6d76a75023fa2f3b2b74b5e3381 +b62d0fcedfe50ddafb0e828245f4e71520df08920450dbe20103cf63260ce591 +f798ace8f08bdb1b63c4ec61703f0664a293b4ef7e252faee932c5d305987fc2 +bcb5e2bbef9d69415c6a47578e2e8d9a38abed14d229f2e3c7e1b98f9f47d234 +cc22a0702f5eccdae5ae38402c2023894ae01a83754982458060a13a8165f649 +5117729bec08e9f2117c14501eca9d96a1b4b53413fa2a1f4ec1eb727bef981c +d5f12b5efdfe4d632e835986f16ffca3fcf6ebaa9e03fa15c5d70e8557985741 +53cf8de128138a0a22aab457bbf59baa37523aff9b491cd863108f5417e1e513 +d30e78d7ee304d227d4a8de5e1d8dcdb86c1e864ea9ee9d5dfb1e070dbffd2b6 +005afa306e553f7a351b28828fed4968b44d1b4b286c01d49ee19e3afe3dda35 +993619e0135c27c137e71d7de361daf63e1b427ea8efadcf36e8f50d619d35ff +26471a0a49663b56a6ad2a5061388b92a6e89c00d76bef9bc7a089ccf6d7c511 +f6cfea54a0571e6e7fcfdcaff9cc7b4fb4a836d0c281227ccfe18ca8346e092c +5d1471c070077a5f541567127be35e1805174fea63f939b1720429312f960267 +9fadc83aa396e351dcd23e21220e850456be1af9a0162f2e726d303b56a166d1 +ef49cf6ec9b335afde96c45622b48bec7139730ee96081591ba24b7921429bdd +5fcbdb255c9a2aa47c9407331a8f451ef0b2b79279ce9add196da18d98598a29 +67ca981b0875beee30e63dd21fdad22eedcfb12b2c70363e2b840b2b623ea007 +59b3b381ae59f0cbcfdda691b1fd0cf20d4baf773ffea08e4013384d3da97bff +9a21574a38623fb1abe11169c7988a1bd7a10be18f5c883a15be833240c49527 +184b4345f6da631d7f8d78aca80994d6e7038923686659691221fa01b528c251 +ec2a52f7b891be141aa712646649847e7fe2ad128adc3cf03febc3725555bbc3 +3a3163534ad869afc6a24617b2f77f722d3c045259be57ffdfb68a41ed139953 +75296880fd03c37faf81c5925affdcc8175f029cb8994be3bd2f4304b72f54b5 +47af8c6cce77ca7a7c70b12c70f7d6e715da13993f8ae11a86b6fedf754a86be +44b4e65ac10c23fb1133c6dfe03e4547b4c22eac782c0cdcdf1f064840b45a1c +9cc82ca5e6afe01abd741ffd70414ef3cbc2dfd2d1df32e4612b048fecefc3a6 +728a43dbda82ace654a68ff0c750b1ef7a9223d680137bb2728b3d5c8945a9c7 +f7506674683c6e8331be9d15261db1976c44a9b18ab5fafca8a80b0d661fbf16 +470afbff8ad5d7ed99bbda94999e9ac9efa3feb126888d075905b468fdc77c6d +d4b7a92e9d98cf189376bca09b50a09db05463c847a8271652542480b565bb5f +e80d0aafb72ebb272df7d1d371cbf8465d50cc074c3cc7c2b8f1be60a1f8901f +50abc1a6816dedee27a30324b4a402d2ce27776ee8c01726dbab2bfb7ce4eaa2 +7daf67282d97ff95678acb54e67dad13f9b3a32a842434bdc2d9888a92a58c0b +d512e0176dc9a1356c0bf2cb08eb9f499623734e3f01e1d7d5770f0a0761ede0 +64d9663fc136072933110dc9c2338ae16405a6196c97f3ea71460082a5928163 +8bb655ef475cba92dd7d6efaf2f21017c99cec103f4d58409b6d8d0e89d31bdd +8fe9c1f076e829e3277a02d8bed0a7b45838fe51405abeed75d04893478e3969 +6c58ce611d97fec9d2dc6dd9ce9b5215c4760eb4ff073bab5750456dc7f824d5 +97f8fa0a2a2e5e874b91b50946432a4d25cb68c8df846bc4b1fe10758155e706 +ea34190e7db866ed299be41cbf1af913feb37fd08fee42deee5be073b0ea0053 +33b20a35def5fbe0e94378c2ebbef66cac0ab19374989f317e7b63bb57279b0c +ed2795fc8c33af0ec4fc78462a811c5820429075ea4815d02436eabb71d583bb +8f82a633539088d14e8dd207c10202637f585c059a1310255099c8504372423b +c2b7c206f9e4fc77d76bf5c425c7f094fa9f93b6fade682eaf91e20dbf7c2ab7 +4592a912ef9a5032adb2966382663d5cb83d1be60c42bf5cd0526360ad3dc29b +962a65fb0af2bc810896aa833d4032437f75ee2e486ff2fc6b14a581f76d62af +5e9b2643743dcb3749a2d58c7af3094df38c3c0262169761a9b2cc9add779626 +18063fa206f398edc4b1a5f6bda8a1dc29b07d52c1ce49d548fbc8b92b77dc4c +2e8c4fdcfe211ce97ce74978b82e56bf929f1655dc74dbde8126129372f43a93 +ba082f59b65934c477a54bc35ee949a811c63fcadeeca74990045c17ffde89e3 +a95a11289118da3e34d454995a56a5f894941b64cd9ba8448fa52fbad869ea79 +2e98b7533a7267e2e8213ea7bc92e00685e959e7826cf1bc9503ce95827d17ce +d965c94a4b1eb8246bfbfad264e2b59878bfd0bc5cfca55207b8915ef47c3b28 +bdee9fc6f2ff5e8fb1ea200a8932255ab2975a5df7a689ed938de6b8b85f959a +a25ecaac01a2259b782565bb2230e7a4a75691ced106ddb2b67b3694e8f491a6 +ab6bb9c2077a2cbb809129989ebce2c20a50a0f327d27dfc1a3ccd7cbbefe067 +f2d611779d1027c9b688994c87675e306a1caa9c3e5b226da534d3048ceb4c30 +357a729ef313ea4ac681a12dd60fcb5985640c80642a870c3b509f4f68a05487 +383822ae12a6ee24ec342fdeaf0f1e4f893c91841e5d9e829981b114211bc216 +d4eb7eb3e975cff1cbbeb778ea66c67fce0ff0e8a39cf890e0f68c296d1e625d +b0d8c2ed686164bb08448c74007479863d0f42a62c93d637ac0e205ef01fd179 +65e1e72d83a5a910e0778b1055b01bad215e0f768f1932bb787ae651b8ca2a67 +dfbc5f7060220ce2b75aefa718cef6a2604d9fe27763043408242d46eed50b19 +0a24476f5c7776757a14edc9657357ae32c3b50959c214e3c5219c8cd12f4596 +5fd4c48fb08cb1e2f12e92468fa3c7c2129c011bb257d5f3c839471a569e7cbd +ceabbc51ed9c958a6203c0c8e304bba0019781bb15c6ec100f4e36971dab9400 +de6c2afd6f00aa7085968e3cae689af2cdc5350ec8ace369f5da75d0a129fcb7 +42f6e58624e541bc7d1be6f8adb2f9f0f132e1d590cc406be42c083158561880 +84f942b759a9051491dc6fa2abf89fbd459599dd285886e2b6ed71012d670c6c +f1e29a79f952e4aa544caef90462b29d4f4f20be09b829b02c11c4f0d7316895 +c87933387db785fd6669210d3495fea4e27dba8a50abd7a02e7d1a42f8a7581c +cbd7e54898e3670a52eebb0b783357da441dcd643018149e7215d30009760485 +15cba63dc44facc0c7bc086f606f90e23fac830e9f8624a768697e768f14e862 +79da00de9a729899c25bd7ace28f5ca064a7c4f777021a737f615b5a7695b49a +d52616291d0ed0584409893365264887bc534b567219293f4693c4a73c1a494a +e317eeaa624a6339f1ecd370821f4edfa4bbc14923546ddcce198e5af9b470e9 +5a390d7c8c6e9b74df6e7cad2330ba50667dd5662b74c205c16706d2ac50dcfc +5eea6acdb1f372fb40aea8d47fc2881d3cad562fc34b0cb011f257d6f1346953 +0f635969d82ad2c6ae87d0b5d3ca8c728bb9afdc845fbfc6f1b585dbabec8119 +048621d3c9a6cccf785a057f54d5bf8b4305c5b7d598c5189e1801ac327e203a +5b3c6688e9c6d4950774d29d4a8e1fb8273f74fde2c42dd57b24edba76a64142 +0e3fe84d4de48017cf32af30f6e3eb9a6945971b49fe8d6bb32778509dd03022 +9409f9e687febeabe63b112a7e30a8a284210bd3c59ec59d5bb2745855997365 +de3c3739af4b9037fd657da8f1fbb8afc48c8df76cb3d91e59f188a8e3b7868a +73ffd0c4a53728d2227001e8e74ee2b38e225c82c8889a81167e751c91810067 +6ab08eb4af988a854d135d19d6f15c614ecfa6642df9ac58c5f6dabe2e2ef602 +6fbab0f9bb126c24f96f5f53b94c540d9c23eed7e46393601a6473e74219713a +d427db2af7d7301bd417090795b99d19703ff3ccd859ff9ce6927001b851515a +3b82bc08cd19937c54e81549a3450ddde91c8adf82c1ec8f196b1cd80db3bb57 +fba270cd9bd62c5f2e3cff5876bacd574d50af68543bf2d1b6f98851e8c9dfad +ff2ac1db226067fb63da8b6377286ec32d472c6a5d40101d94e927dfd0689aa8 +660272f18bee93ced2a77f1a05b08da4488d30abd079cb443a9904acee469a66 +08b63059d7906d6586542e8a8a9b41a4c199999d6d65f8f336481f067b67f906 +d2a7a30223b129c5618fb2fc324639956d117aba900259c61793d8ad12907878 +98242bc4531d3688df36765e6b69fc343ddf2683da659cbbf3ae22224158224b +ba0b92eee51215aa785332bfaaafc47a653ae605ca4dc13b5fe4d847b3faae49 +ea52d013817e75a4ce0676961260214f0847fd3257f72480c7ab9f0d70188b96 +bbda478f93c4647d52273da786ed03cd17082ab158ee96368acd9b7d7ceebd60 +045e83e38577cbe8b03e9246c056dbee5fca0eea1430f604b200db1e958574f8 +7b254453f90c1f32236a1bd0942e2753cbbb64eb6485c234c90810a9873bb935 +82cb73ddfd57ddb210eca66a514f405b8e06961ce7428b40a3d94850e8c0a63b +3e4f7e9d13efad70e099670b798da5d56528fc91617bb44aa32e047925c0a470 +91c9b7d40186c9cb32ccbb309c42894bfa17f94ead0b37d8b71f0b49f31f424b +73bbdaf6309749c26a73aeb266257096ab6a069a760f7aa562d6231d5c43883e +f48c3ae89acaafad766b027fc1fc7b0be998a7c4241347bb3fe3a1657c88b892 +d29020f92edaa59929eec0d2c7464e583d3d417b5d5115b3ece459e55e45bc68 +28eb0de7b3c3487a25eeca6114c5ccb23f9ef10695d971b8fe13365f9b3fa967 +eddfd6cee9b505e18c54c64564a795e90282e48ab09d011f2b12afa71721e1fa +937aa00bba9ea89be8cfd319a6c611cf7593ee321a9b8f34860386afc18000a0 +973eb482e651c7e81ea804324306fa4fbcdd04162b29ae2b83b341e93d891ec3 +5a8af145480f0a7914f6bd6ba29c227776ee2e8a9fd5b5e93b2f39f0c6fa1ffa +0c63c3b744e8e108f9c6973fffb71ca03884d87e17cbba27a154ae0bce55b8bb +4ea33f0d883592ae98d78d959cac12789784bac28fbd5f89a46d4f4e123a9420 +27b973ad0c7ac6c8f58eb16f18f187feeeea907d8488cb1dcea88a4bc3a784ff +b13d92b5c5c79d516773d0f39ef5fad76d770aa868e167d8de4b9e391d76649d +6c3718ebf61b37c735573d6ddf1d8757df025de839b0b722206bafb7f622a4e5 +a3090d17da1e125754ca5b36e3e4c7019787605c3f0fa9d145959a6530900882 +aba5992627deddc477775274a900132855a0df63d98aaf58c50b522461fe3c04 +e4d3d4e9a7e52c51beaf632142e16a6353d2c375e534f9914c15539080762b31 +c90681d700d6953fc4b84411fc77d4b2fd3dc6fb6d260a822eca389cf0b833a8 +1546cfac197e7a97cc09239ff206dce896ec92bd3d36d3febc5a61e26db49f0c +fb2b0e5975d3fe4c987eb80cc6444416600f19e5897cd5d0833612b47414c01d +25dba0f3c22ccda96245e8f7eca954f056a697b5f6050949abda10bdfbf310c2 +5c4a4094abc5c6b71a670990306561e8bc1cab54c3a7ad3b05eebef6173d7c8f +50d68a93cdc845900a6d729a64ee48eb7efa9c5b866e5dcb0039883cc3cdac90 +4ad895cd0e709d216a6b65874166f868c3914be18e786c24bca27c54e0b839ea +b78e875780ce54c8d941bd7e8192b036aa8f2152c9b609c81f835b8d720400d8 +0dba717a7280392d585f8caad0293cb11fb5ffbb42ef6a2f2eaea98ad2bd56c2 +7cbf041b3c96310122fadecb8a8babd207aa66723b3faa52944a0bb78973a10f +a04856de03ceeaf415e5a9cda184f919420a7e73b26cd38c6a50bb9e9744ed45 +94ac8474929692dd138ccd0da77ce7b0466c9464cfe9786ff83b8135b49c9c54 +f8ae1c44ced690591fad261d238caefab50c63e969653f019c515b49d2884c61 +5d51182ca84d1b4fa29772b74a11a7314887034ea6e22de73c47537511f6a6f5 +0e9f6a1598eff8a08aaf8668245ed33c79e681c039b30944a22e4e5e9c3c92fd +f35afe5e66d734bafe2e85616ae132a751215a56c4526e959ee04ab4b7002d0e +ccb1b49eb1f5c154e8886fbca5ce83a31aa3c8f84359c4c66f6af83dfb0a4366 +cc2d7fe6de33abf14e3e1e2f8dc1ed91a0d0107b6665cf31c5eb3402b02c6756 +d893637fe35d7c4399768d5cd659c4ecd31bdd312537ac8acb85c77d6788c0fb +ac9d47ee6746afad82d49e5dd1c04fe2c9186e62b83dd88bdf3ae9d1a7df2dc8 +70394b8148f89db647c9f9d0131a83deb55dfa2c92ff0c9e073e1b4d1178b594 +f16428bac0084765db82026b8e6aa50b8222c58af752a80c17fcc9fbb0589fd2 +2a166de209255454054b9efec0687811b2dee4d7fb3032f4d4c28f264a180d3b +8135b49c8adc03934eaff2434f46292e1721aa25892468634b601e3b4aba668c +62bb839cd85b5b5eeefc7e22ec5339f003e166db0abdead64da2a5e16c2ff078 +a51cfa5743e7eb8bb8f1090559a9ecf19ada7f654ddf7ef79fe51a845be8dfad +e8fd8c1ee70bf5bdb921136b76dd7262ee4ba8fa2fb9a25e5d2a5980ee401ae1 +5dc766b4963bb9dd786929bab56e65cdbd618062afe34c166f90e8166577ea24 +5bc425c08883cb8be042a99ff43eadf60d1fe6495717dc44c3b78bedd70c5a7b +7c32cc9bb8e8e69213e94f4c0d740be930cdda5d4c653720374e34e4b633573b +d4cc76832430bd51f18d8b0e7c07b54381d79a2fd434992e49730b433f646edc +b17062f2480ee7c8af3c2c76b03abb1b839a8cc335ed3646b5867446073781eb +1d6b3c9a96179ee05fc3b4c7b168778036d40621fec6fee032b015f3897a8dbe +63b1fad3ede70e2db545653834cb7080f6280f55730c82bec752c9e83dc70abe +30908ea6b40075dd5251f15b632a808394391141c54f65a026b16a2a34747f85 +fd4178a4e96fcb4a776be1839d08242e8254b5d8f558603b0b7cf3abaae988c9 +e18d7e7bdb2d52d484e32e975b683ad79b795618f3b637e1aec7010ea244cb7d +a57f12fb9952eb14db718d851ecab91bb1a39b95c5aed98e4c0db466bf12a7fc +acf197699d07193d53c71efa10d6c967a348b1a3cf7af986f24029a8b516bbb3 +a682c055ec80e6641f68015a0e5e92c70028462675b37baa94164b60d4026bef +5f753214804ef70e86beaa1f3c05d21cd85b3509d6245359cd68c5a77c92f266 +d3b5bad87c9d9f4293e7912322f8d9f255bb6c5b7d980364f71c973d13e63245 +2373e87df286b56414e10e7fbf79823d6fe53dc3a45a2f1683d8c922b88ebb94 +a97201720f103138709e4361b8ef1c570d166e763263c98933a718f562a3c15e +0313dc400d09f97dc8fb62b66ef0d5317777c0aca4ef536ecf3c05d7461ebe18 +9a57e736bb33420c134e250e36ebd26f6d782c129057f63a4255533799547698 +6eb95054d03eac52df1d7092cfeb1ccc8e3ddfcb07896b2d561489c310c6a08e +5c58ed379105d6addbb96ff4b8e7c2c2a2892c53fe592d5abe906112770a8306 +ac64d5d34c734047ccdc995bf74886c53e9af81a16d6ed1eff343b99810bf9f1 +dfe70a3e8b2484eb4b4ec097758d219182ecdb17f4ba237b8161b56232dad6f7 +eee0803678ae36418ef3a117dc9e34794a07b2852c52779d1ede2896b5d70e94 +e7494222c49e0775e63b64d73d1d627c14e775ff37028a944137a39a94b947d4 +7ca1a0a569babf4c92c6a3e3403f0e1aba385e9bfcca7e663f9ade536f56731b +368333461ca4fd85e77c26f9092a8eb57620e27dfeb0e7844e7863eb62294f00 +e023a9b4a7c4e7f0b75f36dbe823a2c88022b4d247ea81f6e18d262407b0516f +175402554fc3b74975b0a313af59809a6382990b561843f19e8052cd2d01971c +d3f04643d59d20472372b518f1b3e0cd12d8598bbbeaa728f0e47f5aa125b32d +b0de7159123716746ce294c9bdf77016fe334cfe45108ddcd325ef3b61fa67e5 +50718e841a6d9c691965d43b10aa388d49444b36ebac52c0d1e06a248b87a0bf +6bbc396366e322af167f62c3bf00cf6f727cd081c81471d13796c23f0e13b64a +2fec4399908dc6f8550a058e28536ccbca7d70607821f77c69daf23b8738c17e +2bedaeea4b14afbce1e02bb2873bcb5eb0db37afa344bc8a5e28448e11ee1007 +4c4a7dfe34526ae811bdee77dc716ebffd4ddb299dc98f74d8e5e9d7b6de0751 +7333973a32db992ab40bb2df32008165fac3fb5b69b2fa707b8b8a55eaa467e9 +e6a3fad796f92556577220c862c60ba3c56babc5ea00677ab2ace2194a277c90 +3d98db046f5ae6d08bc1ff04ae29078eec1475c4dcbe5842810753d18a928e89 +5f479f76189466e38a223f66c3fa83c6c50138dbd2f4f9f12df440373a98a86d +e5d06c40046f41079eafa0062c96d85a97364fde75ee41d2ff09ee0bfc38697a +7e394e4de27d511cf4c4d96fbca82cadbce1f13789410ed9fbed6ba600b4f3cf +441bde40ab8ebe8423c3b9997996756e674193baaf348dc8701994c8384591b7 +843135a2cec348d567fb30e03e7b36bba0839149d16bb47231648919d6dcfe28 +882b216e15c9ac755a72576ba9f7006d416ed8f18ae872c257fb52b1b66ddc6e +80de4c6d29761dce4f69aa3e445010013aedb44dfdf2507ef8def4266da630c5 +0de35a1c0b023a73cc543592d116d075ac6f1bce76a1b287b2c71c0fbb16aacc +6ff32c51a9d98eb5e85b6aad4dad5bdd9f9564371035e5f33a6a1e2976144582 +47881acad9a469c316d6c03c4ae2a5ebfc51c71ce46471bccb14a5c940ebf40e +51060851c0935d3f092032824a2258c8c2cd59c2081d0a11549ce1b7880bb3cd +d6a41536966cc9bb089b6ab3eff9ba34a1e02a490fb49f3b714a4c113942d5c5 +f8d2666fd9eac50288a6f38341ff34f89f44861058bcd74e138a5e5b93d98695 +aff66b1276a282063d884cff087ead483215222a484da88c8ebd3fffe5e1edb7 +8d977cf5393e0bce3c576753e336e8d27959f097b8df2a84c6d579a2099658d3 +12f5b6c72060061fc70ccfe9a5897ca5155851780b940746435e387cdeba5e0c +0ac5c1c626a9ee188aa1d3354f863bdfe0e8f83178ffa91fff418dbfc563f207 +d4ab556c9a6a5cd1f4ff218c197a4ce9954f32bf3f6ffd344f3f6bb400d2c2cb +c5d8a337fd792387660da55046b556b7ddf50df31ae2903efb4c70e7adee8b85 +a7b50e5bfced5bf4749bed4e36a1c4a1e759f3c2345a3eed73b9c9941d6e5c7a +3682921d0894f032a01c23d2f3ad313fe6399e3d1317ab5724c0cf8e54e8c2c5 +6efc1e5574d7434d7d68cae8715d122263de1120cbd3199351cab55b1e188602 +4bb669f06e3b224e09c9214d0222227675795e3b23d4c5d7051c4fb1ef1074b9 +e1b751b0890a39c27cb1fa03d33a7332fd80061f81aeac1c9f395033c9eb1ecd +5961e6e137438b8d87fd4f737ffeeebed264ee073ca0d5f5b95d6307d6de0a41 +b65d3e9a1de1a96dc3f3a16918e4b559089dccd1e3ddcb0c07c7494ee40ae018 +9d35a16ce75980695028c5a6c55677bbb001761154cc2f737fb4a12082c2382f +878e53e51805e36beeb0290c8684e2ddb01f1214d885ce6f745c4f32886b08fb +e2452755e002ddf9ae0d952c957bf52ce708757cd87e5bd916b0e00d9cb9b3c0 +3dc8040628d32927801ef76f74bc07bd91d2ca3bae1752081aea491d773f13e3 +67d530b9142d59d208a7c9e3cf23bfabfc77e23f65c91991b0201587ea64de9d +0a806a71a5572516462528c0c7c85d02c55b40de0c487d0d8c34b1354575604b +7628eef3d733bfa95c01b9c296c82ac3af80349d8d5c1f93090b41ff16be3f10 +a1f5d9333fe1c0d36a9dbb1e3ed9d9387cd2014c056a56ddc3cc38698377578d +ac8ec0e8112bdc47b5de96ca66d39924261aa5d97c63527a5f4ae3886269f6e1 +ba68936d52b2f5d48b1d2b271cf0007dfef529b965a5e5b5c1d5626b022dfcd2 +7eee217f48f3838de9f4eab6be81f48ee4a1ac17e6f5a5b4c5b639a6fe890485 +9240450db6dcc9412638052a208ca85108fc941fdc9364c455c6338607547231 +611f89a2af34f21b7ad0737de131494b4217cf4961c2063a308ce54cd27922dd +60bc20fc0fc670ef17c27194932825b2e9c339804b934a757ec9c6176dc44536 +73e2cc8d256c0d7cbb8e6eafa16e60c2b2ac1233424915525fb901baafdb12ee +fbe8292ed097f7e8956f496a5600cd7633a3ee873c0f8ba6e73874d70f931557 +aa4f939dc697db300ec94cd0dcd6d4a4026f6aa8439b8ee4f2123a38861c9670 +4f8d78da456ac34cb97efb8ef8844b282e0f5350252f44ba62b3b33f91da1b53 +e9e242dd438933bae21068fec3da558a7b03673fd6c457eab2af7cc1b8e469e7 +9413fe41c5a2a3519e8dee7534a86077a9fb45fd34a10503748f9f87475526ee +0764f96de4afa6332f61517bb23e5713e279d152516b3af370ec6d269db2573b +1324268a61abb55d19b06f5bef558ba992f47e0774bdef85628b404d802f5f96 +e08c7358b646507cc933a4e915c694a5cafb137434bac41dff9cab79c8c685f0 +e1d61b4868fb143ef0126d8be63389c0d9f3045ef668f61c8a2d75aa0eed300e +eaecc205625ea1b4ec07d1bb6e790a8e26e83dfc18f719265d9ededddb49fec2 +ccbf02764407e045778844529c209508c8bfb1c1778b3ace523d947673cd82ef +67b2ea3eb3b2b33790c8d8b88d7251324f45cfd682ad11eccb8341e79ae2fe0e +43fda75bd5d311d710f1634edb305681c9890305821e3f1bb15b003819376371 +004809e59cefe012b802871e2826e92f31ef78d44301d4bc83c587b363b675f3 +b3f0699d237c25c3c48219594a2c3a0acf35f1f3c35cacd9f60ab5992e6fe031 +37abc48b829b49db0a8f8b23713df9c716c706070a504dbc29c15ce5c83afc2c +a27e7dfba78792df0bb24457076ae17211bfc5b74b827fdc86ba15d7b24a6887 +0cd5fe1b22b757d5f321a992d1eda4ec4b2b6fc329db627617e3e58f118f9eb2 +32b48cabc49f11ba9777f8ba56a8b7a3a4e3e76e6051b854203ccb98ced73c56 +9ad5a84fd033534e5c742e0a1d4c919a1fcc69bdcd31b29eee885ebcad6f82f1 +b4d51e6889546900bcc955d4825184c5f0fde40241de7c50a7c49e6a68683ceb +6684c29c33cc63362c4666fe8bb7d2f39c5925ed6a3f6572da3d9e2f19e32a7c +e87af43ab9965eb90ba8a90bd92a93d97f8a77e2532d778f439225552c159635 +06b319b7554ca8d84fd4ee02b5373e687addcf4f94411e51ed771a811d2df5ed +6094a0ec262927619462d7de8dd20a99107a0347ff2c22f21c9c7ff18ccf5355 +7cb9ef252fd75429e81454e2bcc628098d82a8e9cdb289cc4a724975993bfb42 +5b6679350efb9f827f1cc542487c914e3e7fd791203afecbda33f622a697a145 +96f8102f1d5c2047bae1085810e693e75773ed40c1f79da58f377110e7105298 +bd2824597a344924068c151ff672bd217c28b7355256ccd05f70f342058342c8 +68c201e7de190079f3d39d1e23804c8c617e2e060b3f7dc90cb5c48b4ababb64 +260343c327d05b91edff8a35a4a618d0a70abcd72036d162ebba5b94bb16cf88 +8076d7d765fdb83199859f6fffe7c1b39886609f357915dfb5c1d849993fa15e +86cd01b30a6fd8d5f116aacdca41a575c0319a6540ba7acfd01f588b75209924 +105e746860110d7a1bfe16e3dc31f13026f19ffa90b60d71be61e019423d4426 +262d9e8817fb2ae96203674f5f50af2cfdf91113f83bf23a45174b7e5ddc69ac +62df5a7a1ac4ce67fcc46c2f92d764698e42ca103327ecdfdd3e05d419d4ee14 +630d34bcc0485e7c85e0c5fe244042001219d457ed3636b383ed38d89ce0bd01 +ad668b75923650dd8a4bc84b02391ae15cbdab93d8fad10b531086a876951ec3 +9871ec22a41e6eb0d81e6f0ccc4e33cf0dddbc197dc050192050ad3557d150c3 +e4233553d6c5d4fdbb0482edb3fd7bdabb2a348986cff2b9b61cfd3db28ecc1b +f39a7511d032f86ad5c1d7bb2c90dc1bec69149968e24bec4b819fec05fffb6d +22ad946b957570a38287a953c94d87a46c7c8afd990d3fda7831c9eb4142e3b8 +db19f13ad542b2805bc8bb49165b08c8b1bc1a04ba1ba5177c17e71e71e9eed3 +b1d0657d107b80ccec2894028b4509f33664123076f9abe61919d7bb4158b839 +c99fbd1d42fa2bbb8880926c548ef06a8169bd200093421ff43d71e5d55fc691 +e290fdb7124d42ab2e257ad7711d63d47d11e9497e8cbd38856a3f91e684832e +60cb0459233d79128a4b64f5be54b56e2d09d425ab6e9f4982d14db8ea69a932 +b011070cde4e732a75d10a74240274998b9b33366786692fabe0ddcbef1bb869 +6a0ccb6c28cc3e4cf990d64db8cf765073b23c25c4d33de606efcff05901e324 +09a4c60a826d515e179480bb2f700112c5d2f0a5d847c67ece58c32670583eff +8e1ed86cdbcd307fd9f35b8bec9d052356b9919f422c1f027498a360c3fc1f86 +852ad054a5c185452010ba61325eb3079a713e6030a639913a1dac4920c3ccc5 +b24607d65c6d0e929ca06738805c0b4688e259b654eb2ce52b9ce7d68995ccfd +34408888d3963459b95103434734b1a14526ae9d892333c7f4102aecd41d5d84 +9c1883d492f233630d75d363ccb93ce78c6ee27cc2d533ec879bb54bd123b3a3 +c50a93d4a66924593e819d1ac027896c271a3f0a4416901b898f3facabbb4373 +894237264595e81ff5b1eb990afc0bb318a4d372e8db65c7ef8395746f5aed00 +1a12c81ffa93d52354a32608b6c785aa3f35c8206a121e041686571a373729d7 +8cc3a4706aeb73ca37958faf24f2dfc839e97febfd506965185e3658f6585933 +9e4db163170b6af8f4a2dcb07c528ac34b0c29f1a8e6aaa639b6696e6284a7b8 +ec043c4839ad38585ae97ecec95a53632410f31e99a766f4dec82af52cc8ddfa +dacdfd13a18a2908cc0f5dcabfd1751027101ba7f00f3256d68387987a8ecbd6 +28a2714424d4510cf4a1190ce46c66fe95bd83734d3859c706432d4eaa7ea16c +d2ebecff208a105170fa5c3da1135e930794c3b8572a3303667028cccbb57766 +53241f90834f18f20e9ac7349b62dd993481a8ccb35219378dee0ca2fb8e73de +322df0a5297057335d0ac9086bc99fc4836c3c58ffcf53c0b36aaaa35c8cb685 +a89f45583cf09d976aea75d761da58946c7fb19a076fcdb6074457d81d581b8d +8709c316ace44755523bc5544c3d4a60e3cb9bdaaa0891cc8ddf4a8fec0b3ae3 +e55ffb602bdca0a804c2d27494bf0f3b80acb66120c05b356623f66ea5bcf65b +e68402065e6be41fdec2a0a8ae8edfe64f956ecfbbbf56f6a7ec18677cab30ba +e198e428cc555ffa37228c033da93b3ed9d97d604317cedb0a7bc701d3684838 +a4aa6a38b01fec46dd01c3fa9271eb1afaa033b8e63c019d1cf1cd079052428b +0ada8c1ddcca15b257a4b50c0cf5df1040b7f4fd3920338379b461667c0333c5 +7ca835544502c7e5def4c55b614415c7917d5983026c706ebe93f1c0642311d9 +0fa22fded1419c66666e633516abb9962f8147e35d08ef822ac45b2a64dd6502 +86e956e0c4ed97a8e536a48befe09a650e88bd487ca301c19d3409ef8ce94f3e +e683aed70fee5cf5ba17ec896ed305051ddc4aa1e7199e19e1f86a29211a2ac4 +c7fc540a948328362a28b4fbf6be439d5bcf2fedfd8e45860fadf77d652c481e +eaef46995b5a7e2970f9d4589f003dd568d741d99d2c14c8255dbc50340de4bf +3bba1e7f3d29544bee524180249976a9635b6239f5b419a020dafcb20402dd77 +2e5ca3307cc26fd7ef6efb6cb58c5f201774e991ee38b2a62add0a60ffd8af6c +9b441be1eeeaf4c780124f47b7a4a0a0ac46b437d0bbd2d3c4e546dceb056705 +0a11d8fcc7d3aaabff5753560301948712da6d8d0cada681e4c9c2012f77be60 +26b2f842301fb35a90db3c4f4f84e1bd30bae32fe4ae7f392fea32390c62d8fe +2937aa73e35391ef3357ee6552ab37bc5c723df5f36a30497319649f645b9267 +e3eb4dfd86618f3d2e7560df20a0b593b2dd0205e8470337ca8c418defaf9077 +9adf3c34e8f2b92cae2f73b2afc3b5181413942d411cfd10db5a6a93310ca081 +310e199195888e102ebb9fcd10b025091104aed42d4327ee4bf9b1be081d9c45 +cb341ccd4a732a6900c56ee591603d08c5c7f11c26bd9adc58be6643ed22428e +7938a32227d06c23e67390df091566df0b574f44d049a1a2795496d514df20ed +f836e47f9b4b7878f91b548056069c21325868a675080c63b236fa30dfab957d +ef11332714a0f77aebea926f2a8c548e1367e84a1cd5865bbc95b06f6310d009 +f9ba3ce164a846a4c4c6e1246876cc8a4a68f0e0bf77a4269256876baee137b2 +55246035c9c16de07b30b66a8572243a2c3c9b96c117402e6b40e5fa4da6f120 +6dfd92289a89bfe4cefd761fb6e0584c7749186432af9b3887c6119c852b7a60 +bb6bb9dbb1d0bf1671ccff0aeb92ddb64d504c479cbde36f2c6f17145b7da920 +b8147c534bf53e7c2b0db1a3835bf44bdd79710cccb79454b4f9642fd80f1d75 +b4abb9ad49c0c6ff68f161b8df2215d8d86958bc1f7470e0f7f4a05af610de64 +329aac1ce5613b68c2c61c031382f92d3674687bdc6a0769d77f663c7a7c7cce +414815e34aa0324a0171bffd53f150cf78093140d1303c7b341a4167788ff4c9 +15cb42180b5cfcd27f6711c35bd5cb269c3c9642861e2c9f435beb6d68b8891b +60ad43845343a294cbf42e70df804ea4b70e27a2596d8be33729e87d4d806d93 +9971bf01356a7eb0809006632d7108c0547fc752813dc5876d38b48b72eb7539 +5dfac91b34ce383a9ebae75df02827b7602d08df36c25e6f7c10941065d55eec +6f79e3e80cbd0db2c3383a72fde25cb4fae0d32d0c1e1b425d3fa9c2ca933a79 +801e99cf622ed8624b60df8ed21c78bf9e90045ec38f8816df3322525c2540c7 +30568d4effe3c58a2282e0bdb3c5cff5d855770b468e4a7b69c099acdeed17a8 +4dd9c13b035fe5ec213233eb8caaddb26a1a8532e8ce21707d34e4d382aeefed +9f5b955181969a1e15251905c4f10bbbc5b33421059d140664410059fa99496d +fd758e012393a1db17548f6f34c6982b34a277fe5c6705605414630d7a9d2abc +47026bebaf52ddd730612e753f401eb446fb0ded77757196e5ed389de495c37d +a133ecc07efa24a74046019daa0f075cebce8b5f1d8cb2b8cabeafe600624f98 +326e09a2c60a6aacda93e77f62727ac597aa3c3741c93437bff91d0175312d10 +712a14460697528c5ff2eee1e348d5bcccfdb59aa2db748823fdc29819e5abec +5921679f180ec4d7924a3047ae145959800b35ccaf0ee3c1d4c0c9205f5ffbf5 +4aac04505107ce64dcb699ab320b525c0172d2142d1ed5c06716abd41810c61b +6f6cf97046c82aa5388c27faa9393bea8bf5107806bcc6472bc70a7ca4a74e5f +b7356143a41db699d2b77d7e3f12b05b779a72732e322699ce4f8972a193256c +7088c02c86906805ccf001d3b0db6e70af122d727751242f0261fe18e07a93c9 +bbbb3bdea5f90778c5628599aaf6c67ded3daedec72887ddfc44c7bded1ca82e +2fc217cd0158c8a7911bb3d8e7b54b5dfa8c72341b1faea1b3f9d167becd87ca +82cbb4637d8c51a0c76e5f1854e22c9dae736ee3a974b9c02dbf00a68b145a90 +d5fd63e809985d828d490fbd0e524bc1f2e82f124e4b3ee3a0d387a49f5b9757 +a4e049a37882ef7e73b10832e5cf27c18050158d0c365cfeb2291cbad44b2ce2 +435f31f58b4355663510ea6096d1318b4895ba3fef71a490274074785a576a9f +7ceb471c0393c3cd94e0f6be931a4c2cd3f8ef61aef576650b6e23841b035913 +3604b59968c3d2bcd17eeeff33fa25d15bde4b65314163f67942eab86a858dbe +083774621edbece278f5d9b9e9b9c1399e68063eb16509b06f2a6231f0ddc861 +ee777c413d68debd9d21f6ae678a95116e58922e32420630c632140f794036c6 +1da58a585bb48f78c68a479169c1fcee5f4d3ec8cdcbe2f620d51ec6714c3077 +c12ea1dd5c219c64efc9e2a080f46f7ae3f4ff4c0e8d84fd75d0a3a77bb985fe +b866893d8c2f956096f60890b3fe537c87f4dfafa7e4d147a83a772a631620dd +a0a468a4e2a595ce5d84fc34cd76df4c7b618f25028975fb6869f4d6bf22d539 +c0523ffe5a39617d43e166b458f80a9e658329b21682509e04ae6edc204707bd +1a7cec577bbff2748a3c0f9986314c5619fdc3b22dde34269ad8f757c38d05f8 +df9f89dd60c085c2935b0bb84d44758282a676da879a13d2f48978fd3538f98c +fe9a20b81fe841d9e369b1468c05481147f517da78a01edef82ad2089a143c0c +1e75d6530b79fcc180ff279578fd3073c9cbeab25c4b2e40f196715d3e3dc5ac +54d7e04fb71493d20861966057b4f853b03caf832b39b1fa8b5dc9f77abaeb54 +399c458bfac364f1be9bdf581f38c0d005fb21fb874d14b31ddbcae7d6c1c7b6 +5a85e111d48488842ca32388cb1bfae943b801a116e14debe352b6e9d2eb3404 +e5a27595f77f1cbe17d076630d537936d7ef5a7b2b175162c0ecba84b02d7d7a +564a37db83e56f41298bbc1cca7a9dfa4a71172b92b0e27f7955a5de1a4319bc +956690951d7cb0265fed3fccf9c675bb3d0255b07b65a90c989c35760480d4e4 +f2837176bbad80ea0168c430e066802dd8f135d63827ea99efbde4650292a55b +4ed5198b0e2b6195df37a7312dfb3ae996f0321ec65fbe3312ec892dc0572a83 +d9bc4138de4fb8f3169a035d75336c14fbc50eb9e8bb2b9156290b511ee24fa4 +e75b957e38c4ce4925bfa1f4376f8bb7ee011efa988d966208feb93083825331 +fc820b3826b3237e4d9b1a9e13784bb3d62b5ac448607d6212cebd7605c85ab3 +11bf07c333964d0e141ba8a1f972b96b0b9a606b0c2f7aced108c8feb7f49e5e +d4165d0c0cce676206324b46a9d35f56936ece60e720d07c31aab6b1aaf7d6f7 +d2f6d66974ab03419fe8e3a9e3c59997e43063185cd760884d0e5e1bb1acb525 +e69713114e673154419f3545921e1df695a7321297299b915b68740445e4694a +1ea25e4dd33844fe2ed7a07bd4169806772424fbaf72be85492b9a26a9071ee8 +5b2061fd9439226431a039b96cd1704da917fd2dcad36869ff33ffd7deaee12f +7e558965208d632b9a0cd5f53d75fb6f83bf4ee5d1d534369dcd809d2095be2d +6bb5d71aeb99c8aee1567994481cf877eb42daa66159085ddc96d071ad04ee81 +5030f84c0e53a7a0b52e1b0aa408824bfbab3d47272de5d5d58663022fc6aea3 +8a3ec02ded26669203f5dd224797c39ebb137eb451f644c7111ad4d6ae4c51f4 +f200852906f5ac43bcf3078996ad8b0ece872fe2b4f6bb3935cf3d9a2f651ed3 +318f86012b7af826df2f6049ea9f717c16b60a222492158e496e51344489420f +b5e75c75cd339be419ba3a939ccfc52ac30b4eb5c2bb1e0cf26b83a6e19c19c6 +2573ca4ac2b63b1914bcb808a02543ed79cf82e86ac0e8aa25a4c36f11242d1a +a966d2329dda6642c5055dba9713ed80aee576e7eb773e878d0b9f194581a4bc +8b6597c6c385942066a6784ab87a0badcd7ab49099775864de0ff5ab0cc7fc49 +28f94b3e956678fcc89d51ea7adf5f9cc9a9be1531e8273fa7a30f660e38f5b7 +dde8f6efa9087bc90d47ff60d42f5d02cac1ecd2e37df3653966ad37e744ad76 +ca6edefd13182c89f30b5faa7d9c83552cbce91fdc2760b3de1e37c1d6b98c61 +c3087d42cc30170b03e9b7d3c12d23d313d6b5a522639c0255fc4fde39101161 +e40e9e2383602945a2283cabdc4aa4e0fc912f97370a23c44cbc55565ef3f30f +f62d2f825f63fa5236aad1da26fab87caad472b22217cc7050d53ae7aaef3a61 +5da0fc52c77aea9e8a7cfe79ea5780331cbc04646814d235525377593e264b0e +be4a122e6c65f4306a154129ef2a7f956e51b206b34170a91fde12abd927fc51 +9af3361f109f098e44d825ec44cc06b76672ea317e1fbb6b2a35cdfbb856fffc +24c7419ceb2deb162986847bf6f55f80bcc521ae73405df230f2ecd865ab19e3 +e969999e25d7d5572b50096d0145390d7a4b60eaa07315c5e0165db0f803b79b +426a97a0f81d2e6a021749d8deba2ed844924ef5652efc5b91ddd5e517030efe +cc99d49437e999d1316dd75e9001bf600fd412b9deb0aad5dba55eaa33bed5b2 +855870e04e1731878098eef5e396bde6fb719664635a9299e7ca60cd8eb65bd5 +7fea75f00ad58980f4377fa7f1dbe417ae85471934e6f6d7f923b7dedd6002fb +ec73f8c5db6043c0495048fab0d4f7c0beb26a5636b9e1cda69950ffc3bd792e +0cc722f62d3143bf3e64fb940dd73d91c06086576515b08104d124df6189b443 +555f11f33784d70ced5e9dd367ff79f31841a962e93cddd0c3bb08b2b6aea070 +63f43c91e19a2d299b48409071404a75180eff9aa217fdf07eea792570674a2b +23b46de701047e1d1f5773e608487f0aa94adacd8f256cb956c4113039b3aa83 +19795dd4b147ac14f4d15426eb490148c24ff325026f36c8c7e1f13feb282d43 +7ea9fffa95e0c81d1d9bd2fa6dc8681217f1c2fad7122c971872af83af7f727f +af0dc4eca43cd4d8838e6bc6aa08de2e7377ea63915da70ea1d55cf8d39a3103 +330086751c42d6a23251e8aabbd7aa075d30d503aa98e498ef3a4a620b286541 +5d0276eac2d544710e47f3487258c3dc1cc50157f770cf2373458735bf729426 +0a344e626ddd282e5efa200465d1084e8c80f8d899891ce9c6b9278a37fe122b +4b14795d49e86906432322a3a1ed6d4690d248705e6761a00409ab46d30cb0e8 +86bdafe88dc55549c766dc9af42b35c0f595050d7e70c0d95b9a43d5ec18efbf +13723c7de42c2cdbaaba28d23fa79b05315f31b51b3eb7573c847894dbdbabb6 +891a3b72c790baa74c4c0f839626a7ba046289b27b32dae77cf086fc16ef6b65 +07a52cd93b5f1c55124b3b11d8be7d5dfcd9c7d2ef5b7a88b887683c234ded63 +4f04261ac2b3fd98a21eb61df4064f69e6b970caab7cd6c26c3b0387d3201148 +2477eed979df27b2d475edab9e804c4a1123f656cde3f99b2bcd6b2ae8329d1e +656e85b818c8097ac700d3708bdf746f1c52df95c2a33050d9c911beff02bfef +1d076398c795edfd2330dce9512026c0792f1b40c5fe0432bcc156a8c20ef21e +2f0062f5cab18e14ca1a734e257d4d8d20b3afabe359d953b94e0eb304d67f5c +4d0f87c685ac9148e39cdfee0c00f961b4a13de1327b8ba8406882cacea4bc46 +4fe350b30f53c25638cc6453b7967af11e9e02ebb5d20fae46b94cd292c3f08b +71b366b3248ebfc63851d2cc0a23d87f719e5395e07233409dee21393e4666b7 +fb4abc9f66f14ba67f081cf7339f819a92bb17dd640d12b72fbec9f8fbef6e20 +8978a718dcc40f4f38579031cf93ce3dabfc2f2428ae4b815f14fa122899c5be +15b95af25f7d0fe1937ee88feb5a26d678db8e33e59baddecdda98c20830dce8 +83aa353f3ccc8e9d2bead8fed5f5e88db42d85a2f7d3d8e0e14b51f27358a8a1 +f68d5b356fa24d53a5f5dbaa62b6b55fc953eaaf120159975b39586a69f55c3c +95f317a37f38e378a25f9234c447ed889b95d0c3ddebbcde523b3f341b2de3ac +c5f21649632114ec7fcbb972f9601e6af5a36a9a899e49a2d60178d596bb9745 +10923e7302e4320b3010185168be945ac189567ed209a491421d74917acde07d +f8866332b7fa4ed7476fee0e0266cdae2f8224f616067143e903c3689b8e5a75 +47659b2b1c9f37efe2b7df4032843fcb1e24d99a05c71d3f367b57f44e27039e +87c5ec675ed4ef73841c99fa8a13b13e4ee786b8e90b79dd7856cfedfebbaa56 +f8dfde63d9b23cdc248e6959a8f20549fcd1f0e90902d9976ade27b809acc988 +2bf0ea5802509d2c859447c83bbf96070cc0228e8e05e08fd6e84b7538bcec02 +03792daa8a87f812608f934273f98dcf6e52fec785de9851cc159b72a3d9a46f +e7129baec8b790fb0212da2193ed51da8b5d328b35eeb63354b8023f12c6bad3 +661d2b0edd2703ef5b06bdafc58ff22f659ac74b0ee85cd40a069ddcfa905db5 +66cf937caface9db0309d2ace13c43b8c0142cdb8eb4ed557301f3f19d83b98b +07c71934c05cb53e68db065728ec2acdd29c4aecf348ffd6a5eda99c242b3061 +9987a15f554a5e54cff293429f6d147f1ad4e97a620ef1447a02484e2d80f35c +efa627d64cf13726d76b91aba683ce4251eab9d330b64a8c84f027999a8ce95c +12814eea28a6e8540f65615d75993df63973edc2f5362b6277b275a7ac39ed5f +a19e46f1539c46f824410bd6ae9e5268d75f3d2b70887266de4d65df95e13331 +afcb75cf99823db4c36cb2de2a8414bb92508aa2eff0fafb6114b781f19380b3 +e50633dfe96998176d24010c60692ceb709691864cd73694ebd942a143857fb5 +5c3fb2e8ff3a8a754d978d47828bd831322dec48c99c142395c108114641c785 +4b51e898ab328f18847ef4a68d2076f7721dae2edcb68ad4256722c3d3af3ffb +c1fc5f23680112a2d82dcbc4a12a2835ae524f94d6c69a47a1e1f514f5f5f114 +6c68bb0717bc746679e66bc7f01caed0e51a134eafea7d6c4e43e6431538e14f +b12af2fa2a79e38446cd32f8ab3a5f9c457a44ba9bd7fa5a59cb779c68021ffa +a5f077905e266665ba057d5a59e56e3fcd47221d55eebf1da1e670da660a8546 +bcb88b9292afec3b18d35bb75555dc1936dbe3bd3a7906c4ad8989015da99898 +dbab277e0f304c7d0150baff56e8672e0f00856a1531c941142d32614989e99c +f9eae654ccf0aead574f97c054f3a18f8076a9f8df8f2de591e6468ea856c002 +81d7ed4a9dc7a5598f4301f1a1cde5dc4ef41dbde654a0850658dd00ea847fb1 +1376894c9f31f5147f4005da7359f7a052e33bcdf347158899cbacfcf4e9fbe8 +c5c691188edf3356aa9187c3621a37e5b0e13395462cb855c2f6e66883c7cc54 +f221d6673bf1507932fc54b4dcea9e1ff60017404ef18213a495d1a28433eb0e +2660d7490ecbe82d768194f26e2d0706c1218582ad601e9348c6fd53060b6331 +c36e76859d82ccce397ec0b5dedae6be3965783b0fb9a26dec145ac775a6da10 +c876d8e34e644556637e620a6a01a3b4af4d59c9820c94b6a2fa4644b108ab59 +180c561b5824c658d60ec9ac7ad1c68e5cf42e004660759ed72c845119aeade2 +e4e194d4b611670e692bd34ba0156eb8ebad862d0be2d2f1e27859ceeb2e43d8 +1c8775268d3d952ecaf2b8bc5e8206b8d911b90c0c773f9563b209cf382611e3 +a0132469877092e6d540b4eec5ebf185283647ecd428d7674de7f960033aebcd +aee4e32f5d2740bb65883de50c479841f0ff1f150c2b4f0dd221cd181d29a104 +cc1b983a57315f5c4154ef426e959170d58927c62b7a1a6a3bc8f44d9e41227e +d6762b77b721366be102d4e33d01d52ba4d7b259e7bc76623550c3b01b792264 +0039f0be102b81cca0f4c1af5f219dae771360236ecdb4fb90603b12861a858d +d0b0f501ca7842c4bb1ed88b1dff82f29fcf35af7daeab39d1448037f268d1f4 +d9adbe3eff5219a11f3f006187c0386a54186fe5832b634ee93b0a2c236c5d00 +87dd474f36076ddb813f02345d066c0f2e9414a44060980c95b32fa4107d0f1e +bcb11d5284f55680b73ab54265fd24f3375bbf6448f18d96a5052136acceb70a +cc0f50cccc2b28456e4af36d76efbfa1c03ff007146268fc491decc207dfe643 +670c84c1fcf3cd2bf574f86efe40d23b69cb60ae8db7a5207fd6585e8df5b438 +a1fb54b35fb6963bbdfeba452fe6032d0e5c74966e4f2249dc4626459887e80a +97034ae1d3dc03f25187fd34b060dd6511eb3734a2ebc5c6764991543bd3b833 +38a2cb0f6121553d4ea2de3dab9b1e606dda33acc8f437cf55d041f624109247 +5107bfaa9757c8288e0bef0609276311aa55941e65c578265b8b4920c5b3657d +02f7e311a02cf8d09a7559e12e5db43063b817546b397b8c035f17e167c469fe +e383caed7f2d63c0c3a12147c3ad28b188d7ecd1a190ddca12afdc31f6d44503 +c382e8cf8b651754369b03c58a592a42a9812ef8065717854c85a93a1ffc8643 +b1ac5ee5662630c3f1207e2c30c71de595c569fff3a94de2f9c53fd0b9fd59fd +b92245223198a7ae787aa67f605d6650977dd66e11a11f00bb82c6751f66558e +0b7218f4d84bb5786e865662d017fd2b690d2c561e78cca6a7c102774307aead +e037ac0430d377662aa9e725e3bcba890e9ef95c0094b79d4b4ee734628970a6 +23b3986b8a3ab3a3755225eaa19900d836548be5be83adf543efbe10b3c55660 +05398f2522e27273b340add67ac370845eec7b6a58cf55c8906949d0a8ed567e +c979af23e36fae0be6bd3fd2d8c6ad87629c7dcbce55fa7ed764507e07511fc2 +166db6366582490509e05b9ffa8ca1538930573d05ad6f5de5939aa8796ec2cf +2e79a9b7bf66e7cc42405e188df5da27b66b80c83bf40badbda185820d9a9773 +1b679eb16e349c987190e51c80cb2792f4d210202934f0df56735f4282395269 +ebc4c70b25cc0c34c722004574e4433756e55f9725fabbba501cd38b4ddc572b +1fce6cda5d734dbe4d9e6fd039994f3d1f4dfdb6e0aed0ee8573a52667cd445e +ba950f4cae1d77040a4bf00a42dc63e768e3cff9bb02d4a8e8ca12ea601dfa70 +2d88b43311438d065eaf91dfcbe3d6f6c1dfc11ce61a049f51444da3f682c48c +bd18aaed4744580afb7418ae05f311f00cc1c5ce3557b5dff72671f58ba4c6b9 +27d986dcebc898d369e46cc327da1f1cc53b9984fff44f1215a2a65073898e0a +4d1840b1247b61a552065307c18b8bbfb4b0d14cdc516e93801c111a8299d020 +048d799760d9ca19ea2ac938f7d50e86fdde14fb341c2ffe307beda05f1b1670 +7c5dfdf9edd96b088a60503e05384b1e7b459ff12d0f7b62ce574d28c29fb0c0 +38dafeda7dd19f96f551f4e2a0e6fac85c00041121eb9cc85fe9edd0d19469f5 +16ce2d707521896f83fd8b13891a7e9c5c4fa5a5b5f5fcdcff9b66583aa6213e +abc95f57060ea4a59a3df8850a4dbd2be7a209e9283549071cc76552696dcc4a +4b3b9667a69f3c520c075bdaec71791ea343022037d684d9ca7fa7a4cb7b0ae7 +1d16e2a0247ad75c045d5dc4d3956882d8d074a8211257ab33e504175ff80d3f +3570c3f5f5b56210bf61c91fcac02377e544369fc6e5404bc24bf61e3ce3aa0c +40f148f6f14ce9ac11a5689bff4fee5e02d6383524f2f2b96055cf2067591518 +1d6a8d04a91bad0d5679557b6b0b7e7da0995796c8e7e4725a2c279ebc777187 +7c6128d2d6ab4d1a1e0fefde58beb1b5cca7521b4d50e329866a32f13bf7fd43 +012481d8f6089d81c625cc11dc89b31320818e1dce321adaebc73effd87afed6 +fb3789ffd783eb785046f36048b0151aeab0ba88beca9e28645bb12dbd3956c2 +8929ec53269e79c437cd957953c06c98858b9d8ae228149878b0b822f30b09f8 +bb181847af1d98e000b700656f6d26d50799e4243aab93248d6e71839bf0187a +166ffd6af616f3da4260c14812d2ba5deecba04748bd9eb0dc6555ffc9627dbd +8b72d646d2f6c627efd7205668fabe6b7738010e01bc3d110849609ba2517733 +20561d7caf8c64697d7ea41e9c24b935aa9a3fdb7be49cbf58272f309ca67eef +bb3fa4ad48104a3eef4732d165fa4e4dff1dafead9d8f094223bba2d0d8bec5a +a15b0347e69a77136ef8acd7069c1e09b15024079a34e2c17b03feb2df6bf087 +779b6f46be71b2381d47d9038cf206108a903750e6de1dd34bc1fb8e1039e722 +15f917de89577ce14a18ebeb46d62ab43645507f5b0f990bd24c74d9a92c968e +19091ade5267591a2f098b937577aad4eb08e0f36d409a274281239f1eac1a8d +d87fae7a37aa67b2ca1dbc89f4c0f6af4413f51092993666a6a165518b2707c4 +907d5da3975b74018c40185a4c87bcdab5e1fda68b06b7037b7a17c0abe4cb97 +64e5885bc4c1893aca4c9594dd2ac40c1b5fdd992cebeb64f9b313d501d83ed4 +80003ea2e7162620fe4fa264943457693652f46c0f0b1843aa61fbdfd657d35a +bc866e27b63196ee524eaadfd05621f4a131cc0d38b8ba9982750d4f37d67a35 +77f31526a39156b05d36b8124ad2d04ad6010a473703ffb375d68c629e3c26e2 +efa56cb1a646306ac001c35b8e0f3a7ac3dbbe28a0c2427adbe16198639acfef +4a90f273784485f91821353589e21b8cfcd4b2289344b55787e73a60f10cab8b +5d4b80f0a782d9900ac8372f9b3a91bcf51a1f61742a9435be4b727241b9df25 +1da7e1110c6452584f5d50a01c158fcfa25b02883750b175e38b1d3ca2a9f856 +0eb35e4fe74705be34321024a38dcbafe2a9bd5a150d25785b32c563bd0a2d1d +7ba533fab24e9e4f25ececf5358fa9eb20488888d1debe3c8d1d128e422ad0e9 +be060be8259c006d9c60ad2a941aad8f2c61d15845da8aa762887ca83bce6fab +95ba074116ddbd7b75d97c6b9b093e3d9d2f5a4712c303dd6fd89df607988672 +cca9cb44927c42a22269627d8de165b21f1322431bbc890b451c75d2262186f9 +34e94a9a47515fd781e202ca6fa1858cea4045b054b2e81bdccb91934c2acc12 +2ed64594da77ad6edd4318eeec31da4844ea21afb1eceec5def9487ea1dbee9d +98f3d25c7ac04d31a820ffb086d8f6b8c7dc8f07ee2d1e71034acbdb1dc5010b +48664f57942cef1d3909378dd2e3c8cf227ad0d922eb3fdd8ba2c0d2b111a03b +57815b9a730a9e7f07c496d9927767ef78a553cbff2b54f40b9edf1cdae529ff +5a45a956e84d038ed29dc69710610e199e2651968e81216e659c8cf32782cf43 +76372921d21c3ffa77c1f7eb7747df7bfb6b248b125069a2a35b1a8cf7eec665 +c3274581a8d61f144aee9a53cf41cc101ff890b4d436508f40f029a92b3c34c0 +19af97305cba83a53f6eff10dbdd36761ea23ed18982f24324c7553d95a23abb +d75e481c1c71a7f74fd0e7a782661cabbc1f9ef627751e268ad83e9fabeb8524 +7718b7cd828dc8fdd22d8e2e05ca630c509c1ad8f0fb1ff6ac5a392e4c6ac37c +dd69c834e09e2965db779a283d7d8da81e04bbcf40c946f767730c70fd8aff96 +90940afe11f17ce6bd33e010becad17093591a8d7e82970bb951be886a94c3cb +018e20b2531b541681e428fcbcf63b3ac53184a1ef13d6beb04ead746bea3486 +b4c99434a1c8e9c4292583ce2f87558c81bf603dbab69f9fa8efbccb2e8b4efc +364b5ac29846ffd2945f31a838b698ae53e05f56f85e940034bc5955407aae17 +a9fb9453a945575bf1f85ffb0e6d225bcd87fae4e4551dfa5fd1cee5ad8699a9 +06bf885cc5636df883886f302693550841cbb1deef0a6dda069818e0346e31f8 +f87b7020734e8ad1a4a4013c387a60b77b0190f800ccc931d5cb302956263797 +48e2177fffd92e38ae6bb0621556a1a586b74f9c1d425fd12e9f008611a51efc +4319e4225d0c6555f292750ae1923845919c302d56983adfa97075fcdc806d28 +87f94ed91b0375803c90f35cc230865314fa0469d2b2a71ea1c6b29437c3c3a5 +3bf11a93e31b32d0ee220250b87c9934f14e4cc923d1d7d4ab086dbc914b15aa +a79985c970513db533c6e70fcc45450c93a1a032870056a12bf5268fe363b223 +3442e653d0bc259b98620583a51f55f7e89c16a59e85ce66ae056a65dfaf0188 +0b54deaf30b8e21280d98a9bafa0f401fc25a9d20a9a422c152139e3a040ccee +d279b8587ac04b1437d8fe2c670ad4657da79ec8de5153d026d008a912f22289 +996013851fc74c03426abbf16d663850a33b55f72bdf0a3bb20250d9f35b6c3d +97ef7df881335b256b8f1846f227e8cadbfd6cddf26545512c654f1a664ac67f +ff3deed538959823a151e0f8373694d529c9ab7cd58c48dd4717ac19a965ea66 +6f1969df92796ce3a735bf19b92157b9ccf080c2aea7be341cbb900a03896b7a +4ca46af38c51fcf08769e98232039bd17682074b4eb18f30ae9b7dd3fb763511 +cae6756e5998a0a7aab89c620e405ceab692c7d185d6db0cf500fcf89cf1a9cd +0e53f0e6c1eaee82065756bd1708a824090de983655722dab11787ed865c0099 +005ad29c12fe12e4534c0f2480924d68e8559f69548e74b3edffdeb5abce0680 +434f1995c334a8c9313cd2db036ed014a491867103152a4233ed72079f089b9e +39338ea6b5f3d595849f256ad65d9a167667ad3b067a85ff3e541d276043e08c +6f70721738c8774d37d209478c00d4d4bbd6b7fbb6e07b77afa87e1920abb8fe +0a146d9e6d4f18d695023cba709541d29d0d26ebac935ca4c00e28ca8c9f2647 +f5b515a8c956640a607e1af85afd1084122cdc02224c754755215a936c162ea8 +31ca8c0e5a7119968d2597b0998cd4fefd12b0f69e30746d04345406231366ec +b3bab2af4a2d70eaa61240554e1f8e8c1cccd9880fd6bd83a38b54ad5959f576 +9d252afb5b5b872f0dc97104ee4ed900d1f3aae4589ae85dac85e65634397c6c +4da85972a0d0c2b7000888149280ae582ba889578d7bc515d964ca0b5bc92219 +bc3a090d59bb95adb230b1740b8380e5dd01a27a221c2fe1e668a709dd24fd11 +d36f40aca7ed7f43f1ce0e28c50597240d4380cbf2a181bd7c28b5cf4c95d9c2 +84a4fc3c31faf4f9b3b8f1cc85462711fde23439dca3972ee20d651d634aaa6f +2d3539e8cf072c9da68a01cc89ea935de070ddf32bc26d616410f526b37c89a0 +ea59a1bf9eab03c5b85ef2f8c8b9848004e5c3490351a7f1aec48469140b0676 +2b7286170efbbf68ba09db77e17de523456244593c09acd6be3a9db31a3a56ba +f4f0de79619a70eeffaa33e1ad9081cd74057b5d81e2bb6bf973fb50de259b2a +6ab55b0c9fe89ffdfa0da2c7554360517b6cb4d75eeee0cf2ec44cf682901864 +c9aa7b05b7105a639e4a6500429d07d7ed9a578ca329235aa61bfb5b459c75ac +199b8c2e436a0c73cf6fa9897aac3770c4c6f9393f6783d47f2ef1fa4f86f2c3 +3058e1dee447e0edcee038efbbb4192cd1c78ca28dfd3e9972ef52d1d2c2c96f +abdead48507ab80bddf2550acf1cc6b81d29dabf6829da55fd64464f365aadbd +e7d6e972cd3208fb6b679d6c780fa7cfab86a0e86ea8e91367ff53955a3e1907 +c78d7bee62c13e07b3e1b1b64639cd77c21d882ddf4ff00cd7d46e946fa42d56 +864d7bbc34c7aca481c027202b925114354810a18cf478409e21b87972ad166d +3fe61117e614d7cd7f0359286dc0b5d16b6f23e627e8b60dd94401be46474820 +1d4a98f86e8713dea5b3c25a3ab4e5cc932d86893ea2e6621473e51c859933a1 +a19cadd311b929fa9e256b19cf14e2bef6f488aade70252a755f79193812531b +8ea1a282ae48aef06fd590fa1b04f89724647ce2bc6fd021d9ae5e92c5a71f25 +3f7d28173062990a791d17ce8a924c89986b25e5cae4766c3cf5e9fdd3916c62 +6f553b2aac5de8c95ab1d7b56dc0516982a62c5c959c82736b6979a8e1ec19e1 +b632b280c616b7e37f74a45b9ad57edda4b7489eb910404e7be4e7edb51271f9 +8dcfe910020975acc28b7183ac6adc56aa6ee68bf690e578591b68b4d8b04719 +58a899c6f2a2aabe10141b0656c51becc99801805b27a8837205345d1daa951d +432b525f0a117c0495aa5bd1fc44806fc163125e2f116776813d8d22427eded6 +9881f1a5da891e97e181ed339a083ff6821e99439618aecef62d5807929c8a39 +385697ef0c6024f5c2880a264aab6fa39ea54ec7ac2f263307c2c3bb132684ee +4bc7cc9409c8e71dd8889114c69bb5c9f87f0a3644b3debb285f86856dfb6711 +cbc133ef3b853b448267bc2aad471fb72f52e21a94c526dfc5dcbb86d4d184ee +9a463d5f0acb7254fbb89fb2c964b49253d450d0d20ea51bb47ae06d999e0a7a +7a91be0643e555eccd04027c1d7b5a52c0cb7c7541678c62fc27b4daa63eeb6a +17ee67bc4cc6dd1cff171b33c548dc22a21e24dcafd18012af1b6cea9a1b84eb +8f0140383c4b3ea250b382d1fc62f5ab4ceda8b922ac11de48d288b65a5ce4f0 +4ba12d997bcfa09043fd128509bf2ffdba507f149e14b129cccb9b4b05922c66 +eb6c724600f6dbc678c77456bd1b302a33216e9bb9927af9f03c5570ee2e3df2 +8d1690661298f0a9c915e435d17cd7b3dc739f8bcd6a818dc03ad8c4e671b4e5 +c9cbed7c326ed83612a6affc804721e0cd2154fccd127d83e7e0b699d39a93d1 +09c7b87abf7b85e177182930a195e6b9977b0b159f7164efc4af6b71e91f2e8d +a4376ef7ae61c6e4e0192567235beb1e7fb1cfa1d430fcc7822d7ca72a47f654 +ca13ff6bc28c1b24c2738992ea833db434bbec0c7518281beb8fcbfc4a7fc994 +ff1157d933a952fd2f441beae22bf3ad77501a206d12f483112b2188ffd3f718 +153eabab1c553d0fa12670eb6f4598a99bb771134f1293c909c288201d42a2a4 +d47756d8efa9eb1acd391337395ae4f22b33c225488b268462162187b674966b +3995b6665b836fc97453e6376bad09eaf80580c2611d4a998f19137b6f0e8e64 +ef0dbd748e911d986900fe0f07ce0e915b072e8f0c5ae78778ff88a0f8f36d36 +8a16d2788e5d82409b95849fd292d832bf5e594da719d2319261151bb4979435 +caf30b7dbc473590cdca8d766aaec58c9b4861a254800e82f808da18d4d3a1d3 +e3e5b602d2293b0cfdeeef0023f65c9f1c5186c8c8b974c93d34f51def512293 +72b4175643464ec7c41b4281cdda953bac614405de32c9ac738598fc5b4b3add +3b69f7b887dd7561ff83da90f1f8628687131973000f2fc667d1ffe303fbeec0 +c599b22ca38f9b028e46035c9738d7b7792cc298b7cd11dd18c10e9bbb7c1a49 +55b749226aa0afaa68f2f7b8027667daafec604867d344173ecdf658f72c92c0 +03a8aa1831f910678c83ed5ee662d42db276695bea37372ea16057ec67cc6727 +9310e88afdb2b515189fb004f2bc003ca4796d3a8d19316451b9bc2b13623626 +a5d7256a097588b3b4d301a2b0f59718257bf17728d9abf2fe46e8606bc6a2d0 +73891759d154adfcff0ce603f15a1ba7c721b0a2066be9d3433a1950b71a505a +25503680495bbaf1867b19213a84fb3e5d67b2dc2bac6f0519e783df126e5502 +d71b747171197e3aca499e8b3cb3b5c70bf0969fe4685727536040b70fef3607 +e888e351e6b2ab58114dab4f375cc9aaf508db81adc8fc848aa4d1620a7d80e8 +48f92986fa69d5b9d7c27dbc711c55c53c9cb58637c3b824d5f539997315d03b +b14d74a363ff6d4d2661afb2f5bb102e5445ddff984a52c83493ce3279d6755c +4d +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark + +%%EndResource +end +[/N228/ArialMT 1 TZ +PDFVars/TermAll get exec end end + +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +/N226 [/Indexed /N224 /ColorSpace findRes 255 +<~!!!!"!*?H7C+!2RI+EcZ;CFEDVIF`hkNG'A.SG^+IY +H$O^^H@(!cI!gLkpkDM2@+I +MMmCNN/W^TNK&sYNfT6^OH>QdOcbfiP*;&mP`q>rPa%GuQ'R`%Q^=&+R$a;0R@9S5 +S"#n;S=H.@SXuFET:_aKTV/!PTq\9UUSFT[Unji`V5C,eVl-GkW2Q\pWN)tuX/i;& +XK8P+Xfeh0YHP.6YctC;Z*L[@Za7!F['[6K[C3NP\$riV\@B)[\[oA`]=Y\f]Y(qk +]tV4p^V@P!^qde&_8=(+_o'C1`5KX6`Q#p;a2c6AaN2KFai_cKbKJ)Qbfn>Vc-FV[ +cd0qad*U1fdF-Ike'ldqeC<%!e^i=&f@SX,f\"m1g"P06gY:KL +i8ESQiSrkVjQ#=_jQ5Ock3(pjkih6pl07KulKdd%m-O*+mHs?0mdKW5nF5r;naZ2@ +o(2JEo^qeKp%A%Pp@n=Uq"XX[q>'m`qYU0er;?KkrVc`prr<#u~>] +/ColorSpace defineRes pop +%%EndPageSetup +0 0 612 792 RC +BT +/N223 1 Tf +26.03779 0 0 26.03779 90.03318 695.64808 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +0 Tw +( )Tj +0 -1.14749 TD +( )Tj +T* +( )Tj +/N228 1 Tf +0 -1.14289 TD +( )Tj +/N223 1 Tf +35.99699 0 0 35.99699 90.03318 415.47138 Tm +( )Tj +/N231 1 Tf +9.95919 0 0 9.95919 90.03318 398.67279 Tm +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +0 -1.14459 TD +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +0 -1.14459 TD +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +T* +( )Tj +0 -1.14459 TD +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +T* +( )Tj +0 -3.63859 TD +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +T* +( )Tj +0 -1.14459 TD +( )Tj +0 -1.15658 TD +( )Tj +ET +q +261.09819 0 0 103.43139 74.79438 496.94459 cm + +_op? setoverprint +BI +/Width 1088 +/Height 431 +/Filter [/ASCII85Decode /LZWDecode ] +/BitsPerComponent 8 +/Decode [0 255] +/ColorSpace /N226 /ColorSpace findRes +ID +J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H +>q_R=AlC^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mioWjnAY&^gM+`4=1jRLW!YA +=M/6)*KS9PE`kN%="Tc_Aoh+fk'&t\ctIN)4XQLiVpoI(>.nOW?*DmsG$@,,f58"P +DKfeXi0S^6MAH=;fBr>1IXb_>kP+oS^^pnX!PjdJ%0OEX9GI`IODGpB_@VYP +$,Ve*/ITH-bV]jIOR,+@`"`Y"/@)9.f?D&^M-b]OrH +OmIKK1>PGuZpO^p!!2GcT28O\ +I4!bfj*`Xbbb=u/V&/.iEF;`ir;A=m'3O.'W3o?&A5QB+5?V)&j!@p_!;gk6g30:# +(YEnes'OP]B]!jQ7X`Zi.#.]*FOda.3&fQXZQ^LH7/Ljth%ulq0<"W1O+C<)IB[NMZ`5dM@FdGMa8AOa'JgIN('$C"_BhjOFN#QEk\q +WGaOO%;1X.-2k`KOm3f+Q0'oX;(,e:DM"JDH7aXXh2HpBSQ:'%&Tm2qG"JT8WXTuO +B)7IMNS^Yn^SL32DR.An=/-KlO5bW9H=O'sJ#[1o>'I%72F-.Ij]2QWS.k`Gq_IDP +O^EcG9Ea]PNT'm,JR?Z>\&71Hn\:^f)%<(M)892Np&SK`*1C)O,g]o1 +Q&lNoHA,*DWWOSK6t5!;MGo/@o+ng^qO^t]HR=8e\]'(0ht[>*Mbos1ek?n5T`fOu +q'Ea4JHO#PgL*X9Yn$MeYT0X%A?%qUMtec)7sM4X0P-,-ZTc!g&0H@Z;)>o<4Kng1 +Iu)H?[3W8"W+'HtL.e@Y&BFXC*he?,lK)TokTj:8qPo'#&M:/l +FOAMi)WJn/NH*I59I^<:l%4ejL'D!?.Y7XJ),tMD&-p"+nj0,CAUHG2Rlb@I$n +'h)V'Ps2Lq+uS".:HRHfW$0YC9GP'hSj\"4,OOHtfeTC9>3/J]PB;E1A@Z@i9l;)< +5"Ur"*gp1l(pBu9tq(`r*ZfP +A+4K3]'@TA&??n.8PQEo=%&!U[38o*,a"]%]+ZY65X[:`M(2VauYAOmJu-9dW'S=;L0a$$2WXL.0H;pKtA"H:P:;M:SIM +BZ>(tPW"pDE7d4]CcoD%aX2N<)X,K#3tOhg2A+*]e;imtUlVk*-GZ(!jH5G%R;Pkr +>rp&]bN]`$o^PW1bb'0C9SL2S[YIPf:l&hN';`f/i_+YQMsg!KO7PElh,uL/nZjCQ +mQ"J27#pY"rYtnsiB=m#%$=fn*+Ue"73]2[Q]\CPq`.4Oil\m%U7F9W3.W(/5QcV" +NUO?6N,^+I2+6rVou.8^",WLXLi$IkB/52l,';b0oq%(sS>&7!$rMbG[`%\/5=jEAOE#qDa6b[WfZse=.&R$cI9mYpM'hFVWeUjMY/$he;JP< +C/#to#j)Tj"[1&Ccc/@geS4a5bcL_LNP@H>Yq[+``fTW]ZcO;cd0+$Q0gErQc>N:6 +7f@+qr^$OWkhI_)DGZCs+pSPJ+pbt\$n'8f?B3C[KrFQP..IPr,0m""@TpiHYe!MU +dmTG)01I4g%0GN+OW\!1iqVKU&oqqJ.BKseE)IipT*>B5iC.G]U'-kqE[3>&;_@cN +7SNQpFRDhW-'4KeDl3F^V$TKjr@^"[!kAT;80Y1:#\,:S`EN=7poi&7POJKQVIKsb +$;La-:I/=mKIG0@>iJT0pFXDqUAjs7BHYL+$cP1"n5u@&`;*jTD?TT.Y;e+/`r?H" +PCcor:[0),UhI!t8Ya;0'K>2Zk7,$V;$VEP,oO^DY$VQ%P$HAHnsL$me=.:.jdrlN7p^YXAWVC%`5nEb.TUW'2@96OL$=s:&gD+p69mq2C4C)c+Q#N\3M +DcBf8OoacC-7%#W7@Y%]&sPq@,/u;EnO1o>ied1],\cgO&K'bDqDE&+E\0fil:`)` +*,TKq#QapEk2Omjk.P5WUe^pb#TE7?V"Nj`-c3J2EB59/N>[`Q&8edbd/o#6SL,Nu +,-ST-N#)d(6QlL:T8[#";F(+R0,Nd$)WDN6ZC"N%<20c,DN;m[17TPKr?5Wp*V-qo +OU*)'?SCKkk-G:HP/nc^^D5m]+K$S>@MjnpTEF_9-cS?_67X$+jrq#SM@s/E;0*'g +1k=#Kg'2F=Oa'eX`d1,O)!D&-BC)6W*meZ?,7Y^B_1(GV&gO3W/h4RZdNKO6q"a*_ +--cuGTtX5dI_A''ck".L;]m5S"##6B2^Z=N8tu7T(?6]T+JMb7!\h\mjUt>Tj&2g* +NtEt\"Rn`Z)DB_eDLRSHf01`TkGns6Z2dpB6=MR3U!mNpPPAN^3[6C'4,.r>Zj`+8 +HPg3t#LbmM9>]d="$.V8!j1<'M[LUMs#S08Ws:"$64kb<@m`SG\a^P(`eu@!aTp

    L4&mqeXQ=CDmJX.]JY-VP`UBPGsEaU"S& +nQ-Z]77,L]Z,Mh&Cm.Gb%b`JFr2.8Qc;+,_@VO9m.86D9BTR>C?n.:'!bmcb!^Sg6 +%"8cR5)'4%oGA`!E,EH,9PoY2b2APlr*^73:K)pT$G-G;ddReS7fkT"Zde3XJPjoD +,&P:R/9Oj-P;gY2\S9832"kjpegF:Arj5L;PoM;l,uPod)DkXd-,e?\oTF8FY_TDU +U'Ag07n1cN+\.,jPmSZ#>65O7>qc3^kB/Ws30&S>3QtV_mTO/\.+%F%_ZDC2/Z2Pq +%TL[+mZdulQ!Pm+m]^hkC"('R/hLspjd8%,m++C:kLLa*LJ-&dNM9&KgC_&/+VX)S!Y!aPrd_CE,$$\J#S9gL7V-b6=9oTSmAj^5"SB*@,HA.N@L#nB-!GmE +q5Pf3E3TX%)qjTOELP+PIr<_4Oe"9Up!aJePdA$TH].O(+^<_ +8n?KgWc198>>%:*o//)j:j44$C$(X(1HJKXl6.S(Gg3P.:@OR+%[9KnC]YUq1uPF= +b`k[D@b(?N[RD[DFHs%_rlO(#i85"7faD8e4k$A8^]<@(ojT,1qh94;hZs-BmT3rqKM,>388NQ#(o2rEk,HDo% +\'BYbka;pZlQRgriYsa%#A/'9cSe['$b5u?FaFh*.]a'1Z#`(f'[RYQ7&_IfN#(m5 +iZTh2ogjI1n0`%mNekp\H'L4rVG+iaOC8_rimCnJe;$<]U5P'lO"bsXU(pg_+'80a +-#RBA:doLT70l]9hQu/a65tJ(U1u5_M^u1%Di0RU=t5`kas%>c%-Iqa)CZ:;F12Q$ +<8V<>@p4"W+H9ejQ`4D[ANO<$24'7''5cio>d!`dNe]D%#:V%,J@BB7@U"a7 +6[0(Q>d"RVf[XZaqX$3Q+Y^95XrWT]qOHrO=VrL2bj$>`Gi9)&Mm#16V1PtWUP`M0 +?/fW)c*F`Oo&M +79^H:B+QScO?#moKj&Mp-MMDuH=@2$JuO;N +a_ljt(c@j$@lC<7:)>.CaRn9IVW(=kiDHs+$*5ZPWd=Ad+P(9RFkA&/'pc7U0p9Pi +Xb7gBnn'1lRl!!l.h!Rl%'@[[L)=PDg2S-RhHWmq]aX&PQF%mc2+eZ0O>JkZnGMJA +2$Bs(edde^"`"MQ)b5/:+`O'GcT79V5h`IK'Cd_8U:[')-(VmV1m&l/6>X0Y`Cn0* +[olB)"gt35ZZ8%IK@)-GFZY.fR(.qR]:$Qm.%h`pkqdK(=Vu9iZ4Dn;n0-9@9<_'g +qXu(jr*epi-7ee:3,+a(W8^h&+BMF4L]`u="d90b>>s1i34:0&!BN)qbe#ZQDYs\& +OE.C]0"*qeFa0DX(>ME0TeHk#g;"k87Yo3^&X=*;U/LPbHMeDe_ODBN&8SEEi$"(g +YK)CZH:T1JI(!3[5=29!.-g9G6En$D.d/tui1@I'94TL`+7rkcNMEEr8?q['9]?dp +V!#1g&#q@#'C-"[2mu[;+sDuV+]p3<8-7(RX!&*m/*^]!H^H,EFsIHf:)+MAjsIsu +JTQ$_Q\$'(b4O18@,`$JH2BMW@M?PZ0u>-Eb'VJGiEfT$9V/-?X7Sm82N\>K`$UG, +#]>BW\_)H*b#+'j?#YHkeLJ"Kb,j1D=UlSn2/odu2iZfg\jX#5\"/Q(gT%XXUMtuP +P=oSN"Pu1ueVnJp4$O?WO$)12PO2?<9Zqu0!%[V^TWt5s,qHZr59>24b,oHsaU4@c +pHG$>_j+FKm7p=#.^j`t#N?`E8n?d?%nAbU+^;l1GuCJjAOiITJL@eHcNd4iCM;]H +_Kutr9:9oc053+5Smn5RC0e<<,[Qli.9i'lA^5?5QK.o>,\A??gP#5]RVN_I*3jf4 +>fgq"F(*b^SG+=8AZ7:q%/1@Ne1.ZN'FfL#gT:N9?a&d/R+8tu,=TU;bc^Vj-V_^7 +(=_pY=34Oe!cNWAL>"@CSd?od,*LnZ*@Sqe"j@IA7@P)g06QgY>HjI65-(Eg5HUm$V`9>VD5:-SLligiD:D&+S*qX8U;YMoV=m +iW.kc^u1;DGe="V5J^cifQ9;#&W&p5mJ'@]0c:M?O7AV,4t.M58AGN*qn50(N5[*+ +flXr9s'Nkli:hW=+E*]D^_;"3rX,j#!$cRkOa`#b-c'J3pnXpR;5m+*oB7=rV\lGO +*VB^a/g.p49agWNjP!f^Sl;?6WStQu8=h?k0RAS)N=N3oA(Cp4]Uou^hI9DDj$*ij +WE#Y#C=o:&n3R04`Z3pnAHfH$Alf<*'Xk3 +Elq`=/F2#("KeWp@-#OH"5(=UW+9/l_MQooGJWO=h[i;9it-u=b*:3A0'Ji&,Wq7l +*4mFP7!uYn#k[K'Viu]S/[Z:h5+#9Llr,VqFTN]Na/t3U/#+^bLpa(E'cTRbZ!+%S ++EBM4rZHlB"];>"j^+6Q.GImT;2WU>L`?$i2SE.4b6_OS@!SAMUXha>8B(,iLLMSG +lD5Joe?Wdpc#S\;B7LdJ#;Wm_h;^l![;%=rU+c1QMi$Nl_XC$<4+RFL8>XT3;eUBINJaL.`3f +PFj+DAu.:0\UF%`lWG@FJ"i8M-&:a81g75^[PKeNmjKN)Kh'diBaO5UHDO:]p8XmL +TQpIF]/o#%N/Zik&uWUYE$?,`lKCb\!q2AG'sJgg@sMppq[,pCm#')WQ?+NKZAPQD +D\^a:&ZtN'-2ec[daL.lK]lq%W\4bTGB4XrW[%K2_"fQP5'QI]\ft5EMF\d1NTGV_ +[+]lTJZbd'$l+YrR3(neiVin&M+:a`WIaL%h`e_uaS0>.8-kj)dIDK:SLZGm^Bg&j?kTq9`!g:u&ADWk +6s`MZ=[EMkU:;8?-m:(Rh4cm79UpVD3NdUj_dtZcUOa\:Aem),G3L1kM)tasrM(@_ +mTThl8d4?$1OoXW+;ck'F&;s_2PW+=9ajXUYtTYb_Cku3I'f0_o]o"MA>g^*(OM"X +mlm-ddDUFK,iZHib$o-?>gORF0T`78nc^8qq[d_#*SCepe4AZ-6$>Z#GK8/b0BOcH +6P?WFMtr[@,`*5*bE85\1->r^I&<2ZL$Q`V:+,)d6^:7":lm]e<9JSo3+>'0YEiKF +_u+@BVljp#Ze$E77!O[>r1["*H=,_9:KPL]`/qtsAuQdk757e=9kD!PjntKm+o[ll +Y^\GI[2a^6JUg-4Z3SXT\0DShNC:ek^B+3ITV)?s&8B6'$CjrqkO"_]k/&h:uU!oOR[2"m"MP@eKAS%B0a`_E$";"T_:3Mm656WOR +[\;eWfM[<(:^S?uVmb(+Z,dH +4",o'X/212Pb'P&3I!nD7$pX`ke:(5^mHTo"q1/$j;j_F->kEUX;$9,O88!202Vk6 +!BaGIiI2a(TKfP:S0*F[O*] +;)L#u#Hrm*)qcckE%ZDB_$9b@d=rXun[Ta`2!4rnr*HKrNC>7;K".F^,4Uc,.0]M$ +.BU6/JV/6,bca.!Ul(2MeojiXjL5d:O?Z!L'A'&F1^C.qn!k&:r53lAJGJ_D[RV\DmFeAOE6[;8[9 +.iH!@;tDl8NC9>b*c4-@,?j/Ur7.A+YL`L^s'$`/:,E9Ld4>f7BiBMVW:!ksN=;+] +Q852n6rkFm7eL>F;'p6kHQ\dXle@+$Y@N5qbpYAKO>F$Qp(]%#c!JQ,9=M"3@Fib: +gMtQaWH9bl>hqF#A%'1R5]Z!:(BY^E[/7ta*"4@Z:f:l +pT`ImYn0X'X98@ef_4c!l[g4W'rM!^-M)7GLSJG`r1i:_1sKfAEc3`t&%F:%O3%i% +Yis+[;7sf#ONcl\8]E6X>qJZb6:ZCQ>Pb0*^OL5=(;DML\@qA%^QBPT7QHqqPjlF, +SldgljUB,pr;t1Fr1hWjFSSn+:=5-tUXobt4lWnde9=G_?TDSomDFFL/S[SfC?G!+ +Ztj7c$jrbS=&M:BCO+p-LIr=^cj0PFl(U5Ufri.D6bSPd(Wq+uRF@#MZ*,?o!\r$] +%,\:s)ppZ]=5T8JQ/#srVVpH=\N)aR3;uZoqAI8pH2bIGh]LXS:RU>r=]0_Pa5BV* +IJ>I-TBJ]qG+anR=;d>I-qIC6eZ^10.)/6ZBC.< +#T?W'@eID0kDA`a5S/F>9CViUqD5m\g\U] +$h"EX1VY)/\T?:P,'H*l0=$D##5f'qHj-C2V$NibS;Zfk)@A`c\>*1t-?pW#-jPA% +&r:VL5*9+]O@R.H(U1ss_Jl-DUa&/3\>P4g5]^6kE/GIE#751G#p:V2'Bfd&%]Lk_ +_H\E,!Odj%(btA+_(^Y>$Y_mf[m8.tOeOBJq?&GsV2':c_4k,M3?"f)'LFVnUWVE0 +5_bZ$I#7\+Oh`Wcl]DJD007Ir%Vi>LQp6<&/!&qJ/`EWKWqdL[q] +r(fU?[(0itMLZ5WGuKHD9bN$D/PF4fq#>nj[RS)FW,uu3d[5`9ALE!UO8OGr'CRLS +RP3#8a+>s3&ZZ6A)2a"3`,!LIq0W8AMTG^IN"hJr.><[.XY8];"oO2c'UY"^Kue(c +8;!m,q"G@mXU?P^JGJPbr0G@PUWQ!#X@.1lOlJIGV+QE>]j&e)PcDm2)Q7U&XZ:R; +goJTiYKI'QOfPA%1pK\0@@FhCb<32U@(NBu:T9G]b%.s(Uq4aVBIGDabIkNl>$).+'@B(?)s"QW +8aj)V(=@gQd?'a'jVbX4bti0q;:Q]6!pqgU*[7+<;?\5l,nj/k,-6'2d+'C>AL>`N +916H@.7%"^ALUNb/'\OAYT58=R1@UR/lMp-c9e>Sr@p[n/lOVado>:u[0P/_T9442 +;gg[TUsCFm3gB`pci#t)jZ^lAQdT/($3?IB'ggD,_QMDb<'*)RI7;Y.8'@nR;QWJ1 +!3K('8lWc'ZlLGld(G9WY12i8eJ)[54Z?@([8Qs#eQ#VQnT33n9I$&)eR_n6UEZU9 +<7S*Ue^[s,H2gN;?<.5;ee*\"FV<7GA(F(Zd@j=c`FW(mB@_Ti'k!:-I:H<;CY$I@ +f%"Wgj_iZBDq>/3f+i;W-$%TpF4Wj&f2ZtFATl[JGLqOnf9LX5V0^b$He65af@><$ +jaPhSJ(OpTfG/ti-%ac,K@iVGfN!XXAVSi[LY.<:fTh1YM05bgD.!J +-*l8_ZeIpUgJtZ9A[^?9\(cVHgQf>(V7PEh]A(<;gXX!ljhBLB^W_n\.@c,ab^.:j +8_aJEX$+GWA]EMJa4u(2=5C\AWucn<:Y_0J#(=Qtjj)ZK*0tHf>ntE8916#O1=u/# +]@,NOKWnA%7bpKJ.]l-F.Ce1sKZ"6uMO\)1!qj;^Ute:Q-ZrMHW>+1%K0t942fu)f +1NAQKPaE3FYP$r.,QJRT29Jk<%HTagHE,NokorR]=:@DQ1UCBp_GCh6e-k`FXmTNs +:Yun:,TZH4)th4oP)\R%&#-)]?2'_7pt+S#hk7)Vb9GdiD=ibJoAJ9Y@-r=!rX]A6hRTK5_?efN +YarMR'W%*1f;p!$ER;j/)N)bpiAMh;_T1WcH=7j$en`K;;:ge^+>'0/WCA,aQ.P!Y +O'jI1]=&B2c68N#iaS#%ih^nZD=ZW6AAfG'eFKWt^+bQG1"UjO@^q*M67Lc)lX41T +?62%7Sd3m(1>erJ`eGls$n( +L.7RV*a[`qjW5E'/UQL0Z]r,)Eo8t;6-[s?C<,@s$OLEZ1QHJt:1I?tbVG2iS*[+[d&F+4E@1BkkFe1) +[<*t=7M816ea"TiApGJiJYJ`ff04hDBh%;aa63N%Z=]&a[P2BFS7n1/BV:Z)[H;$[ +gdYU;kl(#5]VsU"E#pj0Y78]QL4![;KZ_#W(-?hL;e8GrL6%MHY7-3(esF5s^dfH7 +8`ZBZ/>:/9V,gWYZqPtid"4lIN*&k-""#4K*G,CDO&7ko.+@S"q=5A-'IO +ITs!q^F>k*!ITlA,=KZXkQ1U!_",q>`k>CoWDKC&Qf3F-o=cu-:hY"g]Y_m)!qm=G +4Le_,)k1%qTbN9.ASYIC84(@R7Xh"1=X`^`hr`9d#/E@l^p8>A$mo=-fUQQqO?U*p +Lq-+?f!;8Efa/R1#\M1VLu6,\fj*4nRD +KC<\I/-qh4BG-PG8X2#rlAb?TmWcuFm_Z%pg^oe5$8a&9%W(oqi:Ck_OB#fo>`Ap!5gDoE09+?K9?t@Yj]heg9ub@;_UC +o[X?:=)BlT=U94q(Zl,"Q0Zs:?d*/$[I6sP,9*Ql;C/M))p\O>^/iD^I:k7/GH5'? +GCj@k2>9@pmo;4=^uY8p.GU8&WoGRk+'0DB<\B-_9;cbdU%!;`eW);Hm_GIg?30XL +/9n,VGu@=*Skfe]AmPFOZ2^,tmuLsKM"Y`SoUb/dFr,E9EI!q2GSMQNLtMOc/,!l= +1T&uk7`OhVQ#nj@EFC+_0<'&cB)'q-nQ2sRn"!B9VX7`mpO%13;FH[<,HkIJD+q`i +E?o_2P%8^WHM/.?(VSc4T2Gp$$9)Ah8XYG8RkE?cH@LQ:cas"\_0H-17k]O+Ed[_5 +BF013i1F]3?bm'SJ4=^aC9N;Is1\l5L%[1'NQf@6_E +$-0[e'3R$,"((&[XMUs"7u?Q@gZF/M$6UFo#Y0UKQdjmqqQWdLl*_@9Cje'0FhcS) +K8B<7)ucBgrQpr%e'c!*r^NN&OOH*\#L,CU4;?>`.mKl%s1&s/G^:nu/o2E0;r<)/ +!!iQ+"Ts?B@*j-d-3g)l_dUpeF++i;MFD"%BOjFe)idEudJ3p"73dseAC>`kVF_Si +5f`GpKRH':MZ_Z'2Y_`8'L0`qo=>(k*oE@4B[R([IY1:H$g<_lr9R`S0;$_Zq7RiW +-U6'1cnPC5hd;!Dh==0g%b0P+-=c@!V)QB5:f#XkV1<[hNfOfa58Gr +?%rMiPL>B`EMS''ahNkBpUj%H#Bd33F*ZR;5*fR&Nm-sFqW7<_-Ilq2*Bp>Lhf\B\ +&,D%Sm`DU#b^/,J:P)H`]?oX4466**Bu#r2#h!b-$g@K_lbDY:!kZ6dC`*Gnbkn4A +U!4eiDMaJ\R,#NZ3,c1_B.4QI6Ht&2ZX1Srn.MC2K +QkABRhB.ODb(27B;:>75,V&*]q]lgNh\DjVUA6kqo>9$@9N3#d(bR,Mogo +Bh\=X96;XUB8,u@'1J\C._d@ZLj_8r71)&H?^L)Kdl!l,njb&QF(360Y=lOhNE-Db +A<5+f?#*6feb]_A_6TO)XJG<\LmZW__?j^S#iRu[fn^B5O4m28F(_s;V&nbu[62ho +1)A#5^/^!>OM4\-lu'37n`r2Xb\MXaBAV7OXLTU;33ErF1jt*oM#i7D2@TaaD,tK_("F6O +:<=X.,p;MqJ&7A9q\Ujj-no&INU]1KiNd!3Y)/JiBKHAie3GE9"JeFF56t_-pOm07 +)+*>N%LDta0o`H$72Vgd'R9(m:!qQPLAl9"Gb9PG*P.ZY#^BiY9o[Q6PtW=_((+^.ad#H=BdjRNS_I:6Z&cF6/6?Q?$#23(Y`9,ttHcd4CJP +P@W?HqgM,U&hco;#o_JB]p;/GB[!Fk8/UT+QKL/@Q:\84B&b/'Aq!'@+qHT\I!gC% +Q=gm:4#1DI=EW)gRSH2,1Zo/DCK&$7cQbY<$"Wn%Zi+7Uo,Tu,&Hn`EIXVr",/*.o +4&KoK?VJS1B.,bgTek>_;0"0U9LTjDP]D:P'WjWZ<eZ:l9"@W::Os'T/P-b",uU`kSm`Z(-EjFBM)_k"BuGb(:InJM,W*N) +c['belCeNaeHW6#b(a@T/E3BlOtdkY(9d"VrD2u6RF=M@=528BNjWW4U&)>e/#?[X +d#l_Ig<2=R4QT$&I:()4`knM<959a[EL;Wg8\bLSIl-_ufD@CtlPYJ^F"5%i)OhdL +[+Qt\3/CJq-M\rVR4EGSp_>]?7r3_\YGE;oQFf(ndhSE-ep`F>>12-e,$)'lBT^8G +%rKc1\Y-sV*gQ49pKmq2[UaFA&3H7VDTsT=Q[L)_isTfPFeLWLfX4h8.Q']hj>5U'o=:ng6UH7WUZAGI\:TIQoQU +"X.P]f-BuF/W46G)`L+o1;W(&R4OfY:B*3=&(,o4rEqbTd=nIW8W?If`?S3VW$ +C+_id;e]\?WQ;NIZ%OW.PsXZ8"obgTeH\VZI:u&\4!W3i1F_R0"/tOcP-&\Y:TUYu +lPe$Bc=EB8Pq[YlaOY:H#@s[uXgtY$rkU#88>,;.4PR9#iS2Ii31+Q[8o98s`tcb? +P\eQH2c1'P`K@as(8=ClW@U"Gk`>420=a"oOuf&8JWg +4#c?#5D;APY),.L,2idaVja/K6k&5t3i0TTiPPcJQA8T)onKk50#cK?-Y;Z#SM`Eu +L.+/^+Qm;@NtD9HVE9Y%mW5G*T+5RNCWT)d`"Si+h9dB;(O%3pA;9f`%j_'-/b'b( +VY0f%Jh2`ti'f<>OUhXh*c5gGhJB/>9Y(3R3?MYME&[P-J]Pr)V'R--Q9ak2&]lCU ++Y0bLPRWi#9>?nc:kQnp@QE2c?Uph2G`m/IboR:+7ld1(iiIW<.>%SBomK5kqVk6> +%f1,(WP?Cr;E;M8IieEH,N&*RK6E(>ItN4FJ,\[)K$*]$q?79%*7).ik93E#@p!U[ +!Y=AApLSaFJl)>7I)N.g^C=`G!\3Ldm-:ep5u5q-&(\;Z]$TG4!TIi>Xth3=M#G97 +9$a@_/+S>S:B\ada"I3:_b0IfcK=]m#Y7NMHIEmY[!q?oV+2L"]cn1Lg^lIFT\^FE%XI"4'>b1a_D_T!.U+Qdl=:nB +d0_)eYY*7Pi.FZ:mJRQi>)JE/IV`@-LPZR>1hq";Q>iFRD)1o]:qHg@%g3gaO^T"Z +>2LN^"C_SYn&@a_]S_iCIW96KZ+,%@]bj;.(kP$i./OZ4cF67uX\VnVOae8Oiu1J. +.'Wari4aeuCB.m)OO:'rM74SF38QC0`c3s`&X&YViZliK,*>YEJqDAQ*?5[O*_N=B +%94U("H_#i>&kf2&ia$W4Wom/+MpDgBDEF>+!D)L\?Z2_,MNt(1*H*t8MOm(ccHYl +g*:R6Nis$BOcLc%],[P4-g,G+OH0d_R9-H!A@6g#Kn[0M:OhPa^4Ejgu@L*SKV+YMe$ +@Oh<(ii8fV.Z]36AK1p:C=,2U&?E82c9 +,uVlQOi0MA2)u=XFn90&BpB(3Q +E@^/p3eA:ojq.M*_HR/]*V2?:PK^4./iOGs-)9*S;4?^Cia_iF"K[&1Ie/*$6gK`C:klL +5Uhbb7S'@I+oW5K_]r-b\HoW9srY;HCk7meh)FUB7uJ0Sc3;F#_1,"GXhI9#qWC:,'> +F0^n-3Dd#K,k@KMV$\172CK\3oVq'UC!f:D*at#cm +?Gk`/26`_GZmHr'<<=QNi85A/.9Gp/43a?n@6\/%L^WJX)t?I/eG+6?>XUBR!UP1n +Yhh(o78H0U%>3DG6[N@P!E$4!0aPr8k#;f^@NlOaAl4kjAaO'Y_?KHpK`L!\p((X; +Ou]sGHun.OitNBhh\4QOB!k3E6JlLCE0n3sn685+I +(%;EW!'[u[[iB&iLOr^@@6[e'`GLTiD$3XP5f8k1nPBg5r +H'b"Gf:R@*UO$">HC([Yf<9N;Z[5c_H^D?kf=u\L_gGP+I$`$(f?\j]dsYDcfM@2<;h\=TKpZ(ufO'@M@tn)u +L6ub2fPcN^F,*kALR +EI + +Q +q +134.14878 0 0 23.99798 85.11358 449.06858 cm + +_op? setoverprint +BI +/Width 559 +/Height 100 +/Filter [/ASCII85Decode /LZWDecode ] +/BitsPerComponent 8 +/Decode [0 255] +/ColorSpace /N226 /ColorSpace findRes +ID +J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H +>q_R=AlC^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mioWjnAY&^gM+`4=1jRLW!YA +=M/6)*KS9PE`kN%="Tbr0@0I,k&EVQXcN*X4XQLiVpdpFqLSIW5rrZE1iE)3UH\uJ +J2^]Gf`,;]hJd^E4soh,\`.P:o6('LG(59e3ZF)4/!j9!G'cIa5?G$Hk4V+.phrb: +aPlg(oe,.2LY_%fk+3X9J'5ao_7^gA=3@-/5RlK+oY8M3kj4`$A'F4%0Iiar^b?`' +#::!DSGo2N>P.ANMKC!A6;@qD%]'`CS6qt/dL,rk;'MJ?^!R45&]MjC9]Ccr9CVPj +OfFT^4gC2t+!jdrMVFg:<.s'sOs5M'apcpP$d(5XQ2jL^E^(d.JGX%+a(RP8e2>\& +UD>gBar*$,F#7_6bt'CN2_3?eSqkV>_@Br!O@hELc]dG(Oe)+PaG1Z*%0hd=1bq-^ +cq,4eiW8[T#s"e<"Tjlc#^m(EUQk^8P#FgJ/<8(5nn1(8'8dMe]#T(;(UueZOGOk8 +I;%R?icuV5U!fu$Jf!GA*oMV/r(r$s;O`7KMtR2rDis%(5;(R=Prqjrc:rd?_@nC. +9HWWOKj17*q#=u0p/3&T9"%n&=]]Iu?:WN/'oQkG=$e$2NV?rX2jO!RKm?q32;;+S +=+m<"?B=&0I&0hS>_LZEeW1\YLhV?i3S'+_ih/edT'V=+Ys45XUAcQo'DJQ9+5mK. +^+[1Q&iiOn[aG>"@lX0J0&P(;(0BUX(a"@h)BGHI+kaSmnIPGA#3*4>2GpLso?%<6 +3SIYFMbaiQ54*prl4c1o"FKRr??qcT60Aa1?_8J&IJF.4aC\KRJbgiHSiD=L1GH^c +C(tmZO8sdC7=)fMZb(6DT;f?4EYs#gY_LUI7q[;48o7J;"j/o2l!9T)! +\O$T[QG&K>"5sR'G_`^U0j%-&@DTO5U_XKN;`>AM*!:JKL&ijHX8j#eRg\a?h*3Xu +%0:^G=9ACZ]pMP^iV;;ii-dUR63be-4D7d#asKL.PoCp:7QRDe)B6^?,QIs69'C]Z +P.0#2cY9+8:)JW)-9+9qHr?*R_=rTWk^$f[g5Kp@/'BeQ+UBLRJRf1-]/Rf"iVU8J +d<4TpZ3:]m.[H$mVF_cc5:DTrc]Y0n/.d&nj2`dN3R.p(K(+7(PIus6k))*eW(Q-A +C"[7&Q>e'=pp(e0VHemkFg%d\#3W#JNU0t#8YQG6N\k9+PPB^BLsea>%0h^T%Uu)& +XDqes-s6r>U,eKtp$;SC3MXp'6]:ahCQdi?u*M+4ZJ/+#r.67ae +84?*/FeF<-<%p8U'Fq1/;M1'%BjN29?XdcCi\)_E#:O=#+OX<3&1Z^EA3@boW$+u$3hD5@D+YABBHf;L`LlbamRB'mE=#D>=kBRb_U +Y0)i139a!L;'5BR]>Qb2Coq6\3RuB&**#b7,ePiT(=qWX[.l$*2-mOh[,BXG6Z4B8 +_QJ"7gTF2RJ?:EmXZ*C2hCI5s+%h`IEZgq/Kh87iEWYE +EG+jD+Z:4m&e?9uq&uoGB(jj2HpHs+=2SZ2T3]*8I]IVh,"d5Y +WlAgDNY!:6f0G7"--CC*p(>;4'"FF-KP,/'enhMAk^i))eTLHjXhX#e +@VK\4qtG7#!`QloZ:s,1^Duf^;j4_gDrl(f:/W+>P;rXCiJ2Eer8S*d!rU\*B@62BAm&aB0uENS&Qq.Fd6>\>h\SgWGVT`i\dMeLH)\[B$C +(E`OjRWBIS[i^jMkrX'fpi6Z]#j6X,IN*jE^`T2[#:dp1s#G?8;P(LuL@DlPC[+X[ +_'Ul=c.U!@k.X:Md).uNI,om>p&VfVB:@jk(LUV\UWImT)>%4deb3<'E8/.!k^Kkq +H[fi(r+@D7Im;\4*3\G;LJ[Qt5(NU1=EC0ckG^j;B8Z3YUX%K6qk%utmR_T^Wh,.X +d,,:WdYqY(LEQ&h*op+op.hRaDqt'tbTLW8+\8!CO;@`>^5_8']T8@&B)_s",07rR +4g4eaC8CU,n=mfg$0+"_/^!u%SF4_c+DI-$0B2_&@dK,FnIO.=:eL5=*s'^%j=j!^ +X.]X5KWC1j!cMiSmo672P#3A$%I4f-Y^SA\Os!Scr,!(`j,4-q5&d`W!0/haC&m\] +&;j4I"]-K@0T+5]KZ-b2%'\Us/7>hWY\1/?#Hq>*lp+HZRgh&dCT1d@-Jhnoo_Q`5 +"OG0fjX=^$\6mT%!3_]WBEnkT@/Y%lrN<7#%n?8E5jGT5l`id5Ab(\9+UPC2p8'+l +#uKAjrp"I62bOG[E4647<9PWgY_X^rhfCn8YKQd0fR1lQV@m'p56K067iu +?6k[C-P0,\d%$c3DPRc),YkTe10YhkRS#s$B!KWKlr+peEZfCp*t[H9-rRVg.h(oI +'16m.:[Zg'gDfTe.roh,E9AA64!?B1FpjW`dO+kS#`3AdH#]37dTIA!N$-5L,d+;s +-o?1sbks2d&(0g2:j4)s%2ol>-dC0_1C/D*lR%b"pZZ?\#a6@TWt5hcq#uitjRX@P +RauE[.T5s_Y88rM*@0!48-i!FEShin,X/OL/+YVA$r&L:0eDgL+HhpCP1ZtDL8g'& +/e`jCZ-#0s'*e$/A?tVio1Lpdp*!#*0@<&ic+Kne'.6^Y-5$576i_/(XZ#b(4-Anc +'4N7#HT1P/2^/ld`mH7lCF1jl4O_Rro/m-9r(D^3'COG(E3=_T:B-J`oLVn9_g9Ce +eKr\V5'+Fq9iP@h.XUcH4k(8bZl:S1GndGe:Mq#qZ_Kjnm2cn=Of@pfUNUCu0KV_l +3\$gQC67=0%*^DJ$18fkErPp!A="k'7`#G>&9C6:+#*)X0$P@mN"nWFN#CRqdGmX2 +1i=K`$;*ZV%H.4#oNWn61ghOt_)/AFc\u.>7_q``:6a!so[-AieP1/=9si_No\iP% +j\Bp^::0C`o^P^6ohT]*:UL'ro`7lH"]0=J:pga/oat%Y'iB)k;7.EAoc[3j,uSk7 +;RJ)SoeBB&2,eWX;mebeog)P779"D$<4,G"ohe^H +EI + +Q +q +107.99099 0 0 17.03858 410.40649 141.41429 cm + +_op? setoverprint +BI +/Width 450 +/Height 71 +/Filter [/ASCII85Decode /LZWDecode ] +/BitsPerComponent 8 +/Decode [0 255] +/ColorSpace /N226 /ColorSpace findRes +ID +J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Re4U +>q_R=AlC-henlmLbi_p8F1uQWTMT+u$7-II8#0$J"7l;:^I"ku@H7bqDe&6Z/\3F`'J@B0Ye +V[M_*`,D8V10HSnJuk#c]C+3YL.<\bOL-LU#XZE\<=i4g)SKYh&P7\[n+<<.HX!t; +*%Il];h!7h#[k+]4-onT$[:X>Rr0T3(pMi6&f"5tX.@k@+=aVIIa4*qm!)qW.TZ*W +Dq&hj?F`R@Pn%0OXrbnr7N($^TK]!Y3s2pH3D)iXr]Eu^(e;0!,SZ?Tc[$T73"T;t +"!M:QXB7ecau'C5k\K1X]$So1$6a?qOSqRE8gb)t#_K-S78Y#HLPb;s8JoJRCfmIO +ccgFV7#4\>)b9HK&KRgkK=qqlLA;n^8BM'eKZIn)5lsWppjXm=@efq0U1SZM/PCZi +hQ=C&6AgR"na[B,W.9IF]<-S`5r24@<7O%.d6\'3:QrAt&>ZV#&Lsb'JdX`Ai.-8( +O7XV.3_tk&(f/)m80B:Fmbn*kW?D8V8L9,f>q_Q5;B84sW`8nL1uJLELb@3\l4=R# +;>tMfNI<:Ne`ZaY-rQ;1!gD!P44'fnkS_3G=6_2!5M&F=m7c4^BqH%E"9lFt<#03] +=1-t:Tl1JE"[QOm-[@m'f?,LL8%s+MrpD8U!YfjWf+K3F>6"[H?lS6RJ5?XjN9r;B +70PME(`88ZK9-eDfRY(YNVeOa9f<[c#SsF#A>$d8Wr\n(RZJ@%"p*Rg()I,f;BWKl +Os"4YR/r^(\'bsd[Gc\PK,>*jjFp`O+M`4E`.MAE-&6aFO/Wnh+'(Q4[[;a08hK=a +3Y?*8GIL13KS40Nl5"%f(\.r<;lD/&5UamW8Wk3hqPm(0<[[ts+G9q5lCiubPFj!T +#7uO5(RDL^*Y8YnY(.BV&%3mUE_8jR^k3QZAst%7"0@;a5k#t^Z3jC,4UM.mm7:J$ +boh8ZM2!/"qN'?@ELlU!RKusXU2UA]T7p-5B)T]B%KDfI58i`#GVL7c"iehMH4LKk +XtTh]&e+O?ZnN23r"(@?VSef^`U6Q.\_+/aG'l61&pei5s +"Y,U9J#h``6Ata`+Ga-p7"Q!S!!G5+K7+D"@Li2X&peY1.?bIE*'tk0.jBuKdhIV@ +U>a3(.$4(r_t"'Lb!YhI0bF[IEYsr`=Tj7(XG+FAU-T9Z(4-TlL7P5!jWb'@/Q#CX +WKT#&@uPhZ;6<3N=OO8nWCV\>SZr`ng?_?uGp/o6:-[D/5ic0sLi3#IVU[NMjW$l9 +:?\H:BcKK1!.^!G%LnY)F?l]r_1^nk:-NY@0F8]iO@1B5P_i0/jWOhYl6[=V,/RBU +YnN.S$98ZcA4@lP_gWkR]F=U`iR-+SSjai;31-C%$:H?eCDLcNq1qlnq$N4^nhhQL +&3JqR[%*p-%>siR;8@keL(^pmQI6L0aLq$d1`c%J2Fo@]]blmm&k#O,)'92C/!@5` +M`9kV:XudY+S:bi8G*h5#Vb-FoVA79$7=Nl.0$"rFZIjd%l\'N#G_JB5KJus8;K\B +.$K%>'i9Ajf6"3X1\O2^W^f-bK@6Q0IKZ;f.fVa9B-srBGp214:PuY(94>IT`++?8 +Vq>o16GBfA3h4<)9^[+H2OV]3'%0B'bFXDn/q`oJgmUNa.X +(be[=Y??ZM@XIh%5L8m5A$#SV.##fh:'!lF4uR=mm[0gs'"#3uh3[u=o*UTRUmV$6[48/MgP0=_C-0`ciHU.k/' +-&.A?>@E\NL+XV!/nYa4OJA!i!QNF?biFj/M9*hW,Zl5RB##RQnn&"uT`'RIorWn5 +PAqb5D&Z]bLCKWB!$^p:NPW53lL2Oqbu+G)jAGob87bnRf-!%ei]!HjA^DQ/s!6CJ ++^>BjL*/iMoi,*O-o=4YWl/m?ki*nb#gpeUbUX+E_N.-A)G\9P!i$=^hj3td5ZcX_ +!%$p1R-@.lbSMcNP!kBBp:=bE)RtUX[reO>Qj:B3hH/DT2k_DR=0]PcP\) +-OCSGoH]%14BOt?p0$(=%"`2V"b*ifG$E=g16RY78)M';A,?$0jOYQ>#`?8J(2JnJ +c0CKPD]p=7XLaRVktc:5[4mNX5ATa"Sc +98*qnTuEYu8W_cO0imtB1WU?$dIfn[*_iTmdoKP#S32r-+p`H$5Adp?1k_@$dR!VZ +Tga6=plVUL;L%?=ksSA$Xjth^f0N!\[docIY-2Lq2eO6%5S/44pX2!je0(se#^SP8 +c^H1-,>qsR&N4KqaU;)_L!!nbuM5t]"Tk^ +=$hhcaF#E/`'O45mqp*o.2OW,3cIrR"l>'MV]l&&)\YXjQt33+@WO.YGg3Z$NNKtI#E1K![(e[cA-=G +*UO+V%2eD?55IU1nuX8?@N\]'9`YdWUMlUok;"4bq$+&'9i,T*YOq7Dq!CNbore9< +"/]noW;0J07&g4'`&;@26nSf_7egX#0UCe=cN$S_jBbfVM>7!:WYp@%uJh[du +)'Te)E/Z%3`[Hp<,0tNJiWfD0R0L_q!eru*_M](E!kB`K:+/M.OWG`bi%.`Cjs$oG +U)Y36?KI6V.-r`'Z-FOci?TTMKTWG?Wb*8E7UbJfqJrimK-.VIj%,](ZA^:W\=n@?5N'#1".7D;^<[J*ofTC131ff_1!'h +/hnWo]>XUp+[-:rVudVf[,KsjZTaZ&bUe9n,3;NRlm+$d-uB,E/A^0h_&ghjaW.%< +S?#RGLN".&7Ka=@"XS+K_-YB:JLI6P&ebP=aWB94fUAPSGE*Z\J,mQp_&O(b4(mo- +J71>k&AsR&4N*9s5[Y.E`bqL\*W\PUN8C"s^_.,V/[D22T\s3#5Rn73pFeftoFUX% +=$\K)]nqq=PT`@>clsoQ6<#O'BphmPrDY70iV.?<#%JlU'4=,fhOD)'6rN[BWkW +Y?P#5=nT=-+obMa9iRBR>ZK$J[Ei*cd9UnF?+%d[ouCArdpo>p((T_,@VDj:pkf]PF(SHuB(g@[p3U +EI + +Q +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 2 2 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 2)Tj +9.95919 0 0 9.95919 90.03318 711.00679 Tm +0 Tc +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +0 -1.14459 TD +( )Tj +0 -1.15658 TD +( )Tj +T* +( )Tj +/N223 1 Tf +20.03829 0 0 20.03829 90.03318 602.41578 Tm +(P)Tj +15.95869 0 0 15.95869 103.35209 602.41578 Tm +0.00088 Tc +(REF)Tj [-12.29998 ]TJ (A)Tj [23.79998 ]TJ (C)Tj [-6.29998 ]TJ (E)Tj +20.03829 0 0 20.03829 168.98658 602.41578 Tm +0 Tc +( )Tj +/N170 1 Tf +11.99899 0 0 11.99899 90.03318 583.93739 Tm +( )Tj +0 -1.14999 TD +( )Tj +/N231 1 Tf +0 -1.12998 TD +-0.00048 Tc +0.00048 Tw +(This document ex)Tj [-10.5 ]TJ (plains )Tj [-10 ]TJ (how to constru)Tj [-10.5 ]TJ (c)Tj [3.29998 ]TJ (t a)Tj [-6.69999 ]TJ ( compi)Tj [-12.69999 ]TJ (l)Tj [-2.69999 ]TJ (er usin)Tj [-10.5 ]TJ (g)Tj [9.5 ]TJ ( lex)Tj [-10.5 ]TJ ( and)Tj [-10.5 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.5 ]TJ (a)Tj [3.29998 ]TJ (c)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ (. )Tj [-10 ]TJ (Lex)Tj [-10.5 ]TJ ( and )Tj [-20 ]TJ (y)Tj [19.5 ]TJ (a)Tj [3.29998 ]TJ (c)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ ( )Tj [-10 ]TJ (are)Tj [-6.69999 ]TJ ( )Tj +0 -1.14999 TD +-0.00129 Tc +0.04129 Tw +(t)Tj [-3.5 ]TJ (ool)Tj [-3.5 ]TJ (s used t)Tj [-3.5 ]TJ (o)Tj [-1.29998 ]TJ ( )Tj [-10 ]TJ (g)Tj [8.69999 ]TJ (e)Tj [2.5 ]TJ (ne)Tj [-7.5 ]TJ (rat)Tj [-3.5 ]TJ (e)Tj [-7.5 ]TJ ( l)Tj [-3.5 ]TJ (e)Tj [-7.5 ]TJ (x)Tj [-11.29998 ]TJ (i)Tj [-3.5 ]TJ (cal)Tj [-3.5 ]TJ ( anal)Tj [-13.5 ]TJ (y)Tj [18.69999 ]TJ (z)Tj [-7.5 ]TJ (ers)Tj [-12.09999 ]TJ ( and p)Tj [-11.29998 ]TJ (a)Tj [2.5 ]TJ (rse)Tj [-7.5 ]TJ (r)Tj [1.69999 ]TJ (s. )Tj [-10 ]TJ (I)Tj [11.69999 ]TJ ( )Tj [-10 ]TJ (assum)Tj [-3.5 ]TJ (e)Tj [2.5 ]TJ ( )Tj [-20 ]TJ (y)Tj [18.69999 ]TJ (ou )Tj [-10 ]TJ (can p)Tj [-11.29998 ]TJ (r)Tj [1.69999 ]TJ (o)Tj [-11.29998 ]TJ (g)Tj [8.69999 ]TJ (r)Tj [-8.29998 ]TJ (a)Tj [2.5 ]TJ (m)Tj [-3.5 ]TJ ( i)Tj [-3.5 ]TJ (n)Tj [-1.29998 ]TJ ( C)Tj [-4.29998 ]TJ (,)Tj [-1.29998 ]TJ ( and)Tj [-11.29998 ]TJ ( )Tj +T* +-0.00059 Tc +0.00059 Tw +(understand data stru)Tj [-10.59999 ]TJ (cture)Tj [-6.79998 ]TJ (s)Tj [-1.39999 ]TJ ( such as linked-lists and trees. )Tj +T* +-0.00048 Tc +0.11048 Tw +( )Tj [-1140 ]TJ (The introduction describ)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ (s the basic building)Tj [9.5 ]TJ ( blocks of a compiler and e)Tj [-6.69999 ]TJ (x)Tj [-10.5 ]TJ (plains )Tj [10 ]TJ (the)Tj [13.29998 ]TJ ( )Tj +T* +-0.00099 Tc +0.11099 Tw +(interaction between lex)Tj [-11 ]TJ ( and )Tj [-10 ]TJ (y)Tj [19 ]TJ (a)Tj [-7.19999 ]TJ (cc. The nex)Tj [-11 ]TJ (t)Tj [-3.19999 ]TJ ( two )Tj [10 ]TJ (sections describe lex)Tj [-11 ]TJ ( and )Tj [-10 ]TJ (y)Tj [19 ]TJ (a)Tj [2.79998 ]TJ (c)Tj [-7.19999 ]TJ (c)Tj [2.79998 ]TJ ( in more )Tj +T* +-0.00028 Tc +0.31028 Tw +(detail. W)Tj [-6.5 ]TJ (ith this backg)Tj [9.69999 ]TJ (r)Tj [2.69999 ]TJ (ound, we constru)Tj [-10.29998 ]TJ (c)Tj [3.5 ]TJ (t a )Tj [-10 ]TJ (sophisticated calculator.)Tj [-10.29998 ]TJ ( Conventional )Tj +T* +-0.00149 Tc +0.06149 Tw +(ari)Tj [-3.69999 ]TJ (t)Tj [-3.69999 ]TJ (h)Tj [-1.5 ]TJ (m)Tj [-3.69999 ]TJ (e)Tj [2.29998 ]TJ (t)Tj [-3.69999 ]TJ (i)Tj [-3.69999 ]TJ (c)Tj [2.29998 ]TJ ( operat)Tj [-3.69999 ]TJ (i)Tj [-3.69999 ]TJ (ons an)Tj [-11.5 ]TJ (d cont)Tj [-3.69999 ]TJ (rol)Tj [-3.69999 ]TJ ( st)Tj [-3.69999 ]TJ (at)Tj [-3.69999 ]TJ (em)Tj [-3.69999 ]TJ (ent)Tj [-3.69999 ]TJ (s)Tj [-2.29998 ]TJ (, such as )Tj +/N171 1 Tf +21.78999 0 TD +0.00158 Tc +0 Tw +(if-)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (l)Tj [-0.59999 ]TJ (se)Tj +/N231 1 Tf +2.43998 0 TD +-0.00099 Tc +0.06098 Tw +( and )Tj +/N171 1 Tf +2.05999 0 TD +0.00189 Tc +0 Tw +(while)Tj +/N231 1 Tf +2.16999 0 TD +0.00138 Tc +0.05859 Tw +(, a)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ (e)Tj [5.19999 ]TJ ( imple)Tj [5.19999 ]TJ (me)Tj [5.19999 ]TJ (nte)Tj [5.19999 ]TJ (d)Tj [1.39999 ]TJ (.)Tj [11.39999 ]TJ ( )Tj +-28.45999 -1.14999 TD +-0.00129 Tc +0.01129 Tw +(W)Tj [-7.5 ]TJ (ith m)Tj [6.5 ]TJ (i)Tj [-3.5 ]TJ (nor changes, we )Tj [-10 ]TJ (convert the cal)Tj [-13.5 ]TJ (culator into a compiler for a stack-)Tj [-8.29998 ]TJ (b)Tj [-1.29998 ]TJ (ased machine.)Tj [-11.29998 ]TJ ( )Tj +T* +0.00109 Tc +0.10888 Tw +(The)Tj [4.89999 ]TJ ( r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (m)Tj [-11.09999 ]TJ (a)Tj [4.89999 ]TJ (ining)Tj [11.09999 ]TJ ( s)Tj [-9.69999 ]TJ (e)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (tions )Tj [-10 ]TJ (disc)Tj [4.89999 ]TJ (uss issue)Tj [4.89999 ]TJ (s)Tj [0.29998 ]TJ ( tha)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ ( c)Tj [4.89999 ]TJ (o)Tj [1.09999 ]TJ (m)Tj [-11.09999 ]TJ (m)Tj [-0.89999 ]TJ (onl)Tj [-11.09999 ]TJ (y)Tj [21.09999 ]TJ ( a)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (is)Tj [-9.69999 ]TJ (e)Tj [4.89999 ]TJ ( in c)Tj [4.89999 ]TJ (o)Tj [1.09999 ]TJ (mpile)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ ( )Tj [-10 ]TJ (wr)Tj [4.09999 ]TJ (iting)Tj [11.09999 ]TJ (.)Tj [1.09999 ]TJ ( Sour)Tj [4.09999 ]TJ (ce)Tj [4.89999 ]TJ ( )Tj +0 -1.13999 TD +-0.00059 Tc +0.00059 Tw +(code for )Tj [-10 ]TJ (ex)Tj [-10.59999 ]TJ (amples ma)Tj [-6.79998 ]TJ (y)Tj [19.39999 ]TJ ( b)Tj [-10.59999 ]TJ (e)Tj [3.19999 ]TJ ( downloaded )Tj [-10 ]TJ (from the w)Tj [-8.39999 ]TJ (e)Tj [3.19999 ]TJ (b site listed below. )Tj +0 -1.14999 TD +-0.00019 Tc +0.17019 Tw +( )Tj [-1080 ]TJ (Permission to reproduce)Tj [-6.39999 ]TJ ( portions of this docum)Tj [-12.39999 ]TJ (ent is g)Tj [9.79998 ]TJ (i)Tj [-2.39999 ]TJ (ven)Tj [-10.19999 ]TJ ( provided th)Tj [-10.19999 ]TJ (e web site)Tj [-6.39999 ]TJ ( )Tj +T* +-0.00059 Tc +0.01058 Tw +(listed below is r)Tj [-7.59999 ]TJ (e)Tj [3.19999 ]TJ (fe)Tj [-6.79998 ]TJ (renc)Tj [-6.79998 ]TJ (e)Tj [-6.79998 ]TJ (d, and no)Tj [-10.59999 ]TJ ( additional r)Tj [-7.59999 ]TJ (e)Tj [3.19999 ]TJ (str)Tj [-7.59999 ]TJ (i)Tj [-2.79998 ]TJ (ctions appl)Tj [-12.79998 ]TJ (y)Tj [19.39999 ]TJ (.)Tj [-10.59999 ]TJ ( Source)Tj [-6.79998 ]TJ ( cod)Tj [-10.59999 ]TJ (e)Tj [3.19999 ]TJ (, when)Tj [-10.59999 ]TJ ( part)Tj [-12.79998 ]TJ ( of )Tj +T* +-0.00099 Tc +0.00099 Tw +(a softwar)Tj [-8 ]TJ (e)Tj [2.79998 ]TJ ( proje)Tj [-7.19999 ]TJ (c)Tj [2.79998 ]TJ (t, ma)Tj [-17.19999 ]TJ (y)Tj [19 ]TJ ( b)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ ( used fr)Tj [-8 ]TJ (eel)Tj [-23.19999 ]TJ (y)Tj [19 ]TJ ( without ref)Tj [-8 ]TJ (e)Tj [-7.19999 ]TJ (rence to the )Tj [-10 ]TJ (author. )Tj +T* +0 Tc +0 Tw +( )Tj +T* +( )Tj +T* +(T)Tj +9.47918 0 0 9.47918 97.35258 349.71688 Tm +-0.00079 Tc +(HOMAS )Tj +11.99899 0 0 11.99899 133.94949 349.71688 Tm +0 Tc +(N)Tj +9.47918 0 0 9.47918 142.70878 349.71688 Tm +-0.00239 Tc +(IEMA)Tj [-14.39999 ]TJ (NN)Tj +11.99899 0 0 11.99899 180.62559 349.71688 Tm +0 Tc +( )Tj +-7.54998 -1.14999 TD +-0.00019 Tc +0.00019 Tw +(Portland, Ore)Tj [-6.39999 ]TJ (g)Tj [9.79998 ]TJ (on )Tj +T* +0 Tc +0 Tw +( )Tj +T* +0.00219 Tc +0.24778 Tw +(e)Tj [6 ]TJ (m)Tj [0 ]TJ (a)Tj [6 ]TJ (il: )Tj +0 0 1 sc +4.5 0 TD +-0.00149 Tc +0 Tw +(t)Tj [-3.69999 ]TJ (hom)Tj [-3.69999 ]TJ (asn@epaperp)Tj [-11.5 ]TJ (r)Tj [1.5 ]TJ (ess.co)Tj [-11.5 ]TJ (m)Tj +ET + +144.02899 307 131.98899 -0.59999 rf +BT +/N228 1 Tf +14.03878 0 0 14.03878 276.01768 308.32029 Tm +0 0 0 sc +0 Tc +( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 294.52149 Tm +0.00068 Tc +-0.00068 Tw +(we)Tj [4.5 ]TJ (b site)Tj [4.5 ]TJ (: )Tj +0 0 1 sc +4.5 0 TD +-0.00169 Tc +0 Tw +(epaperp)Tj [-11.69999 ]TJ (r)Tj [1.29998 ]TJ (ess.com)Tj +ET +144.02899 293.20199 80.15299 -0.59999 rf +BT +/N228 1 Tf +14.03878 0 0 14.03878 224.18199 294.52149 Tm +0 0 0 sc +0 Tc +( )Tj +-9.55558 -1.13679 TD +( )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 3 3 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 3)Tj +/N223 1 Tf +20.03829 0 0 20.03829 90.03318 701.40759 Tm +0 Tc +(C)Tj +15.95869 0 0 15.95869 104.55198 701.40759 Tm +-0.00189 Tc +(ONTE)Tj [-4.09999 ]TJ (N)Tj [-9.09999 ]TJ (T)Tj [-0.09999 ]TJ (S)Tj +20.03829 0 0 20.03829 180.86558 701.40759 Tm +0 Tc +( )Tj +23.99798 0 0 23.99798 306.01519 674.64979 Tm +( )Tj +11.03909 0 0 11.03909 90.03318 641.29258 Tm +-0.00399 Tc +0.49789 Tw +(1. I)Tj +8.99919 0 0 8.99919 110.79139 641.29258 Tm +-0.00129 Tc +0 Tw +(NTRODUCTION)Tj +11.03909 0 0 11.03909 177.26589 641.29258 Tm +30.35258 Tc +( 4)Tj +ET + +90.03298 640.09298 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 641.29258 Tm +0 Tc +( )Tj +-39.08699 -3.31518 TD +-0.00399 Tc +0.49789 Tw +(2. L)Tj +8.99919 0 0 8.99919 114.39109 604.69558 Tm +-0.00028 Tc +0 Tw +(EX)Tj +11.03909 0 0 11.03909 126.39009 604.69558 Tm +0 Tc +( )Tj +35.23908 0 TD +(6)Tj +ET +90.03298 603.49598 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 604.69558 Tm +( )Tj +/N231 1 Tf +-39.08699 -1.67388 TD +0.00129 Tc +1.45518 Tw +(2.1 T)Tj [-7.39999 ]TJ (h)Tj [1.29998 ]TJ (e)Tj [10.39999 ]TJ (o)Tj [1.29998 ]TJ (ry)Tj [12.19999 ]TJ ( )Tj +38.58699 0 TD +0 Tc +0 Tw +(6 )Tj +-38.58699 -1.15219 TD +0.00149 Tc +1.45498 Tw +(2.2 Prac)Tj [10.59999 ]TJ (tic)Tj [10.59999 ]TJ (e)Tj [10.59999 ]TJ ( )Tj +38.58699 0 TD +0 Tc +0 Tw +(7 )Tj +/N223 1 Tf +-38.58699 -2.78259 TD +-0.00399 Tc +0.49789 Tw +(3. Y)Tj +8.99919 0 0 8.99919 114.99108 542.78079 Tm +-0.01548 Tc +0 Tw +(AC)Tj [-26.69999 ]TJ (C)Tj +11.03909 0 0 11.03909 134.54949 542.78079 Tm +0 Tc +( )Tj +33.94569 0 TD +-0.00178 Tc +(12)Tj +ET +90.03298 541.58099 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 542.78079 Tm +0 Tc +( )Tj +/N231 1 Tf +-39.08699 -1.68479 TD +0.00088 Tc +1.45559 Tw +(3.1 T)Tj [-7.79998 ]TJ (h)Tj [0.89999 ]TJ (e)Tj [10 ]TJ (o)Tj [0.89999 ]TJ (ry)Tj [11.79998 ]TJ ( )Tj [-30543.5 ]TJ (12 )Tj +0 -1.14129 TD +0.00119 Tc +-0.00119 Tw +(3.2 )Tj [-1456.5 ]TJ (Prac)Tj [10.29998 ]TJ (tic)Tj [10.29998 ]TJ (e, Pa)Tj [10.29998 ]TJ (rt I)Tj [19 ]TJ ( )Tj [-28989.09999 ]TJ (14 )Tj +T* +(3.3 )Tj [-1456.5 ]TJ (Prac)Tj [10.29998 ]TJ (tic)Tj [10.29998 ]TJ (e, Pa)Tj [10.29998 ]TJ (rt I)Tj [8.09999 ]TJ (I)Tj [8.19999 ]TJ ( )Tj [-28652.19999 ]TJ (17 )Tj +/N223 1 Tf +0 -2.79348 TD +-0.00399 Tc +0.49789 Tw +(4. C)Tj +8.99919 0 0 8.99919 115.59098 468.14698 Tm +-0.01548 Tc +0 Tw +(AL)Tj [-18 ]TJ (C)Tj [-26.69999 ]TJ (U)Tj [-13.29998 ]TJ (L)Tj [-31.29998 ]TJ (A)Tj [0 ]TJ (T)Tj [-18 ]TJ (O)Tj [-11 ]TJ (R)Tj +11.03909 0 0 11.03909 171.62638 468.14698 Tm +-0.00178 Tc +30.31089 Tw +( 20)Tj +ET +90.03298 466.94699 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 468.14698 Tm +0 Tc +0 Tw +( )Tj +/N231 1 Tf +-39.08699 -1.67388 TD +0.00039 Tc +1.45608 Tw +(4.1 Descr)Tj [7.29998 ]TJ (i)Tj [-4.39999 ]TJ (pt)Tj [6.5 ]TJ (ion)Tj [11.29998 ]TJ ( )Tj [-28771.79998 ]TJ (20 )Tj +0 -1.15219 TD +0.00079 Tc +1.45568 Tw +(4.2 I)Tj [18.59999 ]TJ (n)Tj [0.79998 ]TJ (clude )Tj [1456.5 ]TJ (Fil)Tj [6.89999 ]TJ (e)Tj [9.89999 ]TJ ( )Tj [-28641.29998 ]TJ (23 )Tj +0 -1.14129 TD +0.00028 Tc +1.45619 Tw +(4.3 Lex )Tj [1456.5 ]TJ (I)Tj [18.09999 ]TJ (nput )Tj [-29521.79998 ]TJ (24 )Tj +0 -1.15219 TD +0.00079 Tc +1.45568 Tw +(4.4 Y)Tj [5.59999 ]TJ (acc )Tj [1456.5 ]TJ (I)Tj [18.59999 ]TJ (nput )Tj [-29021.79998 ]TJ (25 )Tj +0 -1.14129 TD +0.00129 Tc +1.45518 Tw +(4.5 I)Tj [19.09999 ]TJ (n)Tj [1.29998 ]TJ (terpret)Tj [7.39999 ]TJ (e)Tj [-0.5 ]TJ (r)Tj [8.19999 ]TJ ( )Tj [-29217.39999 ]TJ (29 )Tj +T* +0.00059 Tc +1.45588 Tw +(4.6 Com)Tj [17.59999 ]TJ (p)Tj [0.59999 ]TJ (iler)Tj [7.5 ]TJ ( )Tj [-29663.09999 ]TJ (30 )Tj +/N223 1 Tf +0 -2.79348 TD +-0.00399 Tc +0.49789 Tw +(5. M)Tj +8.99919 0 0 8.99919 116.91088 355.59638 Tm +-0.00178 Tc +0 Tw +(ORE )Tj +11.03909 0 0 11.03909 138.86909 355.59638 Tm +0 Tc +(L)Tj +8.99919 0 0 8.99919 145.58848 355.59638 Tm +-0.00028 Tc +(EX)Tj +11.03909 0 0 11.03909 157.58758 355.59638 Tm +-0.00178 Tc +31.58268 Tw +( 32)Tj +ET +90.03298 354.39599 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 355.59638 Tm +0 Tc +0 Tw +( )Tj +/N231 1 Tf +-39.08699 -1.67388 TD +0.00068 Tc +1.45579 Tw +(5.1 Str)Tj [7.59999 ]TJ (i)Tj [-4.09999 ]TJ (ng)Tj [11.59999 ]TJ (s )Tj +38.08699 0 TD +0 Tc +0 Tw +(32 )Tj +-38.08699 -1.15219 TD +0.00109 Tc +1.45539 Tw +(5.2 Reserv)Tj [12 ]TJ (ed )Tj [1456.5 ]TJ (W)Tj [10.19999 ]TJ (o)Tj [1.09999 ]TJ (rd)Tj [12 ]TJ (s)Tj [9.89999 ]TJ ( )Tj [-26815.19999 ]TJ (33 )Tj +0 -1.14129 TD +-0.00019 Tc +1.45669 Tw +(5.3 Debug)Tj [10.69999 ]TJ (g)Tj [10.69999 ]TJ (i)Tj [-5 ]TJ (ng)Tj [10.69999 ]TJ ( )Tj [1456.5 ]TJ (Lex)Tj [-11 ]TJ ( )Tj [-27195.69999 ]TJ (33 )Tj +/N223 1 Tf +0 -2.78259 TD +-0.00399 Tc +0.49789 Tw +(6. M)Tj +8.99919 0 0 8.99919 116.91088 281.08259 Tm +-0.00178 Tc +0 Tw +(ORE )Tj +11.03909 0 0 11.03909 138.86909 281.08259 Tm +0 Tc +(Y)Tj +8.99919 0 0 8.99919 146.18849 281.08259 Tm +-0.01548 Tc +(AC)Tj [-13.29998 ]TJ (C)Tj +11.03909 0 0 11.03909 165.62689 281.08259 Tm +-0.00178 Tc +30.85438 Tw +( 35)Tj +ET +90.03298 279.88299 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 281.08259 Tm +0 Tc +0 Tw +( )Tj +/N231 1 Tf +-39.08699 -1.68479 TD +0.00079 Tc +1.45568 Tw +(6.1 Recurs)Tj [9.5 ]TJ (ion)Tj [11.69999 ]TJ ( )Tj [-29380.5 ]TJ (35 )Tj +0 -1.14129 TD +0.00088 Tc +1.45559 Tw +(6.2 I)Tj [18.69999 ]TJ (f)Tj [-13.89999 ]TJ (-)Tj [7.79998 ]TJ (E)Tj [3 ]TJ (lse )Tj [1456.5 ]TJ (Am)Tj [17.89999 ]TJ (big)Tj [11.79998 ]TJ (u)Tj [0.89999 ]TJ (ity )Tj [-26141.29998 ]TJ (35 )Tj +0 -1.15219 TD +0.00158 Tc +1.45489 Tw +(6.3 Erro)Tj [12.5 ]TJ (r )Tj [1456.5 ]TJ (Me)Tj [10.69999 ]TJ (ssag)Tj [12.5 ]TJ (e)Tj [-0.19999 ]TJ (s)Tj [10.39999 ]TJ ( )Tj [-27195.69999 ]TJ (36 )Tj +0 -1.14129 TD +0.00119 Tc +1.45529 Tw +(6.4 I)Tj [19 ]TJ (nherited )Tj [1456.5 ]TJ (A)Tj [16.79998 ]TJ (t)Tj [-3.59999 ]TJ (t)Tj [7.29998 ]TJ (r)Tj [-2.69999 ]TJ (ibu)Tj [12.09999 ]TJ (t)Tj [-3.59999 ]TJ (e)Tj [10.29998 ]TJ (s)Tj [10 ]TJ ( )Tj [-25597.89999 ]TJ (37 )Tj +T* +0.00048 Tc +1.45599 Tw +(6.5 Em)Tj [17.5 ]TJ (bedded )Tj [1456.5 ]TJ (Actio)Tj [11.39999 ]TJ (ns)Tj [9.29998 ]TJ ( )Tj [-25815.19999 ]TJ (37 )Tj +0 -1.15219 TD +(6.6 D)Tj [5.29998 ]TJ (e)Tj [-1.29998 ]TJ (bug)Tj [11.39999 ]TJ (g)Tj [11.39999 ]TJ (i)Tj [-4.29998 ]TJ (ng)Tj [11.39999 ]TJ ( )Tj [1445.59999 ]TJ (Y)Tj [5.29998 ]TJ (acc )Tj [-26695.69999 ]TJ (38 )Tj +/N223 1 Tf +0 -2.78259 TD +-0.00399 Tc +0.49789 Tw +(7. B)Tj +8.99919 0 0 8.99919 115.59098 168.53199 Tm +-0.00358 Tc +0 Tw +(I)Tj [-5.79998 ]TJ (B)Tj [-1.39999 ]TJ (L)Tj [-6.09999 ]TJ (I)Tj [-5.79998 ]TJ (OGR)Tj [-14.79998 ]TJ (A)Tj [11.89999 ]TJ (P)Tj [-3.29998 ]TJ (HY)Tj +11.03909 0 0 11.03909 178.10578 168.53199 Tm +-0.00178 Tc +29.72399 Tw +( 39)Tj +ET +90.03298 167.33198 431.48399 -1.19999 rf +BT +11.03909 0 0 11.03909 521.51719 168.53199 Tm +0 Tc +0 Tw +( )Tj +9.95919 0 0 9.95919 90.03318 150.77349 Tm +( )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 4 4 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 4)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +0.00158 Tc +0.48719 Tw +(1)Tj [4.39999 ]TJ (.)Tj [-0.59999 ]TJ ( Introduc)Tj [4.39999 ]TJ (ti)Tj [6.09999 ]TJ (on )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 681.00929 Tm +-0.00009 Tc +0.13009 Tw +(Until 1975, writing a)Tj [-6.29998 ]TJ ( co)Tj [-10.09999 ]TJ (mpiler was)Tj [-10.89999 ]TJ ( a v)Tj [-10.09999 ]TJ (e)Tj [3.69999 ]TJ (r)Tj [-17.09999 ]TJ (y)Tj [19.89999 ]TJ ( time-)Tj [-7.09999 ]TJ (c)Tj [3.69999 ]TJ (onsuming)Tj [9.89999 ]TJ ( p)Tj [-10.09999 ]TJ (r)Tj [2.89999 ]TJ (ocess.)Tj [-10.09999 ]TJ ( The)Tj [-6.29998 ]TJ (n)Tj [-0.09999 ]TJ ( )Tj +0 0 1 sc +31.00999 0 TD +0.00009 Tc +0.12989 Tw +(L)Tj [10.89999 ]TJ (e)Tj [3.89999 ]TJ (sk [)Tj [-6.89999 ]TJ (1975])Tj +ET +462.12199 679.68899 59.875 -0.59999 rf +BT +11.99899 0 0 11.99899 521.99708 681.00929 Tm +0 0 0 sc +0 Tc +0 Tw +( )Tj +-36 -1.14999 TD +-0.00099 Tc +(and )Tj +0 0 1 sc +1.84999 0 TD +0.00009 Tc +0.15989 Tw +(J)Tj [-10.69999 ]TJ (ohnson)Tj [10.09999 ]TJ ( [)Tj [-6.89999 ]TJ (1975)Tj [10.09999 ]TJ (])Tj +ET +112.23098 665.89099 76.31399 -0.59999 rf +BT +11.99899 0 0 11.99899 188.54499 667.21038 Tm +0 0 0 sc +0.00109 Tc +0.15888 Tw +( pub)Tj [11.09999 ]TJ (lishe)Tj [4.89999 ]TJ (d pa)Tj [4.89999 ]TJ (pe)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (s)Tj [0.29998 ]TJ ( on le)Tj [4.89999 ]TJ (x a)Tj [4.89999 ]TJ (nd )Tj [-10 ]TJ (y)Tj [21.09999 ]TJ (a)Tj [4.89999 ]TJ (cc)Tj [4.89999 ]TJ (. The)Tj [4.89999 ]TJ (s)Tj [0.29998 ]TJ (e)Tj [4.89999 ]TJ ( utilitie)Tj [4.89999 ]TJ (s g)Tj [11.09999 ]TJ (r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ (l)Tj [-21.09999 ]TJ (y)Tj [31.09999 ]TJ ( simplif)Tj [-15.89999 ]TJ (y)Tj [21.09999 ]TJ ( )Tj +-8.20999 -1.14999 TD +-0.00039 Tc +0.08039 Tw +(compiler writing)Tj [9.59999 ]TJ (.)Tj [-0.39999 ]TJ ( )Tj [-20 ]TJ (I)Tj [22.59999 ]TJ (m)Tj [-2.59999 ]TJ (pl)Tj [-12.59999 ]TJ (e)Tj [-6.59999 ]TJ (m)Tj [-2.59999 ]TJ (entation details for lex)Tj [-10.39999 ]TJ ( and )Tj [-10 ]TJ (y)Tj [19.59999 ]TJ (a)Tj [-6.59999 ]TJ (c)Tj [-6.59999 ]TJ (c)Tj [3.39999 ]TJ ( ma)Tj [-16.59999 ]TJ (y)Tj [19.59999 ]TJ ( be found)Tj [-10.39999 ]TJ ( in )Tj +0 0 1 sc +31.03999 0 TD +-0.00019 Tc +0.08018 Tw +(Aho [)Tj [-7.19999 ]TJ (1986])Tj +ET +462.48199 652.09199 56.63499 -0.59999 rf +BT +11.99899 0 0 11.99899 519.11738 653.41159 Tm +0 0 0 sc +-0.00999 Tc +0 Tw +(. )Tj +-35.75999 -1.14999 TD +-0.00228 Tc +0.00228 Tw +(L)Tj [8.5 ]TJ (e)Tj [1.5 ]TJ (x)Tj [-12.29998 ]TJ ( and )Tj [-20 ]TJ (y)Tj [17.69999 ]TJ (a)Tj [-8.5 ]TJ (cc a)Tj [-8.5 ]TJ (r)Tj [0.69999 ]TJ (e )Tj [-10 ]TJ (avai)Tj [-4.5 ]TJ (l)Tj [-4.5 ]TJ (a)Tj [1.5 ]TJ (bl)Tj [-14.5 ]TJ (e from)Tj [-4.39999 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N172 1 Tf +1.5 -1.22999 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00178 Tc +0.00178 Tw +(Mort)Tj [-4 ]TJ (i)Tj [-4 ]TJ (ce Kern S)Tj [-25.69999 ]TJ (y)Tj [18.19999 ]TJ (st)Tj [-4 ]TJ (em)Tj [-4 ]TJ (s \()Tj [-8.79998 ]TJ (M)Tj [-2.59999 ]TJ (KS)Tj [-5.69999 ]TJ (\), at)Tj [-4 ]TJ ( )Tj +0 0 1 sc +13.54998 0 TD +0.00019 Tc +0 Tw +(http://www.mks.com)Tj +ET +288.61698 609.73498 101.39199 -0.59999 rf +BT +11.99899 0 0 11.99899 390.00819 611.05509 Tm +0 0 0 sc +0 Tc +(, )Tj +/N172 1 Tf +-23.5 -1.21998 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00088 Tc +0.00088 Tw +(GNU flex)Tj [-10.89999 ]TJ ( and bison, at )Tj +0 0 1 sc +9.54998 0 TD +0.00028 Tc +0 Tw +(http://www.g)Tj [10.29998 ]TJ (nu.or)Tj [-6.69999 ]TJ (g)Tj +ET +240.62098 595.09599 94.55198 -0.59999 rf +BT +11.99899 0 0 11.99899 335.17269 596.41629 Tm +0 0 0 sc +0 Tc +(, )Tj +/N172 1 Tf +-18.92999 -1.21998 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +0.00019 Tc +-0.00019 Tw +(Ming)Tj [10.19999 ]TJ (, at )Tj +0 0 1 sc +3.62998 0 TD +0 Tw +(http://ag)Tj [10.19999 ]TJ (n)Tj [-9.79998 ]TJ (es.dida.ph)Tj [-9.79998 ]TJ (y)Tj [20.19999 ]TJ (s)Tj [-0.59999 ]TJ (ik.uni-)Tj [-6.79998 ]TJ (e)Tj [4 ]TJ (ssen.de/~ja)Tj [-6 ]TJ (njaap/ming)Tj [10.19999 ]TJ (w)Tj [2.39999 ]TJ (32)Tj +ET +169.58699 580.45799 270.33699 -0.59999 rf +BT +11.99899 0 0 11.99899 439.92399 581.77749 Tm +0 0 0 sc +0 Tc +(, )Tj +/N172 1 Tf +-27.65998 -1.21998 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00009 Tc +0.00009 Tw +(C)Tj [-13.09999 ]TJ (y)Tj [19.89999 ]TJ (gnus, at )Tj +0 0 1 sc +4.51998 0 TD +0 Tc +0 Tw +(http://www.c)Tj [-6.19999 ]TJ (y)Tj [10 ]TJ (gnus.com/misc/)Tj [-12.19999 ]TJ (g)Tj [10 ]TJ (n)Tj [0 ]TJ (u-win)Tj [-10 ]TJ (3)Tj [0 ]TJ (2)Tj +ET +180.26599 565.81898 196.78399 -0.59999 rf +BT +11.99899 0 0 11.99899 377.04928 567.13868 Tm +0 0 0 sc +-0.00059 Tc +0.00059 Tw +(, and )Tj +/N172 1 Tf +-22.41999 -1.22999 TD +0 Tc +0 Tw +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00048 Tc +0.00048 Tw +(me, at )Tj +0 0 1 sc +2.68998 0 TD +0.00099 Tc +0 Tw +(http://e)Tj [4.79998 ]TJ (pa)Tj [4.79998 ]TJ (pe)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (p)Tj [1 ]TJ (r)Tj [4 ]TJ (e)Tj [4.79998 ]TJ (ss.)Tj [-9 ]TJ (c)Tj [4.79998 ]TJ (o)Tj [1 ]TJ (m)Tj +ET +158.30699 551.05999 108.95098 -0.59999 rf +BT +11.99899 0 0 11.99899 267.25839 552.37998 Tm +0 0 0 sc +0 Tc +(. )Tj +-14.76998 -1.13999 TD +( )Tj +0 -1.14999 TD +-0.00048 Tc +0.27049 Tw +(The ve)Tj [-6.69999 ]TJ (rsion from M)Tj [-11.29998 ]TJ (K)Tj [1.69999 ]TJ (S is a hi)Tj [-12.69999 ]TJ (g)Tj [9.5 ]TJ (h)Tj [-0.39999 ]TJ (-qu)Tj [-10.5 ]TJ (a)Tj [3.29998 ]TJ (lit)Tj [-12.69999 ]TJ (y)Tj [19.5 ]TJ ( )Tj [-10 ]TJ (com)Tj [-12.69999 ]TJ (m)Tj [-2.69999 ]TJ (ercial p)Tj [-10.5 ]TJ (r)Tj [2.5 ]TJ (oduct that )Tj [-10 ]TJ (ret)Tj [-12.69999 ]TJ (a)Tj [3.29998 ]TJ (ils for )Tj [-10 ]TJ (about )Tj +T* +-0.00088 Tc +0.06089 Tw +($300US. GNU softw)Tj [-8.69999 ]TJ (a)Tj [2.89999 ]TJ (re)Tj [-7.09999 ]TJ ( )Tj [-10 ]TJ (is free.)Tj [-10.89999 ]TJ ( Output from fl)Tj [-13.09999 ]TJ (ex)Tj [-10.89999 ]TJ ( ma)Tj [-7.09999 ]TJ (y)Tj [19.09999 ]TJ ( )Tj [-10 ]TJ (be us)Tj [-11.69999 ]TJ (ed in a )Tj [-10 ]TJ (commercial p)Tj [-10.89999 ]TJ (r)Tj [2.09999 ]TJ (oduct, )Tj +T* +-0.00048 Tc +0.01049 Tw +(and, as of v)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ (rsion 1.24, t)Tj [-12.69999 ]TJ (h)Tj [-0.5 ]TJ (e same is true )Tj [-10 ]TJ (for bison.)Tj [-10.5 ]TJ ( Ming)Tj [9.5 ]TJ ( and C)Tj [-23.5 ]TJ (y)Tj [19.5 ]TJ (gnus a)Tj [-6.69999 ]TJ (r)Tj [2.5 ]TJ (e 32)Tj [-10.39999 ]TJ (-bit W)Tj [-6.69999 ]TJ (i)Tj [-2.69999 ]TJ (ndows-)Tj +T* +-0.00039 Tc +0.06039 Tw +(95/NT ports of the GNU software. M)Tj [-21.19999 ]TJ (y)Tj [19.59999 ]TJ ( version is based on Ming)Tj [9.59999 ]TJ (\222s, but is compiled with )Tj +T* +0.00028 Tw +(Visual C++)Tj [-6.29998 ]TJ ( and in)Tj [-10.29998 ]TJ (cludes )Tj [-10 ]TJ (a minor bu)Tj [-10.29998 ]TJ (g fix)Tj [-10.29998 ]TJ ( in the fil)Tj [-12.5 ]TJ (e)Tj [3.5 ]TJ ( handlin)Tj [-10.29998 ]TJ (g)Tj [9.69999 ]TJ ( )Tj [-10 ]TJ (routine. )Tj [-10 ]TJ (I)Tj [12.69999 ]TJ (f)Tj [-7.29998 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.69999 ]TJ (o)Tj [-0.29998 ]TJ (u)Tj [-10.29998 ]TJ ( download m)Tj [-22.5 ]TJ (y)Tj [9.69999 ]TJ ( )Tj +T* +-0.00068 Tc +0.00068 Tw +(version, be sure to )Tj [-10 ]TJ (retain )Tj [-10 ]TJ (director)Tj [-17.69999 ]TJ (y)Tj [19.29998 ]TJ ( structur)Tj [-7.69999 ]TJ (e when )Tj [-10 ]TJ (y)Tj [19.29998 ]TJ (o)Tj [-10.69999 ]TJ (u unz)Tj [-6.89999 ]TJ (ip. )Tj +T* +0 Tc +0 Tw +( )Tj +ET +1 1 1 sc +/N224 /ColorSpace findRes CS +0 0 0 SC +1 J +1 j +0.23899 w +10 M +[]0 d +270.97799 392.31298 107.99099 17.99899 re +B* +BT +/N228 1 Tf +8.99179 0 0 8.99179 292.21629 398.67279 Tm +0 0 0 sc +0.00408 Tc +-0.00169 Tw +(Lex)Tj [23.69999 ]TJ (ical Analy)Tj [10.39999 ]TJ (z)Tj [10.39999 ]TJ (e)Tj [-0.19999 ]TJ (r)Tj +ET +1 1 1 sc +270.97799 320.43899 107.99099 17.99798 re +B* +BT +8.99179 0 0 8.99179 292.57629 326.67878 Tm +0 0 0 sc +0.00289 Tc +-0.00048 Tw +(Sy)Tj [9.19999 ]TJ (ntax)Tj [22.5 ]TJ ( Analy)Tj [9.19999 ]TJ (z)Tj [9.19999 ]TJ (e)Tj [-1.39999 ]TJ (r)Tj +/N173 1 Tf +-0.29359 11.00909 TD +0.60099 Tc +0 Tw +(a=b+c*d)Tj +-2.40199 -7.01908 TD +0.00048 Tc +(id1)Tj [-600.5 ]TJ (=)Tj [-600.5 ]TJ (id2)Tj [-600.5 ]TJ (+)Tj [-600.5 ]TJ (id3)Tj [-600.5 ]TJ (*)Tj [-600.5 ]TJ (id4)Tj +11.98919 0 0 11.98919 321.37388 287.56208 Tm +0 Tc +(=)Tj +3.00248 -1.50119 TD +(+)Tj +ET +333.97299 286.72198 m +351.97099 277.72299 l +369.96998 268.72399 m +387.96798 259.72399 l +315.97399 286.72198 m +297.97599 277.72299 l +405.96699 250.72499 m +423.96499 241.72599 l +S +BT +11.98919 0 0 11.98919 393.24789 251.56498 Tm +(*)Tj +ET +351.97099 268.72399 m +333.97299 259.72399 l +387.96798 250.72499 m +369.96998 241.72599 l +S +BT +8.99179 0 0 8.99179 277.57749 268.24369 Tm +0.00048 Tc +(id1)Tj +ET +324.97399 423.87098 m +324.97399 413.43199 l +S +324.97399 410.31199 m +327.01298 414.39099 l +326.89299 414.27099 l +326.65299 414.15199 l +326.41299 414.15199 l +326.17298 414.03199 l +325.93399 414.03199 l +325.69398 413.91198 l +324.37399 413.91198 l +324.13398 414.03199 l +323.89399 414.03199 l +323.65399 414.15199 l +323.41398 414.15199 l +323.17399 414.27099 l +322.93399 414.39099 l +324.97399 410.31199 l +f* +324.97399 392.31298 m +324.97399 377.43499 l +S +324.97399 374.31498 m +327.01298 378.39399 l +326.89299 378.27499 l +326.65299 378.15499 l +326.41299 378.15499 l +326.17298 378.03498 l +325.93399 378.03498 l +325.69398 377.91499 l +324.37399 377.91499 l +324.13398 378.03498 l +323.89399 378.03498 l +323.65399 378.15499 l +323.41398 378.15499 l +323.17399 378.27499 l +322.93399 378.39399 l +324.97399 374.31498 l +f* +324.97399 356.43598 m +324.97399 341.55799 l +S +324.97399 338.43798 m +327.01298 342.51699 l +326.89299 342.39698 l +326.65299 342.27699 l +326.41299 342.27699 l +326.17298 342.15798 l +325.93399 342.15798 l +325.69398 342.03799 l +324.37399 342.03799 l +324.13398 342.15798 l +323.89399 342.15798 l +323.65399 342.27699 l +323.41398 342.27699 l +323.17399 342.39698 l +322.93399 342.51699 l +324.97399 338.43798 l +f* +324.97399 320.43899 m +324.97399 305.56098 l +S +324.97399 302.44099 m +327.01298 306.51998 l +326.89299 306.39999 l +326.65299 306.28099 l +326.41299 306.28099 l +326.17298 306.16099 l +325.93399 306.16099 l +325.69398 306.04098 l +324.37399 306.04098 l +324.13398 306.16099 l +323.89399 306.16099 l +323.65399 306.28099 l +323.41398 306.28099 l +323.17399 306.39999 l +322.93399 306.51998 l +324.97399 302.44099 l +f* +BT +/N171 1 Tf +9.95129 0 0 9.95129 201.02389 425.31059 Tm +0.00439 Tc +-0.00119 Tw +(s)Tj [7.69999 ]TJ (our)Tj [7.69999 ]TJ (ce cod)Tj [10 ]TJ (e)Tj +2.26689 -6.33029 TD +0.00088 Tc +0 Tw +(to)Tj [-5.5 ]TJ (ke)Tj [10.69999 ]TJ (n)Tj [-5.5 ]TJ (s)Tj +-1.80868 -7.45169 TD +0.00419 Tc +-0.00099 Tw +(s)Tj [7.5 ]TJ (y)Tj [1.89999 ]TJ (nt)Tj [4.69999 ]TJ (ax t)Tj [4.69999 ]TJ (r)Tj [19.59999 ]TJ (ee)Tj +/N173 1 Tf +8.99179 0 0 8.99179 313.57449 250.24519 Tm +0.00048 Tc +0 Tw +(id2)Tj +4.00329 -2.00169 TD +(id3)Tj [-6939.09999 ]TJ (id4)Tj +ET +324.97399 241.72599 m +324.97399 226.72698 l +S +324.97399 223.72698 m +327.01298 227.80699 l +326.89299 227.68699 l +326.65299 227.56698 l +326.41299 227.44699 l +326.17298 227.44699 l +325.93399 227.32699 l +324.13398 227.32699 l +323.89399 227.44699 l +323.65399 227.44699 l +323.41398 227.56698 l +322.93399 227.80699 l +324.97399 223.72698 l +f* +BT +8.99179 0 0 8.99179 295.21609 174.29148 Tm +(load)Tj [-1601.29998 ]TJ (id3)Tj +0 -1.20098 TD +(mul)Tj [-2201.79998 ]TJ (id4)Tj +T* +(add)Tj [-2201.79998 ]TJ (id2)Tj +T* +(store)Tj [-1000.79998 ]TJ (id1)Tj +ET +1 1 1 sc +270.97799 205.72898 107.99099 17.99899 re +B* +BT +/N228 1 Tf +8.99179 0 0 8.99179 292.57629 211.96839 Tm +0 0 0 sc +0.00379 Tc +-0.00138 Tw +(C)Tj [5.39999 ]TJ (ode G)Tj [7.69999 ]TJ (enerator)Tj +ET +324.97399 205.72898 m +324.97399 190.84999 l +S +324.97399 187.72999 m +327.01298 191.80999 l +326.89299 191.80999 l +326.65299 191.68998 l +326.41299 191.56999 l +326.17298 191.56999 l +325.93399 191.44999 l +325.45399 191.44999 l +325.09399 191.32998 l +324.85398 191.32998 l +324.61399 191.44999 l +324.13398 191.44999 l +323.89399 191.56999 l +323.65399 191.56999 l +323.41398 191.68998 l +323.17399 191.80999 l +322.93399 191.80999 l +324.97399 187.72999 l +f* +BT +/N171 1 Tf +9.95129 0 0 9.95129 187.58509 175.73139 Tm +0.00479 Tc +-0.00158 Tw +(gener)Tj [8.09999 ]TJ (a)Tj [-1.59999 ]TJ (t)Tj [5.29998 ]TJ (e)Tj [2.5 ]TJ (d co)Tj [10.39999 ]TJ (de)Tj +/N231 1 Tf +11.99899 0 0 11.99899 450.72309 136.13459 Tm +0 Tc +0 Tw +( )Tj +/N170 1 Tf +-19.09999 -1.38999 TD +-0.00149 Tc +0.00149 Tw +(F)Tj [9.29998 ]TJ (i)Tj [-3.69999 ]TJ (gure 1)Tj [-11.5 ]TJ (-)Tj [1.5 ]TJ (1: )Tj +/N231 1 Tf +4.98999 0 TD +-0.00019 Tc +0.00019 Tw +(Compilation Sequence )Tj +-15.94999 -1.64999 TD +1.25 Tc +0 Tw +( )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 5 5 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 5)Tj +0 55.84999 TD +-0.00109 Tc +0.12109 Tw +( )Tj [-1130 ]TJ (L)Tj [9.69999 ]TJ (e)Tj [2.69999 ]TJ (x)Tj [-11.09999 ]TJ ( g)Tj [8.89999 ]TJ (e)Tj [2.69999 ]TJ (n)Tj [-11.09999 ]TJ (e)Tj [2.69999 ]TJ (r)Tj [-8.09999 ]TJ (a)Tj [2.69999 ]TJ (tes C code for a lex)Tj [-11.09999 ]TJ (i)Tj [-3.29998 ]TJ (cal anal)Tj [-13.29998 ]TJ (y)Tj [28.89999 ]TJ (z)Tj [-7.29998 ]TJ (e)Tj [-7.29998 ]TJ (r)Tj [1.89999 ]TJ (, or scanner. )Tj [-10 ]TJ (I)Tj [11.89999 ]TJ (t)Tj [-3.29998 ]TJ ( uses patterns t)Tj [-13.29998 ]TJ (h)Tj [-1.09999 ]TJ (at match )Tj +0 -1.14999 TD +0.00009 Tc +0.47988 Tw +(string)Tj [10.09999 ]TJ (s in th)Tj [-9.89999 ]TJ (e input a)Tj [-6.09999 ]TJ (nd conve)Tj [-6.09999 ]TJ (rts the strin)Tj [-9.89999 ]TJ (g)Tj [0.09999 ]TJ (s to )Tj +/N171 1 Tf +22.81999 0 TD +-0.00248 Tc +0 Tw +(t)Tj [-4.69999 ]TJ (o)Tj [-2.5 ]TJ (kens)Tj +/N231 1 Tf +2.54998 0 TD +-0.00109 Tc +0.48109 Tw +(.)Tj [-11.09999 ]TJ ( Tokens )Tj [-10 ]TJ (are)Tj [-7.29998 ]TJ ( numeric)Tj [-7.29998 ]TJ (al)Tj [-13.29998 ]TJ ( )Tj +-25.36999 -1.14999 TD +-0.00019 Tc +0.00019 Tw +(repres)Tj [-11 ]TJ (entations of string)Tj [9.79998 ]TJ (s)Tj [-11 ]TJ (,)Tj [-0.19999 ]TJ ( and simplif)Tj [-7.19999 ]TJ (y)Tj [19.79998 ]TJ ( proc)Tj [-6.39999 ]TJ (essing. This is illustrated in F)Tj [5.89999 ]TJ (i)Tj [-2.39999 ]TJ (gure 1-1. )Tj +T* +-0.00009 Tc +0.17008 Tw +( )Tj [-1080 ]TJ (As lex)Tj [-10.09999 ]TJ ( finds identifiers )Tj [-10 ]TJ (in the input stream, it e)Tj [-6.29998 ]TJ (n)Tj [-0.09999 ]TJ (ters them in a)Tj [-6.29998 ]TJ ( )Tj +/N171 1 Tf +28.50999 0 TD +0.00009 Tc +0.17988 Tw +(symbol table)Tj +/N231 1 Tf +5.25999 0 TD +-0.00019 Tc +0.17019 Tw +(. The)Tj [-6.39999 ]TJ ( )Tj +-33.76998 -1.14999 TD +-0.00039 Tc +0.08039 Tw +(s)Tj [-11.19999 ]TJ (y)Tj [19.59999 ]TJ (mbol table ma)Tj [-16.59999 ]TJ (y)Tj [19.59999 ]TJ ( also )Tj [-10 ]TJ (c)Tj [-6.59999 ]TJ (ontain other information)Tj [-10.39999 ]TJ ( such as data t)Tj [-22.59999 ]TJ (y)Tj [19.59999 ]TJ (pe )Tj [-10 ]TJ (\()Tj +/N171 1 Tf +27.95999 0 TD +0.00169 Tc +0 Tw +(inte)Tj [5.5 ]TJ (g)Tj [-8.29998 ]TJ (e)Tj [5.5 ]TJ (r)Tj +/N231 1 Tf +2.83999 0 TD +-0.00149 Tc +0.08149 Tw +( or )Tj +/N171 1 Tf +1.48999 0 TD +-0.00079 Tc +0 Tw +(real)Tj +/N231 1 Tf +1.60998 0 TD +-0.00158 Tc +0.08158 Tw +(\) and )Tj +-33.89999 -1.14999 TD +0.00189 Tc +0.09809 Tw +(loc)Tj [5.69999 ]TJ (a)Tj [5.69999 ]TJ (tion of)Tj [4.89999 ]TJ ( the va)Tj [5.69999 ]TJ (r)Tj [4.89999 ]TJ (i)Tj [-10.29998 ]TJ (a)Tj [5.69999 ]TJ (b)Tj [1.89999 ]TJ (le)Tj [5.69999 ]TJ ( i)Tj [-10.29998 ]TJ (n)Tj [1.89999 ]TJ ( me)Tj [5.69999 ]TJ (mor)Tj [-15.09999 ]TJ (y)Tj [21.89999 ]TJ (. All subse)Tj [5.69999 ]TJ (q)Tj [1.89999 ]TJ (u)Tj [-8.09999 ]TJ (e)Tj [-4.29998 ]TJ (nt r)Tj [4.89999 ]TJ (e)Tj [5.69999 ]TJ (fe)Tj [5.69999 ]TJ (r)Tj [4.89999 ]TJ (e)Tj [5.69999 ]TJ (n)Tj [-8.09999 ]TJ (c)Tj [5.69999 ]TJ (e)Tj [5.69999 ]TJ (s)Tj [1.09999 ]TJ ( to id)Tj [-8.09999 ]TJ (e)Tj [5.69999 ]TJ (n)Tj [1.89999 ]TJ (tif)Tj [4.89999 ]TJ (ier)Tj [4.89999 ]TJ (s)Tj [1.09999 ]TJ ( r)Tj [4.89999 ]TJ (e)Tj [-4.29998 ]TJ (f)Tj [4.89999 ]TJ (e)Tj [5.69999 ]TJ (r to the)Tj [5.69999 ]TJ ( )Tj +T* +-0.00059 Tc +0.00059 Tw +(appropriate s)Tj [-21.39999 ]TJ (y)Tj [19.39999 ]TJ (mbol table )Tj [-10 ]TJ (index)Tj [-10.59999 ]TJ (.)Tj [-0.59999 ]TJ ( )Tj +T* +-0.00199 Tc +0.03199 Tw +( )Tj [-1220 ]TJ (Yacc )Tj [-10 ]TJ (gener)Tj [-9 ]TJ (a)Tj [1.79998 ]TJ (t)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (s C)Tj [-5 ]TJ ( code f)Tj [-9 ]TJ (o)Tj [-2 ]TJ (r a s)Tj [-12.79998 ]TJ (y)Tj [18 ]TJ (nt)Tj [-14.19999 ]TJ (ax)Tj [-12 ]TJ ( anal)Tj [-14.19999 ]TJ (y)Tj [28 ]TJ (z)Tj [-18.19999 ]TJ (er, or )Tj [-10 ]TJ (parser. Y)Tj [-9.79998 ]TJ (a)Tj [1.79998 ]TJ (c)Tj [-8.19999 ]TJ (c)Tj [1.79998 ]TJ ( uses )Tj [-10 ]TJ (g)Tj [8 ]TJ (r)Tj [1 ]TJ (am)Tj [-4.19999 ]TJ (m)Tj [-14.19999 ]TJ (a)Tj [1.79998 ]TJ (r rul)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (s t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (at)Tj [-14.19999 ]TJ ( )Tj +T* +0.15209 Tw +(al)Tj [-4.29998 ]TJ (l)Tj [-4.29998 ]TJ (o)Tj [-2.09999 ]TJ (w i)Tj [-4.29998 ]TJ (t)Tj [-4.29998 ]TJ ( t)Tj [-4.29998 ]TJ (o)Tj [-2.09999 ]TJ ( anal)Tj [-24.29998 ]TJ (y)Tj [27.89999 ]TJ (z)Tj [-8.29998 ]TJ (e)Tj [-8.29998 ]TJ ( t)Tj [-4.29998 ]TJ (oke)Tj [-8.29998 ]TJ (ns from)Tj [-4.29998 ]TJ ( l)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (x)Tj [-12.09999 ]TJ ( and cr)Tj [-9.09999 ]TJ (eat)Tj [-4.29998 ]TJ (e )Tj [-10 ]TJ (a s)Tj [-12.89999 ]TJ (y)Tj [17.89999 ]TJ (nt)Tj [-14.29998 ]TJ (ax)Tj [-12.09999 ]TJ ( t)Tj [-4.29998 ]TJ (r)Tj [0.89999 ]TJ (ee. A s)Tj [-22.89999 ]TJ (y)Tj [17.89999 ]TJ (nt)Tj [-4.29998 ]TJ (ax)Tj [-12.09999 ]TJ ( )Tj [-10 ]TJ (t)Tj [-4.29998 ]TJ (r)Tj [0.89999 ]TJ (ee i)Tj [-4.29998 ]TJ (m)Tj [-4.29998 ]TJ (poses a)Tj [-8.29998 ]TJ ( )Tj +T* +0.09199 Tw +(hi)Tj [-4.19999 ]TJ (erar)Tj [-9 ]TJ (chi)Tj [-4.19999 ]TJ (cal)Tj [-4.19999 ]TJ ( st)Tj [-4.19999 ]TJ (ruct)Tj [-4.19999 ]TJ (ur)Tj [-9 ]TJ (e on)Tj [-12 ]TJ ( t)Tj [-4.19999 ]TJ (okens. For )Tj [-10 ]TJ (ex)Tj [-12 ]TJ (am)Tj [-4.19999 ]TJ (pl)Tj [-4.19999 ]TJ (e, operat)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ (r p)Tj [-12 ]TJ (r)Tj [1 ]TJ (ec)Tj [-8.19999 ]TJ (edenc)Tj [-8.19999 ]TJ (e)Tj [1.79998 ]TJ ( and )Tj [-10 ]TJ (associ)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (v)Tj [-2 ]TJ (i)Tj [-4.19999 ]TJ (t)Tj [-14.19999 ]TJ (y)Tj [18 ]TJ ( a)Tj [-8.19999 ]TJ (r)Tj [1 ]TJ (e)Tj [-8.09999 ]TJ ( )Tj +T* +-0.00099 Tc +0.03099 Tw +(apparent)Tj [-13.19999 ]TJ ( in the s)Tj [-21.79998 ]TJ (y)Tj [19 ]TJ (nt)Tj [-13.19999 ]TJ (ax)Tj [-11 ]TJ ( tree. Th)Tj [-11 ]TJ (e nex)Tj [-11 ]TJ (t)Tj [-3.19999 ]TJ ( step, )Tj [-10 ]TJ (code )Tj [-10 ]TJ (generation, do)Tj [-11 ]TJ (es )Tj [-10 ]TJ (a depth)Tj [-10.79998 ]TJ (-)Tj [2 ]TJ (f)Tj [-8 ]TJ (i)Tj [-3.19999 ]TJ (rst walk of)Tj [-8 ]TJ ( the)Tj [-7.19999 ]TJ ( )Tj +T* +0.16099 Tw +(s)Tj [-11.79998 ]TJ (y)Tj [19 ]TJ (ntax)Tj [-11 ]TJ ( tree to g)Tj [9 ]TJ (e)Tj [2.79998 ]TJ (ne)Tj [-7.19999 ]TJ (rate )Tj [-10 ]TJ (code. Some compilers produce machine cod)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ (, w)Tj [-8.79998 ]TJ (h)Tj [-1 ]TJ (ile others, as)Tj [8.19999 ]TJ ( )Tj +T* +-0.00009 Tc +0.00009 Tw +(shown above, output asse)Tj [-6.29998 ]TJ (mbl)Tj [-12.29998 ]TJ (y)Tj [19.89999 ]TJ (. )Tj +T* +0 Tc +0 Tw +( )Tj +ET +1 1 1 sc +/N224 /ColorSpace findRes CS +0 0 0 SC +1 J +1 j +0.71699 w +10 M +[]0 d + +213.62298 417.03099 35.99699 17.99899 re +B* +BT +/N228 1 Tf +8.99128 0 0 8.99128 225.86178 423.39068 Tm +0 0 0 sc +0.00448 Tc +(lex)Tj +ET +1 1 1 sc +213.62298 489.02499 35.99699 17.99899 re +B* +BT +8.99128 0 0 8.99128 222.26208 495.26478 Tm +0 0 0 sc +-0.00619 Tc +(ya)Tj [-10.5 ]TJ (c)Tj [-13.29998 ]TJ (c)Tj +ET +1 1 1 sc +348.49198 453.02799 35.99699 17.99899 re +B* +BT +8.99128 0 0 8.99128 361.93049 459.26779 Tm +0 0 0 sc +0.00709 Tc +(cc)Tj +-22.83338 4.00349 TD +0.00408 Tc +(bas.y)Tj +0.26689 -7.99369 TD +0.00379 Tc +(bas.l)Tj [-12385.09999 ]TJ (lex)Tj [23.39999 ]TJ (.)Tj [1.39999 ]TJ (y)Tj [10 ]TJ (y)Tj [23.39999 ]TJ (.c)Tj +14.51939 7.99369 TD +0.00299 Tc +(y)Tj [9.19999 ]TJ (.tab)Tj [12 ]TJ (.)Tj [0.59999 ]TJ (c)Tj +15.80059 -3.99018 TD +0.00448 Tc +(bas.ex)Tj [24.09999 ]TJ (e)Tj +0.24018 5.99189 TD +0.00509 Tc +(source)Tj +-2.04179 -12.99809 TD +0.00439 Tc +-0.00199 Tw +(com)Tj [10 ]TJ (p)Tj [0.09999 ]TJ (iled output)Tj +ET +447.48298 507.02398 m +447.48298 474.74598 l +S +447.48298 471.02699 m +450.00299 476.06599 l +449.64299 475.82598 l +449.40299 475.82598 l +449.04299 475.70599 l +448.80299 475.58599 l +448.44299 475.46598 l +446.40299 475.46598 l +446.04299 475.58599 l +445.80398 475.70599 l +445.44398 475.82598 l +445.20399 475.82598 l +444.96398 476.06599 l +447.48298 471.02699 l +f* +447.48298 453.02799 m +447.48298 420.87098 l +S +447.48298 417.03099 m +450.00299 422.07099 l +449.64299 421.95098 l +449.40299 421.83099 l +449.04299 421.83099 l +448.80299 421.71099 l +448.44299 421.59098 l +447.84298 421.59098 l +447.60299 421.47099 l +447.24299 421.47099 l +447.00299 421.59098 l +446.40299 421.59098 l +446.04299 421.71099 l +445.80398 421.83099 l +445.44398 421.83099 l +445.20399 421.95098 l +444.96398 422.07099 l +447.48298 417.03099 l +f* +384.48899 462.02799 m +421.20599 462.02799 l +S +425.04499 462.02799 m +420.00599 459.50799 l +420.24598 459.98799 l +420.36599 460.34799 l +420.48599 460.58799 l +420.48599 460.94799 l +420.60598 461.18798 l +420.60598 462.74699 l +420.48599 462.98699 l +420.48599 463.34698 l +420.36599 463.58699 l +420.24598 463.94699 l +420.12599 464.18699 l +420.00599 464.54699 l +425.04499 462.02799 l +f* +321.49398 498.02499 m +346.21199 465.02699 l +S +348.49198 462.02799 m +343.45199 464.54699 l +343.81199 464.54699 l +344.05198 464.66699 l +344.41198 464.78698 l +344.65199 464.78698 l +344.89199 464.90699 l +345.25199 465.14698 l +345.73199 465.38699 l +346.21199 465.86698 l +346.45199 465.98699 l +346.69198 466.22698 l +346.81199 466.46699 l +347.05198 466.70698 l +347.17199 466.94699 l +347.41198 467.18699 l +347.53199 467.54699 l +348.49198 462.02799 l +f* +321.49398 426.03099 m +346.21199 458.90798 l +S +348.49198 462.02799 m +343.45199 459.50799 l +343.81199 459.38798 l +344.05198 459.26799 l +344.41198 459.26799 l +344.65199 459.14799 l +344.89199 459.02799 l +345.25199 458.78799 l +345.49198 458.66799 l +345.73199 458.54798 l +346.21199 458.06799 l +346.45199 457.94799 l +346.69198 457.70799 l +346.81199 457.46798 l +347.05198 457.22799 l +347.17199 456.98799 l +347.41198 456.74798 l +347.53199 456.38798 l +348.49198 462.02799 l +f* +249.61999 426.03099 m +281.77699 426.03099 l +S +285.61698 426.03099 m +280.57699 423.51098 l +280.69699 423.87098 l +280.81698 424.11099 l +280.93699 424.47099 l +281.05699 424.71099 l +281.05699 425.07099 l +281.17698 425.31098 l +281.17698 426.86999 l +281.05699 427.10998 l +281.05699 427.46998 l +280.93699 427.70999 l +280.81698 428.06999 l +280.57699 428.54998 l +285.61698 426.03099 l +f* +249.61999 498.02499 m +281.77699 498.02499 l +S +285.61698 498.02499 m +280.57699 495.50498 l +280.81698 495.98498 l +280.93699 496.34498 l +281.05699 496.58499 l +281.05699 496.94499 l +281.17698 497.18499 l +281.17698 498.74398 l +281.05699 498.98399 l +281.05699 499.34399 l +280.93699 499.58399 l +280.81698 499.94398 l +280.69699 500.18399 l +280.57699 500.54399 l +285.61698 498.02499 l +f* +182.18598 498.02499 m +209.78298 498.02499 l +S +213.62298 498.02499 m +208.58299 495.50498 l +208.82299 495.98498 l +208.94299 496.34498 l +209.06298 496.58499 l +209.06298 496.94499 l +209.18299 497.18499 l +209.18299 498.74398 l +209.06298 498.98399 l +209.06298 499.34399 l +208.94299 499.58399 l +208.82299 499.94398 l +208.70298 500.18399 l +208.58299 500.54399 l +213.62298 498.02499 l +f* +182.18598 426.03099 m +209.78298 426.03099 l +S +213.62298 426.03099 m +208.58299 423.51098 l +208.70298 423.87098 l +208.82299 424.11099 l +208.94299 424.47099 l +209.06298 424.71099 l +209.06298 425.07099 l +209.18299 425.31098 l +209.18299 426.86999 l +209.06298 427.10998 l +209.06298 427.46998 l +208.94299 427.70999 l +208.82299 428.06999 l +208.58299 428.54998 l +213.62298 426.03099 l +f* +BT +8.99128 0 0 8.99128 289.57649 409.83189 Tm +0 Tc +0 Tw +(\()Tj +/N174 1 Tf +0.33358 0 TD +0.00549 Tc +(yylex)Tj +/N228 1 Tf +2.29539 0 TD +0 Tc +(\))Tj +-2.62899 11.00968 TD +(\()Tj +/N174 1 Tf +0.33358 0 TD +0.00648 Tc +(yypa)Tj [15.5 ]TJ (r)Tj [5.89999 ]TJ (se)Tj +/N228 1 Tf +3.52308 0 TD +0 Tc +(\))Tj +-11.81039 -5.51148 TD +0.00318 Tc +(y)Tj [9.39999 ]TJ (.tab.h)Tj +ET +231.62098 489.02499 m +231.62098 474.74598 l +S +231.62098 471.02699 m +234.14099 476.06599 l +233.90098 475.82598 l +233.54098 475.82598 l +233.30099 475.70599 l +233.06098 475.58599 l +232.70098 475.46598 l +230.54098 475.46598 l +230.30099 475.58599 l +229.94198 475.70599 l +229.70199 475.82598 l +229.34199 475.82598 l +229.10198 476.06599 l +231.62098 471.02699 l +f* +231.62098 453.02799 m +231.62098 438.86898 l +S +231.62098 435.02999 m +234.14099 440.06898 l +233.90098 439.94898 l +233.54098 439.82899 l +233.30099 439.82899 l +233.06098 439.70899 l +232.70098 439.58898 l +230.54098 439.58898 l +230.30099 439.70899 l +229.94198 439.82899 l +229.70199 439.82899 l +229.34199 439.94898 l +229.10198 440.06898 l +231.62098 435.02999 l +f* +BT +/N231 1 Tf +11.99899 0 0 11.99899 485.52018 388.11369 Tm +0 Tc +( )Tj +/N170 1 Tf +-24.64999 -1.39999 TD +-0.00149 Tc +0.00149 Tw +(F)Tj [9.29998 ]TJ (i)Tj [-3.69999 ]TJ (gure 1)Tj [-11.5 ]TJ (-)Tj [1.5 ]TJ (2: )Tj +/N231 1 Tf +5 0 TD +0.00138 Tc +-0.00138 Tw +(B)Tj [8.39999 ]TJ (u)Tj [1.39999 ]TJ (ilding)Tj [11.39999 ]TJ ( a)Tj [5.19999 ]TJ ( C)Tj [-11.59999 ]TJ (o)Tj [1.39999 ]TJ (mpile)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ ( with )Tj [-10 ]TJ (L)Tj [22.19999 ]TJ (e)Tj [5.19999 ]TJ (x)Tj [-8.59999 ]TJ (/)Tj [-0.79998 ]TJ (Ya)Tj [5.19999 ]TJ (cc)Tj +/N170 1 Tf +14.37998 0 TD +0 Tc +0 Tw +( )Tj +/N231 1 Tf +-27.68998 -1.64999 TD +( )Tj +0 -1.14999 TD +-0.00048 Tc +0.03048 Tw +( )Tj [-1220 ]TJ (F)Tj [5.59999 ]TJ (i)Tj [-2.69999 ]TJ (g)Tj [9.5 ]TJ (u)Tj [-10.5 ]TJ (re 1-2 illustrates the )Tj [-10 ]TJ (file naming)Tj [9.5 ]TJ ( )Tj [-10 ]TJ (conventions used b)Tj [-10.5 ]TJ (y)Tj [19.5 ]TJ ( lex)Tj [-10.5 ]TJ ( and )Tj [-20 ]TJ (y)Tj [19.5 ]TJ (a)Tj [-6.69999 ]TJ (cc. W)Tj [-6.69999 ]TJ (e)Tj [3.5 ]TJ (')Tj [9.69999 ]TJ (ll assum)Tj [-12.69999 ]TJ (e)Tj [-6.69999 ]TJ ( )Tj +T* +0.00099 Tc +-0.00099 Tw +(our)Tj [4 ]TJ ( g)Tj [11 ]TJ (o)Tj [-9 ]TJ (a)Tj [4.79998 ]TJ (l)Tj [-1.19999 ]TJ ( is to wr)Tj [4 ]TJ (ite)Tj [4.79998 ]TJ ( a)Tj [4.79998 ]TJ ( )Tj [-10 ]TJ (B)Tj [8 ]TJ (A)Tj [-6.79998 ]TJ (S)Tj [-12.79998 ]TJ (I)Tj [24 ]TJ (C c)Tj [4.79998 ]TJ (o)Tj [1 ]TJ (mpile)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (.)Tj [1 ]TJ ( )Tj [-10 ]TJ (F)Tj [7.09999 ]TJ (i)Tj [-1.19999 ]TJ (r)Tj [4 ]TJ (s)Tj [0.19999 ]TJ (t, we)Tj [4.79998 ]TJ ( n)Tj [-9 ]TJ (e)Tj [4.79998 ]TJ (e)Tj [4.79998 ]TJ (d)Tj [1 ]TJ ( to spe)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (i)Tj [-1.19999 ]TJ (f)Tj [-16 ]TJ (y)Tj [21 ]TJ ( )Tj [-10 ]TJ (a)Tj [4.79998 ]TJ (ll pa)Tj [4.79998 ]TJ (tte)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (n)Tj [1 ]TJ ( )Tj [-10 ]TJ (ma)Tj [4.79998 ]TJ (tc)Tj [4.79998 ]TJ (hing)Tj [11 ]TJ ( )Tj [-10 ]TJ (r)Tj [4 ]TJ (u)Tj [1 ]TJ (le)Tj [4.89999 ]TJ (s)Tj [-9.79998 ]TJ ( )Tj +0 -1.16999 TD +-0.00228 Tc +0.03228 Tw +(for l)Tj [-4.5 ]TJ (e)Tj [1.5 ]TJ (x)Tj [-12.29998 ]TJ ( \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 129.38989 309.88018 Tm +-0.00219 Tc +0 Tw +(bas.l)Tj +/N231 1 Tf +11.99899 0 0 11.99899 162.38708 309.88018 Tm +-0.00189 Tc +0.04188 Tw +(\) and g)Tj [8.09999 ]TJ (r)Tj [-8.89999 ]TJ (a)Tj [-8.09999 ]TJ (m)Tj [-4.09999 ]TJ (m)Tj [-4.09999 ]TJ (a)Tj [1.89999 ]TJ (r )Tj [10 ]TJ (rul)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ (s for )Tj [-10 ]TJ (y)Tj [18.09999 ]TJ (a)Tj [-8.09999 ]TJ (cc)Tj [-8.09999 ]TJ ( )Tj [10 ]TJ (\()Tj +/N173 1 Tf +11.03909 0 0 11.03909 310.69479 309.88018 Tm +-0.00219 Tc +0 Tw +(ba)Tj [-10.89999 ]TJ (s.y)Tj +/N231 1 Tf +11.99899 0 0 11.99899 343.81199 309.88018 Tm +0.00149 Tc +0.02848 Tw +(\))Tj [4.5 ]TJ (.)Tj [1.5 ]TJ ( Comma)Tj [5.29998 ]TJ (nds to c)Tj [5.29998 ]TJ (r)Tj [-5.5 ]TJ (e)Tj [5.29998 ]TJ (a)Tj [-4.69999 ]TJ (te)Tj [5.29998 ]TJ ( our)Tj [4.5 ]TJ ( c)Tj [5.29998 ]TJ (o)Tj [1.5 ]TJ (mpiler)Tj [4.5 ]TJ (,)Tj [1.5 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 295.36138 Tm +-0.00219 Tc +0 Tw +(bas.exe)Tj +/N231 1 Tf +11.99899 0 0 11.99899 136.22929 295.36138 Tm +0.00088 Tc +-0.00088 Tw +(, a)Tj [4.69999 ]TJ (r)Tj [3.89999 ]TJ (e)Tj [4.69999 ]TJ ( liste)Tj [4.69999 ]TJ (d be)Tj [4.69999 ]TJ (lo)Tj [-9.09999 ]TJ (w: )Tj +-3.84999 -1.17999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 269.20359 Tm +-0.00219 Tc +(yacc)Tj [-597.79998 ]TJ (\226d)Tj [-597.89999 ]TJ (bas.y)Tj [-11358.79998 ]TJ (#)Tj [-597.89999 ]TJ (create)Tj [-597.69999 ]TJ (y.tab.h,)Tj [-597.89999 ]TJ (y.tab.c)Tj +0 -1.13038 TD +(lex)Tj [-597.89999 ]TJ (bas.l)Tj [-13750.09999 ]TJ (#)Tj [-597.89999 ]TJ (create)Tj [-597.89999 ]TJ (lex.yy.c)Tj +T* +(cc)Tj [-597.89999 ]TJ (lex.yy.c)Tj [-597.89999 ]TJ (y.tab.c)Tj [-597.79998 ]TJ (\226obas.exe)Tj [-1793.5 ]TJ (#)Tj [-597.89999 ]TJ (compile/link)Tj +/N231 1 Tf +11.99899 0 0 11.99899 108.03169 229.96688 Tm +0 Tc +( )Tj +-1.5 -1.16999 TD +-0.00209 Tc +0.38209 Tw +(Yacc)Tj [-8.29998 ]TJ ( re)Tj [-8.29998 ]TJ (ads t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e )Tj [-10 ]TJ (gram)Tj [-4.29998 ]TJ (m)Tj [-14.29998 ]TJ (a)Tj [1.69999 ]TJ (r des)Tj [-12.89999 ]TJ (c)Tj [1.69999 ]TJ (ri)Tj [-4.29998 ]TJ (pt)Tj [-4.29998 ]TJ (i)Tj [-4.29998 ]TJ (ons i)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 310.81478 215.92799 Tm +-0.00219 Tc +0 Tw +(bas)Tj [-10.89999 ]TJ (.y)Tj +/N231 1 Tf +11.99899 0 0 11.99899 343.93199 215.92799 Tm +-0.00119 Tc +0.38119 Tw +( and )Tj [-10 ]TJ (g)Tj [8.79998 ]TJ (e)Tj [2.59999 ]TJ (n)Tj [-11.19999 ]TJ (e)Tj [2.59999 ]TJ (rat)Tj [-13.39999 ]TJ (e)Tj [2.59999 ]TJ (s a p)Tj [-11.19999 ]TJ (a)Tj [2.59999 ]TJ (rser,)Tj [-11.19999 ]TJ ( function )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 201.40928 Tm +-0.00219 Tc +0 Tw +(yyparse)Tj +/N231 1 Tf +11.99899 0 0 11.99899 136.22929 201.40928 Tm +0.00129 Tc +0.02868 Tw +(, in f)Tj [4.29998 ]TJ (ile)Tj [5.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 174.62609 201.40928 Tm +-0.00219 Tc +0 Tw +(y.tab)Tj [10.79998 ]TJ (.c)Tj +/N231 1 Tf +11.99899 0 0 11.99899 220.70228 201.40928 Tm +0.00099 Tc +0.02899 Tw +(. )Tj [-10 ]TJ (I)Tj [24 ]TJ (n)Tj [1 ]TJ (c)Tj [4.79998 ]TJ (l)Tj [-1.19999 ]TJ (ud)Tj [-9 ]TJ (e)Tj [4.79998 ]TJ (d)Tj [1 ]TJ ( in f)Tj [4 ]TJ (ile)Tj [4.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 304.33529 201.40928 Tm +-0.00219 Tc +0 Tw +(bas.y)Tj +/N231 1 Tf +11.99899 0 0 11.99899 337.33259 201.40928 Tm +-0.00109 Tc +0.03109 Tw +( are token decla)Tj [-7.29998 ]TJ (r)Tj [1.89999 ]TJ (ations. The )Tj +/N173 1 Tf +11.03909 0 0 11.03909 474.84109 201.40928 Tm +-0.00219 Tc +0 Tw +(\226d)Tj +/N231 1 Tf +11.99899 0 0 11.99899 488.03999 201.40928 Tm +0.00088 Tc +0.02909 Tw +( option)Tj [10.89999 ]TJ ( )Tj +-33.16999 -1.20999 TD +-0.00189 Tc +0.03189 Tw +(causes )Tj [-20 ]TJ (y)Tj [18.09999 ]TJ (a)Tj [-8.09999 ]TJ (cc t)Tj [-4.09999 ]TJ (o)Tj [-1.89999 ]TJ ( )Tj [-10 ]TJ (g)Tj [8.09999 ]TJ (e)Tj [1.89999 ]TJ (n)Tj [-11.89999 ]TJ (e)Tj [1.89999 ]TJ (rat)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ ( d)Tj [-11.89999 ]TJ (e)Tj [1.89999 ]TJ (fi)Tj [-4.09999 ]TJ (ni)Tj [-4.09999 ]TJ (t)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (ons for t)Tj [-4.09999 ]TJ (okens and )Tj [-10 ]TJ (pl)Tj [-4.09999 ]TJ (ace t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (em)Tj [-4.09999 ]TJ ( i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ ( fi)Tj [-4.09999 ]TJ (l)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 422.04548 186.89039 Tm +-0.00219 Tc +0 Tw +(y.tab)Tj [-10.89999 ]TJ (.h)Tj +/N231 1 Tf +11.99899 0 0 11.99899 468.36158 186.89039 Tm +-0.00178 Tc +0.04179 Tw +(. L)Tj [19 ]TJ (e)Tj [2 ]TJ (x)Tj [-11.79998 ]TJ ( )Tj [10 ]TJ (reads)Tj [-12.59999 ]TJ ( )Tj +-31.52999 -1.20999 TD +0.00099 Tc +0.31898 Tw +(the)Tj [4.79998 ]TJ ( pa)Tj [4.79998 ]TJ (tte)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (n)Tj [1 ]TJ ( d)Tj [-9 ]TJ (e)Tj [4.79998 ]TJ (sc)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (ptions)Tj [-9.79998 ]TJ ( in )Tj +/N173 1 Tf +11.03909 0 0 11.03909 232.82128 172.37168 Tm +-0.00219 Tc +0 Tw +(bas.l)Tj +/N231 1 Tf +11.99899 0 0 11.99899 265.81849 172.37168 Tm +-0.00059 Tc +0.32058 Tw +(, includes fi)Tj [-12.79998 ]TJ (le )Tj +/N173 1 Tf +11.03909 0 0 11.03909 345.37188 172.37168 Tm +-0.00219 Tc +0 Tw +(y.tab.h)Tj +/N231 1 Tf +11.99899 0 0 11.99899 391.56799 172.37168 Tm +-0.00138 Tc +0.32139 Tw +(, and )Tj [-10 ]TJ (gene)Tj [-7.59999 ]TJ (r)Tj [-8.39999 ]TJ (a)Tj [2.39999 ]TJ (tes a l)Tj [-13.59999 ]TJ (e)Tj [2.39999 ]TJ (x)Tj [-11.39999 ]TJ (i)Tj [-3.59999 ]TJ (cal)Tj [6.39999 ]TJ ( )Tj +-25.12998 -1.19999 TD +-0.00088 Tc +0.00088 Tw +(anal)Tj [-23.09999 ]TJ (y)Tj [29.09999 ]TJ (z)Tj [-7.09999 ]TJ (e)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (, function )Tj +/N173 1 Tf +11.03909 0 0 11.03909 179.54568 157.97279 Tm +-0.00219 Tc +0 Tw +(yylex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 212.66288 157.97279 Tm +0.00109 Tc +-0.00109 Tw +(, in f)Tj [4.09999 ]TJ (ile)Tj [4.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 249.97979 157.97279 Tm +-0.00219 Tc +0 Tw +(lex.yy.c)Tj +/N231 1 Tf +11.99899 0 0 11.99899 302.77549 157.97279 Tm +0 Tc +(. )Tj +-17.72999 -1.18998 TD +-0.00088 Tc +0.03089 Tw +( )Tj [-1220 ]TJ (F)Tj [5.19999 ]TJ (i)Tj [-3.09999 ]TJ (nall)Tj [-13.09999 ]TJ (y)Tj [19.09999 ]TJ (,)Tj [-10.89999 ]TJ ( the lex)Tj [-10.89999 ]TJ (e)Tj [2.89999 ]TJ (r )Tj [-10 ]TJ (and pa)Tj [-7.09999 ]TJ (r)Tj [-7.89999 ]TJ (s)Tj [-1.69999 ]TJ (er a)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (e )Tj [-10 ]TJ (compiled and lin)Tj [-10.89999 ]TJ (ked together)Tj [-7.89999 ]TJ ( to form th)Tj [-10.89999 ]TJ (e )Tj [-10 ]TJ (ex)Tj [-10.89999 ]TJ (ecutable, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 129.65519 Tm +-0.00219 Tc +0 Tw +(bas.exe)Tj +/N231 1 Tf +11.99899 0 0 11.99899 136.22929 129.65519 Tm +0.00059 Tc +-0.00059 Tw +(. )Tj [100 ]TJ (F)Tj [6.69999 ]TJ (r)Tj [3.59999 ]TJ (om )Tj +/N173 1 Tf +11.03909 0 0 11.03909 177.02589 129.65519 Tm +-0.00219 Tc +0 Tw +(main)Tj +/N231 1 Tf +11.99899 0 0 11.99899 203.42369 129.65519 Tm +0.00158 Tc +0.33839 Tw +(, we)Tj [5.39999 ]TJ ( ca)Tj [5.39999 ]TJ (ll )Tj +/N173 1 Tf +11.03909 0 0 11.03909 258.97909 129.65519 Tm +-0.00219 Tc +0 Tw +(yyparse)Tj +/N231 1 Tf +11.99899 0 0 11.99899 305.17518 129.65519 Tm +0.00088 Tc +0.33909 Tw +( to r)Tj [3.89999 ]TJ (un the)Tj [4.69999 ]TJ ( c)Tj [4.69999 ]TJ (o)Tj [0.89999 ]TJ (mpile)Tj [4.69999 ]TJ (r)Tj [3.89999 ]TJ (.)Tj [0.89999 ]TJ ( F)Tj [7 ]TJ (unc)Tj [4.69999 ]TJ (tion )Tj +/N173 1 Tf +11.03909 0 0 11.03909 475.80099 129.65519 Tm +-0.00219 Tc +0 Tw +(yyparse)Tj +/N231 1 Tf +11.99899 0 0 11.99899 521.99708 129.65519 Tm +0 Tc +( )Tj +-36 -1.20999 TD +0.00178 Tc +0.00819 Tw +(a)Tj [5.59999 ]TJ (u)Tj [1.79998 ]TJ (toma)Tj [5.59999 ]TJ (tic)Tj [5.59999 ]TJ (a)Tj [5.59999 ]TJ (l)Tj [-0.39999 ]TJ (l)Tj [-10.39999 ]TJ (y)Tj [21.79998 ]TJ ( c)Tj [5.59999 ]TJ (a)Tj [5.59999 ]TJ (lls )Tj +/N173 1 Tf +11.03909 0 0 11.03909 183.26539 115.13639 Tm +-0.00219 Tc +0 Tw +(yyle)Tj [-10.89999 ]TJ (x)Tj +/N231 1 Tf +11.99899 0 0 11.99899 216.38259 115.13639 Tm +-0.00119 Tc +0.00119 Tw +( t)Tj [-3.39999 ]TJ (o)Tj [-1.19999 ]TJ ( obt)Tj [-3.39999 ]TJ (ai)Tj [-3.39999 ]TJ (n each t)Tj [-3.39999 ]TJ (oken. )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 6 6 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 6)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +-0.00178 Tc +0.49058 Tw +(2. L)Tj [-4.29998 ]TJ (ex )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +15.95869 0 0 15.95869 90.03318 659.05108 Tm +-0.00088 Tc +0.58769 Tw +(2.1 The)Tj [-8.69999 ]TJ (or)Tj [-17.79998 ]TJ (y)Tj [13.89999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 638.65278 Tm +-0.00079 Tc +0.06079 Tw +(The first phase in a compiler reads the input source and conve)Tj [-7 ]TJ (rts string)Tj [9.19999 ]TJ (s in the source to)Tj [9.19999 ]TJ ( )Tj +0 -1.14999 TD +0.00178 Tc +0.01818 Tw +(toke)Tj [5.59999 ]TJ (ns. Usin)Tj [-8.19999 ]TJ (g)Tj [11.79998 ]TJ ( reg)Tj [11.79998 ]TJ (u)Tj [1.79998 ]TJ (la)Tj [5.59999 ]TJ (r e)Tj [5.59999 ]TJ (x)Tj [-8.19999 ]TJ (pr)Tj [4.79998 ]TJ (e)Tj [5.59999 ]TJ (ssions, we ca)Tj [5.59999 ]TJ (n spec)Tj [5.59999 ]TJ (ify)Tj [21.79998 ]TJ ( )Tj [-10 ]TJ (p)Tj [-8.19999 ]TJ (a)Tj [5.59999 ]TJ (tte)Tj [5.59999 ]TJ (r)Tj [4.79998 ]TJ (n)Tj [1.79998 ]TJ (s)Tj [-9 ]TJ ( to le)Tj [5.59999 ]TJ (x)Tj [-8.19999 ]TJ ( tha)Tj [5.59999 ]TJ (t)Tj [-0.39999 ]TJ ( a)Tj [5.59999 ]TJ (llo)Tj [-8.19999 ]TJ (w it to sca)Tj [5.59999 ]TJ (n)Tj [1.79998 ]TJ ( )Tj [-10 ]TJ (a)Tj [5.59999 ]TJ (nd )Tj +T* +0.00109 Tc +0.17889 Tw +(ma)Tj [4.89999 ]TJ (tc)Tj [4.89999 ]TJ (h str)Tj [4.09999 ]TJ (i)Tj [-1.09999 ]TJ (ng)Tj [11.09999 ]TJ (s in the)Tj [4.89999 ]TJ ( inp)Tj [11.09999 ]TJ (u)Tj [1.09999 ]TJ (t. Ea)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (h)Tj [1.09999 ]TJ ( pa)Tj [4.89999 ]TJ (tte)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (n)Tj [1.09999 ]TJ ( in le)Tj [14.89999 ]TJ (x)Tj [-8.89999 ]TJ ( )Tj [10 ]TJ (ha)Tj [4.89999 ]TJ (s a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ (ssoc)Tj [4.89999 ]TJ (i)Tj [-1.09999 ]TJ (a)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ (e)Tj [4.89999 ]TJ (d)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (tion)Tj [-8.89999 ]TJ (.)Tj [1.09999 ]TJ ( T)Tj [-8.09999 ]TJ (y)Tj [21.09999 ]TJ (pic)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (l)Tj [-21.09999 ]TJ (y)Tj [31.09999 ]TJ ( )Tj [-10 ]TJ (a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ ( )Tj +T* +-0.00079 Tc +0.05079 Tw +(action returns )Tj [-10 ]TJ (a token,)Tj [-10.79998 ]TJ ( re)Tj [-7 ]TJ (presentin)Tj [-10.69999 ]TJ (g)Tj [9.19999 ]TJ ( the mat)Tj [-13 ]TJ (c)Tj [3 ]TJ (hed s)Tj [-11.59999 ]TJ (t)Tj [-3 ]TJ (ring)Tj [9.19999 ]TJ (, fo)Tj [-10.79998 ]TJ (r subsequ)Tj [-10.79998 ]TJ (e)Tj [3 ]TJ (nt use)Tj [-7 ]TJ ( b)Tj [-10.79998 ]TJ (y)Tj [19.19999 ]TJ ( th)Tj [-10.79998 ]TJ (e pa)Tj [-7 ]TJ (rser.)Tj [-10.79998 ]TJ ( )Tj +T* +0.00109 Tc +0.16889 Tw +(To be)Tj [4.89999 ]TJ (g)Tj [11.09999 ]TJ (i)Tj [-1.09999 ]TJ (n with, howe)Tj [4.89999 ]TJ (v)Tj [1.09999 ]TJ (er, we)Tj [4.89999 ]TJ ( will simpl)Tj [-11.09999 ]TJ (y)Tj [31.09999 ]TJ ( pr)Tj [4.09999 ]TJ (int the)Tj [4.89999 ]TJ ( ma)Tj [4.89999 ]TJ (tc)Tj [4.89999 ]TJ (he)Tj [4.89999 ]TJ (d str)Tj [4.09999 ]TJ (i)Tj [-1.09999 ]TJ (ng)Tj [11.09999 ]TJ ( ra)Tj [4.89999 ]TJ (the)Tj [4.89999 ]TJ (r)Tj [-5.89999 ]TJ ( tha)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ ( r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (tur)Tj [4.09999 ]TJ (n)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ ( )Tj +T* +0.00149 Tc +-0.00149 Tw +(toke)Tj [5.29998 ]TJ (n va)Tj [5.29998 ]TJ (lue)Tj [5.29998 ]TJ (.)Tj [1.5 ]TJ ( We)Tj [5.29998 ]TJ ( ma)Tj [-14.69999 ]TJ (y)Tj [21.5 ]TJ ( sc)Tj [5.29998 ]TJ (an f)Tj [4.5 ]TJ (o)Tj [1.5 ]TJ (r)Tj [4.5 ]TJ ( ide)Tj [5.29998 ]TJ (n)Tj [1.5 ]TJ (tif)Tj [4.5 ]TJ (ie)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (s)Tj [0.69999 ]TJ ( usin)Tj [-8.5 ]TJ (g)Tj [11.5 ]TJ ( the r)Tj [4.5 ]TJ (e)Tj [-4.69999 ]TJ (g)Tj [11.5 ]TJ (u)Tj [1.5 ]TJ (la)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ ( )Tj [-10 ]TJ (e)Tj [5.29998 ]TJ (x)Tj [-8.5 ]TJ (pr)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (ssion )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 236.66088 543.86068 Tm +-0.00219 Tc +(letter\(letter|digit\)*)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 529.58189 Tm +0 Tc +( )Tj +T* +0.00099 Tc +0.00889 Tw +(This pa)Tj [4.79998 ]TJ (tte)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (n)Tj [1 ]TJ ( ma)Tj [4.79998 ]TJ (tc)Tj [4.79998 ]TJ (he)Tj [4.79998 ]TJ (s a)Tj [4.79998 ]TJ ( str)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (ng)Tj [11 ]TJ ( of)Tj [4 ]TJ ( c)Tj [4.79998 ]TJ (h)Tj [-9 ]TJ (a)Tj [4.79998 ]TJ (r)Tj [-6 ]TJ (a)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (t)Tj [-1.19999 ]TJ (e)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (s tha)Tj [4.79998 ]TJ (t)Tj [-1.19999 ]TJ ( beg)Tj [11 ]TJ (i)Tj [-1.19999 ]TJ (ns with a)Tj [4.79998 ]TJ ( sing)Tj [11 ]TJ (le)Tj [4.79998 ]TJ ( le)Tj [4.79998 ]TJ (tte)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (,)Tj [1 ]TJ ( )Tj [-10.09999 ]TJ (a)Tj [4.79998 ]TJ (nd is f)Tj [4 ]TJ (o)Tj [1 ]TJ (llowe)Tj [4.79998 ]TJ (d)Tj [-9 ]TJ ( )Tj +T* +0.00129 Tc +0.13868 Tw +(b)Tj [-8.69999 ]TJ (y)Tj [21.29998 ]TJ ( ze)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ (o)Tj [1.29998 ]TJ ( or)Tj [4.29998 ]TJ ( mor)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ ( le)Tj [5.09999 ]TJ (tte)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ (s)Tj [0.5 ]TJ ( )Tj [-10 ]TJ (or)Tj [4.29998 ]TJ ( dig)Tj [11.29998 ]TJ (its. This e)Tj [5.09999 ]TJ (x)Tj [-8.69999 ]TJ (a)Tj [5.09999 ]TJ (m)Tj [-0.89999 ]TJ (ple)Tj [5.09999 ]TJ ( )Tj [10 ]TJ (nic)Tj [5.09999 ]TJ (e)Tj [5.09999 ]TJ (l)Tj [-10.89999 ]TJ (y)Tj [21.29998 ]TJ ( illustr)Tj [4.29998 ]TJ (a)Tj [5.09999 ]TJ (te)Tj [5.09999 ]TJ (s ope)Tj [5.09999 ]TJ (ra)Tj [5.09999 ]TJ (tions a)Tj [5.09999 ]TJ (llowe)Tj [5.09999 ]TJ (d in )Tj +T* +-0.00099 Tc +0.01098 Tw +(re)Tj [-7.19999 ]TJ (g)Tj [9 ]TJ (u)Tj [-1 ]TJ (lar ex)Tj [-11 ]TJ (pressions: )Tj +T* +0 Tc +0 Tw +( )Tj +/N172 1 Tf +1.5 -1.25 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00088 Tc +0.00088 Tw +(repetition, ex)Tj [-10.89999 ]TJ (pressed b)Tj [-20.89999 ]TJ (y)Tj [19.09999 ]TJ ( the \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 266.17849 459.38778 Tm +0 Tc +0 Tw +(*)Tj +/N231 1 Tf +11.99899 0 0 11.99899 272.77789 459.38778 Tm +-0.00248 Tc +0.00248 Tw +(\224 op)Tj [-12.5 ]TJ (erat)Tj [-4.69999 ]TJ (or )Tj +/N172 1 Tf +-13.72999 -1.27999 TD +0 Tc +0 Tw +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00099 Tc +0.00099 Tw +(alternation, ex)Tj [-11 ]TJ (pressed b)Tj [-21 ]TJ (y)Tj [19 ]TJ ( )Tj [-10 ]TJ (the \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 271.57798 444.02899 Tm +0 Tc +0 Tw +(|)Tj +/N231 1 Tf +11.99899 0 0 11.99899 278.17749 444.02899 Tm +-0.00228 Tc +0.00228 Tw +(\224 ope)Tj [-8.5 ]TJ (rat)Tj [-4.5 ]TJ (o)Tj [-2.29998 ]TJ (r )Tj +/N172 1 Tf +-14.17999 -1.25999 TD +0 Tc +0 Tw +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00219 Tc +(concat)Tj [-4.39999 ]TJ (en)Tj [-12.19999 ]TJ (at)Tj [-4.39999 ]TJ (i)Tj [-4.39999 ]TJ (on )Tj +-1.5 -1.13999 TD +0 Tc +( )Tj +/N171 1 Tf +-1.5 -1.14999 TD +-0.00039 Tc +1.25039 Tw +( Any)Tj +/N231 1 Tf +3.04998 0 TD +-0.00099 Tc +0.22099 Tw +( re)Tj [-7.19999 ]TJ (g)Tj [9 ]TJ (u)Tj [-1 ]TJ (lar ex)Tj [-11 ]TJ (pression ex)Tj [-11 ]TJ (pressions ma)Tj [-7.19999 ]TJ (y)Tj [29 ]TJ ( be ex)Tj [-11 ]TJ (pressed as a finite state automaton )Tj +-3.04998 -1.14999 TD +-0.00149 Tc +0.00149 Tw +(\(FS)Tj [-5.39999 ]TJ (A)Tj [0.69999 ]TJ (\). W)Tj [-7.69999 ]TJ (e)Tj [2.29998 ]TJ ( )Tj [-10 ]TJ (can )Tj [-10 ]TJ (repr)Tj [-8.5 ]TJ (esent)Tj [-3.69999 ]TJ ( )Tj [-10 ]TJ (an FS)Tj [-5.39999 ]TJ (A usi)Tj [-3.69999 ]TJ (n)Tj [-11.5 ]TJ (g)Tj [8.5 ]TJ ( st)Tj [-3.69999 ]TJ (at)Tj [-13.69999 ]TJ (es, and )Tj [-10 ]TJ (t)Tj [-3.69999 ]TJ (r)Tj [1.5 ]TJ (ansi)Tj [-3.69999 ]TJ (t)Tj [-3.69999 ]TJ (i)Tj [-3.69999 ]TJ (ons bet)Tj [-3.69999 ]TJ (w)Tj [0.69999 ]TJ (een st)Tj [-3.69999 ]TJ (at)Tj [-13.69999 ]TJ (es)Tj [-12.29998 ]TJ (. There)Tj [-7.69999 ]TJ ( i)Tj [-3.69999 ]TJ (s)Tj [-2.29998 ]TJ ( one)Tj [-7.69999 ]TJ ( )Tj +T* +-0.00059 Tc +0.00059 Tw +(start state, and one o)Tj [-10.59999 ]TJ (r)Tj [2.39999 ]TJ ( more final or )Tj [-10 ]TJ (acc)Tj [-6.79998 ]TJ (epting)Tj [9.39999 ]TJ ( st)Tj [-12.79998 ]TJ (ate)Tj [-6.79998 ]TJ (s)Tj [-1.39999 ]TJ (. )Tj +ET +1 1 1 sc +/N224 /ColorSpace findRes CS +0 0 0 SC +1 J +1 j +0.71699 w +10 M +[]0 d +252.5 322.11898 m +252.73999 324.15899 l +253.33999 326.07899 l +254.41899 327.75898 l +255.85899 329.19898 l +257.53898 330.27899 l +259.45899 330.87799 l +261.49899 331.11799 l +263.41899 330.87799 l +265.33898 330.27899 l +267.01799 329.19898 l +268.45799 327.75898 l +269.53799 326.07899 l +270.25799 324.15899 l +270.49798 322.11898 l +270.25799 320.07899 l +269.53799 318.15998 l +268.45799 316.47999 l +267.01799 315.03999 l +265.33898 313.95999 l +263.41899 313.35998 l +261.49899 313.11999 l +259.45899 313.35998 l +257.53898 313.95999 l +255.85899 315.03999 l +254.41899 316.47999 l +253.33999 318.15998 l +252.73999 320.07899 l +252.5 322.11898 l +b* +BT +/N228 1 Tf +8.98149 0 0 8.98149 258.97909 319.47938 Tm +0 0 0 sc +0 Tc +0 Tw +(0)Tj +ET +1 1 1 sc +324.49398 322.11898 m +324.73399 324.15899 l +325.33399 326.07899 l +326.41299 327.75898 l +327.85299 329.19898 l +329.53298 330.27899 l +331.45298 330.87799 l +333.49299 331.11799 l +335.41299 330.87799 l +337.33299 330.27899 l +339.13198 329.19898 l +340.45199 327.75898 l +341.53199 326.07899 l +342.25199 324.15899 l +342.49198 322.11898 l +342.25199 320.07899 l +341.53199 318.15998 l +340.45199 316.47999 l +339.13198 315.03999 l +337.33299 313.95999 l +335.41299 313.35998 l +333.49299 313.11999 l +331.45298 313.35998 l +329.53298 313.95999 l +327.85299 315.03999 l +326.41299 316.47999 l +325.33399 318.15998 l +324.73399 320.07899 l +324.49398 322.11898 l +b* +BT +8.98149 0 0 8.98149 330.97309 319.47938 Tm +0 0 0 sc +(1)Tj +ET +1 1 1 sc +398.64698 322.11898 m +398.76699 324.27899 l +399.48699 326.43899 l +400.44699 328.35899 l +401.88699 330.03898 l +403.56698 331.47799 l +405.48699 332.55799 l +407.64698 333.15798 l +409.80699 333.39799 l +412.08599 333.15798 l +414.12599 332.55799 l +416.04598 331.47799 l +417.84599 330.03898 l +419.16598 328.35899 l +420.24598 326.43899 l +420.84599 324.27899 l +421.08599 322.11898 l +420.84599 319.95899 l +420.24598 317.79998 l +419.16598 315.87998 l +417.84599 314.19999 l +416.04598 312.75999 l +414.12599 311.67999 l +412.08599 311.07998 l +409.80699 310.83999 l +407.64698 311.07998 l +405.48699 311.67999 l +403.56698 312.75999 l +401.88699 314.19999 l +400.44699 315.87998 l +399.48699 317.79998 l +398.76699 319.95899 l +398.64698 322.11898 l +b* +270.49798 322.11898 m +318.49398 322.11898 l +S +0 0 0 sc +324.49398 322.11898 m +316.57398 318.15998 l +316.69398 318.63899 l +316.93399 318.99899 l +317.41398 320.91899 l +317.41398 321.39898 l +317.53399 321.87899 l +317.53399 322.35899 l +317.41398 322.83898 l +317.41398 323.31898 l +316.93399 325.23899 l +316.69398 325.59899 l +316.57398 326.07899 l +324.49398 322.11898 l +f* +342.49198 322.11898 m +392.64799 322.11898 l +S +398.64698 322.11898 m +390.72799 318.15998 l +390.84799 318.63899 l +391.08799 318.99899 l +391.56799 320.91899 l +391.56799 323.31898 l +391.08799 325.23899 l +390.84799 325.59899 l +390.72799 326.07899 l +398.64698 322.11898 l +f* +1 1 1 sc +400.80699 322.11898 m +401.04699 324.15899 l +401.76699 326.07899 l +402.84698 327.75898 l +404.28698 329.19898 l +405.96699 330.27899 l +407.88699 330.87799 l +409.80699 331.11799 l +411.84599 330.87799 l +413.76599 330.27899 l +415.44599 329.19898 l +416.88598 327.75898 l +417.96598 326.07899 l +418.56599 324.15899 l +418.80599 322.11898 l +418.56599 320.07899 l +417.96598 318.15998 l +416.88598 316.47999 l +415.44599 315.03999 l +413.76599 313.95999 l +411.84599 313.35998 l +409.80699 313.11999 l +407.88699 313.35998 l +405.96699 313.95999 l +404.28698 315.03999 l +402.84698 316.47999 l +401.76699 318.15998 l +401.04699 320.07899 l +400.80699 322.11898 l +b* +BT +8.98149 0 0 8.98149 407.40669 319.47938 Tm +0 0 0 sc +(2)Tj +ET +198.62399 322.11898 m +246.61999 322.11898 l +S +252.5 322.11898 m +244.69999 318.15998 l +244.81999 318.63899 l +245.05999 318.99899 l +245.53999 320.91899 l +245.53999 323.31898 l +245.05999 325.23899 l +244.81999 325.59899 l +244.69999 326.07899 l +252.5 322.11898 l +f* +327.13299 328.47898 m +327.85299 333.87799 l +328.57299 338.43798 l +329.53298 342.15798 l +330.49299 345.15699 l +331.45298 347.31698 l +332.41299 348.51699 l +333.37298 348.99699 l +334.45298 348.63699 l +335.41299 347.43699 l +336.37298 345.39698 l +337.33299 342.51699 l +338.17199 338.79798 l +339.01199 334.47799 l +S +339.85198 328.47898 m +334.81298 335.79798 l +335.29299 335.67799 l +335.77299 335.55799 l +336.25299 335.43798 l +336.73298 335.43798 l +337.21299 335.31799 l +338.17199 335.31799 l +338.65199 335.43798 l +339.13198 335.43798 l +339.61199 335.55799 l +340.09199 335.67799 l +340.57199 335.79798 l +341.05198 335.91799 l +341.41198 336.15798 l +341.89199 336.39799 l +342.25199 336.63798 l +342.73199 336.87799 l +339.85198 328.47898 l +f* +BT +/N174 1 Tf +8.98149 0 0 8.98149 287.41668 328.47859 Tm +0.00408 Tc +(letter)Tj +2.35128 3.09939 TD +0.00358 Tc +-0.00088 Tw +(letter or digit)Tj +5.63778 -2.99259 TD +0.00389 Tc +0 Tw +(oth)Tj [12.29998 ]TJ (e)Tj [-1.09999 ]TJ (r)Tj +-16.35229 -0.05339 TD +0.00509 Tc +(star)Tj [4.09999 ]TJ (t)Tj +/N231 1 Tf +11.99899 0 0 11.99899 423.24539 308.92028 Tm +0 Tc +( )Tj +/N170 1 Tf +-16.93998 -1.40998 TD +-0.00149 Tc +0.00149 Tw +(F)Tj [9.29998 ]TJ (i)Tj [-3.69999 ]TJ (gure 2)Tj [-11.5 ]TJ (-)Tj [1.5 ]TJ (1: )Tj +/N231 1 Tf +5 0 TD +0.00109 Tc +-0.00109 Tw +(F)Tj [7.19999 ]TJ (i)Tj [-1.09999 ]TJ (nite)Tj [4.89999 ]TJ ( Sta)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ (e)Tj [4.89999 ]TJ ( Automa)Tj [4.89999 ]TJ (ton )Tj +-15.82998 -1.64999 TD +0 Tc +0 Tw +( )Tj +0 -1.14999 TD +-0.00209 Tc +0.03199 Tw +(I)Tj [10.89999 ]TJ (n)Tj [-2.09999 ]TJ ( )Tj [-10.09999 ]TJ (Fi)Tj [-4.29998 ]TJ (g)Tj [7.89999 ]TJ (u)Tj [-12.09999 ]TJ (re 2-1, st)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (e 0 i)Tj [-4.29998 ]TJ (s)Tj [-2.89999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e st)Tj [-4.29998 ]TJ (art)Tj [-4.29998 ]TJ ( st)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (e, and st)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (e 2 i)Tj [-4.29998 ]TJ (s)Tj [-2.89999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e accept)Tj [-4.29998 ]TJ (i)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ (g)Tj [7.89999 ]TJ ( st)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (e. As)Tj [-12.89999 ]TJ ( chara)Tj [-8.29998 ]TJ (c)Tj [1.69999 ]TJ (t)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (rs ar)Tj [-9.09999 ]TJ (e )Tj +T* +0.00209 Tc +0.12789 Tw +(r)Tj [5.09999 ]TJ (e)Tj [5.89999 ]TJ (a)Tj [5.89999 ]TJ (d)Tj [2.09999 ]TJ (,)Tj [-7.89999 ]TJ ( we ma)Tj [5.89999 ]TJ (ke a)Tj [5.89999 ]TJ ( t)Tj [-10.09999 ]TJ (r)Tj [5.09999 ]TJ (a)Tj [5.89999 ]TJ (n)Tj [2.09999 ]TJ (sition f)Tj [5.09999 ]TJ (r)Tj [5.09999 ]TJ (o)Tj [2.09999 ]TJ (m on)Tj [-7.89999 ]TJ (e)Tj [5.89999 ]TJ ( sta)Tj [5.89999 ]TJ (t)Tj [-0.09999 ]TJ (e to )Tj [-10 ]TJ (a)Tj [5.89999 ]TJ (n)Tj [-7.89999 ]TJ (othe)Tj [5.89999 ]TJ (r)Tj [5.09999 ]TJ (.)Tj [2.09999 ]TJ ( Whe)Tj [5.89999 ]TJ (n)Tj [2.09999 ]TJ ( the f)Tj [5.09999 ]TJ (i)Tj [-0.09999 ]TJ (r)Tj [5.09999 ]TJ (s)Tj [1.29998 ]TJ (t l)Tj [-10.09999 ]TJ (e)Tj [5.89999 ]TJ (tte)Tj [5.89999 ]TJ (r)Tj [5.09999 ]TJ ( is re)Tj [5.89999 ]TJ (a)Tj [5.89999 ]TJ (d)Tj [2.09999 ]TJ (,)Tj [-7.89999 ]TJ ( we )Tj +0 -1.13999 TD +0.00788 Tw +(tr)Tj [5.09999 ]TJ (a)Tj [5.89999 ]TJ (n)Tj [2.09999 ]TJ (sition to sta)Tj [5.89999 ]TJ (t)Tj [-0.09999 ]TJ (e)Tj [5.89999 ]TJ ( 1. We)Tj [5.89999 ]TJ ( re)Tj [5.89999 ]TJ (ma)Tj [5.89999 ]TJ (in in sta)Tj [5.89999 ]TJ (t)Tj [-0.09999 ]TJ (e)Tj [5.89999 ]TJ ( 1)Tj [-7.89999 ]TJ ( a)Tj [5.89999 ]TJ (s)Tj [1.29998 ]TJ ( more)Tj [5.89999 ]TJ ( )Tj [-10 ]TJ (le)Tj [5.89999 ]TJ (tte)Tj [5.89999 ]TJ (r)Tj [5.09999 ]TJ (s)Tj [1.29998 ]TJ ( or)Tj [5.09999 ]TJ ( di)Tj [-10.09999 ]TJ (g)Tj [12.09999 ]TJ (its ar)Tj [5.09999 ]TJ (e)Tj [5.89999 ]TJ ( )Tj [-10 ]TJ (r)Tj [5.09999 ]TJ (e)Tj [5.89999 ]TJ (a)Tj [5.89999 ]TJ (d)Tj [2.09999 ]TJ (.)Tj [-7.89999 ]TJ ( )Tj [-10 ]TJ (Whe)Tj [5.89999 ]TJ (n)Tj [2.09999 ]TJ ( we)Tj [5.89999 ]TJ ( re)Tj [5.89999 ]TJ (a)Tj [5.89999 ]TJ (d)Tj [-7.89999 ]TJ ( )Tj +0 -1.14999 TD +-0.00199 Tc +0.11199 Tw +(a char)Tj [-9 ]TJ (act)Tj [-4.19999 ]TJ (er ot)Tj [-4.19999 ]TJ (he)Tj [-8.19999 ]TJ (r t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (an a l)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (t)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (r or di)Tj [-4.19999 ]TJ (g)Tj [8 ]TJ (i)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (,)Tj [-2 ]TJ ( we t)Tj [-4.19999 ]TJ (r)Tj [1 ]TJ (ansi)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (on t)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ ( st)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (e 2, )Tj [10 ]TJ (t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e accept)Tj [-14.19999 ]TJ (i)Tj [-4.19999 ]TJ (ng)Tj [8 ]TJ ( st)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (e. )Tj +/N171 1 Tf +34.43998 0 TD +-0.00039 Tc +0 Tw +(Any)Tj +/N231 1 Tf +1.55999 0 TD +0 Tc +( )Tj +-36 -1.14999 TD +-0.00219 Tc +0.20219 Tw +(FS)Tj [-6.09999 ]TJ (A m)Tj [-4.39999 ]TJ (a)Tj [-8.39999 ]TJ (y)Tj [17.79998 ]TJ ( be ex)Tj [-12.19999 ]TJ (pressed as a com)Tj [-4.39999 ]TJ (put)Tj [-4.39999 ]TJ (er program)Tj [-4.39999 ]TJ (.)Tj [-12.19999 ]TJ ( For ex)Tj [-12.19999 ]TJ (am)Tj [-4.39999 ]TJ (pl)Tj [-4.39999 ]TJ (e, our 3-st)Tj [-4.39999 ]TJ (a)Tj [11.59999 ]TJ (t)Tj [-4.39999 ]TJ (e m)Tj [-4.39999 ]TJ (achi)Tj [-4.39999 ]TJ (n)Tj [-2.19999 ]TJ (e i)Tj [-4.39999 ]TJ (s)Tj [-3 ]TJ ( )Tj +T* +0.00189 Tc +-0.00189 Tw +(e)Tj [5.69999 ]TJ (a)Tj [5.69999 ]TJ (s)Tj [1.09999 ]TJ (il)Tj [-10.29998 ]TJ (y)Tj [21.89999 ]TJ ( p)Tj [-8.09999 ]TJ (r)Tj [4.89999 ]TJ (o)Tj [-8.09999 ]TJ (g)Tj [11.89999 ]TJ (r)Tj [4.89999 ]TJ (a)Tj [5.69999 ]TJ (mme)Tj [5.69999 ]TJ (d: )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 7 7 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 7)Tj +0 55.84999 TD +0 Tc +( )Tj +0 -1.14999 TD +( )Tj +ET +1 1 1 sc + +124.58999 692.40798 398.84698 -12.47898 rf +BT +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 683.40908 Tm +0 0 0 sc +-0.00219 Tc +(start:)Tj [-1195.69999 ]TJ (goto)Tj [-597.89999 ]TJ (state0)Tj +ET +1 1 1 sc +124.58999 679.92898 398.84698 -12.47898 rf +124.58999 667.44999 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 126.03019 658.45118 Tm +0 0 0 sc +(state0:)Tj [-597.89999 ]TJ (read)Tj [-597.89999 ]TJ (c)Tj +ET +1 1 1 sc +124.58999 654.97099 398.84698 -12.35899 rf +BT +11.03909 0 0 11.03909 178.82609 645.97219 Tm +0 0 0 sc +(if)Tj [-597.89999 ]TJ (c)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (letter)Tj [-597.89999 ]TJ (goto)Tj [-597.89999 ]TJ (state1)Tj +ET +1 1 1 sc +124.58999 642.61199 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 178.82609 633.61318 Tm +0 0 0 sc +(goto)Tj [-597.89999 ]TJ (state0)Tj +ET +1 1 1 sc +124.58999 630.13398 398.84698 -12.47898 rf +124.58999 617.65499 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 126.03019 608.65528 Tm +0 0 0 sc +(state1:)Tj [-597.89999 ]TJ (read)Tj [-597.89999 ]TJ (c)Tj +ET +1 1 1 sc +124.58999 605.17599 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 178.82609 596.17628 Tm +0 0 0 sc +(if)Tj [-597.89999 ]TJ (c)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (letter)Tj [-597.89999 ]TJ (goto)Tj [-597.89999 ]TJ (state1)Tj +ET +1 1 1 sc +124.58999 592.69699 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 178.82609 583.69738 Tm +0 0 0 sc +(if)Tj [-597.89999 ]TJ (c)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (digit)Tj [-597.89999 ]TJ (goto)Tj [-597.89999 ]TJ (state1)Tj +ET +1 1 1 sc +124.58999 580.21798 398.84698 -12.35899 rf +BT +11.03909 0 0 11.03909 178.82609 571.21839 Tm +0 0 0 sc +(goto)Tj [-597.89999 ]TJ (state2)Tj +ET +1 1 1 sc +124.58999 567.85899 398.84698 -12.47898 rf +124.58999 555.37998 398.84698 -12.47898 rf +BT +11.03909 0 0 11.03909 126.03019 546.38049 Tm +0 0 0 sc +(state2:)Tj [-597.89999 ]TJ (accept)Tj [-597.89999 ]TJ (string)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 532.10169 Tm +0 Tc +( )Tj +T* +-0.00178 Tc +0.02178 Tw +(Thi)Tj [-4 ]TJ (s)Tj [-2.59999 ]TJ ( i)Tj [-4 ]TJ (s)Tj [-2.59999 ]TJ ( )Tj [10 ]TJ (t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (e t)Tj [-4 ]TJ (echni)Tj [-4 ]TJ (que used b)Tj [-11.79998 ]TJ (y)Tj [28.19999 ]TJ ( l)Tj [-4 ]TJ (e)Tj [2 ]TJ (x)Tj [-11.79998 ]TJ (.)Tj [-1.79998 ]TJ ( R)Tj [-4.79998 ]TJ (e)Tj [2 ]TJ (g)Tj [8.19999 ]TJ (u)Tj [-1.79998 ]TJ (l)Tj [-4 ]TJ (a)Tj [2 ]TJ (r ex)Tj [-11.79998 ]TJ (press)Tj [-12.59999 ]TJ (i)Tj [-4 ]TJ (ons are t)Tj [-4 ]TJ (r)Tj [1.19999 ]TJ (ansl)Tj [-4 ]TJ (at)Tj [-4 ]TJ (ed b)Tj [-11.79998 ]TJ (y)Tj [18.19999 ]TJ ( l)Tj [-4 ]TJ (e)Tj [2 ]TJ (x)Tj [-11.79998 ]TJ ( t)Tj [-4 ]TJ (o)Tj [-1.79998 ]TJ ( a com)Tj [-4 ]TJ (put)Tj [-4 ]TJ (er)Tj [11.19999 ]TJ ( )Tj +T* +0.00079 Tc +0.05918 Tw +(pr)Tj [3.79998 ]TJ (ogr)Tj [3.79998 ]TJ (a)Tj [4.59999 ]TJ (m)Tj [-1.39999 ]TJ ( tha)Tj [4.59999 ]TJ (t)Tj [-1.39999 ]TJ ( mimic)Tj [4.59999 ]TJ (s a)Tj [4.59999 ]TJ (n)Tj [0.79998 ]TJ ( )Tj [-10 ]TJ (F)Tj [6.89999 ]TJ (S)Tj [-3.09999 ]TJ (A. Usin)Tj [-9.19999 ]TJ (g)Tj [10.79998 ]TJ ( the)Tj [4.59999 ]TJ ( n)Tj [-9.19999 ]TJ (e)Tj [4.79998 ]TJ (x)Tj [-9.19999 ]TJ (t)Tj [-1.39999 ]TJ ( )Tj +/N171 1 Tf +18.68998 0 TD +0.00109 Tc +0 Tw +(inp)Tj [11.09999 ]TJ (u)Tj [1.09999 ]TJ (t)Tj +/N231 1 Tf +2.04998 0 TD +-0.00199 Tc +0.06199 Tw +( chara)Tj [-8.19999 ]TJ (c)Tj [1.79998 ]TJ (t)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (r,)Tj [-12 ]TJ ( and )Tj +/N171 1 Tf +6.28999 0 TD +-0.00009 Tc +0.06008 Tw +(current)Tj [-12.29998 ]TJ ( state)Tj +/N231 1 Tf +5.14999 0 TD +-0.00119 Tc +0.06118 Tw +(, the nex)Tj [-11.19999 ]TJ (t)Tj [-3.39999 ]TJ ( )Tj +-32.17999 -1.14999 TD +-0.00199 Tc +0.00199 Tw +(st)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (e i)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( easi)Tj [-4.19999 ]TJ (l)Tj [-14.19999 ]TJ (y)Tj [18 ]TJ ( d)Tj [-12 ]TJ (e)Tj [1.79998 ]TJ (t)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (rm)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ (ed)Tj [-12 ]TJ ( b)Tj [-12 ]TJ (y)Tj [18 ]TJ ( i)Tj [-4.19999 ]TJ (ndex)Tj [-12 ]TJ (i)Tj [-4.19999 ]TJ (ng)Tj [8 ]TJ ( i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ (t)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ ( a com)Tj [-4.19999 ]TJ (p)Tj [-12 ]TJ (ut)Tj [-4.19999 ]TJ (er-)Tj [-9 ]TJ (g)Tj [8 ]TJ (en)Tj [-12 ]TJ (erat)Tj [-4.19999 ]TJ (ed st)Tj [-14.19999 ]TJ (at)Tj [-4.19999 ]TJ (e t)Tj [-4.19999 ]TJ (a)Tj [1.79998 ]TJ (bl)Tj [-4.19999 ]TJ (e)Tj [-8.19999 ]TJ (.)Tj [-1.89999 ]TJ ( )Tj +T* +-0.00048 Tc +0.06048 Tw +( )Tj [-1190 ]TJ (Now we c)Tj [-6.69999 ]TJ (a)Tj [3.29998 ]TJ (n easil)Tj [-22.69999 ]TJ (y)Tj [29.5 ]TJ ( und)Tj [-10.5 ]TJ (e)Tj [-6.69999 ]TJ (r)Tj [2.5 ]TJ (stand some of lex)Tj [-10.5 ]TJ (\222)Tj [2.5 ]TJ (s limi)Tj [7.29998 ]TJ (tations. F)Tj [5.59999 ]TJ (o)Tj [-0.5 ]TJ (r ex)Tj [-10.5 ]TJ (ample, lex cannot be )Tj +T* +-0.00158 Tc +0.04159 Tw +(used t)Tj [-3.79998 ]TJ (o)Tj [-1.59999 ]TJ ( recog)Tj [8.39999 ]TJ (n)Tj [-1.59999 ]TJ (i)Tj [-3.79998 ]TJ (z)Tj [-7.79998 ]TJ (e nest)Tj [-3.79998 ]TJ (ed )Tj [-10 ]TJ (st)Tj [-3.79998 ]TJ (ruct)Tj [-3.79998 ]TJ (ures such as parent)Tj [-13.79998 ]TJ (heses. Nest)Tj [-3.79998 ]TJ (ed st)Tj [-3.79998 ]TJ (ruct)Tj [-3.79998 ]TJ (ures )Tj [-10 ]TJ (are handl)Tj [-3.79998 ]TJ (ed b)Tj [-21.59999 ]TJ (y)Tj [18.39999 ]TJ ( )Tj +0 -1.16999 TD +-0.00119 Tc +0.01119 Tw +(incorporatin)Tj [-11.19999 ]TJ (g)Tj [8.79998 ]TJ ( a stack. W)Tj [-7.39999 ]TJ (h)Tj [-1.19999 ]TJ (enever w)Tj [-9 ]TJ (e)Tj [2.59999 ]TJ ( encounte)Tj [-7.39999 ]TJ (r)Tj [1.79998 ]TJ ( a \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 330.49308 449.06858 Tm +0 Tc +0 Tw +(\()Tj +/N231 1 Tf +11.99899 0 0 11.99899 337.09259 449.06858 Tm +-0.00079 Tc +0.01078 Tw +(\224, we push it on the stac)Tj [13 ]TJ (k. W)Tj [-7 ]TJ (h)Tj [-0.79998 ]TJ (en a \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 510.11808 449.06858 Tm +0 Tc +0 Tw +(\))Tj +/N231 1 Tf +11.99899 0 0 11.99899 516.71759 449.06858 Tm +-0.00379 Tc +(\224 )Tj +-35.55999 -1.18998 TD +-0.00059 Tc +0.09059 Tw +(is encountered, w)Tj [-8.39999 ]TJ (e)Tj [3.19999 ]TJ ( matc)Tj [-6.79998 ]TJ (h it with the top of the s)Tj [8.59999 ]TJ (t)Tj [-2.79998 ]TJ (ack, and pop the stack. )Tj [-10 ]TJ (L)Tj [10.19999 ]TJ (e)Tj [3.19999 ]TJ (x)Tj [-10.59999 ]TJ (,)Tj [-0.59999 ]TJ ( howeve)Tj [-6.79998 ]TJ (r)Tj [2.39999 ]TJ (,)Tj [-10.59999 ]TJ ( )Tj +0 -1.14999 TD +-0.00009 Tc +0.08009 Tw +(onl)Tj [-12.29998 ]TJ (y)Tj [29.89999 ]TJ ( h)Tj [-10.09999 ]TJ (a)Tj [3.69999 ]TJ (s states and trans)Tj [-10.89999 ]TJ (itions between states. Si)Tj [7.69999 ]TJ (nce it has no stack, it i)Tj [7.69999 ]TJ (s)Tj [-0.89999 ]TJ ( )Tj [10 ]TJ (not well suited)Tj [9.89999 ]TJ ( )Tj +T* +-0.00199 Tc +0.23199 Tw +(for parsi)Tj [-4.19999 ]TJ (n)Tj [-12 ]TJ (g)Tj [8 ]TJ ( nest)Tj [-4.19999 ]TJ (ed st)Tj [-4.19999 ]TJ (ruct)Tj [-4.19999 ]TJ (ures. Yacc au)Tj [-12 ]TJ (g)Tj [8 ]TJ (m)Tj [-4.19999 ]TJ (ent)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( a)Tj [-8.19999 ]TJ (n)Tj [-2 ]TJ ( FS)Tj [-5.89999 ]TJ (A wi)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ ( a s)Tj [7.19999 ]TJ (t)Tj [-4.19999 ]TJ (ack, and can process)Tj [-12.79998 ]TJ ( )Tj +T* +0.00109 Tc +0.06889 Tw +(c)Tj [4.89999 ]TJ (onstr)Tj [4.09999 ]TJ (uc)Tj [4.89999 ]TJ (ts suc)Tj [4.89999 ]TJ (h)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ (s)Tj [0.29998 ]TJ ( pa)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (nt)Tj [-11.09999 ]TJ (he)Tj [4.89999 ]TJ (se)Tj [4.89999 ]TJ (s with e)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (s)Tj [0.29998 ]TJ (e)Tj [4.89999 ]TJ (.)Tj [1.09999 ]TJ ( The)Tj [4.89999 ]TJ ( impor)Tj [4.09999 ]TJ (ta)Tj [4.89999 ]TJ (nt thing)Tj [11.09999 ]TJ ( is to use)Tj [4.89999 ]TJ ( th)Tj [11.09999 ]TJ (e)Tj [4.89999 ]TJ ( r)Tj [4.09999 ]TJ (i)Tj [-1.09999 ]TJ (g)Tj [11.09999 ]TJ (h)Tj [1.09999 ]TJ (t tool f)Tj [4.09999 ]TJ (o)Tj [1.09999 ]TJ (r )Tj +T* +-0.00048 Tc +0.00048 Tw +(the job. )Tj [-10 ]TJ (L)Tj [20.29998 ]TJ (e)Tj [3.29998 ]TJ (x)Tj [-10.5 ]TJ ( is g)Tj [9.5 ]TJ (ood )Tj [-10 ]TJ (at pa)Tj [-6.59999 ]TJ (ttern matching)Tj [9.5 ]TJ (. )Tj [-10 ]TJ (Yac)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ ( is a)Tj [-6.69999 ]TJ (ppropriate fo)Tj [-10.5 ]TJ (r more ch)Tj [-10.5 ]TJ (alleng)Tj [9.5 ]TJ (in)Tj [-10.5 ]TJ (g)Tj [9.5 ]TJ ( tasks. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 343.83738 Tm +0.00028 Tc +0.58648 Tw +(2.2 Practice )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 323.43908 Tm +1.25 Tc +0 Tw +( )Tj +/N174 1 Tf +9.95919 0 0 9.95919 160.10729 304.60058 Tm +-0.00158 Tc +(M)Tj [12.09999 ]TJ (e)Tj [0.29998 ]TJ (tac)Tj [-7.59999 ]TJ (har)Tj [-5.89999 ]TJ (ac)Tj [-7.59999 ]TJ (ter)Tj [-1933.59999 ]TJ (M)Tj [12.09999 ]TJ (atc)Tj [-7.59999 ]TJ (hes)Tj +/N173 1 Tf +0.01199 -1.24099 TD +0 Tc +(.)Tj +/N228 1 Tf +8.30119 0 TD +-0.00199 Tc +0.00129 Tw +(any)Tj [28.09999 ]TJ ( c)Tj [-8 ]TJ (har)Tj [-6.29998 ]TJ (ac)Tj [-8 ]TJ (ter)Tj [-6.29998 ]TJ ( ex)Tj [-8 ]TJ (c)Tj [-8 ]TJ (ept new)Tj [9.29998 ]TJ (line)Tj +/N173 1 Tf +-8.30119 -1.31318 TD +0.00239 Tc +0 Tw +(\\n)Tj +/N228 1 Tf +8.30119 0 TD +-0.00299 Tc +(new)Tj [8.29998 ]TJ (line)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0 Tc +(*)Tj +/N228 1 Tf +8.30119 0 TD +-0.00189 Tc +0.00119 Tw +(z)Tj [16.19999 ]TJ (e)Tj [0 ]TJ (r)Tj [-6.19999 ]TJ (o)Tj [0 ]TJ ( or)Tj [-6.19999 ]TJ ( m)Tj [-24.29998 ]TJ (o)Tj [0 ]TJ (r)Tj [-6.19999 ]TJ (e)Tj [0 ]TJ ( c)Tj [-7.89999 ]TJ (opies)Tj [-7.89999 ]TJ ( of)Tj [-13.19999 ]TJ ( pr)Tj [-6.19999 ]TJ (ec)Tj [-7.89999 ]TJ (eding ex)Tj [-7.89999 ]TJ (pr)Tj [-6.19999 ]TJ (es)Tj [-7.89999 ]TJ (s)Tj [-7.89999 ]TJ (i)Tj [3.39999 ]TJ (on)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0 Tc +0 Tw +(+)Tj +/N228 1 Tf +8.30119 0 TD +-0.00199 Tc +0.00129 Tw +(one or)Tj [-6.29998 ]TJ ( m)Tj [-24.39999 ]TJ (o)Tj [-0.09999 ]TJ (r)Tj [-6.29998 ]TJ (e)Tj [-0.09999 ]TJ ( c)Tj [-8 ]TJ (opies)Tj [-8 ]TJ ( of)Tj [-13.29998 ]TJ ( pr)Tj [-6.29998 ]TJ (ec)Tj [-8 ]TJ (eding ex)Tj [-8 ]TJ (pr)Tj [-6.29998 ]TJ (es)Tj [-8 ]TJ (s)Tj [-8 ]TJ (i)Tj [3.29998 ]TJ (on)Tj +/N173 1 Tf +-8.30119 -1.31318 TD +0 Tc +0 Tw +(?)Tj +/N228 1 Tf +8.30119 0 TD +-0.00189 Tc +0.00119 Tw +(z)Tj [16.19999 ]TJ (e)Tj [0 ]TJ (r)Tj [-6.19999 ]TJ (o)Tj [0 ]TJ ( or)Tj [-6.19999 ]TJ ( one c)Tj [-7.89999 ]TJ (opy)Tj [28.19999 ]TJ ( of)Tj [-13.19999 ]TJ ( pr)Tj [-6.19999 ]TJ (ec)Tj [-7.89999 ]TJ (eeding ex)Tj [-7.89999 ]TJ (pr)Tj [-6.19999 ]TJ (es)Tj [-7.89999 ]TJ (s)Tj [-7.89999 ]TJ (i)Tj [3.39999 ]TJ (on)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0 Tc +0 Tw +(^)Tj +/N228 1 Tf +8.30119 0 TD +-0.00268 Tc +0.00199 Tw +(beginning of)Tj [-14 ]TJ ( line)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0 Tc +0 Tw +($)Tj +/N228 1 Tf +8.30119 0 TD +-0.00248 Tc +0.00178 Tw +(end of)Tj [-13.79998 ]TJ ( line)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0.00239 Tc +0 Tw +(a|b)Tj +/N228 1 Tf +8.30119 0 TD +-0.00169 Tc +0.00099 Tw +(a or)Tj [-6 ]TJ ( b)Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0.00239 Tc +0 Tw +(\(ab\)+)Tj +/N228 1 Tf +8.30119 0 TD +-0.00199 Tc +0.00129 Tw +(one or)Tj [-6.29998 ]TJ ( m)Tj [-24.39999 ]TJ (o)Tj [-0.09999 ]TJ (r)Tj [-6.29998 ]TJ (e)Tj [-0.09999 ]TJ ( c)Tj [-8 ]TJ (opies)Tj [-8 ]TJ ( of)Tj [-13.29998 ]TJ ( ab \()Tj [-6.29998 ]TJ (g)Tj [-0.09999 ]TJ (r)Tj [-6.29998 ]TJ (ouping\))Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0.00239 Tc +0 Tw +("a+b")Tj +/N228 1 Tf +8.30119 0 TD +-0.00299 Tc +0.00228 Tw +(liter)Tj [-7.29998 ]TJ (al \223)Tj [-7.29998 ]TJ (a)Tj [-1.09999 ]TJ (+b\224)Tj [-7.29998 ]TJ ( \()Tj [-7.29998 ]TJ (C)Tj [-3.69999 ]TJ ( es)Tj [-9 ]TJ (c)Tj [-9 ]TJ (apes)Tj [-9 ]TJ ( s)Tj [-9 ]TJ (t)Tj [-2.29998 ]TJ (ill w)Tj [8.29998 ]TJ (o)Tj [-1.09999 ]TJ (r)Tj [-7.29998 ]TJ (k)Tj [-21.09999 ]TJ (\))Tj +/N173 1 Tf +-8.30119 -1.31329 TD +0.00239 Tc +0 Tw +([])Tj +/N228 1 Tf +8.30119 0 TD +-0.00178 Tc +0.00109 Tw +(c)Tj [-7.79998 ]TJ (har)Tj [-6.09999 ]TJ (ac)Tj [-7.79998 ]TJ (ter)Tj [-6.09999 ]TJ ( c)Tj [-7.79998 ]TJ (l)Tj [3.5 ]TJ (as)Tj [-7.79998 ]TJ (s)Tj +ET +/N224 /ColorSpace findRes CS +0 0 0 SC +0 J +0 j +0.21598 w +10 M +[]0 d +158.18699 314.55999 m +453.96299 314.55999 l +S +158.18699 314.55999 295.77499 -0.95999 rf +158.18699 302.20098 m +453.96299 302.20098 l +S +158.18699 302.20098 295.77499 -0.95999 rf +158.18699 158.33299 m +453.96299 158.33299 l +S +158.18699 158.33299 295.77499 -0.95999 rf +BT +/N170 1 Tf +11.99899 0 0 11.99899 454.32279 157.37289 Tm +0 Tc +0 Tw +( )Tj +-20.30999 -1.90998 TD +-0.00048 Tc +0.00048 Tw +(Table 2-1: )Tj +/N231 1 Tf +4.60998 0 TD +0.00199 Tc +-0.00199 Tw +(Pa)Tj [5.79998 ]TJ (tte)Tj [5.79998 ]TJ (r)Tj [5 ]TJ (n)Tj [2 ]TJ ( Ma)Tj [5.79998 ]TJ (tching)Tj [12 ]TJ ( Pr)Tj [5 ]TJ (imitive)Tj [5.79998 ]TJ (s)Tj [1.19999 ]TJ ( )Tj +-14.65998 -1.64999 TD +0 Tc +0 Tw +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 8 8 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 8)Tj +/N174 1 Tf +9.95919 0 0 9.95919 168.74659 710.16688 Tm +-0.00209 Tc +(Ex)Tj [-8.09999 ]TJ (pr)Tj [-6.39999 ]TJ (es)Tj [-8.09999 ]TJ (s)Tj [-8.09999 ]TJ (i)Tj [3.19999 ]TJ (on)Tj [-5421.79998 ]TJ (M)Tj [11.59999 ]TJ (a)Tj [-0.19999 ]TJ (tc)Tj [-8.09999 ]TJ (hes)Tj +/N173 1 Tf +0.01199 -1.24099 TD +0.00239 Tc +(abc)Tj [-8566.29998 ]TJ (abc)Tj +0 -1.31329 TD +(abc*)Tj [-7963.89999 ]TJ (ab,)Tj [-602.39999 ]TJ (abc,)Tj [-602.39999 ]TJ (abcc,)Tj [-602.39999 ]TJ (abccc,)Tj [-602.39999 ]TJ (\205)Tj +T* +(abc+)Tj [-7963.89999 ]TJ (abc,)Tj [-602.39999 ]TJ (abcc,)Tj [-602.39999 ]TJ (abccc,)Tj [-602.39999 ]TJ (\205)Tj +T* +(a\(bc\)+)Tj [-6759 ]TJ (abc,)Tj [-602.39999 ]TJ (abcbc,)Tj [-602.39999 ]TJ (abcbcbc,)Tj [-602.39999 ]TJ (\205)Tj +T* +(a\(bc\)?)Tj [-6759 ]TJ (a,)Tj [-602.39999 ]TJ (abc)Tj +T* +([abc])Tj [-7361.39999 ]TJ (a,)Tj [-602.39999 ]TJ (b,)Tj [-602.39999 ]TJ (c)Tj +T* +([a-z])Tj +/N228 1 Tf +10.36138 0.01199 TD +-0.00119 Tc +0.00048 Tw +(any)Tj [28.89999 ]TJ ( letter, )Tj +/N173 1 Tf +4.62649 0 TD +0 Tc +0 Tw +(a)Tj +/N228 1 Tf +0.60238 0 TD +-0.00158 Tc +0.00088 Tw +( thr)Tj [-5.89999 ]TJ (ough )Tj +/N173 1 Tf +3.93978 0 TD +0 Tc +0 Tw +(z)Tj +-19.53009 -1.32528 TD +0.00239 Tc +([a\\-z])Tj [-6759 ]TJ (a,)Tj [-602.39999 ]TJ (-,)Tj [-602.39999 ]TJ (z)Tj +0 -1.31329 TD +([-az])Tj [-7361.39999 ]TJ (-,)Tj [-602.39999 ]TJ (a,)Tj [-602.39999 ]TJ (z)Tj +T* +([A-Za-z0-9]+)Tj +/N228 1 Tf +10.36138 0 TD +-0.00209 Tc +0.00138 Tw +(one or)Tj [-6.39999 ]TJ ( m)Tj [-24.5 ]TJ (o)Tj [-0.19999 ]TJ (r)Tj [-6.39999 ]TJ (e)Tj [-0.19999 ]TJ ( alphanum)Tj [-24.5 ]TJ (er)Tj [-6.39999 ]TJ (ic)Tj [-8.09999 ]TJ ( c)Tj [-8.09999 ]TJ (har)Tj [-6.39999 ]TJ (ac)Tj [-8.09999 ]TJ (ter)Tj [-6.39999 ]TJ (s)Tj +/N173 1 Tf +-10.36138 -1.31318 TD +0.00239 Tc +0 Tw +([)Tj [-602.39999 ]TJ (\\t\\n]+)Tj +/N228 1 Tf +10.36138 0 TD +-0.00219 Tc +(w)Tj [9.09999 ]TJ (h)Tj [-0.29998 ]TJ (ites)Tj [-8.19999 ]TJ (pac)Tj [-8.19999 ]TJ (e)Tj +/N173 1 Tf +-10.36138 -1.31329 TD +0.00239 Tc +([^ab])Tj +/N228 1 Tf +10.36138 0.01208 TD +-0.00178 Tc +0.00109 Tw +(any)Tj [28.29998 ]TJ (thing ex)Tj [-7.79998 ]TJ (c)Tj [-7.79998 ]TJ (ept: )Tj +/N173 1 Tf +7.51809 0 TD +0.00239 Tc +0 Tw +(a,)Tj [-602.39999 ]TJ (b)Tj +-17.87948 -1.32528 TD +([a^b])Tj [-7361.39999 ]TJ (a,)Tj [-602.39999 ]TJ (^,)Tj [-602.39999 ]TJ (b)Tj +0 -1.31329 TD +([a|b])Tj [-7361.39999 ]TJ (a,)Tj [-602.39999 ]TJ (|,)Tj [-602.39999 ]TJ (b)Tj +T* +(a|b)Tj +10.37348 0.01208 TD +0 Tc +(a)Tj +/N228 1 Tf +1.20478 0 TD +-0.00189 Tc +(or)Tj +/N173 1 Tf +1.49398 0 TD +0 Tc +(b)Tj +ET +/N224 /ColorSpace findRes CS +0 0 0 SC +0 J +0 j +0.21598 w +10 M +[]0 d + +166.82699 720.12599 m +445.32398 720.12599 l +S +166.82699 720.12599 278.49699 -0.95999 rf +166.82699 707.76699 m +445.32398 707.76699 l +S +166.82699 707.76699 278.49699 -0.95999 rf +166.82699 511.58299 m +445.32398 511.58299 l +S +166.82699 511.58299 278.49699 -0.95999 rf +BT +/N170 1 Tf +11.99899 0 0 11.99899 445.68348 510.62348 Tm +( )Tj +-19.5 -1.90998 TD +-0.00048 Tc +0.00048 Tw +(Table 2-2: )Tj +/N231 1 Tf +4.60998 0 TD +-0.00009 Tc +0.00009 Tw +(Pattern Matc)Tj [-6.29998 ]TJ (hing)Tj [9.89999 ]TJ ( Ex)Tj [-10.09999 ]TJ (amples )Tj +-14.75 -1.64999 TD +0 Tc +0 Tw +( )Tj +0 -1.14999 TD +-0.00088 Tc +0.00088 Tw +(Reg)Tj [9.09999 ]TJ (u)Tj [-0.89999 ]TJ (la)Tj [-7.09999 ]TJ (r ex)Tj [-10.89999 ]TJ (pressions in lex)Tj [-10.89999 ]TJ ( are composed of )Tj +/N171 1 Tf +17.68998 0 TD +-0.00048 Tc +0 Tw +(metac)Tj [-6.69999 ]TJ (haracters)Tj +/N231 1 Tf +6.21998 0 TD +-0.00028 Tc +0.00028 Tw +( \(Table 2)Tj [-10.29998 ]TJ (-)Tj [2.69999 ]TJ (1\). Pa)Tj [-6.5 ]TJ (ttern matchin)Tj [-10.29998 ]TJ (g)Tj [-0.29998 ]TJ ( )Tj +-23.90998 -1.14999 TD +-0.00189 Tc +0.11189 Tw +(ex)Tj [-11.89999 ]TJ (am)Tj [-4.09999 ]TJ (pl)Tj [-4.09999 ]TJ (es are shown i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ ( )Tj [-9.89999 ]TJ (Tabl)Tj [-4.09999 ]TJ (e 2-2. W)Tj [-8.09999 ]TJ (i)Tj [-4.09999 ]TJ (t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ ( a cha)Tj [-8.09999 ]TJ (r)Tj [1.09999 ]TJ (act)Tj [-4.09999 ]TJ (e)Tj [-8.09999 ]TJ (r)Tj [1.09999 ]TJ ( cl)Tj [-4.09999 ]TJ (ass, norm)Tj [-4.09999 ]TJ (a)Tj [1.89999 ]TJ (l)Tj [-4.09999 ]TJ ( op)Tj [-11.89999 ]TJ (er)Tj [-8.89999 ]TJ (at)Tj [-4.09999 ]TJ (ors l)Tj [-4.09999 ]TJ (o)Tj [-1.89999 ]TJ (se t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (ei)Tj [-4.09999 ]TJ (r )Tj +0 -1.16999 TD +-0.00228 Tc +0.02229 Tw +(m)Tj [-4.5 ]TJ (eani)Tj [-4.5 ]TJ (n)Tj [-2.29998 ]TJ (g)Tj [7.69999 ]TJ (.)Tj [-2.29998 ]TJ ( T)Tj [-11.5 ]TJ (w)Tj [-0.09999 ]TJ (o oper)Tj [-9.29998 ]TJ (a)Tj [1.5 ]TJ (t)Tj [-4.5 ]TJ (o)Tj [-2.29998 ]TJ (rs al)Tj [-4.5 ]TJ (l)Tj [-4.5 ]TJ (o)Tj [-2.29998 ]TJ (wed i)Tj [-4.5 ]TJ (n)Tj [-2.29998 ]TJ ( a char)Tj [-9.29998 ]TJ (act)Tj [-4.5 ]TJ (e)Tj [-8.5 ]TJ (r)Tj [0.69999 ]TJ ( cl)Tj [-14.5 ]TJ (ass are t)Tj [-4.5 ]TJ (h)Tj [-2.29998 ]TJ (e h)Tj [-22.29998 ]TJ (y)Tj [17.69999 ]TJ (ph)Tj [-12.29998 ]TJ (en \(\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 430.20478 426.27049 Tm +0 Tc +0 Tw +(-)Tj +/N231 1 Tf +11.99899 0 0 11.99899 436.80429 426.27049 Tm +-0.00129 Tc +0.03129 Tw +(\224)Tj [-7.5 ]TJ (\))Tj [1.69999 ]TJ ( and )Tj [10 ]TJ (circumflex)Tj [-11.29998 ]TJ ( )Tj +-28.89999 -1.20999 TD +-0.00299 Tc +0 Tw +(\(\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 99.27239 411.75169 Tm +0 Tc +(^)Tj +/N231 1 Tf +11.99899 0 0 11.99899 105.87188 411.75169 Tm +-0.00209 Tc +0.11209 Tw +(\224\). W)Tj [-8.29998 ]TJ (h)Tj [-2.09999 ]TJ (en used bet)Tj [-4.29998 ]TJ (w)Tj [0.09999 ]TJ (e)Tj [-8.29998 ]TJ (e)Tj [1.69999 ]TJ (n t)Tj [-4.29998 ]TJ (w)Tj [0.09999 ]TJ (o charact)Tj [-14.29998 ]TJ (ers, t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e hy)Tj [17.89999 ]TJ (p)Tj [-12.09999 ]TJ (h)Tj [-2.09999 ]TJ (en r)Tj [-9.09999 ]TJ (e)Tj [1.69999 ]TJ (pres)Tj [-12.89999 ]TJ (ent)Tj [-4.29998 ]TJ (s)Tj [-2.89999 ]TJ ( a ran)Tj [-12.09999 ]TJ (g)Tj [7.89999 ]TJ (e)Tj [-8.29998 ]TJ ( of charact)Tj [-14.29998 ]TJ (ers.)Tj [-12.09999 ]TJ ( )Tj +-1.31999 -1.18998 TD +-0.00079 Tc +0.07078 Tw +(The cir)Tj [-7.79998 ]TJ (c)Tj [3 ]TJ (umflex)Tj [-10.79998 ]TJ (, when us)Tj [-11.59999 ]TJ (ed as th)Tj [-10.79998 ]TJ (e first )Tj [-10 ]TJ (cha)Tj [-7 ]TJ (r)Tj [2.19999 ]TJ (acte)Tj [-7 ]TJ (r)Tj [2.19999 ]TJ (, )Tj [-10 ]TJ (negates the)Tj [-7 ]TJ ( ex)Tj [-10.79998 ]TJ (pression. )Tj [-10 ]TJ (If two patte)Tj [-7 ]TJ (rns)Tj [-11.59999 ]TJ ( )Tj +0 -1.14999 TD +-0.00068 Tc +0.03068 Tw +(match the same strin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ (, th)Tj [-10.69999 ]TJ (e longest match wins. )Tj [-10 ]TJ (I)Tj [12.29998 ]TJ (n)Tj [-0.69999 ]TJ ( )Tj [-10 ]TJ (case both match)Tj [-10.69999 ]TJ (e)Tj [3.09999 ]TJ (s ar)Tj [-7.69999 ]TJ (e th)Tj [-10.69999 ]TJ (e same len)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ (th, )Tj +T* +0.00119 Tc +-0.00119 Tw +(the)Tj [5 ]TJ (n)Tj [1.19999 ]TJ ( the)Tj [5 ]TJ ( f)Tj [4.19999 ]TJ (i)Tj [-1 ]TJ (r)Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ (t pa)Tj [5 ]TJ (tte)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (n)Tj [1.19999 ]TJ ( listed is use)Tj [5 ]TJ (d. )Tj +T* +0 Tc +0 Tw +( )Tj +0 -7.96998 TD +( )Tj +0 -1.14999 TD +( )Tj +0 -1.16999 TD +0.03999 Tw +( )Tj [-1210 ]TJ (I)Tj [13 ]TJ (nput to)Tj [-10 ]TJ ( )Tj [-10 ]TJ (L)Tj [10.79998 ]TJ (e)Tj [3.79998 ]TJ (x)Tj [-10 ]TJ ( is divided i)Tj [-12.19999 ]TJ (n)Tj [0 ]TJ (to three s)Tj [-10.79998 ]TJ (ections, with )Tj +/N173 1 Tf +11.03909 0 0 11.03909 342.73208 232.60659 Tm +-0.00219 Tc +0 Tw +(%%)Tj +/N231 1 Tf +11.99899 0 0 11.99899 355.93099 232.60659 Tm +0.00039 Tc +0.03959 Tw +( dividing)Tj [10.39999 ]TJ ( the)Tj [-5.79998 ]TJ ( sections.)Tj [-9.59999 ]TJ ( This is best )Tj +-22.15998 -1.18998 TD +0.00119 Tc +-0.00119 Tw +(illustr)Tj [4.19999 ]TJ (a)Tj [5 ]TJ (te)Tj [5 ]TJ (d b)Tj [-8.79998 ]TJ (y)Tj [21.19999 ]TJ ( e)Tj [5 ]TJ (x)Tj [-8.79998 ]TJ (a)Tj [5 ]TJ (m)Tj [-1 ]TJ (ple)Tj [5 ]TJ (.)Tj [1.19999 ]TJ ( T)Tj [-8 ]TJ (h)Tj [1.19999 ]TJ (e)Tj [5 ]TJ ( f)Tj [4.19999 ]TJ (i)Tj [-1 ]TJ (r)Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ (t e)Tj [5 ]TJ (x)Tj [-8.79998 ]TJ (a)Tj [5 ]TJ (m)Tj [-1 ]TJ (ple)Tj [5 ]TJ ( is the)Tj [5.19999 ]TJ ( shor)Tj [4.19999 ]TJ (te)Tj [5 ]TJ (st possible)Tj [5 ]TJ ( le)Tj [5 ]TJ (x)Tj [-8.79998 ]TJ ( f)Tj [4.19999 ]TJ (ile)Tj [5 ]TJ (: )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 192.52999 Tm +-0.00219 Tc +(%%)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 178.37109 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00048 Tc +0.02049 Tw +(I)Tj [12.5 ]TJ (nput is copied to output, one chara)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ (ter at a time. )Tj [-10 ]TJ (The first )Tj +/N173 1 Tf +11.03909 0 0 11.03909 374.52949 164.33229 Tm +-0.00219 Tc +0 Tw +(%%)Tj +/N231 1 Tf +11.99899 0 0 11.99899 387.72839 164.33229 Tm +-0.00199 Tc +0.02198 Tw +( i)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( al)Tj [-4.19999 ]TJ (wa)Tj [-8.19999 ]TJ (y)Tj [18 ]TJ (s)Tj [-2.79998 ]TJ ( r)Tj [-9 ]TJ (e)Tj [-8.19999 ]TJ (qui)Tj [-4.19999 ]TJ (red, as t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (ere )Tj +-24.80999 -1.18998 TD +-0.00068 Tc +0.07069 Tw +(must alwa)Tj [-6.89999 ]TJ (y)Tj [19.29998 ]TJ (s)Tj [-1.5 ]TJ ( b)Tj [-10.69999 ]TJ (e)Tj [3.09999 ]TJ ( a )Tj [-10 ]TJ (rules s)Tj [-11.5 ]TJ (ection. Howev)Tj [-10.69999 ]TJ (e)Tj [3.09999 ]TJ (r, if )Tj [-10 ]TJ (we d)Tj [-10.69999 ]TJ (on\222t specif)Tj [-17.69999 ]TJ (y)Tj [19.29998 ]TJ ( a)Tj [-6.89999 ]TJ (n)Tj [-20.69999 ]TJ (y)Tj [19.29998 ]TJ ( rules, th)Tj [-10.69999 ]TJ (en the def)Tj [-7.69999 ]TJ (a)Tj [3.09999 ]TJ (ult )Tj +0 -1.14999 TD +-0.00028 Tc +0.15029 Tw +(action is to match )Tj [-10 ]TJ (ever)Tj [-17.29998 ]TJ (y)Tj [9.69999 ]TJ (t)Tj [-2.5 ]TJ (hing)Tj [9.69999 ]TJ ( and )Tj [-10 ]TJ (cop)Tj [-20.29998 ]TJ (y)Tj [19.69999 ]TJ ( it to out)Tj [-12.5 ]TJ (put. Defaults fo)Tj [-10.29998 ]TJ (r input a)Tj [-6.5 ]TJ (n)Tj [-0.09999 ]TJ (d output are)Tj [-6.39999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 122.21578 Tm +-0.00219 Tc +0 Tw +(stdin)Tj +/N231 1 Tf +11.99899 0 0 11.99899 123.03039 122.21578 Tm +-0.00099 Tc +0.20098 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 151.10809 122.21578 Tm +-0.00219 Tc +0 Tw +(stdout)Tj +/N231 1 Tf +11.99899 0 0 11.99899 190.70478 122.21578 Tm +0.00129 Tc +0.19869 Tw +(, r)Tj [4.29998 ]TJ (e)Tj [-4.89999 ]TJ (spe)Tj [5.09999 ]TJ (c)Tj [5.09999 ]TJ (tive)Tj [5.09999 ]TJ (l)Tj [-10.89999 ]TJ (y)Tj [21.29998 ]TJ (.)Tj [1.29998 ]TJ ( )Tj [-10 ]TJ (He)Tj [5.09999 ]TJ (re)Tj [5.09999 ]TJ ( is the)Tj [5.09999 ]TJ ( sa)Tj [5.09999 ]TJ (me)Tj [5.09999 ]TJ ( e)Tj [5.09999 ]TJ (x)Tj [-8.69999 ]TJ (a)Tj [5.09999 ]TJ (m)Tj [-0.89999 ]TJ (ple)Tj [5.09999 ]TJ (,)Tj [1.29998 ]TJ ( with de)Tj [5.09999 ]TJ (f)Tj [4.29998 ]TJ (a)Tj [5.09999 ]TJ (ults e)Tj [5.09999 ]TJ (x)Tj [-8.69999 ]TJ (plic)Tj [5.09999 ]TJ (it)Tj [9.09999 ]TJ (l)Tj [-10.89999 ]TJ (y)Tj [21.29998 ]TJ ( )Tj +-8.38999 -1.18998 TD +-0.00088 Tc +0 Tw +(coded: )Tj +ET +1 1 1 sc +225.62199 352.35699 160.78698 -20.87799 rf +BT +11.99899 0 0 11.99899 234.02119 334.47808 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +0.00099 Tc +(de)Tj [4.79998 ]TJ (finitions)Tj +/N231 1 Tf +4.22999 0 TD +0 Tc +( ... )Tj +ET +224.90199 353.07699 0.71998 -0.71998 rf +224.90199 353.07699 0.71998 -0.71998 rf +225.62199 353.07699 160.78698 -0.71998 rf +386.40798 353.07699 0.71998 -0.71998 rf +386.40798 353.07699 0.71998 -0.71998 rf +224.90199 352.35699 0.71998 -20.87799 rf +386.40798 352.35699 0.71998 -20.87799 rf +1 1 1 sc +225.62199 331.47799 160.78698 -12.35899 rf +BT +/N173 1 Tf +11.03909 0 0 11.03909 234.02119 322.47909 Tm +0 0 0 sc +-0.00219 Tc +(%%)Tj +ET +224.90199 331.47799 0.71998 -12.35899 rf +386.40798 331.47799 0.71998 -12.35899 rf +1 1 1 sc +225.62199 319.11898 160.78698 -13.79899 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 234.02119 308.32029 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +-0.00019 Tc +(rules)Tj +/N231 1 Tf +2 0 TD +0 Tc +( ... )Tj +ET +224.90199 319.11898 0.71998 -13.79899 rf +386.40798 319.11898 0.71998 -13.79899 rf +1 1 1 sc +225.62199 305.32099 160.78698 -12.47898 rf +BT +/N173 1 Tf +11.03909 0 0 11.03909 234.02119 296.32128 Tm +0 0 0 sc +-0.00219 Tc +(%%)Tj +ET +224.90199 305.32099 0.71998 -12.47898 rf +386.40798 305.32099 0.71998 -12.47898 rf +1 1 1 sc +225.62199 292.84199 160.78698 -20.87799 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 234.02119 281.92248 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +-0.00009 Tc +(subroutines)Tj +/N231 1 Tf +4.66999 0 TD +0 Tc +( ... )Tj +ET +224.90199 271.96299 0.71998 -0.71998 rf +224.90199 271.96299 0.71998 -0.71998 rf +225.62199 271.96299 160.78698 -0.71998 rf +386.40798 271.96299 0.71998 -0.71998 rf +386.40798 271.96299 0.71998 -0.71998 rf +224.90199 292.84199 0.71998 -20.87799 rf +386.40798 292.84199 0.71998 -20.87799 rf +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 9 9 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +17.5 Tc +0 Tw +( 9)Tj +0 55.84999 TD +0 Tc +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 684.72889 Tm +-0.00219 Tc +(%%)Tj +2.39129 -1.13038 TD +(/*)Tj [-597.89999 ]TJ (match)Tj [-597.89999 ]TJ (everything)Tj [-597.89999 ]TJ (except)Tj [-597.89999 ]TJ (newline)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(.)Tj [-1793.5 ]TJ (ECHO;)Tj +2.39129 -1.11959 TD +(/*)Tj [-597.89999 ]TJ (match)Tj [-597.89999 ]TJ (newline)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(\\n)Tj [-1195.69999 ]TJ (ECHO;)Tj +0 -2.26089 TD +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (yywrap\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(return)Tj [-597.89999 ]TJ (1;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.26089 TD +-0.00219 Tc +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yylex\(\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.11959 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 483.62568 Tm +( )Tj +0 -1.14999 TD +-0.00059 Tc +0.03059 Tw +(Two patterns have been )Tj [-10 ]TJ (specified in the rules section. Each pattern must b)Tj [9.39999 ]TJ (e)Tj [3.19999 ]TJ (g)Tj [9.39999 ]TJ (i)Tj [-2.79998 ]TJ (n in column)Tj [-10.59999 ]TJ ( )Tj +T* +0.00028 Tc +0.21969 Tw +(one)Tj [4.09999 ]TJ (. This is f)Tj [3.29998 ]TJ (o)Tj [0.29998 ]TJ (llowe)Tj [4.09999 ]TJ (d)Tj [-9.69999 ]TJ ( b)Tj [-9.69999 ]TJ (y)Tj [20.29998 ]TJ ( )Tj +/N171 1 Tf +11.04998 0 TD +0.00048 Tc +0 Tw +(whitespac)Tj [-5.69999 ]TJ (e)Tj +/N231 1 Tf +4.44999 0 TD +-0.00158 Tc +0.22158 Tw +( \(sp)Tj [-11.59999 ]TJ (ace,)Tj [-11.59999 ]TJ ( t)Tj [-3.79998 ]TJ (a)Tj [-7.79998 ]TJ (b or ne)Tj [-7.79998 ]TJ (wl)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (n)Tj [-1.59999 ]TJ (e\), and)Tj [-11.59999 ]TJ ( an )Tj [-10 ]TJ (opt)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (onal)Tj [-3.79998 ]TJ ( act)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (on )Tj +-15.5 -1.14999 TD +0.00149 Tc +0.22848 Tw +(a)Tj [5.29998 ]TJ (ssoc)Tj [5.29998 ]TJ (i)Tj [-0.69999 ]TJ (a)Tj [5.29998 ]TJ (t)Tj [-0.69999 ]TJ (e)Tj [5.29998 ]TJ (d)Tj [1.5 ]TJ ( )Tj [-10 ]TJ (with the)Tj [5.29998 ]TJ ( p)Tj [-8.5 ]TJ (a)Tj [5.29998 ]TJ (tte)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (n. Th)Tj [-8.5 ]TJ (e)Tj [5.29998 ]TJ ( )Tj [-10 ]TJ (a)Tj [5.29998 ]TJ (c)Tj [5.29998 ]TJ (tion ma)Tj [-14.69999 ]TJ (y)Tj [21.5 ]TJ ( )Tj [-10 ]TJ (be a)Tj [5.29998 ]TJ ( sin)Tj [-8.5 ]TJ (g)Tj [11.5 ]TJ (le C sta)Tj [5.29998 ]TJ (t)Tj [-0.69999 ]TJ (e)Tj [5.29998 ]TJ (m)Tj [-0.69999 ]TJ (e)Tj [5.29998 ]TJ (n)Tj [1.5 ]TJ (t,)Tj [-8.5 ]TJ ( )Tj [-10 ]TJ (or)Tj [4.5 ]TJ ( multiple)Tj [5.29998 ]TJ ( C )Tj +T* +-0.00028 Tc +0.04029 Tw +(statements enclosed in br)Tj [-7.29998 ]TJ (aces. An)Tj [-20.29998 ]TJ (y)Tj [19.69999 ]TJ (t)Tj [-2.5 ]TJ (hin)Tj [-10.29998 ]TJ (g)Tj [9.69999 ]TJ ( not starting)Tj [9.69999 ]TJ ( in column one is copi)Tj [-12.5 ]TJ (ed verbatim to )Tj +T* +0.03039 Tw +(the g)Tj [9.59999 ]TJ (e)Tj [3.39999 ]TJ (n)Tj [-10.39999 ]TJ (e)Tj [3.39999 ]TJ (rat)Tj [-12.59999 ]TJ (e)Tj [3.39999 ]TJ (d C file. W)Tj [-6.59999 ]TJ (e)Tj [3.39999 ]TJ ( )Tj [10 ]TJ (ma)Tj [-6.59999 ]TJ (y)Tj [19.59999 ]TJ ( take adv)Tj [-10.39999 ]TJ (a)Tj [3.39999 ]TJ (nta)Tj [-6.59999 ]TJ (g)Tj [9.59999 ]TJ (e of th)Tj [-10.39999 ]TJ (is behavior to specif)Tj [-7.39999 ]TJ (y)Tj [19.59999 ]TJ ( co)Tj [-10.39999 ]TJ (mments in our)Tj [12.59999 ]TJ ( )Tj +0 -1.16999 TD +0.00178 Tc +0.17819 Tw +(le)Tj [5.59999 ]TJ (x)Tj [-8.19999 ]TJ ( f)Tj [4.79998 ]TJ (ile)Tj [5.59999 ]TJ (. )Tj [-10 ]TJ (I)Tj [24.79998 ]TJ (n)Tj [1.79998 ]TJ ( this e)Tj [5.59999 ]TJ (x)Tj [-8.19999 ]TJ (a)Tj [5.59999 ]TJ (m)Tj [-0.39999 ]TJ (ple the)Tj [5.59999 ]TJ (r)Tj [4.79998 ]TJ (e)Tj [5.59999 ]TJ ( )Tj [-10 ]TJ (a)Tj [5.59999 ]TJ (r)Tj [4.79998 ]TJ (e two pa)Tj [5.59999 ]TJ (tte)Tj [5.59999 ]TJ (r)Tj [4.79998 ]TJ (n)Tj [1.79998 ]TJ (s,)Tj [-8.19999 ]TJ ( \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 346.33178 400.59259 Tm +0 Tc +0 Tw +(.)Tj +/N231 1 Tf +11.99899 0 0 11.99899 352.93119 400.59259 Tm +-0.00189 Tc +0.19189 Tw +(\224 and )Tj [10 ]TJ (\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 391.20809 400.59259 Tm +-0.00219 Tc +0 Tw +(\\n)Tj +/N231 1 Tf +11.99899 0 0 11.99899 404.52688 400.59259 Tm +0.00138 Tc +0.17858 Tw +(\224)Tj [5.19999 ]TJ (,)Tj [1.39999 ]TJ ( with an )Tj +/N173 1 Tf +11.03909 0 0 11.03909 461.04219 400.59259 Tm +-0.00219 Tc +0 Tw +(ECHO)Tj +/N231 1 Tf +11.99899 0 0 11.99899 487.43998 400.59259 Tm +0.00149 Tc +0.17849 Tw +( a)Tj [5.29998 ]TJ (c)Tj [5.29998 ]TJ (tion)Tj [-8.5 ]TJ ( )Tj +-33.11999 -1.20999 TD +-0.00209 Tc +0.01208 Tw +(associ)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (ed fo)Tj [-12.09999 ]TJ (r ea)Tj [-8.29998 ]TJ (ch pat)Tj [-4.29998 ]TJ (t)Tj [-4.29998 ]TJ (e)Tj [-8.29998 ]TJ (r)Tj [-9.09999 ]TJ (n. S)Tj [-6 ]TJ (e)Tj [1.69999 ]TJ (veral)Tj [-4.29998 ]TJ ( m)Tj [-4.29998 ]TJ (a)Tj [-8.29998 ]TJ (cros and v)Tj [-12.09999 ]TJ (a)Tj [-8.29998 ]TJ (ri)Tj [-4.29998 ]TJ (abl)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (s ar)Tj [-9.09999 ]TJ (e pred)Tj [-12.09999 ]TJ (efi)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ (ed b)Tj [-22.09999 ]TJ (y)Tj [17.89999 ]TJ ( )Tj [-10 ]TJ (l)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (x)Tj [-12.09999 ]TJ (.)Tj [-2.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 476.16099 386.07379 Tm +-0.00219 Tc +0 Tw +(ECHO)Tj +/N231 1 Tf +11.99899 0 0 11.99899 502.55879 386.07379 Tm +0.00149 Tc +0.00849 Tw +( is a)Tj [15.29998 ]TJ ( )Tj +-34.37998 -1.18998 TD +0.00109 Tc +0.28889 Tw +(ma)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (o tha)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ ( wr)Tj [4.09999 ]TJ (ite)Tj [4.89999 ]TJ (s c)Tj [4.89999 ]TJ (o)Tj [1.09999 ]TJ (d)Tj [-8.89999 ]TJ (e)Tj [-5.09999 ]TJ ( ma)Tj [4.89999 ]TJ (tc)Tj [4.89999 ]TJ (he)Tj [4.89999 ]TJ (d b)Tj [-8.89999 ]TJ (y)Tj [21.09999 ]TJ ( the)Tj [4.89999 ]TJ ( p)Tj [-8.89999 ]TJ (a)Tj [4.89999 ]TJ (tte)Tj [4.89999 ]TJ (rn. This is the)Tj [4.89999 ]TJ ( de)Tj [4.89999 ]TJ (f)Tj [4.09999 ]TJ (a)Tj [4.89999 ]TJ (ult a)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (tion f)Tj [4.09999 ]TJ (o)Tj [1.09999 ]TJ (r)Tj [4.09999 ]TJ ( a)Tj [4.89999 ]TJ (n)Tj [-18.69999 ]TJ (y)Tj [21.09999 ]TJ ( )Tj +0 -1.16999 TD +0.00009 Tc +-0.00009 Tw +(unmatched strin)Tj [-9.89999 ]TJ (g)Tj [10.09999 ]TJ (s. T)Tj [-19.09999 ]TJ (y)Tj [20.09999 ]TJ (pic)Tj [-6.09999 ]TJ (a)Tj [3.89999 ]TJ (ll)Tj [-12.09999 ]TJ (y)Tj [20.09999 ]TJ (,)Tj [0.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 235.58108 357.75619 Tm +-0.00219 Tc +0 Tw +(ECHO)Tj +/N231 1 Tf +11.99899 0 0 11.99899 261.97879 357.75619 Tm +0 Tc +( is defin)Tj [-10 ]TJ (e)Tj [3.79998 ]TJ (d as: )Tj +-14.32998 -1.18998 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 331.47839 Tm +-0.00219 Tc +(#define)Tj [-597.89999 ]TJ (ECHO)Tj [-597.89999 ]TJ (fwrite\(yytext,)Tj [-597.89999 ]TJ (yyleng,)Tj [-597.89999 ]TJ (1,)Tj [-597.89999 ]TJ (yyout\))Tj +/N231 1 Tf +11.99899 0 0 11.99899 108.03169 317.19958 Tm +0 Tc +( )Tj +-1.5 -1.16999 TD +-0.00149 Tc +(Variable )Tj +/N173 1 Tf +11.03909 0 0 11.03909 135.38938 303.16069 Tm +-0.00219 Tc +(yytext)Tj +/N231 1 Tf +11.99899 0 0 11.99899 174.98609 303.16069 Tm +-0.00048 Tc +0.10049 Tw +( is a pointer to the matched string)Tj [9.5 ]TJ ( \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 351.61138 303.16069 Tm +-0.00219 Tc +0 Tw +(NULL)Tj +/N231 1 Tf +11.99899 0 0 11.99899 378.00918 303.16069 Tm +-0.00189 Tc +0.10189 Tw +(-t)Tj [-4.09999 ]TJ (e)Tj [-8.09999 ]TJ (r)Tj [1.09999 ]TJ (m)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ (at)Tj [-4.09999 ]TJ (ed\), a)Tj [-8.09999 ]TJ (nd )Tj +/N173 1 Tf +11.03909 0 0 11.03909 470.28149 303.16069 Tm +-0.00219 Tc +0 Tw +(yyleng)Tj +/N231 1 Tf +11.99899 0 0 11.99899 509.87818 303.16069 Tm +0.00219 Tc +0.09779 Tw +( is)Tj [11.39999 ]TJ ( )Tj +-34.98999 -1.20999 TD +0.00099 Tc +0.22898 Tw +(the)Tj [4.79998 ]TJ ( le)Tj [4.79998 ]TJ (ng)Tj [11 ]TJ (th of)Tj [4 ]TJ ( the)Tj [4.79998 ]TJ ( ma)Tj [4.79998 ]TJ (tc)Tj [4.79998 ]TJ (h)Tj [-9 ]TJ (e)Tj [4.79998 ]TJ (d str)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (ng)Tj [11 ]TJ (. V)Tj [-6.79998 ]TJ (a)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (a)Tj [4.79998 ]TJ (b)Tj [1 ]TJ (le)Tj [4.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 311.65469 288.64189 Tm +-0.00219 Tc +0 Tw +(yyo)Tj [-10.89999 ]TJ (ut)Tj +/N231 1 Tf +11.99899 0 0 11.99899 344.77189 288.64189 Tm +-0.00019 Tc +0.23019 Tw +( is the output file, and defaults to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 274.24319 Tm +-0.00219 Tc +0 Tw +(stdout)Tj +/N231 1 Tf +11.99899 0 0 11.99899 129.62989 274.24319 Tm +0.00009 Tc +0.05989 Tw +(. F)Tj [6.19999 ]TJ (unction )Tj +/N173 1 Tf +11.03909 0 0 11.03909 182.66549 274.24319 Tm +-0.00219 Tc +0 Tw +(yywrap)Tj +/N231 1 Tf +11.99899 0 0 11.99899 222.26208 274.24319 Tm +-0.00039 Tc +0.06039 Tw +( is called b)Tj [-10.39999 ]TJ (y)Tj [19.59999 ]TJ ( lex)Tj [-10.39999 ]TJ ( when)Tj [-10.39999 ]TJ ( input is e)Tj [13.39999 ]TJ (x)Tj [-10.39999 ]TJ (hausted. Retu)Tj [9.59999 ]TJ (rn 1 if )Tj [-10 ]TJ (y)Tj [19.59999 ]TJ (ou ar)Tj [-7.39999 ]TJ (e)Tj [-6.59999 ]TJ ( )Tj +-11.01998 -1.20999 TD +-0.00048 Tc +0.05049 Tw +(done, or)Tj [-7.5 ]TJ ( 0 if mor)Tj [-7.5 ]TJ (e)Tj [3.29998 ]TJ ( p)Tj [-10.5 ]TJ (r)Tj [2.5 ]TJ (oce)Tj [-6.69999 ]TJ (ssing)Tj [9.5 ]TJ ( is r)Tj [-7.5 ]TJ (e)Tj [3.29998 ]TJ (quired.)Tj [-10.5 ]TJ ( Ever)Tj [-17.5 ]TJ (y)Tj [19.5 ]TJ ( )Tj [-20 ]TJ (C program )Tj [-10 ]TJ (requires)Tj [-11.29998 ]TJ ( a)Tj [-6.69999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 435.24438 259.72439 Tm +-0.00219 Tc +0 Tw +(ma)Tj [-10.89999 ]TJ (in)Tj +/N231 1 Tf +11.99899 0 0 11.99899 461.76219 259.72439 Tm +-0.00019 Tc +0.05018 Tw +( function. )Tj [-10 ]TJ (I)Tj [12.79998 ]TJ (n)Tj [-10.19999 ]TJ ( )Tj +-30.97999 -1.20999 TD +0.00219 Tc +0.06779 Tw +(this c)Tj [6 ]TJ (a)Tj [6 ]TJ (s)Tj [1.39999 ]TJ (e)Tj [6 ]TJ (,)Tj [2.19999 ]TJ ( we simpl)Tj [-10 ]TJ (y)Tj [22.19999 ]TJ ( ca)Tj [6 ]TJ (ll )Tj +/N173 1 Tf +11.03909 0 0 11.03909 214.22279 245.20559 Tm +-0.00219 Tc +0 Tw +(yylex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 247.22009 245.20559 Tm +0.00149 Tc +0.06849 Tw +(, the)Tj [5.29998 ]TJ ( ma)Tj [5.29998 ]TJ (in e)Tj [5.29998 ]TJ (n)Tj [1.5 ]TJ (tr)Tj [-15.5 ]TJ (y)Tj [21.5 ]TJ (-)Tj [-5.5 ]TJ (point f)Tj [4.5 ]TJ (o)Tj [1.5 ]TJ (r)Tj [4.5 ]TJ ( le)Tj [5.29998 ]TJ (x)Tj [-8.5 ]TJ (.)Tj [1.5 ]TJ ( Some)Tj [5.29998 ]TJ ( impl)Tj [9.29998 ]TJ (e)Tj [5.29998 ]TJ (me)Tj [5.29998 ]TJ (nta)Tj [5.29998 ]TJ (tions of )Tj +-13.09999 -1.20999 TD +-0.00068 Tc +0.09069 Tw +(lex)Tj [-10.69999 ]TJ ( include copies of )Tj +/N173 1 Tf +11.03909 0 0 11.03909 196.94419 230.68679 Tm +-0.00219 Tc +0 Tw +(ma)Tj [10.79998 ]TJ (in)Tj +/N231 1 Tf +11.99899 0 0 11.99899 223.22209 230.68679 Tm +-0.00099 Tc +0.09098 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 248.65989 230.68679 Tm +-0.00219 Tc +0 Tw +(yywrap)Tj +/N231 1 Tf +11.99899 0 0 11.99899 288.25669 230.68679 Tm +0.00109 Tc +0.08889 Tw +( in a)Tj [4.89999 ]TJ ( )Tj [10 ]TJ (libr)Tj [14.09999 ]TJ (a)Tj [4.89999 ]TJ (r)Tj [-15.89999 ]TJ (y)Tj [21.09999 ]TJ (, e)Tj [4.89999 ]TJ (limina)Tj [4.89999 ]TJ (ting)Tj [11.09999 ]TJ ( the)Tj [4.89999 ]TJ ( ne)Tj [4.89999 ]TJ (e)Tj [4.89999 ]TJ (d)Tj [-8.89999 ]TJ ( to c)Tj [4.89999 ]TJ (ode)Tj [4.89999 ]TJ ( the)Tj [4.89999 ]TJ (m)Tj [8.89999 ]TJ ( )Tj +-16.51998 -1.18998 TD +-0.00059 Tc +0.00059 Tw +(ex)Tj [-10.59999 ]TJ (plicitl)Tj [-12.79998 ]TJ (y)Tj [29.39999 ]TJ (.)Tj [-0.59999 ]TJ ( This is wh)Tj [-10.59999 ]TJ (y)Tj [19.39999 ]TJ ( ou)Tj [-10.59999 ]TJ (r first ex)Tj [-10.59999 ]TJ (ample, the shortest lex)Tj [-10.59999 ]TJ ( prog)Tj [9.39999 ]TJ (ram, fun)Tj [-10.59999 ]TJ (c)Tj [3.19999 ]TJ (tioned properl)Tj [-22.79998 ]TJ (y)Tj [19.39999 ]TJ (.)Tj [-0.39999 ]TJ ( )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 10 10 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 10)Tj +/N174 1 Tf +9.95919 0 0 9.95919 162.86709 710.04689 Tm +-0.00209 Tc +0 Tw +(name)Tj [-9144.69999 ]TJ (f)Tj [-1.39999 ]TJ (unc)Tj [-8.09999 ]TJ (tion)Tj +/N173 1 Tf +0.01199 -1.24099 TD +0.00239 Tc +(int)Tj [-602.39999 ]TJ (yylex\(void\))Tj +/N228 1 Tf +11.62649 0 TD +-0.00138 Tc +0.00068 Tw +(c)Tj [-7.39999 ]TJ (a)Tj [0.5 ]TJ (ll to inv)Tj [4.59999 ]TJ (o)Tj [0.5 ]TJ (k)Tj [-19.5 ]TJ (e)Tj [0.5 ]TJ ( lex)Tj [-7.39999 ]TJ (e)Tj [0.5 ]TJ (r, returns)Tj [-7.39999 ]TJ ( tok)Tj [-19.5 ]TJ (e)Tj [0.5 ]TJ (n)Tj +/N173 1 Tf +-11.62649 -1.31318 TD +0.00239 Tc +0 Tw +(char)Tj [-602.39999 ]TJ (*yytext)Tj +/N228 1 Tf +11.62649 0 TD +-0.00169 Tc +0.00099 Tw +(pointer)Tj [-6 ]TJ ( to m)Tj [-24.09999 ]TJ (a)Tj [0.19999 ]TJ (tc)Tj [-7.69999 ]TJ (hed s)Tj [-7.69999 ]TJ (t)Tj [-1 ]TJ (r)Tj [-6 ]TJ (i)Tj [3.59999 ]TJ (ng)Tj +/N173 1 Tf +-11.62649 -1.31329 TD +0.00239 Tc +0 Tw +(yyleng)Tj +/N228 1 Tf +11.62649 0 TD +-0.00178 Tc +0.00109 Tw +(length of)Tj [-13.09999 ]TJ ( m)Tj [-24.19999 ]TJ (a)Tj [0.09999 ]TJ (tc)Tj [-7.79998 ]TJ (hed s)Tj [-7.79998 ]TJ (t)Tj [-1.09999 ]TJ (r)Tj [-6.09999 ]TJ (i)Tj [3.5 ]TJ (ng)Tj +/N173 1 Tf +-11.62649 -1.31318 TD +0.00239 Tc +0 Tw +(yylval)Tj +/N228 1 Tf +11.62649 0 TD +-0.00209 Tc +0.00138 Tw +(value as)Tj [-8.09999 ]TJ (s)Tj [-8.09999 ]TJ (o)Tj [-0.19999 ]TJ (c)Tj [-8.09999 ]TJ (i)Tj [3.19999 ]TJ (ated w)Tj [9.19999 ]TJ (i)Tj [3.19999 ]TJ (th tok)Tj [-20.19999 ]TJ (e)Tj [-0.19999 ]TJ (n)Tj +/N173 1 Tf +-11.62649 -1.31329 TD +0.00239 Tc +0 Tw +(int)Tj [-602.39999 ]TJ (yywrap\(void\))Tj +/N228 1 Tf +11.62649 0 TD +-0.00189 Tc +0.00119 Tw +(w)Tj [9.39999 ]TJ (r)Tj [-6.19999 ]TJ (apup, r)Tj [-6.19999 ]TJ (e)Tj [0 ]TJ (tur)Tj [-6.19999 ]TJ (n)Tj [0 ]TJ ( 1 if)Tj [-13.19999 ]TJ ( done, 0 if)Tj [-13.19999 ]TJ ( not done)Tj +/N173 1 Tf +-11.62649 -1.31318 TD +0.00239 Tc +0 Tw +(FILE)Tj [-602.39999 ]TJ (*yyout)Tj +/N228 1 Tf +11.62649 0 TD +-0.00259 Tc +0.00189 Tw +(output f)Tj [-13.89999 ]TJ (ile)Tj +/N173 1 Tf +-11.62649 -1.31329 TD +0.00239 Tc +0 Tw +(FILE)Tj [-602.39999 ]TJ (*yyin)Tj +/N228 1 Tf +11.62649 0 TD +-0.00309 Tc +0.00239 Tw +(input f)Tj [-14.39999 ]TJ (ile)Tj +/N173 1 Tf +-11.62649 -1.31329 TD +0.00239 Tc +0 Tw +(INITIAL)Tj +/N228 1 Tf +11.62649 0 TD +-0.00289 Tc +0.00219 Tw +(initial s)Tj [-8.89999 ]TJ (t)Tj [-2.19999 ]TJ (ar)Tj [-7.19999 ]TJ (t c)Tj [-8.89999 ]TJ (ondition)Tj +/N173 1 Tf +-11.62649 -1.31318 TD +0.00239 Tc +0 Tw +(BEGIN)Tj [-602.39999 ]TJ (condition)Tj +/N228 1 Tf +11.62649 0 TD +-0.00219 Tc +0.00149 Tw +(s)Tj [-8.19999 ]TJ (w)Tj [9.09999 ]TJ (itc)Tj [-8.19999 ]TJ (h)Tj [-0.29998 ]TJ ( s)Tj [-8.19999 ]TJ (t)Tj [-1.5 ]TJ (ar)Tj [-6.5 ]TJ (t c)Tj [-8.19999 ]TJ (ondition)Tj +/N173 1 Tf +-11.62649 -1.31329 TD +0.00239 Tc +0 Tw +(ECHO)Tj +/N228 1 Tf +11.62649 0 TD +-0.00189 Tc +0.00119 Tw +(w)Tj [9.39999 ]TJ (r)Tj [-6.19999 ]TJ (ite m)Tj [-24.29998 ]TJ (a)Tj [0 ]TJ (tc)Tj [-7.89999 ]TJ (hed s)Tj [-7.89999 ]TJ (t)Tj [-1.19999 ]TJ (r)Tj [-6.19999 ]TJ (i)Tj [3.39999 ]TJ (ng)Tj +ET +/N224 /ColorSpace findRes CS +0 0 0 SC +0 J +0 j +0.21598 w +10 M +[]0 d + +160.94699 720.00599 m +451.20298 720.00599 l +S +160.94699 720.00599 290.25599 -0.95999 rf +160.94699 707.64698 m +451.20298 707.64698 l +S +160.94699 707.64698 290.25599 -0.95999 rf +160.94699 576.85798 m +451.20298 576.85798 l +S +160.94699 576.85798 290.25599 -0.95999 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 451.56298 575.89799 Tm +0 Tc +0 Tw +( )Tj +-12.12998 -0.89999 TD +( )Tj +/N170 1 Tf +-7.40998 -1.64999 TD +-0.00048 Tc +0.00048 Tw +(Table 2-3: )Tj +/N231 1 Tf +4.61999 0 TD +-0.00189 Tc +0.00189 Tw +(L)Tj [8.89999 ]TJ (e)Tj [1.89999 ]TJ (x)Tj [-11.89999 ]TJ ( P)Tj [-5.79998 ]TJ (r)Tj [1.09999 ]TJ (edefi)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ (ed Vari)Tj [-4.09999 ]TJ (abl)Tj [-14.09999 ]TJ (e)Tj [1.89999 ]TJ (s )Tj +-15.20999 -1.64999 TD +0 Tc +0 Tw +( )Tj +0 -1.14999 TD +( )Tj +T* +-0.00019 Tc +0.19018 Tw +( )Tj [-1060 ]TJ (Here)Tj [-6.39999 ]TJ (\222s a pro)Tj [-10.19999 ]TJ (g)Tj [-0.19999 ]TJ (ram that )Tj [-10 ]TJ (does nothing)Tj [9.79998 ]TJ ( )Tj [-10 ]TJ (at all. All input is matched, but no action is)Tj [-11 ]TJ ( )Tj +T* +0.00068 Tc +-0.00068 Tw +(a)Tj [4.5 ]TJ (ssoc)Tj [4.5 ]TJ (i)Tj [-1.5 ]TJ (a)Tj [4.5 ]TJ (t)Tj [-1.5 ]TJ (e)Tj [4.5 ]TJ (d)Tj [0.69999 ]TJ ( with a)Tj [4.5 ]TJ (n)Tj [-19.29998 ]TJ (y)Tj [20.69999 ]TJ ( p)Tj [-9.29998 ]TJ (a)Tj [4.5 ]TJ (tter)Tj [3.69999 ]TJ (n, so the)Tj [4.5 ]TJ (r)Tj [3.69999 ]TJ (e)Tj [4.5 ]TJ ( will be)Tj [4.5 ]TJ ( no ou)Tj [-9.29998 ]TJ (tput. )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 458.30778 Tm +-0.00219 Tc +(%%)Tj +0 -1.13038 TD +0 Tc +(.)Tj +0 -1.11959 TD +-0.00219 Tc +(\\n)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 406.71209 Tm +-0.00189 Tc +0.41189 Tw +( )Tj [-840 ]TJ (The fol)Tj [-4.09999 ]TJ (l)Tj [-4.09999 ]TJ (o)Tj [-1.89999 ]TJ (wi)Tj [-4.09999 ]TJ (ng)Tj [8.09999 ]TJ ( )Tj [-10 ]TJ (ex)Tj [-11.89999 ]TJ (am)Tj [-4.09999 ]TJ (pl)Tj [-4.09999 ]TJ (e prepends l)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ (e num)Tj [-4.09999 ]TJ (be)Tj [-8.09999 ]TJ (r)Tj [-8.89999 ]TJ (s)Tj [-2.69999 ]TJ ( t)Tj [-4.09999 ]TJ (o)Tj [-1.89999 ]TJ ( each l)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ (e i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ ( a )Tj [-10 ]TJ (f)Tj [-8.89999 ]TJ (i)Tj [-4.09999 ]TJ (l)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ (. S)Tj [-5.69999 ]TJ (o)Tj [-1.89999 ]TJ (m)Tj [-4.09999 ]TJ (e)Tj [11.89999 ]TJ ( )Tj +0 -1.16999 TD +0.00129 Tc +0.00869 Tw +(imple)Tj [5.09999 ]TJ (me)Tj [5.09999 ]TJ (nta)Tj [5.09999 ]TJ (tions of)Tj [4.29998 ]TJ ( le)Tj [5.09999 ]TJ (x)Tj [-8.69999 ]TJ ( pr)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ (d)Tj [1.29998 ]TJ (e)Tj [5.09999 ]TJ (f)Tj [4.29998 ]TJ (in)Tj [-8.69999 ]TJ (e)Tj [5.09999 ]TJ ( a)Tj [5.09999 ]TJ (nd )Tj [-10 ]TJ (c)Tj [5.09999 ]TJ (a)Tj [5.09999 ]TJ (l)Tj [-0.89999 ]TJ (c)Tj [5.09999 ]TJ (u)Tj [1.29998 ]TJ (l)Tj [-10.89999 ]TJ (a)Tj [5.09999 ]TJ (te)Tj [5.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 318.73408 392.67329 Tm +-0.00219 Tc +0 Tw +(yy)Tj [-10.89999 ]TJ (lineno)Tj +/N231 1 Tf +11.99899 0 0 11.99899 371.64968 392.67329 Tm +-0.00048 Tc +0.01049 Tw +(. The input file )Tj [-10 ]TJ (f)Tj [-7.5 ]TJ (o)Tj [-0.5 ]TJ (r lex)Tj [-10.5 ]TJ ( is )Tj +/N173 1 Tf +11.03909 0 0 11.03909 492.71958 392.67329 Tm +-0.00219 Tc +0 Tw +(yyin)Tj +/N231 1 Tf +11.99899 0 0 11.99899 519.11738 392.67329 Tm +-0.00999 Tc +(, )Tj +-35.75999 -1.20999 TD +-0.00048 Tc +0.00048 Tw +(and defaults to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 163.58699 378.15449 Tm +-0.00219 Tc +0 Tw +(stdin)Tj +/N231 1 Tf +11.99899 0 0 11.99899 196.58428 378.15449 Tm +0 Tc +(. )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 353.19659 Tm +-0.00219 Tc +(%{)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (yylineno;)Tj +-2.39129 -1.11959 TD +(%})Tj +0 -1.13038 TD +(%%)Tj +T* +(^\(.*\)\\n)Tj [-2391.39999 ]TJ (printf\("%4d\\t%s",)Tj [-597.89999 ]TJ (++yylineno,)Tj [-597.89999 ]TJ (yytext\);)Tj +T* +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (main\(int)Tj [-597.89999 ]TJ (argc,)Tj [-597.89999 ]TJ (char)Tj [-597.89999 ]TJ (*argv[]\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yyin)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (fopen\(argv[1],)Tj [-597.89999 ]TJ ("r"\);)Tj +0 -1.11959 TD +(yylex\(\);)Tj +0 -1.13038 TD +(fclose\(yyin\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 214.36808 Tm +( )Tj +0 -1.14999 TD +0.00079 Tc +0.10919 Tw +( )Tj [-1140 ]TJ (The)Tj [4.59999 ]TJ ( de)Tj [4.59999 ]TJ (f)Tj [3.79998 ]TJ (i)Tj [-1.39999 ]TJ (nitions se)Tj [4.59999 ]TJ (c)Tj [4.59999 ]TJ (tion is c)Tj [4.59999 ]TJ (o)Tj [0.79998 ]TJ (mpose)Tj [4.59999 ]TJ (d)Tj [0.79998 ]TJ ( of)Tj [3.79998 ]TJ ( substituti)Tj [8.59999 ]TJ (ons, c)Tj [4.59999 ]TJ (ode)Tj [4.59999 ]TJ (, a)Tj [4.59999 ]TJ (nd sta)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ (t sta)Tj [4.59999 ]TJ (t)Tj [-1.39999 ]TJ (e)Tj +/N171 1 Tf +31.75 0 TD +0 Tc +0 Tw +(s)Tj +/N231 1 Tf +0.38999 0 TD +0.00019 Tc +0.10978 Tw +(. Code in )Tj +-32.13999 -1.14999 TD +0.00088 Tc +0.05909 Tw +(the)Tj [4.69999 ]TJ ( de)Tj [4.69999 ]TJ (f)Tj [3.89999 ]TJ (i)Tj [-1.29998 ]TJ (nitions se)Tj [4.69999 ]TJ (c)Tj [4.69999 ]TJ (tion is )Tj [10 ]TJ (simpl)Tj [-11.29998 ]TJ (y)Tj [30.89999 ]TJ ( c)Tj [4.69999 ]TJ (opi)Tj [-11.29998 ]TJ (e)Tj [4.69999 ]TJ (d)Tj [0.89999 ]TJ ( a)Tj [4.69999 ]TJ (s)Tj [0.19999 ]TJ (-)Tj [3.89999 ]TJ (i)Tj [-1.29998 ]TJ (s to the)Tj [4.69999 ]TJ ( top of)Tj [3.89999 ]TJ ( the)Tj [4.69999 ]TJ ( g)Tj [10.89999 ]TJ (e)Tj [4.69999 ]TJ (n)Tj [-9.09999 ]TJ (e)Tj [4.69999 ]TJ (r)Tj [3.89999 ]TJ (a)Tj [4.69999 ]TJ (te)Tj [4.69999 ]TJ (d C )Tj [-10 ]TJ (f)Tj [3.89999 ]TJ (ile)Tj [4.69999 ]TJ (, a)Tj [4.69999 ]TJ (nd must)Tj [8.69999 ]TJ ( )Tj +0 -1.16999 TD +-0.00068 Tc +0.04069 Tw +(be bra)Tj [-6.89999 ]TJ (c)Tj [3.09999 ]TJ (keted )Tj [-10 ]TJ (with \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 185.06518 172.73159 Tm +-0.00219 Tc +0 Tw +(%{)Tj +/N231 1 Tf +11.99899 0 0 11.99899 198.26419 172.73159 Tm +-0.00149 Tc +0.05149 Tw +(\223 a)Tj [-7.69999 ]TJ (nd )Tj [10 ]TJ (\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 233.30119 172.73159 Tm +-0.00219 Tc +0 Tw +(%})Tj +/N231 1 Tf +11.99899 0 0 11.99899 246.50009 172.73159 Tm +0.00189 Tc +0.03808 Tw +(\224)Tj [5.69999 ]TJ ( mar)Tj [4.89999 ]TJ (k)Tj [1.89999 ]TJ (e)Tj [5.69999 ]TJ (r)Tj [4.89999 ]TJ (s.)Tj [-8.09999 ]TJ ( Substit)Tj [9.69999 ]TJ (utions simplify)Tj [31.89999 ]TJ ( p)Tj [-8.09999 ]TJ (a)Tj [5.69999 ]TJ (tte)Tj [5.69999 ]TJ (r)Tj [4.89999 ]TJ (n)Tj [2 ]TJ (-ma)Tj [5.69999 ]TJ (t)Tj [-0.29998 ]TJ (c)Tj [5.69999 ]TJ (h)Tj [1.89999 ]TJ (ing)Tj [11.89999 ]TJ ( )Tj [-10 ]TJ (r)Tj [4.89999 ]TJ (u)Tj [1.89999 ]TJ (le)Tj [5.69999 ]TJ (s.)Tj [-8.09999 ]TJ ( )Tj +-13.03999 -1.18998 TD +-0.00048 Tc +0.00048 Tw +(F)Tj [5.59999 ]TJ (o)Tj [-0.5 ]TJ (r ex)Tj [-10.5 ]TJ (ample, we ma)Tj [-16.69999 ]TJ (y)Tj [19.5 ]TJ ( d)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ (f)Tj [-7.5 ]TJ (i)Tj [-2.69999 ]TJ (ne dig)Tj [9.5 ]TJ (its and letters: )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 11 11 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 11)Tj +0 55.84999 TD +0 Tw +( )Tj +0 -1.14999 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 683.40908 Tm +-0.00219 Tc +(digit)Tj [-1902.19999 ]TJ ([0-9])Tj +0 -1.13038 TD +(letter)Tj [-1304.39999 ]TJ ([A-Za-z])Tj +T* +(%{)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (count;)Tj +-2.39129 -1.11959 TD +(%})Tj +0 -1.13038 TD +(%%)Tj +2.39129 -1.13038 TD +(/*)Tj [-597.89999 ]TJ (match)Tj [-597.89999 ]TJ (identifier)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +({letter}\({letter}|{digit}\)*)Tj [-3152.09999 ]TJ (count++;)Tj +T* +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(yylex\(\);)Tj +0 -1.13038 TD +(printf\("number)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (identifiers)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (%)Tj [0 ]TJ (d\\n",)Tj [-597.89999 ]TJ (count\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 507.14379 Tm +( )Tj +0 -1.14999 TD +-0.00158 Tc +0.52159 Tw +( )Tj [-730 ]TJ (W)Tj [-7.79998 ]TJ (h)Tj [-1.59999 ]TJ (i)Tj [-3.79998 ]TJ (t)Tj [-3.79998 ]TJ (e)Tj [2.19999 ]TJ (space m)Tj [-3.79998 ]TJ (u)Tj [-1.59999 ]TJ (st)Tj [-3.79998 ]TJ ( sepa)Tj [-7.79998 ]TJ (rat)Tj [-3.79998 ]TJ (e)Tj [2.19999 ]TJ ( t)Tj [-3.79998 ]TJ (h)Tj [-1.59999 ]TJ (e de)Tj [-7.79998 ]TJ (fi)Tj [-3.79998 ]TJ (ni)Tj [-3.79998 ]TJ (ng)Tj [8.39999 ]TJ ( t)Tj [-3.79998 ]TJ (e)Tj [-7.79998 ]TJ (rm)Tj [-13.79998 ]TJ ( and t)Tj [-3.79998 ]TJ (h)Tj [-1.59999 ]TJ (e associ)Tj [-3.79998 ]TJ (at)Tj [-3.79998 ]TJ (ed )Tj [-10 ]TJ (ex)Tj [-11.59999 ]TJ (pressi)Tj [-3.79998 ]TJ (on.)Tj [8.39999 ]TJ ( )Tj +0 -1.16999 TD +-0.00079 Tc +0.07078 Tw +(Referen)Tj [-10.79998 ]TJ (ces to substitutions in the rules section ar)Tj [-7.79998 ]TJ (e surrounded b)Tj [-20.79998 ]TJ (y)Tj [19.19999 ]TJ ( br)Tj [-7.79998 ]TJ (ac)Tj [-7 ]TJ (es \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 452.16299 479.30609 Tm +-0.00219 Tc +0 Tw +({letter})Tj +/N231 1 Tf +11.99899 0 0 11.99899 504.95858 479.30609 Tm +-0.00299 Tc +0.07299 Tw +(\) t)Tj [-5.19999 ]TJ (o)Tj [7 ]TJ ( )Tj +-34.57998 -1.18998 TD +-0.00059 Tc +0.04058 Tw +(disting)Tj [9.39999 ]TJ (u)Tj [-0.59999 ]TJ (ish them from lit)Tj [7.19999 ]TJ (erals. W)Tj [-6.79998 ]TJ (h)Tj [-0.59999 ]TJ (en we have a match in the rules section, )Tj [10 ]TJ (the associated)Tj [-10.59999 ]TJ ( )Tj +0 -1.14999 TD +-0.00109 Tc +0.10108 Tw +(C code is ex)Tj [-11.09999 ]TJ (ecuted. Here is a scanner that count)Tj [-13.09999 ]TJ (s the number of chara)Tj [-7.29998 ]TJ (c)Tj [2.69999 ]TJ (te)Tj [-7.29998 ]TJ (rs, words, and )Tj +T* +0.00119 Tc +-0.00119 Tw +(line)Tj [5 ]TJ (s)Tj [0.39999 ]TJ ( in a)Tj [5 ]TJ ( f)Tj [4.19999 ]TJ (ile)Tj [5 ]TJ ( \()Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ (imila)Tj [5 ]TJ (r)Tj [4.19999 ]TJ ( to Unix)Tj [-8.79998 ]TJ ( )Tj +/N171 1 Tf +12.08999 0 TD +0.00299 Tc +0 Tw +(wc)Tj +/N231 1 Tf +1.10998 0 TD +-0.00299 Tc +(\):)Tj [-5.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 413.07159 Tm +-0.00219 Tc +(%{)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (nchar,)Tj [-597.89999 ]TJ (nword,)Tj [-597.89999 ]TJ (nline;)Tj +-2.39129 -1.13038 TD +(%})Tj +T* +(%%)Tj +T* +(\\n)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ (nline++;)Tj [-597.89999 ]TJ (nchar++;)Tj [-597.89999 ]TJ (})Tj +T* +([^)Tj [-597.79998 ]TJ (\\t\\n]+)Tj [-1195.69999 ]TJ ({)Tj [-597.89999 ]TJ (nword++,)Tj [-597.89999 ]TJ (nchar)Tj [-597.89999 ]TJ (+=)Tj [-597.89999 ]TJ (yyleng;)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(.)Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ (nchar++;)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yylex\(\);)Tj +T* +(printf\("%d\\t%d\\t%d\\n",)Tj [-597.89999 ]TJ (nchar,)Tj [-597.89999 ]TJ (nword,)Tj [-597.89999 ]TJ (nline\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 249.28518 Tm +( )Tj +0 -1.14999 TD +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 12 12 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 12)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +-0.00199 Tc +0.49079 Tw +(3. Y)Tj [51.69999 ]TJ (acc )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +15.95869 0 0 15.95869 90.03318 659.05108 Tm +-0.00088 Tc +0.58769 Tw +(3.1 The)Tj [-8.69999 ]TJ (or)Tj [-17.79998 ]TJ (y)Tj [13.89999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 638.65278 Tm +-0.00109 Tc +0.19108 Tw +(Grammars )Tj [-10 ]TJ (for )Tj [-20 ]TJ (y)Tj [18.89999 ]TJ (a)Tj [-7.29998 ]TJ (c)Tj [-7.29998 ]TJ (c)Tj [2.69999 ]TJ ( a)Tj [-7.29998 ]TJ (r)Tj [1.89999 ]TJ (e )Tj [-10 ]TJ (described )Tj [-10 ]TJ (using a v)Tj [-11.09999 ]TJ (a)Tj [2.69999 ]TJ (ria)Tj [-7.29998 ]TJ (n)Tj [-1.09999 ]TJ (t of Backus )Tj [-10 ]TJ (Naur)Tj [-8.09999 ]TJ ( F)Tj [5 ]TJ (o)Tj [-11.09999 ]TJ (r)Tj [-8.09999 ]TJ (m)Tj [-3.29998 ]TJ ( \(B)Tj [5.89999 ]TJ (N)Tj [-8.89999 ]TJ (F)Tj [5 ]TJ (\).)Tj [-11.09999 ]TJ ( This )Tj +0 -1.14999 TD +-0.00088 Tc +0.39089 Tw +(technique was pionee)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (e)Tj [-7.09999 ]TJ (d)Tj [-0.89999 ]TJ ( b)Tj [-10.89999 ]TJ (y)Tj [29.09999 ]TJ ( J)Tj [-11.69999 ]TJ (ohn B)Tj [6.09999 ]TJ (a)Tj [-7.09999 ]TJ (ckus an)Tj [-10.89999 ]TJ (d Peter Naur, and use)Tj [-7.09999 ]TJ (d)Tj [-0.89999 ]TJ ( to describe )Tj +T* +-0.00109 Tc +0.30099 Tw +(A)Tj [-8.89999 ]TJ (L)Tj [9.69999 ]TJ (GO)Tj [-8.89999 ]TJ (L)Tj [9.69999 ]TJ (60. A )Tj [-10.09999 ]TJ (B)Tj [5.89999 ]TJ (N)Tj [-8.89999 ]TJ (F)Tj [5 ]TJ ( )Tj [-10.09999 ]TJ (g)Tj [8.89999 ]TJ (r)Tj [-8.09999 ]TJ (ammar c)Tj [-7.29998 ]TJ (a)Tj [2.69999 ]TJ (n be us)Tj [-11.89999 ]TJ (ed to ex)Tj [-11.09999 ]TJ (press )Tj +/N171 1 Tf +23.80999 0 TD +-0.00178 Tc +0 Tw +(cont)Tj [-4 ]TJ (ext)Tj [-4 ]TJ (-f)Tj [-4 ]TJ (re)Tj [-8 ]TJ (e)Tj +/N231 1 Tf +4.76998 0 TD +0.00028 Tc +0.29969 Tw +( la)Tj [-5.89999 ]TJ (ng)Tj [10.29998 ]TJ (ua)Tj [-5.89999 ]TJ (ges. Most)Tj [-11.89999 ]TJ ( )Tj +-28.57998 -1.14999 TD +0.00158 Tc +0.08839 Tw +(c)Tj [5.39999 ]TJ (onstr)Tj [4.59999 ]TJ (uc)Tj [5.39999 ]TJ (ts in mode)Tj [5.39999 ]TJ (r)Tj [4.59999 ]TJ (n)Tj [1.59999 ]TJ ( prog)Tj [11.59999 ]TJ (ra)Tj [5.39999 ]TJ (mming)Tj [11.59999 ]TJ ( la)Tj [5.39999 ]TJ (n)Tj [-8.39999 ]TJ (g)Tj [11.59999 ]TJ (u)Tj [-8.39999 ]TJ (a)Tj [-4.59999 ]TJ (g)Tj [11.59999 ]TJ (e)Tj [5.39999 ]TJ (s can be)Tj [5.39999 ]TJ ( r)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (pre)Tj [5.39999 ]TJ (s)Tj [0.79998 ]TJ (e)Tj [5.39999 ]TJ (n)Tj [1.59999 ]TJ (te)Tj [5.39999 ]TJ (d in BNF. F)Tj [7.69999 ]TJ (o)Tj [1.59999 ]TJ (r)Tj [4.59999 ]TJ ( e)Tj [5.39999 ]TJ (x)Tj [-8.39999 ]TJ (a)Tj [5.39999 ]TJ (m)Tj [-0.59999 ]TJ (ple)Tj [5.39999 ]TJ (,)Tj [1.59999 ]TJ ( )Tj +T* +0.00079 Tc +-0.00079 Tw +(the)Tj [4.59999 ]TJ ( g)Tj [10.79998 ]TJ (r)Tj [-6.19999 ]TJ (a)Tj [4.59999 ]TJ (mma)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ ( f)Tj [3.79998 ]TJ (o)Tj [-9.19999 ]TJ (r)Tj [3.79998 ]TJ ( a)Tj [4.59999 ]TJ (n)Tj [0.79998 ]TJ ( )Tj [-10 ]TJ (e)Tj [4.59999 ]TJ (x)Tj [-9.19999 ]TJ (pr)Tj [3.79998 ]TJ (e)Tj [4.59999 ]TJ (ssion tha)Tj [4.59999 ]TJ (t)Tj [-1.39999 ]TJ ( multipl)Tj [8.59999 ]TJ (i)Tj [-1.39999 ]TJ (e)Tj [4.59999 ]TJ (s)Tj [0 ]TJ ( a)Tj [4.59999 ]TJ (nd a)Tj [4.59999 ]TJ (dds numbe)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ (s)Tj [0 ]TJ ( is )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 557.65948 Tm +0.59568 Tc +(1)Tj [-1793.5 ]TJ (E)Tj [0.09999 ]TJ (-)Tj [597.89999 ]TJ (>E+E)Tj +0 -1.13038 TD +(2)Tj [-1793.5 ]TJ (E)Tj [0.09999 ]TJ (-)Tj [597.89999 ]TJ (>E*E)Tj +T* +-0.00219 Tc +(3)Tj [-2391.39999 ]TJ (E)Tj [-597.79998 ]TJ (->)Tj [-597.89999 ]TJ (id)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 505.94378 Tm +-0.00109 Tc +0.04109 Tw +(Three produ)Tj [-11.09999 ]TJ (ctions have )Tj [-10 ]TJ (been specifi)Tj [-13.29998 ]TJ (ed. Terms th)Tj [-11.09999 ]TJ (at appea)Tj [-7.29998 ]TJ (r)Tj [1.89999 ]TJ ( on the left-han)Tj [-11.09999 ]TJ (d side \(lhs\) of a )Tj +0 -1.16999 TD +-0.00048 Tc +0.14048 Tw +(production, such as )Tj +/N173 1 Tf +11.03909 0 0 11.03909 190.94479 491.90499 Tm +0 Tc +0 Tw +(E)Tj +/N231 1 Tf +11.99899 0 0 11.99899 197.54418 491.90499 Tm +-0.00088 Tc +0.14089 Tw +( )Tj [-10 ]TJ (\(e)Tj [-7.09999 ]TJ (x)Tj [-10.89999 ]TJ (p)Tj [-0.89999 ]TJ (ression\) are nontermi)Tj [-13.09999 ]TJ (nals. Terms such )Tj [-10 ]TJ (as )Tj +/N173 1 Tf +11.03909 0 0 11.03909 432.72459 491.90499 Tm +-0.00219 Tc +0 Tw +(id)Tj +/N231 1 Tf +11.99899 0 0 11.99899 445.92349 491.90499 Tm +0.00228 Tc +0.14768 Tw +( \()Tj [5.29998 ]TJ (i)Tj [0.09999 ]TJ (de)Tj [6.09999 ]TJ (ntif)Tj [5.29998 ]TJ (ie)Tj [6.09999 ]TJ (r)Tj [5.29998 ]TJ (\))Tj [5.29998 ]TJ ( a)Tj [6.09999 ]TJ (r)Tj [5.29998 ]TJ (e )Tj +-29.65998 -1.17999 TD +-0.00109 Tc +0.21109 Tw +(terminals \(tokens return)Tj [-11.09999 ]TJ (ed b)Tj [-11.09999 ]TJ (y)Tj [18.89999 ]TJ ( lex)Tj [-11.09999 ]TJ (\))Tj [1.89999 ]TJ ( and onl)Tj [-13.29998 ]TJ (y)Tj [18.89999 ]TJ ( ap)Tj [-11.09999 ]TJ (pear on the ri)Tj [-13.29998 ]TJ (g)Tj [8.89999 ]TJ (h)Tj [-1.09999 ]TJ (t-hand )Tj [-10 ]TJ (side \(rhs\) of a )Tj +0 -1.14999 TD +-0.00048 Tc +0.41049 Tw +(production. This g)Tj [9.5 ]TJ (r)Tj [-7.5 ]TJ (am)Tj [-12.69999 ]TJ (mar specifies th)Tj [-10.5 ]TJ (at an )Tj [-10 ]TJ (ex)Tj [-10.5 ]TJ (pression ma)Tj [-6.69999 ]TJ (y)Tj [19.5 ]TJ ( be th)Tj [-10.5 ]TJ (e)Tj [-6.69999 ]TJ ( sum of two)Tj [9.5 ]TJ ( )Tj +T* +-0.00068 Tc +0.03068 Tw +(ex)Tj [-10.69999 ]TJ (pressions, the product of two ex)Tj [-10.69999 ]TJ (pressions, or an)Tj [-10.69999 ]TJ ( identifier. W)Tj [-6.89999 ]TJ (e)Tj [3.09999 ]TJ ( can us)Tj [-11.5 ]TJ (e this g)Tj [9.29998 ]TJ (r)Tj [2.29998 ]TJ (amma)Tj [-6.89999 ]TJ (r to)Tj [-10.69999 ]TJ ( )Tj +T* +-0.00079 Tc +0.00079 Tw +(g)Tj [9.19999 ]TJ (e)Tj [3 ]TJ (n)Tj [-10.79998 ]TJ (e)Tj [3 ]TJ (rat)Tj [-13 ]TJ (e)Tj [3 ]TJ ( ex)Tj [-10.79998 ]TJ (pressions: )Tj +1.5 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 410.55178 Tm +0.59568 Tc +(E-)Tj [597.89999 ]TJ (>E*E)Tj +11.41299 0 TD +-0.00219 Tc +(\(r2\))Tj +-10.21739 -1.13038 TD +0.59568 Tc +(-)Tj [597.89999 ]TJ (>E*z)Tj +10.21739 0 TD +-0.00219 Tc +(\(r3\))Tj +-10.21739 -1.13038 TD +0.59568 Tc +(-)Tj [597.89999 ]TJ (>E+E*z)Tj +10.21739 0 TD +-0.00219 Tc +(\(r1\))Tj +-10.21739 -1.13038 TD +0.59568 Tc +(-)Tj [597.89999 ]TJ (>E+y*z)Tj +10.21739 0 TD +-0.00219 Tc +(\(r3\))Tj +-10.21739 -1.13038 TD +0.59568 Tc +(-)Tj [597.89999 ]TJ (>x+y*z)Tj +10.21739 0 TD +-0.00219 Tc +(\(r3\))Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 346.35719 Tm +0 Tc +( )Tj +0 -1.14999 TD +-0.00088 Tc +0.42089 Tw +(At each step we ex)Tj [-10.89999 ]TJ (panded a term, replacin)Tj [-10.89999 ]TJ (g)Tj [-0.89999 ]TJ ( the lhs of)Tj [12.09999 ]TJ ( a production with )Tj [10 ]TJ (the)Tj [12.89999 ]TJ ( )Tj +T* +-0.00079 Tc +0.15078 Tw +(correspondin)Tj [-10.79998 ]TJ (g)Tj [9.19999 ]TJ ( rhs. The )Tj [-10 ]TJ (numbers on the rig)Tj [9.19999 ]TJ (h)Tj [-0.79998 ]TJ (t in)Tj [-10.79998 ]TJ (dicate which rule applie)Tj [-7 ]TJ (d. To parse an)Tj [-10.79998 ]TJ ( )Tj +T* +-0.00068 Tc +0.04069 Tw +(ex)Tj [-10.69999 ]TJ (pression, we actuall)Tj [-12.89999 ]TJ (y)Tj [19.29998 ]TJ ( n)Tj [-10.69999 ]TJ (eed to do the reverse ope)Tj [-6.89999 ]TJ (ration. )Tj [-10 ]TJ (I)Tj [22.29998 ]TJ (n)Tj [-0.69999 ]TJ (ste)Tj [-6.89999 ]TJ (a)Tj [3.09999 ]TJ (d of starting with a sing)Tj [9.29998 ]TJ (le )Tj +T* +0.16069 Tw +(nonterminal \(start s)Tj [-11.5 ]TJ (y)Tj [19.29998 ]TJ (mb)Tj [-10.69999 ]TJ (ol\) and g)Tj [9.29998 ]TJ (e)Tj [3.09999 ]TJ (ne)Tj [-6.89999 ]TJ (ratin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ ( an e)Tj [-6.89999 ]TJ (x)Tj [-10.69999 ]TJ (pression from a g)Tj [9.29998 ]TJ (r)Tj [2.29998 ]TJ (ammar, we need to )Tj +/N171 1 Tf +T* +-0.00138 Tc +0 Tw +(reduce)Tj +/N231 1 Tf +2.70999 0 TD +-0.00048 Tc +0.03048 Tw +( )Tj [-10 ]TJ (an ex)Tj [-10.5 ]TJ (pression to a sing)Tj [9.5 ]TJ (le nont)Tj [-12.69999 ]TJ (erminal. Thi)Tj [-12.69999 ]TJ (s)Tj [-1.29998 ]TJ ( is known as )Tj +/N171 1 Tf +23.00999 0 TD +-0.00009 Tc +0 Tw +(bottom-up)Tj +/N231 1 Tf +4.10998 0 TD +-0.00149 Tc +0.04148 Tw +( or )Tj +/N171 1 Tf +1.39999 0 TD +0.00099 Tc +0 Tw +(shift-)Tj [4 ]TJ (re)Tj [4.79998 ]TJ (duc)Tj [4.79998 ]TJ (e)Tj +/N231 1 Tf +4.76998 0 TD +0 Tc +( )Tj +-36 -1.14999 TD +-0.00039 Tc +0.12039 Tw +(parsing)Tj [9.59999 ]TJ (,)Tj [-10.39999 ]TJ ( and us)Tj [-11.19999 ]TJ (es a)Tj [-6.59999 ]TJ ( stac)Tj [-6.59999 ]TJ (k for storin)Tj [-10.39999 ]TJ (g)Tj [9.59999 ]TJ ( te)Tj [-6.59999 ]TJ (rms. He)Tj [-6.59999 ]TJ (r)Tj [-7.39999 ]TJ (e)Tj [3.39999 ]TJ ( is the sam)Tj [-12.39999 ]TJ (e)Tj [3.39999 ]TJ ( de)Tj [-6.59999 ]TJ (rivation, but in rev)Tj [-10.39999 ]TJ (e)Tj [3.39999 ]TJ (rse)Tj [-6.59999 ]TJ ( )Tj +T* +-0.00129 Tc +0 Tw +(order: )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 13 13 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 13)Tj +0 55.84999 TD +0 Tw +( )Tj +1.5 -1.14999 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 132.62969 683.40908 Tm +0.59568 Tc +(1)Tj [-1467.29998 ]TJ (.x+y*z)Tj +12.44558 0 TD +-0.00219 Tc +(shift)Tj +-12.44558 -1.13038 TD +0.59568 Tc +(2)Tj [-1467.29998 ]TJ (x.+y*z)Tj +12.44558 0 TD +-0.00219 Tc +(reduce\(r3\))Tj +-12.44558 -1.13038 TD +0.59568 Tc +(3)Tj [-1467.29998 ]TJ (E.+y*z)Tj +12.44558 0 TD +-0.00219 Tc +(shift)Tj +-12.44558 -1.13038 TD +0.59568 Tc +(4)Tj [-1467.29998 ]TJ (E+.y*z)Tj +12.44558 0 TD +-0.00219 Tc +(shift)Tj +-12.44558 -1.11959 TD +0.59568 Tc +(5)Tj [-1467.29998 ]TJ (E+y.*z)Tj +12.44558 0 TD +-0.00219 Tc +(reduce\(r3\))Tj +-12.44558 -1.13038 TD +0.59568 Tc +(6)Tj [-1467.29998 ]TJ (E+E.*z)Tj +12.44558 0 TD +-0.00219 Tc +(shift)Tj +-12.44558 -1.13038 TD +0.59568 Tc +(7)Tj [-1467.29998 ]TJ (E+E*.z)Tj +12.44558 0 TD +-0.00219 Tc +(shift)Tj +-12.44558 -1.13038 TD +0.59568 Tc +(8)Tj [-1467.29998 ]TJ (E+E*z.)Tj +12.44558 0 TD +-0.00219 Tc +(reduce\(r3\))Tj +-12.44558 -1.13038 TD +0.59568 Tc +(9)Tj [-1467.29998 ]TJ (E+E*E.)Tj +12.44558 0 TD +-0.00219 Tc +(reduce\(r2\))Tj [-3804.29998 ]TJ (emit)Tj [-597.89999 ]TJ (multiply)Tj +-13.04348 -1.13038 TD +0.59568 Tc +(1)Tj [597.89999 ]TJ (0)Tj [-1467.29998 ]TJ (E+E.)Tj +13.04348 0 TD +-0.00219 Tc +(reduce\(r1\))Tj [-3804.29998 ]TJ (emit)Tj [-597.89999 ]TJ (add)Tj +-13.04348 -1.11959 TD +(11)Tj [-2065.19999 ]TJ (E)Tj [-597.89999 ]TJ (.)Tj [-7989.19999 ]TJ (accept)Tj +/N231 1 Tf +11.99899 0 0 11.99899 108.03169 544.58059 Tm +0 Tc +( )Tj +-1.5 -1.14999 TD +-0.00059 Tc +0.07058 Tw +(Terms to the left of th)Tj [-10.59999 ]TJ (e )Tj [-10 ]TJ (dot are on the sta)Tj [-6.79998 ]TJ (c)Tj [3.19999 ]TJ (k, whi)Tj [-12.79998 ]TJ (l)Tj [-2.79998 ]TJ (e remainin)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ ( input is to the ri)Tj [-12.79998 ]TJ (g)Tj [9.39999 ]TJ (h)Tj [-0.59999 ]TJ (t of the )Tj +T* +0.03059 Tw +(dot. W)Tj [-6.79998 ]TJ (e)Tj [3.19999 ]TJ ( s)Tj [8.59999 ]TJ (t)Tj [-2.79998 ]TJ (art b)Tj [-10.59999 ]TJ (y)Tj [29.39999 ]TJ ( shifting)Tj [9.39999 ]TJ ( )Tj [-10 ]TJ (tokens onto the s)Tj [8.59999 ]TJ (t)Tj [-2.79998 ]TJ (ack. When the top of )Tj [10 ]TJ (the stack )Tj [10 ]TJ (matches the rhs )Tj +T* +-0.00088 Tc +0.31089 Tw +(of a production, we r)Tj [-7.89999 ]TJ (e)Tj [-7.09999 ]TJ (place the match)Tj [-10.89999 ]TJ (e)Tj [2.89999 ]TJ (d tokens on the stack with t)Tj [6.89999 ]TJ (h)Tj [-0.89999 ]TJ (e lhs of the )Tj +T* +-0.00068 Tc +0.02069 Tw +(production. Conceptuall)Tj [-22.89999 ]TJ (y)Tj [9.29998 ]TJ (, the matched)Tj [-10.69999 ]TJ ( tokens of)Tj [-7.69999 ]TJ ( the rhs )Tj [-10 ]TJ (are pop)Tj [-10.69999 ]TJ (ped of)Tj [-7.69999 ]TJ (f the)Tj [-6.89999 ]TJ ( stack, and)Tj [-10.69999 ]TJ ( the)Tj [-6.89999 ]TJ ( )Tj +T* +-0.00048 Tc +0.04049 Tw +(lhs of the produ)Tj [-10.5 ]TJ (ction is pushed on the sta)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ (k. The)Tj [-6.69999 ]TJ ( )Tj [-10 ]TJ (matched tokens )Tj [-10 ]TJ (are)Tj [-6.69999 ]TJ ( kno)Tj [-10.5 ]TJ (wn as a)Tj [-6.69999 ]TJ ( )Tj +/N171 1 Tf +33.02999 0 TD +0.00039 Tc +0 Tw +(handle)Tj +/N231 1 Tf +2.71998 0 TD +0 Tc +(, )Tj +-35.75 -1.14999 TD +-0.00248 Tc +0.05249 Tw +(and we ar)Tj [-9.5 ]TJ (e )Tj +/N171 1 Tf +4.71998 0 TD +-0.00068 Tc +0 Tw +(reducing)Tj +/N231 1 Tf +3.54998 0 TD +-0.00028 Tc +0.05029 Tw +( the )Tj [-10 ]TJ (handle to the lhs of the production. This process c)Tj [-6.5 ]TJ (ontinues until)Tj [7.5 ]TJ ( )Tj +-8.26998 -1.14999 TD +0.10029 Tw +(we have shifted all input to the stack, and onl)Tj [-12.5 ]TJ (y)Tj [29.69999 ]TJ ( t)Tj [-12.5 ]TJ (h)Tj [-0.29998 ]TJ (e starting)Tj [9.69999 ]TJ ( nonterminal r)Tj [-7.29998 ]TJ (e)Tj [3.5 ]TJ (mains on the)Tj [13.5 ]TJ ( )Tj +0 -1.16999 TD +-0.00048 Tc +0.04049 Tw +(stack. )Tj [-10 ]TJ (I)Tj [22.5 ]TJ (n)Tj [-0.5 ]TJ ( step 1 we shift the )Tj +/N173 1 Tf +11.03909 0 0 11.03909 227.06179 433.94989 Tm +0 Tc +0 Tw +(x)Tj +/N231 1 Tf +11.99899 0 0 11.99899 233.66119 433.94989 Tm +-0.00149 Tc +0.04148 Tw +( t)Tj [-3.69999 ]TJ (o)Tj [-1.5 ]TJ ( t)Tj [-3.69999 ]TJ (h)Tj [-1.5 ]TJ (e s)Tj [7.69999 ]TJ (t)Tj [-3.69999 ]TJ (ack. S)Tj [-5.39999 ]TJ (t)Tj [-3.69999 ]TJ (ep 2 )Tj [10 ]TJ (appl)Tj [-3.69999 ]TJ (i)Tj [-3.69999 ]TJ (e)Tj [2.29998 ]TJ (s rul)Tj [-3.69999 ]TJ (e)Tj [2.39999 ]TJ ( r3 t)Tj [-3.69999 ]TJ (o)Tj [-1.5 ]TJ ( t)Tj [-3.69999 ]TJ (h)Tj [-1.5 ]TJ (e st)Tj [-3.69999 ]TJ (ac)Tj [12.29998 ]TJ (k, chang)Tj [8.5 ]TJ (i)Tj [-3.69999 ]TJ (n)Tj [-11.5 ]TJ (g)Tj [8.5 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 515.39768 433.94989 Tm +0 Tc +0 Tw +(x)Tj +/N231 1 Tf +11.99899 0 0 11.99899 521.99708 433.94989 Tm +( )Tj +-36 -1.20999 TD +0.00109 Tc +(to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 104.43199 419.43109 Tm +0 Tc +(E)Tj +/N231 1 Tf +11.99899 0 0 11.99899 111.03138 419.43109 Tm +0.00009 Tc +0.16989 Tw +(. W)Tj [-6.09999 ]TJ (e)Tj [3.89999 ]TJ ( continue shifti)Tj [7.89999 ]TJ (ng)Tj [10.09999 ]TJ ( and )Tj [-10 ]TJ (reducin)Tj [-9.89999 ]TJ (g)Tj [10.09999 ]TJ (,)Tj [0.09999 ]TJ ( until a)Tj [-6.09999 ]TJ ( sing)Tj [10.09999 ]TJ (le nonterminal, the)Tj [-6.09999 ]TJ ( start s)Tj [-10.69999 ]TJ (y)Tj [20.09999 ]TJ (mbol,)Tj [-9.89999 ]TJ ( )Tj +-1.75 -1.18998 TD +0.00109 Tc +0.03889 Tw +(r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (ma)Tj [4.89999 ]TJ (ins in the)Tj [4.89999 ]TJ ( sta)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (k. )Tj [-10 ]TJ (I)Tj [14.09999 ]TJ (n)Tj [1.09999 ]TJ ( s)Tj [-9.69999 ]TJ (t)Tj [-1.09999 ]TJ (e)Tj [4.89999 ]TJ (p)Tj [1.09999 ]TJ ( 9, whe)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ ( we)Tj [4.89999 ]TJ ( re)Tj [4.89999 ]TJ (duc)Tj [4.89999 ]TJ (e)Tj [4.89999 ]TJ ( )Tj [-10 ]TJ (rule)Tj [4.89999 ]TJ ( r)Tj [4.09999 ]TJ (2, we)Tj [4.89999 ]TJ ( e)Tj [4.89999 ]TJ (mit the)Tj [4.89999 ]TJ ( multipl)Tj [-11.09999 ]TJ (y)Tj [21.09999 ]TJ ( instr)Tj [4.09999 ]TJ (u)Tj [1.09999 ]TJ (c)Tj [4.89999 ]TJ (tion.)Tj [11.09999 ]TJ ( )Tj +0 -1.14999 TD +0 Tc +0.37998 Tw +(Similarl)Tj [-12.19999 ]TJ (y)Tj [30 ]TJ (,)Tj [0 ]TJ ( the )Tj [-10 ]TJ (add instruction is emitted in step )Tj [380 ]TJ (10. Thus, multipl)Tj [-12.19999 ]TJ (y)Tj [20 ]TJ ( has a higher)Tj [-7 ]TJ ( )Tj +T* +-0.00099 Tc +0.00099 Tw +(preced)Tj [-11 ]TJ (enc)Tj [-7.19999 ]TJ (e)Tj [2.79998 ]TJ ( than addition)Tj [-11 ]TJ (.)Tj [-0.89999 ]TJ ( )Tj +T* +-0.00068 Tc +0.15069 Tw +( )Tj [-1100 ]TJ (Consider, however, the shift at step 6.)Tj [9.29998 ]TJ ( )Tj [-10 ]TJ (I)Tj [22.29998 ]TJ (n)Tj [-0.69999 ]TJ (stead o)Tj [-10.69999 ]TJ (f)Tj [2.29998 ]TJ ( shifting)Tj [9.29998 ]TJ (,)Tj [-0.69999 ]TJ ( we could have reduced)Tj [-10.69999 ]TJ (,)Tj [-10.69999 ]TJ ( )Tj +T* +-0.00129 Tc +0.36129 Tw +(appl)Tj [-13.5 ]TJ (y)Tj [18.69999 ]TJ (i)Tj [-3.5 ]TJ (n)Tj [-11.29998 ]TJ (g)Tj [8.69999 ]TJ ( )Tj [-10 ]TJ (rul)Tj [-3.5 ]TJ (e)Tj [2.5 ]TJ ( )Tj [-10 ]TJ (r1. Thi)Tj [-3.5 ]TJ (s)Tj [-12.09999 ]TJ ( woul)Tj [-3.5 ]TJ (d r)Tj [-8.29998 ]TJ (e)Tj [2.5 ]TJ (sul)Tj [-3.5 ]TJ (t)Tj [-3.5 ]TJ ( i)Tj [-3.5 ]TJ (n)Tj [-1.29998 ]TJ ( addi)Tj [-3.5 ]TJ (t)Tj [-3.5 ]TJ (i)Tj [-3.5 ]TJ (on havi)Tj [-3.5 ]TJ (n)Tj [-11.29998 ]TJ (g)Tj [8.69999 ]TJ ( a)Tj [-7.5 ]TJ ( hi)Tj [-13.5 ]TJ (g)Tj [8.69999 ]TJ (h)Tj [-1.29998 ]TJ (er)Tj [-8.29998 ]TJ ( pr)Tj [-8.29998 ]TJ (eced)Tj [-11.29998 ]TJ (ence)Tj [-7.5 ]TJ ( t)Tj [-3.5 ]TJ (h)Tj [-1.29998 ]TJ (an)Tj [-11.29998 ]TJ ( )Tj +T* +0 Tc +0.10998 Tw +(multiplication. This i)Tj [7.79998 ]TJ (s)Tj [-0.79998 ]TJ ( k)Tj [10 ]TJ (nown as a )Tj +/N171 1 Tf +14.44999 0 TD +0.00099 Tc +0 Tw +(shift-)Tj [4 ]TJ (re)Tj [4.79998 ]TJ (duc)Tj [4.79998 ]TJ (e)Tj +/N231 1 Tf +4.76998 0 TD +0.00119 Tc +0.10879 Tw +( )Tj [-10 ]TJ (conf)Tj [4.19999 ]TJ (lic)Tj [5 ]TJ (t. Our)Tj [4.19999 ]TJ ( gr)Tj [4.19999 ]TJ (a)Tj [5 ]TJ (mma)Tj [5 ]TJ (r)Tj [4.19999 ]TJ ( is )Tj +/N171 1 Tf +10.94999 0 TD +0 Tc +0 Tw +(ambiguous)Tj +/N231 1 Tf +4.38999 0 TD +-0.00079 Tc +0.11079 Tw +(, as )Tj +-34.55999 -1.14999 TD +-0.00059 Tc +0.16059 Tw +(there is more than one )Tj [-10 ]TJ (possible derivation that will )Tj [-10 ]TJ (y)Tj [29.39999 ]TJ (i)Tj [-12.79998 ]TJ (eld the ex)Tj [-10.59999 ]TJ (pression. )Tj [-10 ]TJ (I)Tj [22.39999 ]TJ (n)Tj [-0.59999 ]TJ ( this cas)Tj [-11.39999 ]TJ (e,)Tj [-10.59999 ]TJ ( )Tj +T* +-0.00199 Tc +0.00199 Tw +(operat)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ (r pr)Tj [-9 ]TJ (ec)Tj [-8.19999 ]TJ (edenc)Tj [-8.19999 ]TJ (e)Tj [1.79998 ]TJ ( i)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( af)Tj [-9 ]TJ (fect)Tj [-4.19999 ]TJ (ed. As )Tj [-10 ]TJ (anot)Tj [-4.19999 ]TJ (her )Tj [-10 ]TJ (ex)Tj [-12 ]TJ (am)Tj [-4.19999 ]TJ (pl)Tj [-4.19999 ]TJ (e, associ)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (v)Tj [-2 ]TJ (i)Tj [-4.19999 ]TJ (t)Tj [-14.19999 ]TJ (y)Tj [18 ]TJ ( i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e rul)Tj [-14.19999 ]TJ (e)Tj [2.09999 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 282.76249 Tm +0.59568 Tc +(E-)Tj [597.89999 ]TJ (>E+E)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 268.48359 Tm +0 Tc +( )Tj +T* +-0.00059 Tc +0.11059 Tw +(is ambig)Tj [9.39999 ]TJ (uous, )Tj [-10 ]TJ (for w)Tj [-8.39999 ]TJ (e)Tj [3.29998 ]TJ ( m)Tj [-12.79998 ]TJ (a)Tj [-6.79998 ]TJ (y)Tj [19.39999 ]TJ ( )Tj [-10 ]TJ (re)Tj [-6.79998 ]TJ (curse)Tj [-6.79998 ]TJ ( on the)Tj [-6.79998 ]TJ ( left o)Tj [-10.59999 ]TJ (r)Tj [-7.59999 ]TJ ( the ri)Tj [-12.79998 ]TJ (g)Tj [9.39999 ]TJ (h)Tj [-0.59999 ]TJ (t. To)Tj [-10.59999 ]TJ ( remed)Tj [-20.59999 ]TJ (y)Tj [19.39999 ]TJ ( )Tj [-10 ]TJ (th)Tj [-10.59999 ]TJ (e situation, we )Tj +T* +-0.00079 Tc +0.12078 Tw +(could rewrite the )Tj [-10 ]TJ (gramm)Tj [-13 ]TJ (a)Tj [3 ]TJ (r, or suppl)Tj [-23 ]TJ (y)Tj [29.19999 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.19999 ]TJ (a)Tj [-7 ]TJ (c)Tj [-7 ]TJ (c)Tj [3 ]TJ ( with directives that indicate )Tj [-10 ]TJ (which operator)Tj [-7.79998 ]TJ ( )Tj +T* +-0.00059 Tc +0.12059 Tw +(has prec)Tj [-6.79998 ]TJ (edenc)Tj [-6.79998 ]TJ (e)Tj [3.19999 ]TJ (. The latt)Tj [-12.79998 ]TJ (er method is simpler, and will be demonstrated in the )Tj +/N171 1 Tf +32.72999 0 TD +-0.00028 Tc +0 Tw +(practice)Tj +/N231 1 Tf +3.26998 0 TD +0 Tc +( )Tj +-36 -1.14999 TD +-0.00028 Tc +(section. )Tj +0 -1.16999 TD +0.00079 Tc +0.12919 Tw +( )Tj [-1120 ]TJ (The)Tj [4.59999 ]TJ ( )Tj [10 ]TJ (f)Tj [3.79998 ]TJ (o)Tj [0.79998 ]TJ (llowin)Tj [-9.19999 ]TJ (g)Tj [10.79998 ]TJ ( g)Tj [10.79998 ]TJ (r)Tj [-6.19999 ]TJ (a)Tj [4.59999 ]TJ (mma)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ ( ha)Tj [4.59999 ]TJ (s )Tj [10 ]TJ (a)Tj [4.59999 ]TJ ( )Tj +/N171 1 Tf +14.17999 0 TD +-0.00158 Tc +0 Tw +(r)Tj [-12.39999 ]TJ (e)Tj [2.19999 ]TJ (duc)Tj [-7.79998 ]TJ (e-redu)Tj [-11.59999 ]TJ (ce)Tj +/N231 1 Tf +5.77999 0 TD +0.00219 Tc +0.11779 Tw +( )Tj [-10 ]TJ (c)Tj [6 ]TJ (o)Tj [2.19999 ]TJ (n)Tj [-7.79998 ]TJ (f)Tj [5.19999 ]TJ (lic)Tj [6 ]TJ (t. With a)Tj [6 ]TJ (n)Tj [2.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 422.52549 199.24949 Tm +-0.00219 Tc +0 Tw +(id)Tj +/N231 1 Tf +11.99899 0 0 11.99899 435.72439 199.24949 Tm +-0.00019 Tc +0.12019 Tw +( on the)Tj [-6.39999 ]TJ ( stack, w)Tj [-8 ]TJ (e)Tj [-6.39999 ]TJ ( )Tj +-28.80999 -1.20999 TD +0.00338 Tc +-0.00338 Tw +(may)Tj [23.39999 ]TJ ( re)Tj [7.19999 ]TJ (duce)Tj [7.19999 ]TJ ( to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 160.94729 184.73059 Tm +0 Tc +0 Tw +(T)Tj +/N231 1 Tf +11.99899 0 0 11.99899 167.54669 184.73059 Tm +-0.00138 Tc +0.00138 Tw +(, or redu)Tj [-11.39999 ]TJ (ce to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 233.78118 184.73059 Tm +0 Tc +0 Tw +(E)Tj +/N231 1 Tf +11.99899 0 0 11.99899 240.38059 184.73059 Tm +(. )Tj +-12.52999 -1.17999 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 158.57279 Tm +0.59568 Tc +(E-)Tj [597.89999 ]TJ (>T)Tj +0 -1.13038 TD +(E-)Tj [597.89999 ]TJ (>i)Tj [597.89999 ]TJ (d)Tj +T* +(T-)Tj [597.89999 ]TJ (>i)Tj [597.89999 ]TJ (d)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 119.33609 Tm +0 Tc +( )Tj +0 -1.14999 TD +0.00248 Tc +0.05749 Tw +(Ya)Tj [6.29998 ]TJ (c)Tj [6.29998 ]TJ (c)Tj [-3.69999 ]TJ ( ta)Tj [6.29998 ]TJ (ke)Tj [6.29998 ]TJ (s)Tj [-8.29998 ]TJ ( a de)Tj [6.29998 ]TJ (fa)Tj [6.29998 ]TJ (ult ac)Tj [6.29998 ]TJ (tion whe)Tj [6.29998 ]TJ (n)Tj [-7.5 ]TJ ( the)Tj [6.29998 ]TJ (r)Tj [5.5 ]TJ (e is a c)Tj [6.29998 ]TJ (o)Tj [2.5 ]TJ (n)Tj [-7.5 ]TJ (f)Tj [5.5 ]TJ (lic)Tj [6.29998 ]TJ (t. F)Tj [8.59999 ]TJ (o)Tj [-7.5 ]TJ (r)Tj [5.5 ]TJ ( shif)Tj [5.5 ]TJ (t-)Tj [5.5 ]TJ (re)Tj [6.29998 ]TJ (duce)Tj [6.29998 ]TJ ( c)Tj [6.29998 ]TJ (o)Tj [2.5 ]TJ (n)Tj [-7.5 ]TJ (f)Tj [5.5 ]TJ (l)Tj [-9.69999 ]TJ (i)Tj [0.29998 ]TJ (c)Tj [6.29998 ]TJ (t)Tj [0.29998 ]TJ (s, )Tj [-10 ]TJ (y)Tj [22.5 ]TJ (acc)Tj [6.29998 ]TJ ( will )Tj +T* +0.00149 Tc +0.09849 Tw +(shif)Tj [4.5 ]TJ (t. F)Tj [7.59999 ]TJ (o)Tj [1.5 ]TJ (r)Tj [4.5 ]TJ ( r)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (du)Tj [-8.5 ]TJ (c)Tj [5.29998 ]TJ (e)Tj [5.39999 ]TJ (-r)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (duce)Tj [5.29998 ]TJ ( )Tj [-10 ]TJ (c)Tj [5.29998 ]TJ (onf)Tj [4.5 ]TJ (lic)Tj [5.29998 ]TJ (ts, it will use)Tj [5.29998 ]TJ ( the)Tj [5.29998 ]TJ ( f)Tj [4.5 ]TJ (i)Tj [-0.69999 ]TJ (r)Tj [4.5 ]TJ (s)Tj [0.69999 ]TJ (t r)Tj [4.5 ]TJ (u)Tj [1.5 ]TJ (le)Tj [5.29998 ]TJ ( in the)Tj [5.29998 ]TJ ( listing)Tj [11.5 ]TJ (.)Tj [1.5 ]TJ ( )Tj [-10 ]TJ (I)Tj [4.5 ]TJ (t)Tj [-0.69999 ]TJ ( a)Tj [5.29998 ]TJ (l)Tj [-0.69999 ]TJ (so issue)Tj [5.29998 ]TJ (s)Tj [0.69999 ]TJ ( a)Tj [15.29998 ]TJ ( )Tj +T* +-0.00059 Tc +0.01058 Tw +(warnin)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ ( messa)Tj [-6.79998 ]TJ (ge wh)Tj [-10.59999 ]TJ (ene)Tj [-6.79998 ]TJ (v)Tj [-0.59999 ]TJ (er a)Tj [-6.79998 ]TJ ( conflict )Tj [-10 ]TJ (ex)Tj [-10.59999 ]TJ (ists. The warnin)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ (s)Tj [-1.39999 ]TJ ( ma)Tj [-16.79998 ]TJ (y)Tj [19.39999 ]TJ ( b)Tj [-10.59999 ]TJ (e)Tj [3.19999 ]TJ ( suppr)Tj [-7.59999 ]TJ (essed b)Tj [-20.59999 ]TJ (y)Tj [19.39999 ]TJ ( makin)Tj [-10.59999 ]TJ (g)Tj [-0.59999 ]TJ ( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 14 14 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 14)Tj +0 55.84999 TD +-0.00039 Tc +0.02038 Tw +(the grammar un)Tj [-10.39999 ]TJ (ambig)Tj [9.59999 ]TJ (u)Tj [-0.39999 ]TJ (o)Tj [-10.39999 ]TJ (u)Tj [-0.39999 ]TJ (s. Several methods fo)Tj [-10.39999 ]TJ (r r)Tj [-7.39999 ]TJ (e)Tj [3.39999 ]TJ (moving)Tj [9.59999 ]TJ ( ambi)Tj [-12.59999 ]TJ (g)Tj [9.59999 ]TJ (u)Tj [-0.39999 ]TJ (it)Tj [-22.59999 ]TJ (y)Tj [19.59999 ]TJ ( will be present)Tj [-12.59999 ]TJ (e)Tj [3.39999 ]TJ (d in)Tj [-10.39999 ]TJ ( )Tj +0 -1.14999 TD +0.00028 Tw +(subsequent sections. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 659.65109 Tm +0.00039 Tc +0.58639 Tw +(3.2 Practice, )Tj [586.39999 ]TJ (Part )Tj [578.89999 ]TJ (I )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 639.25268 Tm +0 Tc +0 Tw +( )Tj +0 -7.97999 TD +( )Tj +0 -1.14999 TD +( )Tj +T* +-0.00028 Tc +0.19029 Tw +(I)Tj [12.69999 ]TJ (nput to )Tj [-20 ]TJ (y)Tj [19.69999 ]TJ (a)Tj [-6.5 ]TJ (c)Tj [-6.5 ]TJ (c)Tj [3.5 ]TJ ( is divided)Tj [-10.29998 ]TJ ( into three s)Tj [-11.09999 ]TJ (ections. Th)Tj [-10.29998 ]TJ (e )Tj +/N171 1 Tf +20.94999 0 TD +0.00099 Tc +0 Tw +(de)Tj [4.79998 ]TJ (finitions)Tj +/N231 1 Tf +4.22999 0 TD +-0.00028 Tc +0.19029 Tw +( section co)Tj [-10.29998 ]TJ (nsists of token )Tj +-25.17999 -1.15998 TD +-0.00189 Tc +0.02189 Tw +(decl)Tj [-4.09999 ]TJ (ar)Tj [-8.89999 ]TJ (at)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (ons, and C)Tj [-4.89999 ]TJ ( code )Tj [10 ]TJ (bracket)Tj [-14.09999 ]TJ (ed b)Tj [-11.89999 ]TJ (y)Tj [18.09999 ]TJ ( \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 281.89718 501.98419 Tm +-0.00219 Tc +0 Tw +(%{)Tj +/N231 1 Tf +11.99899 0 0 11.99899 295.21609 501.98419 Tm +-0.00189 Tc +0.02189 Tw +(\223 and \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 329.53318 501.98419 Tm +-0.00219 Tc +0 Tw +(%})Tj +/N231 1 Tf +11.99899 0 0 11.99899 342.73208 501.98419 Tm +-0.00309 Tc +0.02299 Tw +(\224. The BN)Tj [-10.89999 ]TJ (F g)Tj [6.89999 ]TJ (r)Tj [-10.09999 ]TJ (am)Tj [-5.29998 ]TJ (m)Tj [-5.29998 ]TJ (a)Tj [0.69999 ]TJ (r )Tj [-10.09999 ]TJ (i)Tj [-5.29998 ]TJ (s)Tj [-3.89999 ]TJ ( pl)Tj [-5.29998 ]TJ (aced i)Tj [-5.29998 ]TJ (n)Tj [-3.09999 ]TJ ( t)Tj [-5.29998 ]TJ (h)Tj [-3.09999 ]TJ (e)Tj [10.69999 ]TJ ( )Tj +/N171 1 Tf +-21.05999 -1.18998 TD +-0.00019 Tc +0 Tw +(rules)Tj +/N231 1 Tf +2 0 TD +-0.00068 Tc +0.00068 Tw +( section, and user su)Tj [-10.69999 ]TJ (broutines are )Tj [-10 ]TJ (added in th)Tj [-10.69999 ]TJ (e )Tj +/N171 1 Tf +18.65998 0 TD +-0.00009 Tc +0 Tw +(subroutines)Tj +/N231 1 Tf +4.66999 0 TD +-0.00019 Tc +0.00019 Tw +( section. )Tj +-25.32998 -1.14999 TD +0.00109 Tc +0.13888 Tw +( )Tj [-1110 ]TJ (This is be)Tj [4.89999 ]TJ (st)Tj [8.89999 ]TJ ( illu)Tj [11.09999 ]TJ (str)Tj [4.09999 ]TJ (a)Tj [4.89999 ]TJ (te)Tj [4.89999 ]TJ (d by)Tj [21.09999 ]TJ ( )Tj [-10 ]TJ (c)Tj [4.89999 ]TJ (onstr)Tj [4.09999 ]TJ (uc)Tj [4.89999 ]TJ (tin)Tj [-8.89999 ]TJ (g)Tj [11.09999 ]TJ ( a)Tj [4.89999 ]TJ ( sma)Tj [4.89999 ]TJ (ll c)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (c)Tj [4.89999 ]TJ (u)Tj [1.09999 ]TJ (la)Tj [4.89999 ]TJ (tor)Tj [4.09999 ]TJ ( tha)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ ( c)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ (dd a)Tj [4.89999 ]TJ (nd subtr)Tj [4.09999 ]TJ (a)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ ( )Tj +T* +-0.00039 Tc +0.25039 Tw +(numbers. W)Tj [-6.59999 ]TJ (e)Tj [3.39999 ]TJ (\222ll be)Tj [-6.59999 ]TJ (g)Tj [9.59999 ]TJ (i)Tj [-2.59999 ]TJ (n b)Tj [-10.39999 ]TJ (y)Tj [19.59999 ]TJ ( )Tj [-10 ]TJ (ex)Tj [-10.39999 ]TJ (amining)Tj [9.59999 ]TJ ( th)Tj [-10.39999 ]TJ (e linka)Tj [-6.59999 ]TJ (ge betwe)Tj [-6.59999 ]TJ (e)Tj [3.39999 ]TJ (n lex)Tj [-10.39999 ]TJ ( and )Tj [-20 ]TJ (y)Tj [19.59999 ]TJ (a)Tj [3.39999 ]TJ (c)Tj [-6.59999 ]TJ (c)Tj [3.39999 ]TJ (. Her)Tj [-7.39999 ]TJ (e)Tj [3.39999 ]TJ ( is the )Tj +T* +-0.00019 Tc +0.00019 Tw +(definitions section for the )Tj [-10 ]TJ (y)Tj [19.79998 ]TJ (a)Tj [-6.39999 ]TJ (c)Tj [-6.39999 ]TJ (c)Tj [3.59999 ]TJ ( input file: )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 421.83088 Tm +-0.00219 Tc +0 Tw +(%token)Tj [-597.89999 ]TJ (INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 394.83309 Tm +-0.00199 Tc +0.09199 Tw +(Thi)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( defi)Tj [-4.19999 ]TJ (ni)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (on decl)Tj [-14.19999 ]TJ (ares)Tj [-12.79998 ]TJ ( )Tj [-10 ]TJ (an )Tj +/N173 1 Tf +11.03909 0 0 11.03909 225.14189 394.83309 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 271.33799 394.83309 Tm +-0.00048 Tc +0.09049 Tw +( tok)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ (n. W)Tj [-6.69999 ]TJ (h)Tj [-0.5 ]TJ (e)Tj [-6.69999 ]TJ (n)Tj [-0.5 ]TJ ( we)Tj [-6.69999 ]TJ ( run )Tj [-20 ]TJ (y)Tj [19.5 ]TJ (a)Tj [-6.69999 ]TJ (c)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ (, it )Tj [-10 ]TJ (gener)Tj [-7.5 ]TJ (a)Tj [-6.69999 ]TJ (tes a p)Tj [-10.5 ]TJ (a)Tj [3.29998 ]TJ (rse)Tj [-6.69999 ]TJ (r)Tj [2.5 ]TJ ( in )Tj +-15.10998 -1.20999 TD +0.00219 Tc +0 Tw +(f)Tj [5.19999 ]TJ (ile)Tj [6 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 108.99159 380.31428 Tm +-0.00219 Tc +(y.tab.c)Tj +/N231 1 Tf +11.99899 0 0 11.99899 155.18769 380.31428 Tm +-0.00068 Tc +0.00068 Tw +(, and also c)Tj [-6.89999 ]TJ (r)Tj [2.29998 ]TJ (eates )Tj [-10 ]TJ (an include file, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 314.65438 380.31428 Tm +-0.00219 Tc +0 Tw +(y.)Tj [-10.89999 ]TJ (tab.h)Tj +/N231 1 Tf +11.99899 0 0 11.99899 360.97059 380.31428 Tm +0.00219 Tc +(: )Tj +-22.57998 -1.18998 TD +0 Tc +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 354.03649 Tm +-0.00219 Tc +(#ifndef)Tj [-597.89999 ]TJ (YYSTYPE)Tj +0 -1.11959 TD +(#define)Tj [-597.89999 ]TJ (YYSTYPE)Tj [-597.89999 ]TJ (int)Tj +0 -1.13038 TD +(#endif)Tj +T* +(#define)Tj [-597.89999 ]TJ (INTEGER)Tj [-597.89999 ]TJ (258)Tj +T* +(extern)Tj [-597.89999 ]TJ (YYSTYPE)Tj [-597.89999 ]TJ (yylval;)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 289.96189 Tm +0 Tc +( )Tj +0 -1.14999 TD +0.00109 Tc +0.03889 Tw +(L)Tj [11.89999 ]TJ (e)Tj [4.89999 ]TJ (x)Tj [-8.89999 ]TJ ( inc)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (ude)Tj [4.89999 ]TJ (s this f)Tj [4.09999 ]TJ (ile)Tj [4.89999 ]TJ ( a)Tj [4.89999 ]TJ (n)Tj [11.09999 ]TJ (d utili)Tj [8.89999 ]TJ (ze)Tj [4.89999 ]TJ (s the)Tj [4.89999 ]TJ ( de)Tj [4.89999 ]TJ (f)Tj [4.09999 ]TJ (i)Tj [-1.09999 ]TJ (nitions)Tj [10.29998 ]TJ ( )Tj [10 ]TJ (f)Tj [4.09999 ]TJ (o)Tj [1.09999 ]TJ (r)Tj [4.09999 ]TJ ( toke)Tj [4.89999 ]TJ (n va)Tj [4.89999 ]TJ (lue)Tj [4.89999 ]TJ (s)Tj [0.29998 ]TJ (. To obta)Tj [4.89999 ]TJ (i)Tj [-1.09999 ]TJ (n toke)Tj [4.89999 ]TJ (ns, )Tj [-10 ]TJ (y)Tj [21.09999 ]TJ (a)Tj [4.89999 ]TJ (cc )Tj +0 -1.16999 TD +0.00169 Tc +0 Tw +(c)Tj [5.5 ]TJ (a)Tj [5.5 ]TJ (lls )Tj +/N173 1 Tf +11.03909 0 0 11.03909 117.27088 262.12419 Tm +-0.00219 Tc +(yylex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 150.26809 262.12419 Tm +0.00009 Tc +0.18989 Tw +(. F)Tj [6.19999 ]TJ (unction )Tj +/N173 1 Tf +11.03909 0 0 11.03909 206.54348 262.12419 Tm +-0.00219 Tc +0 Tw +(yylex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 239.54069 262.12419 Tm +-0.00109 Tc +0.19108 Tw +( has a r)Tj [-8.09999 ]TJ (e)Tj [2.69999 ]TJ (turn t)Tj [-13.29998 ]TJ (y)Tj [18.89999 ]TJ (p)Tj [-11.09999 ]TJ (e)Tj [2.69999 ]TJ ( of )Tj +/N173 1 Tf +11.03909 0 0 11.03909 351.73139 262.12419 Tm +-0.00219 Tc +0 Tw +(int)Tj +/N231 1 Tf +11.99899 0 0 11.99899 371.52969 262.12419 Tm +-0.00099 Tc +0.19099 Tw +(, and )Tj [-10 ]TJ (returns t)Tj [-13.19999 ]TJ (h)Tj [-1 ]TJ (e token value.)Tj [-11 ]TJ ( )Tj +-23.45999 -1.20999 TD +-0.00199 Tc +0.00199 Tw +(Val)Tj [-4.19999 ]TJ (u)Tj [-2 ]TJ (es associ)Tj [-14.19999 ]TJ (at)Tj [-4.19999 ]TJ (ed wi)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e t)Tj [-4.19999 ]TJ (oken ar)Tj [-9 ]TJ (e ret)Tj [-4.19999 ]TJ (u)Tj [-2 ]TJ (rn)Tj [-12 ]TJ (ed b)Tj [-22 ]TJ (y)Tj [18 ]TJ ( l)Tj [-4.19999 ]TJ (e)Tj [-8.19999 ]TJ (x)Tj [-12 ]TJ ( i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ ( vari)Tj [-4.19999 ]TJ (abl)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 397.56748 247.60539 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 437.16419 247.60539 Tm +-0.00268 Tc +0.00268 Tw +(. Fo)Tj [-12.69999 ]TJ (r ex)Tj [-12.69999 ]TJ (am)Tj [-4.89999 ]TJ (pl)Tj [-4.89999 ]TJ (e, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 222.76748 Tm +-0.00219 Tc +0 Tw +([0-9]+)Tj [-3587 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (atoi\(yytext\);)Tj +T* +(return)Tj [-597.89999 ]TJ (INTEGER;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 171.05178 Tm +( )Tj +0 -1.16999 TD +0.00079 Tc +0.05918 Tw +(would stor)Tj [3.79998 ]TJ (e)Tj [4.59999 ]TJ ( the)Tj [4.59999 ]TJ ( v)Tj [-9.19999 ]TJ (a)Tj [4.59999 ]TJ (lue)Tj [4.59999 ]TJ ( o)Tj [-9.19999 ]TJ (f)Tj [3.79998 ]TJ ( )Tj [-10 ]TJ (the)Tj [4.59999 ]TJ ( inte)Tj [4.59999 ]TJ (ge)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ ( in )Tj +/N173 1 Tf +11.03909 0 0 11.03909 281.17718 157.01298 Tm +-0.00219 Tc +0 Tw +(yy)Tj [-10.89999 ]TJ (lval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 320.89389 157.01298 Tm +-0.00039 Tc +0.06039 Tw +(, a)Tj [-6.59999 ]TJ (nd return tok)Tj [-10.39999 ]TJ (e)Tj [3.39999 ]TJ (n )Tj +/N173 1 Tf +11.03909 0 0 11.03909 411.48638 157.01298 Tm +-0.00219 Tc +0 Tw +(INTEGE)Tj [-10.89999 ]TJ (R)Tj +/N231 1 Tf +11.99899 0 0 11.99899 457.80249 157.01298 Tm +0.00509 Tc +0.05488 Tw +( to)Tj [5.09999 ]TJ ( )Tj [-10 ]TJ (y)Tj [25.09999 ]TJ (acc)Tj [8.89999 ]TJ (.)Tj [5.09999 ]TJ ( T)Tj [5.89999 ]TJ (h)Tj [5.09999 ]TJ (e )Tj +-30.64999 -1.20999 TD +-0.00189 Tc +0.06188 Tw +(t)Tj [-14.09999 ]TJ (y)Tj [18.09999 ]TJ (pe o)Tj [-11.89999 ]TJ (f)Tj [1.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 128.06999 142.49409 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 167.66668 142.49409 Tm +0.00228 Tc +0.05769 Tw +( is de)Tj [6.09999 ]TJ (termine)Tj [6.09999 ]TJ (d)Tj [2.29998 ]TJ ( b)Tj [-7.69999 ]TJ (y)Tj [22.29998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 256.57929 142.49409 Tm +-0.00219 Tc +0 Tw +(YYSTYPE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 302.77549 142.49409 Tm +0.00099 Tc +0.05899 Tw +(. Sin)Tj [-9 ]TJ (c)Tj [4.79998 ]TJ (e)Tj [4.79998 ]TJ ( the)Tj [4.79998 ]TJ ( d)Tj [-9 ]TJ (e)Tj [4.79998 ]TJ (f)Tj [4 ]TJ (a)Tj [4.79998 ]TJ (ult t)Tj [-21.19999 ]TJ (y)Tj [21 ]TJ (pe)Tj [4.79998 ]TJ ( is int)Tj [-11.19999 ]TJ (e)Tj [4.79998 ]TJ (ge)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (,)Tj [1 ]TJ ( this wor)Tj [4 ]TJ (k)Tj [1 ]TJ (s )Tj +-17.72999 -1.18998 TD +-0.00088 Tc +0.09089 Tw +(well in this case. Token )Tj [-10 ]TJ (values 0-255 a)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (e r)Tj [-7.89999 ]TJ (e)Tj [2.89999 ]TJ (serv)Tj [-10.89999 ]TJ (e)Tj [-7.09999 ]TJ (d)Tj [-0.89999 ]TJ ( for cha)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (a)Tj [-7.09999 ]TJ (c)Tj [2.89999 ]TJ (ter valu)Tj [-10.89999 ]TJ (es. For ex)Tj [-10.89999 ]TJ (ample, if )Tj +0 -1.14999 TD +-0.00109 Tc +0.00109 Tw +(y)Tj [18.89999 ]TJ (o)Tj [-11.09999 ]TJ (u had )Tj [-10 ]TJ (a rule su)Tj [-11.09999 ]TJ (ch as )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 88.61869 Tm +-0.00219 Tc +([-+])Tj [-5054.39999 ]TJ (return)Tj [-597.89999 ]TJ (*yytext;)Tj [-4782.5 ]TJ (/*)Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (operator)Tj [-597.89999 ]TJ (*/)Tj +ET +1 1 1 sc + +225.62199 635.41299 160.78698 -20.75799 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 234.02119 617.53448 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +0.00099 Tc +(de)Tj [4.79998 ]TJ (finitions)Tj +/N231 1 Tf +4.22999 0 TD +0 Tc +( ... )Tj +ET +224.90199 636.13299 0.71998 -0.71998 rf +224.90199 636.13299 0.71998 -0.71998 rf +225.62199 636.13299 160.78698 -0.71998 rf +386.40798 636.13299 0.71998 -0.71998 rf +386.40798 636.13299 0.71998 -0.71998 rf +224.90199 635.41299 0.71998 -20.75799 rf +386.40798 635.41299 0.71998 -20.75799 rf +1 1 1 sc +225.62199 614.65499 160.78698 -12.47898 rf +BT +/N173 1 Tf +11.03909 0 0 11.03909 234.02119 605.65548 Tm +0 0 0 sc +-0.00219 Tc +(%%)Tj +ET +224.90199 614.65499 0.71998 -12.47898 rf +386.40798 614.65499 0.71998 -12.47898 rf +1 1 1 sc +225.62199 602.17599 160.78698 -13.79899 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 234.02119 591.37669 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +-0.00019 Tc +(rules)Tj +/N231 1 Tf +2 0 TD +0 Tc +( ... )Tj +ET +224.90199 602.17599 0.71998 -13.79899 rf +386.40798 602.17599 0.71998 -13.79899 rf +1 1 1 sc +225.62199 588.37699 160.78698 -12.47898 rf +BT +/N173 1 Tf +11.03909 0 0 11.03909 234.02119 579.37768 Tm +0 0 0 sc +-0.00219 Tc +(%%)Tj +ET +224.90199 588.37699 0.71998 -12.47898 rf +386.40798 588.37699 0.71998 -12.47898 rf +1 1 1 sc +225.62199 575.89799 160.78698 -20.87799 rf +BT +/N231 1 Tf +11.99899 0 0 11.99899 234.02119 564.97889 Tm +0 0 0 sc +0 Tc +(... )Tj +/N171 1 Tf +1 0 TD +-0.00009 Tc +(subroutines)Tj +/N231 1 Tf +4.66999 0 TD +0 Tc +( ... )Tj +ET +224.90199 555.01998 0.71998 -0.71998 rf +224.90199 555.01998 0.71998 -0.71998 rf +225.62199 555.01998 160.78698 -0.71998 rf +386.40798 555.01998 0.71998 -0.71998 rf +386.40798 555.01998 0.71998 -0.71998 rf +224.90199 575.89799 0.71998 -20.87799 rf +386.40798 575.89799 0.71998 -20.87799 rf +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 15 15 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 15)Tj +0 55.84999 TD +0 Tw +( )Tj +0 -1.14999 TD +-0.00189 Tc +0.03189 Tw +(t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (e chara)Tj [-8.09999 ]TJ (c)Tj [1.89999 ]TJ (t)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ (r val)Tj [-4.09999 ]TJ (u)Tj [-1.89999 ]TJ (e fo)Tj [-11.89999 ]TJ (r m)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (nus or pl)Tj [-4.09999 ]TJ (us is ret)Tj [-4.09999 ]TJ (u)Tj [-1.89999 ]TJ (rned. Not)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ ( t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (at)Tj [-4.09999 ]TJ ( we pl)Tj [-4.09999 ]TJ (aced t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (e m)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (nus si)Tj [-4.09999 ]TJ (g)Tj [8.09999 ]TJ (n)Tj [-1.89999 ]TJ ( fi)Tj [-4.09999 ]TJ (rst)Tj [-4.09999 ]TJ ( )Tj +T* +-0.00059 Tc +0.08059 Tw +(so that it wouldn\222t be m)Tj [7.19999 ]TJ (i)Tj [7.19999 ]TJ (s)Tj [-1.39999 ]TJ (taken for a r)Tj [-7.59999 ]TJ (a)Tj [3.19999 ]TJ (n)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ (e desi)Tj [-12.79998 ]TJ (gnator. Gene)Tj [-6.79998 ]TJ (rated token v)Tj [-10.59999 ]TJ (a)Tj [3.19999 ]TJ (lues t)Tj [-12.79998 ]TJ (y)Tj [19.39999 ]TJ (pic)Tj [-6.79998 ]TJ (a)Tj [3.19999 ]TJ (ll)Tj [-12.79998 ]TJ (y)Tj [9.39999 ]TJ ( )Tj +T* +-0.00099 Tc +0.04098 Tw +(start around 258, as lex)Tj [-11 ]TJ ( r)Tj [12 ]TJ (e)Tj [2.79998 ]TJ (serves sev)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ (ral valu)Tj [-11 ]TJ (es fo)Tj [-11 ]TJ (r end-of-)Tj [-8 ]TJ (f)Tj [2 ]TJ (ile and er)Tj [-8 ]TJ (ror pr)Tj [-8 ]TJ (ocessing)Tj [9 ]TJ (. H)Tj [-8.79998 ]TJ (e)Tj [2.79998 ]TJ (re)Tj [-7.19999 ]TJ ( )Tj +T* +0.00138 Tc +-0.00138 Tw +(is the)Tj [5.19999 ]TJ ( c)Tj [5.19999 ]TJ (o)Tj [1.39999 ]TJ (mple)Tj [5.19999 ]TJ (te)Tj [5.19999 ]TJ ( le)Tj [5.19999 ]TJ (x)Tj [-8.59999 ]TJ ( input )Tj [10 ]TJ (spe)Tj [5.19999 ]TJ (c)Tj [5.19999 ]TJ (i)Tj [-0.79998 ]TJ (f)Tj [4.39999 ]TJ (i)Tj [-0.79998 ]TJ (c)Tj [5.19999 ]TJ (a)Tj [5.19999 ]TJ (tion f)Tj [4.39999 ]TJ (o)Tj [-8.59999 ]TJ (r)Tj [4.39999 ]TJ ( our)Tj [4.39999 ]TJ ( ca)Tj [5.19999 ]TJ (lcula)Tj [5.19999 ]TJ (t)Tj [-0.79998 ]TJ (or)Tj [4.39999 ]TJ (: )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 628.21359 Tm +-0.00219 Tc +(%{)Tj +0 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ("y.tab.h")Tj +T* +(%})Tj +0 -2.25 TD +(%%)Tj +0 -2.26089 TD +([0-9]+)Tj [-3587 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (atoi\(yytext\);)Tj +T* +(return)Tj [-597.89999 ]TJ (INTEGER;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +-7.17399 -2.25 TD +-0.00219 Tc +([-+\\n])Tj [-3587 ]TJ (return)Tj [-597.89999 ]TJ (*yytext;)Tj +0 -2.26089 TD +([)Tj [-597.89999 ]TJ (\\t])Tj [-4130.5 ]TJ (;)Tj [-597.89999 ]TJ (/)Tj [0 ]TJ (*)Tj [-597.89999 ]TJ (skip)Tj [-597.89999 ]TJ (whitespace)Tj [-597.89999 ]TJ (*/)Tj +T* +(.)Tj [-6576.19999 ]TJ (yyerror\("invalid)Tj [-597.89999 ]TJ (character"\);)Tj +0 -2.25 TD +(%%)Tj +0 -2.26089 TD +(int)Tj [-597.89999 ]TJ (yywrap\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(return)Tj [-597.89999 ]TJ (1;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 352.35668 Tm +( )Tj +0 -1.14999 TD +-0.00138 Tc +0.13139 Tw +(I)Tj [11.59999 ]TJ (n)Tj [-1.39999 ]TJ (t)Tj [-3.59999 ]TJ (e)Tj [-7.59999 ]TJ (rnal)Tj [-3.59999 ]TJ (l)Tj [-23.59999 ]TJ (y)Tj [18.59999 ]TJ (, )Tj [-20 ]TJ (y)Tj [18.59999 ]TJ (a)Tj [2.39999 ]TJ (c)Tj [-7.59999 ]TJ (c)Tj [2.39999 ]TJ ( m)Tj [-3.59999 ]TJ (a)Tj [2.39999 ]TJ (i)Tj [-3.59999 ]TJ (n)Tj [-1.39999 ]TJ (t)Tj [-3.59999 ]TJ (a)Tj [2.39999 ]TJ (i)Tj [-3.59999 ]TJ (n)Tj [-1.39999 ]TJ (s t)Tj [-3.59999 ]TJ (w)Tj [0.79998 ]TJ (o st)Tj [-3.59999 ]TJ (acks i)Tj [-3.59999 ]TJ (n)Tj [-1.39999 ]TJ ( m)Tj [-3.59999 ]TJ (e)Tj [2.39999 ]TJ (m)Tj [-3.59999 ]TJ (o)Tj [-1.39999 ]TJ (r)Tj [-8.39999 ]TJ (y)Tj [28.59999 ]TJ (;)Tj [-13.59999 ]TJ ( a parse st)Tj [-3.59999 ]TJ (ack and )Tj [-10 ]TJ (a val)Tj [-13.59999 ]TJ (u)Tj [-1.39999 ]TJ (e st)Tj [-3.59999 ]TJ (ack. The)Tj [-7.59999 ]TJ ( )Tj +T* +-0.00088 Tc +0.05088 Tw +(parse stack )Tj [-10 ]TJ (contains term)Tj [-13.09999 ]TJ (inals and nonterminals, a)Tj [-7.09999 ]TJ (nd repres)Tj [-11.69999 ]TJ (ents the curr)Tj [-7.89999 ]TJ (ent parsing)Tj [9.09999 ]TJ ( state.)Tj [-10.89999 ]TJ ( )Tj +0 -1.16999 TD +-0.00209 Tc +0.21209 Tw +(The val)Tj [-4.29998 ]TJ (u)Tj [-2.09999 ]TJ (e st)Tj [-4.29998 ]TJ (ack i)Tj [-4.29998 ]TJ (s)Tj [-2.89999 ]TJ ( an a)Tj [-8.29998 ]TJ (rra)Tj [-18.29998 ]TJ (y)Tj [17.89999 ]TJ ( of )Tj +/N173 1 Tf +11.03909 0 0 11.03909 251.65969 310.72009 Tm +-0.00219 Tc +0 Tw +(YYSTYPE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 297.85578 310.72009 Tm +0.21218 Tw +( el)Tj [-4.39999 ]TJ (em)Tj [-14.39999 ]TJ (e)Tj [-8.39999 ]TJ (n)Tj [-2.19999 ]TJ (t)Tj [-4.39999 ]TJ (s)Tj [-3 ]TJ (, and associ)Tj [-4.39999 ]TJ (at)Tj [-4.39999 ]TJ (es a va)Tj [-8.39999 ]TJ (l)Tj [-4.39999 ]TJ (u)Tj [-2.19999 ]TJ (e wi)Tj [-4.39999 ]TJ (t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ ( each )Tj +-17.31999 -1.20999 TD +-0.00209 Tc +0.03208 Tw +(el)Tj [-4.29998 ]TJ (em)Tj [-4.29998 ]TJ (ent)Tj [-4.29998 ]TJ ( i)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e p)Tj [-12.09999 ]TJ (a)Tj [1.69999 ]TJ (rse)Tj [-8.29998 ]TJ ( st)Tj [-4.29998 ]TJ (ac)Tj [-8.29998 ]TJ (k. For)Tj [-9.09999 ]TJ ( ex)Tj [-12.09999 ]TJ (am)Tj [-4.29998 ]TJ (pl)Tj [-4.29998 ]TJ (e, when)Tj [-12.09999 ]TJ ( l)Tj [-4.29998 ]TJ (e)Tj [-8.29998 ]TJ (x)Tj [-12.09999 ]TJ ( ret)Tj [-4.29998 ]TJ (u)Tj [-2.09999 ]TJ (rns an )Tj +/N173 1 Tf +11.03909 0 0 11.03909 387.84838 296.20138 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 434.04449 296.20138 Tm +0.00109 Tc +0.02888 Tw +( to)Tj [-8.89999 ]TJ (ke)Tj [4.89999 ]TJ (n, )Tj [-20 ]TJ (y)Tj [21.09999 ]TJ (a)Tj [-5.09999 ]TJ (c)Tj [4.89999 ]TJ (c)Tj [4.89999 ]TJ ( shif)Tj [4.09999 ]TJ (ts)Tj [-9.69999 ]TJ ( )Tj +-28.66999 -1.20999 TD +-0.00068 Tc +0.10069 Tw +(this token to )Tj [10 ]TJ (the parse stack. At the same time, the correspondin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 419.88569 281.68249 Tm +-0.00219 Tc +0 Tw +(yylva)Tj [-10.89999 ]TJ (l)Tj +/N231 1 Tf +11.99899 0 0 11.99899 459.60238 281.68249 Tm +0.00129 Tc +0.09869 Tw +( is shif)Tj [4.29998 ]TJ (te)Tj [5.09999 ]TJ (d t)Tj [9.09999 ]TJ (o)Tj [11.29998 ]TJ ( )Tj +-30.79998 -1.18998 TD +-0.00119 Tc +0.08119 Tw +(the value stack. Th)Tj [-11.19999 ]TJ (e pa)Tj [-7.39999 ]TJ (rse and value st)Tj [-13.39999 ]TJ (acks a)Tj [-7.39999 ]TJ (r)Tj [1.79998 ]TJ (e al)Tj [-13.39999 ]TJ (wa)Tj [-17.39999 ]TJ (y)Tj [18.79998 ]TJ (s)Tj [-2 ]TJ ( s)Tj [-12 ]TJ (y)Tj [18.79998 ]TJ (n)Tj [-11.19999 ]TJ (c)Tj [2.59999 ]TJ (hroniz)Tj [-7.39999 ]TJ (e)Tj [2.59999 ]TJ (d, so fi)Tj [-13.39999 ]TJ (nding)Tj [8.79998 ]TJ ( a v)Tj [-11.19999 ]TJ (a)Tj [2.59999 ]TJ (lue)Tj [-7.39999 ]TJ ( )Tj +0 -1.14999 TD +-0.00079 Tc +0.02079 Tw +(related to a token on the )Tj [10 ]TJ (stack is easil)Tj [-13 ]TJ (y)Tj [29.19999 ]TJ ( )Tj [-10 ]TJ (accomplis)Tj [-11.59999 ]TJ (hed. Here is the )Tj [-10 ]TJ (y)Tj [19.19999 ]TJ (a)Tj [-7 ]TJ (cc input specification )Tj +T* +-0.00068 Tc +0.00068 Tw +(for our c)Tj [-6.89999 ]TJ (a)Tj [3.09999 ]TJ (lculator: )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 16 16 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 16)Tj +0 55.84999 TD +0 Tw +( )Tj +0 -1.14999 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 683.40908 Tm +-0.00219 Tc +(%token)Tj [-597.89999 ]TJ (INTEGER)Tj +0 -2.26089 TD +(%%)Tj +0 -2.25 TD +(program:)Tj +4.78259 -1.13038 TD +(program)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\\n')Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ (printf\("%d\\n",)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(|)Tj +T* +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(expr:)Tj +4.78259 -1.11959 TD +(INTEGER)Tj [-11358.79998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($1;)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('-')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.69999 ]TJ (-)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(%%)Tj +0 -2.25 TD +(int)Tj [-597.89999 ]TJ (yyerror\(char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(fprintf\(stderr,)Tj [-597.79998 ]TJ ("%s\\n",)Tj [-597.89999 ]TJ (s\);)Tj +-0.16308 -1.13038 TD +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.22828 -1.13038 TD +0 Tc +(})Tj +0 -2.25 TD +-0.00219 Tc +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yyparse\(\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 357.63619 Tm +( )Tj +0 -1.14999 TD +0.00149 Tc +0.06849 Tw +(The)Tj [5.29998 ]TJ ( r)Tj [4.5 ]TJ (u)Tj [1.5 ]TJ (le)Tj [5.29998 ]TJ (s)Tj [-9.29998 ]TJ ( se)Tj [5.29998 ]TJ (c)Tj [5.29998 ]TJ (tion )Tj [-10 ]TJ (r)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (se)Tj [5.29998 ]TJ (mb)Tj [-8.5 ]TJ (le)Tj [5.29998 ]TJ (s the)Tj [5.29998 ]TJ ( )Tj [-10 ]TJ (B)Tj [8.5 ]TJ (N)Tj [-6.29998 ]TJ (F)Tj [7.59999 ]TJ ( )Tj [-10 ]TJ (g)Tj [11.5 ]TJ (r)Tj [-5.5 ]TJ (a)Tj [5.29998 ]TJ (mma)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ ( di)Tj [-10.69999 ]TJ (sc)Tj [5.29998 ]TJ (usse)Tj [5.29998 ]TJ (d ea)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (lie)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (.)Tj [-8.5 ]TJ ( The)Tj [5.29998 ]TJ ( l)Tj [-10.69999 ]TJ (e)Tj [5.29998 ]TJ (f)Tj [4.5 ]TJ (t)Tj [-0.5 ]TJ (-ha)Tj [5.29998 ]TJ (nd side)Tj [5.29998 ]TJ ( o)Tj [-8.5 ]TJ (f)Tj [4.5 ]TJ ( a )Tj +T* +-0.00028 Tc +0.02029 Tw +(production, or nontermin)Tj [-10.29998 ]TJ (al, is entered left-justifie)Tj [-6.5 ]TJ (d, followed b)Tj [-10.29998 ]TJ (y)Tj [19.69999 ]TJ ( )Tj [-10 ]TJ (a colon. T)Tj [-9.5 ]TJ (h)Tj [-0.29998 ]TJ (is is followed)Tj [9.69999 ]TJ ( )Tj +T* +-0.00079 Tc +0.14079 Tw +(b)Tj [-10.79998 ]TJ (y)Tj [19.19999 ]TJ ( the ri)Tj [-13 ]TJ (g)Tj [9.19999 ]TJ (h)Tj [-0.79998 ]TJ (t-hand side o)Tj [-10.79998 ]TJ (f)Tj [2.19999 ]TJ ( the production. Actions associated with a rule are ente)Tj [-7 ]TJ (red in)Tj [-10.79998 ]TJ ( )Tj +T* +-0.00169 Tc +0 Tw +(braces. )Tj +T* +0.00119 Tc +0.03878 Tw +( )Tj [-1210 ]TJ (B)Tj [-11.79998 ]TJ (y)Tj [21.19999 ]TJ ( utilizing)Tj [11.19999 ]TJ ( le)Tj [5 ]TJ (f)Tj [4.19999 ]TJ (t)Tj [-0.89999 ]TJ (-)Tj [4.19999 ]TJ (r)Tj [4.19999 ]TJ (e)Tj [-5 ]TJ (c)Tj [5 ]TJ (u)Tj [1.19999 ]TJ (r)Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ (io)Tj [-8.79998 ]TJ (n, we)Tj [5 ]TJ ( ha)Tj [5 ]TJ (ve)Tj [5 ]TJ ( sp)Tj [-8.79998 ]TJ (e)Tj [5 ]TJ (c)Tj [5 ]TJ (i)Tj [-1 ]TJ (f)Tj [4.19999 ]TJ (i)Tj [-1 ]TJ (e)Tj [5 ]TJ (d)Tj [1.19999 ]TJ ( tha)Tj [5 ]TJ (t)Tj [-11 ]TJ ( a)Tj [5 ]TJ ( pr)Tj [4.19999 ]TJ (o)Tj [-8.79998 ]TJ (g)Tj [11.19999 ]TJ (r)Tj [4.19999 ]TJ (a)Tj [5 ]TJ (m c)Tj [5 ]TJ (onsists of)Tj [4.19999 ]TJ ( zer)Tj [4.19999 ]TJ (o or)Tj [4.19999 ]TJ ( mor)Tj [4.19999 ]TJ (e)Tj [5 ]TJ ( )Tj +T* +-0.00178 Tc +0.05178 Tw +(ex)Tj [-11.79998 ]TJ (pressi)Tj [-4 ]TJ (ons. Each ex)Tj [-11.79998 ]TJ (pressi)Tj [-4 ]TJ (on t)Tj [-4 ]TJ (e)Tj [2 ]TJ (rm)Tj [-4 ]TJ (i)Tj [-4 ]TJ (n)Tj [-1.79998 ]TJ (at)Tj [-4 ]TJ (es wi)Tj [-4 ]TJ (t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ ( a ne)Tj [-8 ]TJ (wl)Tj [-4 ]TJ (i)Tj [-4 ]TJ (n)Tj [-1.79998 ]TJ (e. W)Tj [-8 ]TJ (h)Tj [-1.79998 ]TJ (en a newl)Tj [-4 ]TJ (i)Tj [-4 ]TJ (n)Tj [-1.79998 ]TJ (e i)Tj [-13.79998 ]TJ (s)Tj [-2.59999 ]TJ ( det)Tj [-4 ]TJ (ect)Tj [-4 ]TJ (ed, w)Tj [-9.59999 ]TJ (e)Tj [2 ]TJ ( )Tj +T* +-0.00109 Tc +0.00109 Tw +(print the value of the )Tj [-10 ]TJ (ex)Tj [-11.09999 ]TJ (pression. W)Tj [-7.29998 ]TJ (h)Tj [-1.09999 ]TJ (en we appl)Tj [-23.29998 ]TJ (y)Tj [18.89999 ]TJ ( t)Tj [-13.29998 ]TJ (h)Tj [-1.09999 ]TJ (e rule )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 235.24639 Tm +-0.00219 Tc +(expr:)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ (expr)Tj [-5434.79998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 220.96759 Tm +0 Tc +( )Tj +T* +-0.00099 Tc +0.03099 Tw +(we repla)Tj [-7.19999 ]TJ (ce the ri)Tj [-13.19999 ]TJ (g)Tj [9 ]TJ (h)Tj [-1 ]TJ (t-h)Tj [-11 ]TJ (a)Tj [2.79998 ]TJ (n)Tj [-11 ]TJ (d)Tj [-1 ]TJ ( side of the production in the parse stack with th)Tj [-11 ]TJ (e left-hand side )Tj +0 -1.16999 TD +-0.00048 Tc +0.07049 Tw +(of the same produ)Tj [-10.5 ]TJ (ction. I)Tj [12.5 ]TJ (n)Tj [-0.5 ]TJ ( this c)Tj [-6.69999 ]TJ (a)Tj [3.29998 ]TJ (se, we pop )Tj [-10 ]TJ (\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 317.05419 193.12989 Tm +-0.00219 Tc +0 Tw +(ex)Tj [-10.89999 ]TJ (pr)Tj [-673.89999 ]TJ ('+')Tj [-674 ]TJ (expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 404.64689 193.12989 Tm +-0.00099 Tc +0.07099 Tw +(\224 and pus)Tj [-11.79998 ]TJ (h \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 466.80178 193.12989 Tm +-0.00219 Tc +0 Tw +(expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 493.19949 193.12989 Tm +-0.00189 Tc +0.07189 Tw +(\224. W)Tj [-8.09999 ]TJ (e)Tj [1.89999 ]TJ ( )Tj +-33.59999 -1.17999 TD +-0.00099 Tc +0.05099 Tw +(have redu)Tj [-11 ]TJ (ced the stack b)Tj [-11 ]TJ (y)Tj [19 ]TJ ( )Tj [-10 ]TJ (poppin)Tj [-11 ]TJ (g)Tj [9 ]TJ ( three terms of)Tj [-8 ]TJ (f the stack, and pushing)Tj [9 ]TJ ( )Tj [-10 ]TJ (back one term. )Tj +0 -1.16999 TD +0.00199 Tc +0.06799 Tw +(We)Tj [5.79998 ]TJ ( may)Tj [22 ]TJ ( re)Tj [5.79998 ]TJ (fe)Tj [5.79998 ]TJ (r)Tj [5 ]TJ (e)Tj [5.79998 ]TJ (n)Tj [-8 ]TJ (c)Tj [5.79998 ]TJ (e)Tj [5.79998 ]TJ ( positions in the)Tj [5.79998 ]TJ ( va)Tj [5.79998 ]TJ (lue)Tj [5.79998 ]TJ ( sta)Tj [5.79998 ]TJ (c)Tj [5.79998 ]TJ (k)Tj [2 ]TJ ( in)Tj [-8 ]TJ ( our)Tj [5 ]TJ ( C c)Tj [5.79998 ]TJ (ode)Tj [5.79998 ]TJ ( b)Tj [-18 ]TJ (y)Tj [22 ]TJ ( sp)Tj [-8 ]TJ (e)Tj [5.79998 ]TJ (c)Tj [5.79998 ]TJ (i)Tj [-0.19999 ]TJ (f)Tj [-15 ]TJ (y)Tj [22 ]TJ (in)Tj [-8 ]TJ (g)Tj [12 ]TJ ( \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 466.92179 164.93229 Tm +0.00869 Tc +0 Tw +($1)Tj +/N231 1 Tf +11.99899 0 0 11.99899 480.24069 164.93229 Tm +-0.00329 Tc +0.07328 Tw +(\224 fo)Tj [-13.29998 ]TJ (r t)Tj [-5.5 ]TJ (h)Tj [-3.29998 ]TJ (e)Tj [-9.5 ]TJ ( )Tj +-32.51998 -1.20999 TD +-0.00039 Tc +0.06039 Tw +(first term on the rig)Tj [9.59999 ]TJ (h)Tj [-0.39999 ]TJ (t-h)Tj [-10.39999 ]TJ (a)Tj [-6.59999 ]TJ (nd side of the productio)Tj [-10.39999 ]TJ (n, \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 345.73188 150.41349 Tm +-0.00219 Tc +0 Tw +($2)Tj +/N231 1 Tf +11.99899 0 0 11.99899 358.93078 150.41349 Tm +-0.00109 Tc +0.06109 Tw +(\224 for the s)Tj [-11.89999 ]TJ (econd, a)Tj [-7.29998 ]TJ (nd so on. \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 503.51869 150.41349 Tm +-0.00219 Tc +0 Tw +($$)Tj +/N231 1 Tf +11.99899 0 0 11.99899 516.71759 150.41349 Tm +-0.00379 Tc +(\224 )Tj +-35.55999 -1.18998 TD +-0.00109 Tc +0.04109 Tw +(desig)Tj [8.89999 ]TJ (n)Tj [-1.09999 ]TJ (at)Tj [-13.29998 ]TJ (es the top of the stack after )Tj [-10 ]TJ (reduction has )Tj [-10 ]TJ (taken place. Th)Tj [-11.09999 ]TJ (e above a)Tj [-7.29998 ]TJ (c)Tj [2.69999 ]TJ (tion adds the )Tj +0 -1.14999 TD +-0.00068 Tc +0.09069 Tw +(value associated with tw)Tj [-8.5 ]TJ (o ex)Tj [-10.69999 ]TJ (pressions, pops three terms off the value sta)Tj [-6.89999 ]TJ (c)Tj [3.09999 ]TJ (k, and pushes )Tj +T* +-0.00079 Tc +0.00079 Tw +(back a sin)Tj [-10.79998 ]TJ (g)Tj [9.19999 ]TJ (le sum. Thus, )Tj [-10 ]TJ (the parse )Tj [-10 ]TJ (and value sta)Tj [-7 ]TJ (c)Tj [3 ]TJ (k)Tj [-10.79998 ]TJ (s)Tj [-1.59999 ]TJ ( remain s)Tj [-21.59999 ]TJ (y)Tj [19.19999 ]TJ (nchroniz)Tj [-7 ]TJ (e)Tj [3 ]TJ (d. )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 17 17 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 17)Tj +0 55.82998 TD +0.00228 Tc +0.07769 Tw +( )Tj [-1170 ]TJ (Nume)Tj [6.09999 ]TJ (r)Tj [5.29998 ]TJ (i)Tj [0.09999 ]TJ (c)Tj [6.09999 ]TJ ( v)Tj [-7.69999 ]TJ (a)Tj [6.09999 ]TJ (lue)Tj [6.09999 ]TJ (s)Tj [1.5 ]TJ ( ar)Tj [5.29998 ]TJ (e)Tj [6.09999 ]TJ ( initia)Tj [6.09999 ]TJ (ll)Tj [-9.89999 ]TJ (y)Tj [22.29998 ]TJ ( )Tj [-10 ]TJ (e)Tj [6.09999 ]TJ (n)Tj [2.29998 ]TJ (te)Tj [6.09999 ]TJ (re)Tj [6.09999 ]TJ (d on the sta)Tj [6.09999 ]TJ (c)Tj [6.09999 ]TJ (k)Tj [-7.69999 ]TJ ( whe)Tj [6.09999 ]TJ (n)Tj [2.29998 ]TJ ( w)Tj [-5.5 ]TJ (e)Tj [6.09999 ]TJ ( re)Tj [6.09999 ]TJ (duce)Tj [6.09999 ]TJ ( f)Tj [5.29998 ]TJ (r)Tj [5.29998 ]TJ (o)Tj [2.29998 ]TJ (m)Tj [-9.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 462.36219 708.96688 Tm +-0.00219 Tc +0 Tw +(I)Tj [-10.89999 ]TJ (NTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 508.67829 708.96688 Tm +0.00109 Tc +0.07888 Tw +( to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 694.44808 Tm +-0.00219 Tc +0 Tw +(expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 116.43099 694.44808 Tm +-0.00158 Tc +0.00158 Tw +(. After )Tj +/N173 1 Tf +11.03909 0 0 11.03909 150.62809 694.44808 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 196.82429 694.44808 Tm +0.00088 Tc +-0.00088 Tw +( is )Tj [-10 ]TJ (shif)Tj [3.89999 ]TJ (te)Tj [4.69999 ]TJ (d to the)Tj [4.69999 ]TJ ( sta)Tj [4.69999 ]TJ (c)Tj [4.69999 ]TJ (k, we)Tj [4.69999 ]TJ ( )Tj [-10 ]TJ (appl)Tj [-11.29998 ]TJ (y)Tj [20.89999 ]TJ ( the)Tj [4.69999 ]TJ ( r)Tj [3.89999 ]TJ (u)Tj [0.89999 ]TJ (le)Tj [4.89999 ]TJ ( )Tj +-8.89999 -1.18998 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 668.17028 Tm +-0.00219 Tc +(expr:)Tj [-597.89999 ]TJ (INTEGER)Tj [-3641.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($1;)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 653.89149 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00209 Tc +(The )Tj +/N173 1 Tf +11.03909 0 0 11.03909 112.47129 639.85269 Tm +-0.00219 Tc +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 158.66738 639.85269 Tm +-0.00068 Tc +0.07069 Tw +( token)Tj [-10.69999 ]TJ ( is p)Tj [-10.69999 ]TJ (opped off)Tj [-7.69999 ]TJ ( the p)Tj [-10.69999 ]TJ (a)Tj [3.09999 ]TJ (rse)Tj [-6.89999 ]TJ ( stac)Tj [-6.89999 ]TJ (k, followed b)Tj [-20.69999 ]TJ (y)Tj [19.29998 ]TJ ( )Tj [-10 ]TJ (a push)Tj [-10.69999 ]TJ ( of)Tj [-7.69999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 453.48289 639.85269 Tm +-0.00219 Tc +0 Tw +(expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 479.88069 639.85269 Tm +-0.00059 Tc +0.07058 Tw +(. F)Tj [5.5 ]TJ (o)Tj [-10.59999 ]TJ (r the)Tj [-6.79998 ]TJ ( )Tj +-32.48999 -1.17999 TD +-0.00088 Tc +0.12089 Tw +(value stack, we pop the )Tj [-10 ]TJ (integ)Tj [9.09999 ]TJ (e)Tj [-7.09999 ]TJ (r value of)Tj [-7.89999 ]TJ (f the stack, and then push it back on ag)Tj [9.09999 ]TJ (ain. )Tj [-10 ]TJ (In)Tj [-10.89999 ]TJ ( )Tj +0 -1.14999 TD +-0.00048 Tc +0.06048 Tw +(other words, w)Tj [-8.29998 ]TJ (e)Tj [3.29998 ]TJ ( do nothi)Tj [-12.69999 ]TJ (ng)Tj [9.5 ]TJ (. )Tj [-10 ]TJ (I)Tj [12.5 ]TJ (n)Tj [-10.5 ]TJ ( fa)Tj [-6.69999 ]TJ (ct, this is the de)Tj [-6.69999 ]TJ (fault action, and n)Tj [-10.5 ]TJ (eed no)Tj [-10.5 ]TJ (t be specified.)Tj [-10.5 ]TJ ( )Tj +0 -1.16999 TD +-0.00099 Tc +0.00099 Tw +(F)Tj [5.09999 ]TJ (i)Tj [-3.19999 ]TJ (nall)Tj [-13.19999 ]TJ (y)Tj [19 ]TJ (,)Tj [-1 ]TJ ( )Tj [-10 ]TJ (when a n)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ (wline i)Tj [-13.19999 ]TJ (s)Tj [-1.79998 ]TJ ( encounter)Tj [-8 ]TJ (ed, the value )Tj [-10 ]TJ (associated with )Tj +/N173 1 Tf +11.03909 0 0 11.03909 407.16668 597.85618 Tm +-0.00219 Tc +0 Tw +(expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 433.56449 597.85618 Tm +0.00079 Tc +-0.00079 Tw +( is )Tj [-10 ]TJ (pr)Tj [3.79998 ]TJ (inte)Tj [4.59999 ]TJ (d. )Tj +-28.62998 -1.20999 TD +-0.00099 Tc +0.09098 Tw +( )Tj [-1160 ]TJ (I)Tj [12 ]TJ (n)Tj [-1 ]TJ ( the ev)Tj [-11 ]TJ (ent of s)Tj [-11.79998 ]TJ (y)Tj [19 ]TJ (ntax)Tj [-11 ]TJ ( er)Tj [-8 ]TJ (rors, )Tj [-10 ]TJ (y)Tj [19 ]TJ (a)Tj [-7.19999 ]TJ (cc c)Tj [-7.19999 ]TJ (a)Tj [2.79998 ]TJ (lls the user-)Tj [-8 ]TJ (s)Tj [-1.79998 ]TJ (upplied function )Tj +/N173 1 Tf +11.03909 0 0 11.03909 438.84408 583.33738 Tm +-0.00219 Tc +0 Tw +(yyerror)Tj +/N231 1 Tf +11.99899 0 0 11.99899 485.04019 583.33738 Tm +0 Tc +0.09999 Tw +(. I)Tj [23 ]TJ (f)Tj [3 ]TJ ( )Tj [-10 ]TJ (y)Tj [20 ]TJ (ou )Tj +-32.91999 -1.20999 TD +-0.00239 Tc +0.02239 Tw +(need t)Tj [-4.59999 ]TJ (o)Tj [-2.39999 ]TJ ( m)Tj [-4.59999 ]TJ (odi)Tj [-4.59999 ]TJ (f)Tj [-19.39999 ]TJ (y)Tj [17.59999 ]TJ ( t)Tj [-4.59999 ]TJ (h)Tj [-2.39999 ]TJ (e i)Tj [-4.59999 ]TJ (n)Tj [-2.39999 ]TJ (t)Tj [-4.59999 ]TJ (e)Tj [-8.59999 ]TJ (rf)Tj [-9.39999 ]TJ (ace t)Tj [-4.59999 ]TJ (o)Tj [-2.39999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 242.06048 568.81858 Tm +-0.00219 Tc +0 Tw +(yyerror)Tj +/N231 1 Tf +11.99899 0 0 11.99899 288.25669 568.81858 Tm +0.00209 Tc +0.01789 Tw +(,)Tj [-7.89999 ]TJ ( )Tj [-20 ]TJ (y)Tj [22.09999 ]TJ (ou ca)Tj [5.89999 ]TJ (n)Tj [-7.89999 ]TJ ( a)Tj [5.89999 ]TJ (lte)Tj [5.89999 ]TJ (r)Tj [5.09999 ]TJ ( the)Tj [5.89999 ]TJ ( )Tj +/N171 1 Tf +7.50999 0 TD +-0.00149 Tc +0 Tw +(canned)Tj +/N231 1 Tf +2.87998 0 TD +0.00109 Tc +0.02888 Tw +( f)Tj [4.09999 ]TJ (ile)Tj [4.89999 ]TJ ( )Tj [10 ]TJ (tha)Tj [4.89999 ]TJ (t)Tj [-11.09999 ]TJ ( y)Tj [21.09999 ]TJ (a)Tj [-5.09999 ]TJ (c)Tj [4.89999 ]TJ (c)Tj [-5.09999 ]TJ ( )Tj [10 ]TJ (inc)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (ude)Tj [4.89999 ]TJ (s )Tj +-26.90998 -1.20999 TD +-0.00059 Tc +0.03059 Tw +(to fit )Tj [-20 ]TJ (y)Tj [19.39999 ]TJ (our n)Tj [-10.59999 ]TJ (eeds.)Tj [-10.59999 ]TJ ( The l)Tj [-12.79998 ]TJ (a)Tj [3.19999 ]TJ (s)Tj [-11.39999 ]TJ (t)Tj [-2.79998 ]TJ ( function in ou)Tj [-10.59999 ]TJ (r )Tj [-20 ]TJ (y)Tj [19.39999 ]TJ (a)Tj [-6.79998 ]TJ (cc)Tj [-6.79998 ]TJ ( sp)Tj [-10.59999 ]TJ (ecification is)Tj [-11.39999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 395.28768 554.29978 Tm +-0.00219 Tc +0 Tw +(main)Tj +/N231 1 Tf +11.99899 0 0 11.99899 421.68548 554.29978 Tm +-0.00248 Tc +0.03248 Tw +( \205)Tj [-12.5 ]TJ ( i)Tj [-4.69999 ]TJ (n)Tj [-2.5 ]TJ ( cas)Tj [-13.29998 ]TJ (e )Tj [-20 ]TJ (y)Tj [17.5 ]TJ (ou )Tj [-10 ]TJ (wer)Tj [-9.5 ]TJ (e)Tj [1.29998 ]TJ ( )Tj +-27.63999 -1.18998 TD +-0.00068 Tc +0.07069 Tw +(wonderin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ ( wher)Tj [-7.69999 ]TJ (e it was. This ex)Tj [-10.69999 ]TJ (ample s)Tj [8.5 ]TJ (till)Tj [7.09999 ]TJ ( has an ambig)Tj [9.29998 ]TJ (uous grammar. )Tj [-10 ]TJ (Yacc will issue )Tj +0 -1.14999 TD +0.00158 Tc +0.27839 Tw +(shif)Tj [4.59999 ]TJ (t-)Tj [4.59999 ]TJ (r)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (duce)Tj [5.39999 ]TJ ( war)Tj [4.59999 ]TJ (n)Tj [1.59999 ]TJ (ing)Tj [11.59999 ]TJ (s)Tj [0.79998 ]TJ (, )Tj [-10 ]TJ (but will still pr)Tj [4.59999 ]TJ (oc)Tj [5.39999 ]TJ (e)Tj [5.39999 ]TJ (ss th)Tj [11.59999 ]TJ (e)Tj [5.39999 ]TJ ( gr)Tj [4.59999 ]TJ (a)Tj [5.39999 ]TJ (mma)Tj [5.39999 ]TJ (r using)Tj [11.59999 ]TJ ( shif)Tj [4.59999 ]TJ (t )Tj [-10 ]TJ (a)Tj [5.39999 ]TJ (s)Tj [0.79998 ]TJ ( the)Tj [5.39999 ]TJ ( de)Tj [5.39999 ]TJ (fa)Tj [5.39999 ]TJ (ult)Tj [-10.59999 ]TJ ( )Tj +T* +-0.00059 Tc +0 Tw +(operation. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 476.66629 Tm +0.00039 Tc +0.58639 Tw +(3.3 Practice, )Tj [586.39999 ]TJ (Part )Tj [578.89999 ]TJ (II)Tj [-7.5 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 456.26799 Tm +0.00099 Tc +0.17898 Tw +(I)Tj [14 ]TJ (n)Tj [1 ]TJ ( this se)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (tion we)Tj [4.79998 ]TJ ( will e)Tj [4.79998 ]TJ (x)Tj [-9 ]TJ (te)Tj [4.79998 ]TJ (nd the)Tj [4.79998 ]TJ ( c)Tj [4.79998 ]TJ (a)Tj [4.79998 ]TJ (l)Tj [-1.19999 ]TJ (c)Tj [4.79998 ]TJ (u)Tj [1 ]TJ (la)Tj [4.79998 ]TJ (tor)Tj [4 ]TJ ( f)Tj [4 ]TJ (r)Tj [-6 ]TJ (om the)Tj [4.79998 ]TJ ( pr)Tj [4 ]TJ (e)Tj [4.79998 ]TJ (v)Tj [1 ]TJ (ious se)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (tion to inc)Tj [4.79998 ]TJ (o)Tj [1 ]TJ (r)Tj [4 ]TJ (por)Tj [4 ]TJ (a)Tj [4.79998 ]TJ (t)Tj [-1.19999 ]TJ (e )Tj +T* +0.00048 Tc +0.07949 Tw +(some)Tj [4.29998 ]TJ ( ne)Tj [4.29998 ]TJ (w f)Tj [3.5 ]TJ (unc)Tj [4.29998 ]TJ (tiona)Tj [4.29998 ]TJ (lit)Tj [-11.69999 ]TJ (y)Tj [20.5 ]TJ (.)Tj [0.5 ]TJ ( )Tj [-10 ]TJ (Ne)Tj [4.29998 ]TJ (w f)Tj [3.5 ]TJ (e)Tj [-5.69999 ]TJ (a)Tj [4.29998 ]TJ (t)Tj [-1.69999 ]TJ (ur)Tj [3.5 ]TJ (e)Tj [4.29998 ]TJ (s)Tj [-0.29998 ]TJ ( inc)Tj [4.29998 ]TJ (l)Tj [-1.69999 ]TJ (ude)Tj [4.29998 ]TJ ( a)Tj [4.29998 ]TJ (r)Tj [3.5 ]TJ (i)Tj [-11.69999 ]TJ (t)Tj [-1.69999 ]TJ (hme)Tj [4.29998 ]TJ (tic)Tj [4.29998 ]TJ ( ope)Tj [4.29998 ]TJ (r)Tj [3.5 ]TJ (a)Tj [4.29998 ]TJ (tor)Tj [3.5 ]TJ (s)Tj [-0.29998 ]TJ ( multip)Tj [10.5 ]TJ (l)Tj [-11.69999 ]TJ (y)Tj [20.5 ]TJ (, a)Tj [4.29998 ]TJ (nd divide)Tj [4.29998 ]TJ (. )Tj +T* +-0.00138 Tc +0.03138 Tw +(Parentheses m)Tj [-13.59999 ]TJ (a)Tj [-17.59999 ]TJ (y)Tj [18.59999 ]TJ ( be us)Tj [-12.19999 ]TJ (ed)Tj [-11.39999 ]TJ ( to over-)Tj [-8.39999 ]TJ (ride ope)Tj [-7.59999 ]TJ (rator p)Tj [-11.39999 ]TJ (r)Tj [1.59999 ]TJ (e)Tj [-7.59999 ]TJ (ceden)Tj [-11.39999 ]TJ (ce, )Tj [-10 ]TJ (and sin)Tj [-11.39999 ]TJ (g)Tj [8.59999 ]TJ (le-ch)Tj [-11.39999 ]TJ (a)Tj [2.39999 ]TJ (r)Tj [-8.39999 ]TJ (acter v)Tj [-11.39999 ]TJ (a)Tj [2.39999 ]TJ (riabl)Tj [-13.59999 ]TJ (e)Tj [2.39999 ]TJ (s )Tj +T* +-0.00009 Tc +0.14009 Tw +(ma)Tj [-6.29998 ]TJ (y)Tj [19.89999 ]TJ ( b)Tj [-10.09999 ]TJ (e)Tj [3.69999 ]TJ ( spe)Tj [-6.29998 ]TJ (c)Tj [3.69999 ]TJ (ified in )Tj [-10 ]TJ (assig)Tj [9.89999 ]TJ (n)Tj [-0.09999 ]TJ (ment statem)Tj [-12.29998 ]TJ (ents. The )Tj [-10 ]TJ (following)Tj [9.89999 ]TJ ( illustrates sam)Tj [-12.29998 ]TJ (p)Tj [-0.09999 ]TJ (le input and)Tj [-10.09999 ]TJ ( )Tj +T* +-0.00028 Tc +0.00028 Tw +(calculator output: )Tj +T* +0 Tc +0 Tw +( )Tj +/N176 1 Tf +11.03909 0 0 11.03909 126.03019 375.27468 Tm +-0.00219 Tc +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +0.59568 Tc +(3*\()Tj [597.89999 ]TJ (4+5)Tj [597.89999 ]TJ (\))Tj +/N176 1 Tf +-4.18479 -1.13038 TD +-0.00219 Tc +(calc)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +-0.00219 Tc +(27)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +0.59568 Tc +(x=3*\()Tj [597.89999 ]TJ (5+4)Tj [597.89999 ]TJ (\))Tj +/N176 1 Tf +-4.18479 -1.13038 TD +-0.00219 Tc +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +0.59568 Tc +(y=5)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +-0.00219 Tc +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +(x)Tj +/N176 1 Tf +-4.18479 -1.11959 TD +-0.00219 Tc +(calc)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +-0.00219 Tc +(27)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +(y)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +-0.00219 Tc +(calc)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +(5)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +-0.00219 Tc +(user)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +-0.00219 Tc +(x)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ (2*y)Tj +/N176 1 Tf +-4.18479 -1.13038 TD +(calc)Tj +/N175 1 Tf +2.39129 0 TD +0 Tc +(:)Tj +/N173 1 Tf +1.79348 0 TD +-0.00219 Tc +(37)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 248.80529 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00228 Tc +0.20228 Tw +(The l)Tj [-4.5 ]TJ (e)Tj [1.5 ]TJ (x)Tj [-12.29998 ]TJ (i)Tj [-4.5 ]TJ (cal)Tj [-4.5 ]TJ ( anal)Tj [-24.5 ]TJ (y)Tj [27.69999 ]TJ (z)Tj [-18.5 ]TJ (er r)Tj [-9.29998 ]TJ (e)Tj [1.5 ]TJ (t)Tj [-14.5 ]TJ (u)Tj [-2.29998 ]TJ (rns )Tj +/N173 1 Tf +11.03909 0 0 11.03909 236.30099 234.76649 Tm +-0.00219 Tc +0 Tw +(VARIABLE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 289.09658 234.76649 Tm +-0.00099 Tc +0.20098 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 317.17419 234.76649 Tm +-0.00219 Tc +0 Tw +(IN)Tj [-10.89999 ]TJ (TEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 363.49038 234.76649 Tm +-0.00099 Tc +0.20098 Tw +( tokens. F)Tj [5.09999 ]TJ (o)Tj [-1 ]TJ (r v)Tj [-11 ]TJ (a)Tj [2.79998 ]TJ (ri)Tj [-13.19999 ]TJ (ables, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 482.40049 234.76649 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 521.99708 234.76649 Tm +0 Tc +( )Tj +-36 -1.20999 TD +-0.00219 Tc +0.17219 Tw +(speci)Tj [-4.39999 ]TJ (fi)Tj [-4.39999 ]TJ (es an)Tj [-12.19999 ]TJ ( i)Tj [-4.39999 ]TJ (ndex)Tj [-12.19999 ]TJ ( t)Tj [-4.39999 ]TJ (o)Tj [-2.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 199.58399 220.24769 Tm +0 Tw +(sym)Tj +/N231 1 Tf +11.99899 0 0 11.99899 219.38238 220.24769 Tm +-0.00039 Tc +0.17039 Tw +(, our s)Tj [-21.19999 ]TJ (y)Tj [29.59999 ]TJ (mbol tabl)Tj [-12.59999 ]TJ (e. F)Tj [5.69999 ]TJ (o)Tj [-10.39999 ]TJ (r this program, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 412.92619 220.24769 Tm +-0.00219 Tc +0 Tw +(sym)Tj +/N231 1 Tf +11.99899 0 0 11.99899 432.72459 220.24769 Tm +0.00028 Tc +0.16969 Tw +( me)Tj [-5.89999 ]TJ (rel)Tj [-11.89999 ]TJ (y)Tj [20.29998 ]TJ ( )Tj [-10 ]TJ (holds the)Tj [-5.89999 ]TJ ( )Tj +-28.55999 -1.19999 TD +-0.00219 Tc +0.11219 Tw +(val)Tj [-4.39999 ]TJ (u)Tj [-2.19999 ]TJ (e of t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e associ)Tj [-4.39999 ]TJ (at)Tj [-4.39999 ]TJ (ed vari)Tj [-4.39999 ]TJ (abl)Tj [-4.39999 ]TJ (e)Tj [1.59999 ]TJ (. W)Tj [-8.39999 ]TJ (h)Tj [-2.19999 ]TJ (en )Tj +/N173 1 Tf +11.03909 0 0 11.03909 285.85679 205.84889 Tm +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 332.05299 205.84889 Tm +-0.00129 Tc +0.11129 Tw +( tokens are returned, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 438.00419 205.84889 Tm +-0.00219 Tc +0 Tw +(y)Tj [-10.89999 ]TJ (ylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 477.72088 205.84889 Tm +-0.00028 Tc +0.11029 Tw +( contains )Tj +-32.30999 -1.18998 TD +-0.00068 Tc +0.00068 Tw +(the number scann)Tj [-10.69999 ]TJ (e)Tj [3.09999 ]TJ (d. He)Tj [-6.89999 ]TJ (r)Tj [-7.69999 ]TJ (e)Tj [3.09999 ]TJ ( is the input specificatio)Tj [-10.69999 ]TJ (n for lex)Tj [-10.69999 ]TJ (:)Tj [-2.69999 ]TJ ( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 18 18 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 18)Tj +0 55.84999 TD +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 684.72889 Tm +-0.00219 Tc +(%{)Tj +2.39129 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ("y.tab.h")Tj +-2.39129 -1.13038 TD +(%})Tj +0 -2.25 TD +(%%)Tj +2.39129 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (variables)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +([a-z])Tj [-4184.79998 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (*yytext)Tj [-597.69999 ]TJ (-)Tj [-597.89999 ]TJ ('a';)Tj +0 -1.11959 TD +(return)Tj [-597.89999 ]TJ (VARIABLE;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(/*)Tj [-597.89999 ]TJ (integers)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +([0-9]+)Tj [-3587 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (atoi\(yytext\);)Tj +0 -1.11959 TD +(return)Tj [-597.89999 ]TJ (INTEGER;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(/*)Tj [-597.89999 ]TJ (operators)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +([-+\(\)=/*\\n])Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (*yytext;)Tj [-597.89999 ]TJ (})Tj +2.39129 -2.25 TD +(/*)Tj [-597.89999 ]TJ (skip)Tj [-597.89999 ]TJ (whitespace)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +([)Tj [-597.89999 ]TJ (\\t])Tj [-4130.5 ]TJ (;)Tj +2.39129 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (anything)Tj [-597.89999 ]TJ (else)Tj [-597.89999 ]TJ (is)Tj [-597.89999 ]TJ (an)Tj [-597.89999 ]TJ (error)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(.)Tj [-8967.5 ]TJ (yyerror\("invalid)Tj [-597.89999 ]TJ (character"\);)Tj +0 -2.26089 TD +(%%)Tj +0 -2.25 TD +(int)Tj [-597.89999 ]TJ (yywrap\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(return)Tj [-597.89999 ]TJ (1;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 284.20239 Tm +( )Tj +0 -1.16999 TD +-0.00079 Tc +0.15078 Tw +(The input specification )Tj [-10 ]TJ (for )Tj [-20 ]TJ (y)Tj [19.19999 ]TJ (a)Tj [3 ]TJ (c)Tj [-7 ]TJ (c)Tj [3 ]TJ ( follows. The to)Tj [-10.79998 ]TJ (kens for )Tj +/N173 1 Tf +11.03909 0 0 11.03909 376.68928 270.16349 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 422.88539 270.16349 Tm +-0.00099 Tc +0.15098 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 449.88319 270.16349 Tm +-0.00219 Tc +0 Tw +(VARIABLE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 502.67878 270.16349 Tm +-0.00358 Tc +0.15359 Tw +( are )Tj +-34.38999 -1.20999 TD +0.00219 Tc +0.16778 Tw +(utilize)Tj [6 ]TJ (d)Tj [12.19999 ]TJ ( b)Tj [-7.79998 ]TJ (y)Tj [32.19999 ]TJ ( )Tj [-20 ]TJ (y)Tj [22.19999 ]TJ (a)Tj [-4 ]TJ (c)Tj [6 ]TJ (c)Tj [6 ]TJ ( to c)Tj [6 ]TJ (r)Tj [5.19999 ]TJ (e)Tj [6 ]TJ (a)Tj [6 ]TJ (t)Tj [-10 ]TJ (e)Tj [6 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 222.86209 255.64469 Tm +-0.00219 Tc +0 Tw +(#defines)Tj +/N231 1 Tf +11.99899 0 0 11.99899 275.65769 255.64469 Tm +0.00109 Tc +0.16889 Tw +( in )Tj +/N173 1 Tf +11.03909 0 0 11.03909 295.09609 255.64469 Tm +-0.00219 Tc +0 Tw +(y.tab.)Tj [10.79998 ]TJ (h)Tj +/N231 1 Tf +11.99899 0 0 11.99899 341.17219 255.64469 Tm +0.00048 Tc +0.16949 Tw +( f)Tj [3.5 ]TJ (o)Tj [0.5 ]TJ (r)Tj [3.5 ]TJ ( use)Tj [4.29998 ]TJ ( in le)Tj [14.29998 ]TJ (x)Tj [-9.5 ]TJ (.)Tj [0.5 ]TJ ( Th)Tj [10.5 ]TJ (is i)Tj [8.29998 ]TJ (s)Tj [-0.29998 ]TJ ( f)Tj [3.5 ]TJ (o)Tj [0.5 ]TJ (llowe)Tj [4.29998 ]TJ (d b)Tj [-9.5 ]TJ (y)Tj [20.5 ]TJ ( )Tj +-20.92999 -1.20999 TD +0.00219 Tc +0.10778 Tw +(de)Tj [6 ]TJ (f)Tj [5.19999 ]TJ (i)Tj [0 ]TJ (nitions f)Tj [5.19999 ]TJ (o)Tj [2.19999 ]TJ (r)Tj [5.19999 ]TJ ( the ar)Tj [5.19999 ]TJ (ithme)Tj [6 ]TJ (tic)Tj [6 ]TJ ( ope)Tj [6 ]TJ (ra)Tj [6 ]TJ (tor)Tj [5.19999 ]TJ (s)Tj [1.39999 ]TJ (. We)Tj [6 ]TJ ( m)Tj [-10 ]TJ (a)Tj [-4 ]TJ (y)Tj [22.19999 ]TJ ( )Tj [-10 ]TJ (sp)Tj [-7.79998 ]TJ (e)Tj [6 ]TJ (c)Tj [6 ]TJ (i)Tj [0.19999 ]TJ (f)Tj [-14.79998 ]TJ (y)Tj [22.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 373.20959 241.12588 Tm +-0.00219 Tc +0 Tw +(%left)Tj +/N231 1 Tf +11.99899 0 0 11.99899 406.20678 241.12588 Tm +-0.00178 Tc +0.11178 Tw +(, )Tj [-10 ]TJ (for l)Tj [-14 ]TJ (e)Tj [2 ]TJ (f)Tj [-8.79998 ]TJ (t)Tj [-3.89999 ]TJ (-associ)Tj [-4 ]TJ (at)Tj [-4 ]TJ (i)Tj [-4 ]TJ (v)Tj [-1.79998 ]TJ (e, o)Tj [-11.79998 ]TJ (r)Tj [1.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 226.72718 Tm +-0.00219 Tc +0 Tw +(%right)Tj +/N231 1 Tf +11.99899 0 0 11.99899 129.62989 226.72718 Tm +-0.00158 Tc +0.03158 Tw +(, for ri)Tj [-3.79998 ]TJ (g)Tj [8.39999 ]TJ (h)Tj [-1.59999 ]TJ (t)Tj [-3.79998 ]TJ ( associ)Tj [-13.79998 ]TJ (at)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (v)Tj [-1.59999 ]TJ (e. The l)Tj [-3.79998 ]TJ (a)Tj [2.19999 ]TJ (st)Tj [-3.79998 ]TJ ( defi)Tj [-3.79998 ]TJ (ni)Tj [-3.79998 ]TJ (t)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (on )Tj [10 ]TJ (l)Tj [-3.79998 ]TJ (i)Tj [-3.79998 ]TJ (s)Tj [-2.39999 ]TJ (t)Tj [-3.79998 ]TJ (e)Tj [2.19999 ]TJ (d has t)Tj [-3.79998 ]TJ (h)Tj [-1.59999 ]TJ (e hi)Tj [-3.79998 ]TJ (g)Tj [8.39999 ]TJ (h)Tj [-1.59999 ]TJ (est)Tj [-3.79998 ]TJ ( preceden)Tj [-11.59999 ]TJ (ce. Thus,)Tj [-11.59999 ]TJ ( )Tj +-3.29998 -1.18998 TD +-0.00028 Tc +0.19029 Tw +(multiplication and div)Tj [9.69999 ]TJ (i)Tj [-2.5 ]TJ (si)Tj [7.5 ]TJ (on have hig)Tj [9.69999 ]TJ (h)Tj [-0.29998 ]TJ (e)Tj [-6.5 ]TJ (r)Tj [2.69999 ]TJ ( prec)Tj [-6.5 ]TJ (ede)Tj [-6.5 ]TJ (n)Tj [-0.29998 ]TJ (ce than addition and subtraction. All )Tj +0 -1.14999 TD +0.00149 Tc +0.43838 Tw +(f)Tj [4.5 ]TJ (our)Tj [4.5 ]TJ ( oper)Tj [4.5 ]TJ (a)Tj [5.29998 ]TJ (tor)Tj [4.5 ]TJ (s)Tj [0.69999 ]TJ ( )Tj [-10.09999 ]TJ (a)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (e le)Tj [5.29998 ]TJ (f)Tj [4.5 ]TJ (t)Tj [-10.59999 ]TJ (-)Tj [4.5 ]TJ (a)Tj [5.29998 ]TJ (ssoc)Tj [5.29998 ]TJ (i)Tj [-0.69999 ]TJ (a)Tj [5.29998 ]TJ (tive)Tj [5.29998 ]TJ (.)Tj [1.5 ]TJ ( )Tj [-10.09999 ]TJ (Using this simple)Tj [5.29998 ]TJ ( te)Tj [5.29998 ]TJ (c)Tj [5.29998 ]TJ (hnique)Tj [5.29998 ]TJ (, )Tj [-10.09999 ]TJ (we a)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (e a)Tj [5.29998 ]TJ (b)Tj [1.5 ]TJ (le to )Tj +T* +-0.00048 Tc +0.00048 Tw +(disambig)Tj [9.5 ]TJ (uate ou)Tj [-10.5 ]TJ (r )Tj [-10 ]TJ (g)Tj [9.5 ]TJ (r)Tj [2.5 ]TJ (amm)Tj [-12.69999 ]TJ (a)Tj [3.29998 ]TJ (r. )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 159.05279 Tm +-0.00219 Tc +(%token)Tj [-597.89999 ]TJ (INTEGER)Tj [-597.89999 ]TJ (VARIABLE)Tj +0 -1.13038 TD +(%left)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ ('-')Tj +T* +(%left)Tj [-597.89999 ]TJ ('*')Tj [-597.89999 ]TJ ('/')Tj +0 -2.26089 TD +(%{)Tj +2.39129 -1.11959 TD +(int)Tj [-597.89999 ]TJ (sym[26];)Tj +-2.39129 -1.13038 TD +(%})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 19 19 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 19)Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 698.52778 Tm +-0.00219 Tc +0 Tw +(%%)Tj +0 -2.26089 TD +(program:)Tj +4.78259 -1.11959 TD +(program)Tj [-597.89999 ]TJ (statement)Tj [-597.89999 ]TJ ('\\n')Tj +0 -1.13038 TD +0 Tc +(|)Tj +T* +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(statement:)Tj +4.78259 -1.13038 TD +(expr)Tj [-13152.29998 ]TJ ({)Tj [-597.89999 ]TJ (p)Tj [0.09999 ]TJ (rintf\("%d\\n",)Tj [-597.89999 ]TJ ($1\);)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (VARIABLE)Tj [-597.89999 ]TJ ('=')Tj [-597.89999 ]TJ (expr)Tj [-4184.79998 ]TJ ({)Tj [-597.89999 ]TJ (sym[$1])Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +0 Tc +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(expr:)Tj +4.78259 -1.13038 TD +(INTEGER)Tj +T* +(|)Tj [-597.89999 ]TJ (VARIABLE)Tj [-9565.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (sym[$1];)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('-')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.69999 ]TJ (-)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('*')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (*)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('/')Tj [-597.89999 ]TJ (expr)Tj [-6576.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (/)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-7174 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($2;)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.25 TD +-0.00219 Tc +(%%)Tj +0 -2.26089 TD +(int)Tj [-597.89999 ]TJ (yyerror\(char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(fprintf\(stderr,)Tj [-597.89999 ]TJ ("%s\\n",)Tj [-597.89999 ]TJ (s\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.25 TD +-0.00219 Tc +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yyparse\(\);)Tj +T* +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 20 20 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 20)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +-0.00109 Tc +0.48989 Tw +(4. Calcu)Tj [-3.59999 ]TJ (l)Tj [-3.29998 ]TJ (ato)Tj [-3.59999 ]TJ (r)Tj [1.39999 ]TJ ( )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +15.95869 0 0 15.95869 90.03318 659.05108 Tm +0.00019 Tc +0.58659 Tw +(4.1 Descrip)Tj [-5.5 ]TJ (tio)Tj [-5.5 ]TJ (n)Tj [2.09999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 638.65278 Tm +-0.00019 Tc +0.23019 Tw +(This version of th)Tj [-10.19999 ]TJ (e c)Tj [-6.39999 ]TJ (a)Tj [3.59999 ]TJ (lculator is substantiall)Tj [-22.39999 ]TJ (y)Tj [19.79998 ]TJ ( )Tj [-10 ]TJ (more complex)Tj [-10.19999 ]TJ ( than pr)Tj [-7.19999 ]TJ (e)Tj [-6.39999 ]TJ (v)Tj [-0.19999 ]TJ (ious versions. )Tj +0 -1.14999 TD +-0.00059 Tc +0.07058 Tw +(Major chan)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ (e)Tj [3.19999 ]TJ (s include c)Tj [-6.79998 ]TJ (ontrol constructs such as )Tj +/N171 1 Tf +20.37998 0 TD +0.00158 Tc +0 Tw +(if-)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (l)Tj [-0.59999 ]TJ (se)Tj +/N231 1 Tf +2.43998 0 TD +-0.00099 Tc +0.07099 Tw +( and )Tj +/N171 1 Tf +2.07998 0 TD +0.00189 Tc +0 Tw +(while)Tj +/N231 1 Tf +2.16999 0 TD +-0.00059 Tc +0.07058 Tw +(. )Tj [-10 ]TJ (I)Tj [22.39999 ]TJ (n)Tj [-0.59999 ]TJ ( add)Tj [-10.59999 ]TJ (ition, a s)Tj [-11.39999 ]TJ (y)Tj [29.39999 ]TJ (ntax)Tj [-10.59999 ]TJ ( )Tj +-27.06999 -1.14999 TD +-0.00099 Tc +0.19099 Tw +(tree is constructed durin)Tj [-11 ]TJ (g)Tj [9 ]TJ ( parsin)Tj [-11 ]TJ (g)Tj [9 ]TJ (.)Tj [-1 ]TJ ( Afte)Tj [-7.19999 ]TJ (r parsin)Tj [-11 ]TJ (g, we walk the s)Tj [-11.79998 ]TJ (y)Tj [19 ]TJ (ntax)Tj [-11 ]TJ ( tree to produce )Tj +T* +-0.00059 Tc +0.00059 Tw +(output. Two versions of the tree w)Tj [-8.39999 ]TJ (a)Tj [3.19999 ]TJ (lk routine a)Tj [-6.79998 ]TJ (r)Tj [2.39999 ]TJ (e s)Tj [-11.39999 ]TJ (upplied: )Tj +1.5 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N172 1 Tf +0 -1.22999 TD +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00199 Tc +0.00199 Tw +(an i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ (t)Tj [-4.19999 ]TJ (e)Tj [1.79998 ]TJ (rpret)Tj [-14.19999 ]TJ (e)Tj [1.79998 ]TJ (r t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (at)Tj [-4.19999 ]TJ ( ex)Tj [-12 ]TJ (ecut)Tj [-14.19999 ]TJ (e)Tj [1.79998 ]TJ (s st)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (em)Tj [-4.19999 ]TJ (ent)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( duri)Tj [-4.19999 ]TJ (n)Tj [-12 ]TJ (g)Tj [8 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e t)Tj [-14.19999 ]TJ (r)Tj [1 ]TJ (ee w)Tj [-9.79998 ]TJ (a)Tj [1.79998 ]TJ (l)Tj [-4.19999 ]TJ (k, and )Tj +/N172 1 Tf +-1.5 -1.21998 TD +0 Tc +0 Tw +(\001\002)Tj +/N231 1 Tf +1.5 0 TD +-0.00228 Tc +0.00228 Tw +(a com)Tj [-4.5 ]TJ (p)Tj [-2.29998 ]TJ (i)Tj [-4.5 ]TJ (l)Tj [-4.5 ]TJ (e)Tj [1.5 ]TJ (r t)Tj [-4.5 ]TJ (h)Tj [-2.29998 ]TJ (at)Tj [-4.5 ]TJ ( )Tj [-10 ]TJ (g)Tj [7.69999 ]TJ (e)Tj [1.5 ]TJ (n)Tj [-12.29998 ]TJ (e)Tj [1.5 ]TJ (rat)Tj [-4.5 ]TJ (e)Tj [1.5 ]TJ (s)Tj [-13.09999 ]TJ ( code for )Tj [-10 ]TJ (a h)Tj [-22.29998 ]TJ (y)Tj [17.69999 ]TJ (pot)Tj [-4.5 ]TJ (het)Tj [-4.5 ]TJ (i)Tj [-4.5 ]TJ (cal)Tj [-4.5 ]TJ ( s)Tj [-13.09999 ]TJ (t)Tj [-4.5 ]TJ (ack-bas)Tj [-13.09999 ]TJ (ed m)Tj [-4.5 ]TJ (a)Tj [1.5 ]TJ (chi)Tj [-4.5 ]TJ (n)Tj [-2.29998 ]TJ (e. )Tj +-1.5 -1.14999 TD +0 Tc +0 Tw +( )Tj +-1.5 -1.14999 TD +0.00158 Tc +-0.00158 Tw +(To ma)Tj [5.39999 ]TJ (ke)Tj [5.39999 ]TJ ( thing)Tj [11.59999 ]TJ (s)Tj [0.79998 ]TJ ( more)Tj [5.39999 ]TJ ( c)Tj [5.39999 ]TJ (o)Tj [1.59999 ]TJ (n)Tj [-8.39999 ]TJ (c)Tj [5.39999 ]TJ (r)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (te)Tj [5.39999 ]TJ (, h)Tj [-8.39999 ]TJ (e)Tj [5.39999 ]TJ (r)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ ( is a)Tj [5.39999 ]TJ ( s)Tj [-9.19999 ]TJ (a)Tj [5.39999 ]TJ (mple)Tj [5.39999 ]TJ ( prog)Tj [11.59999 ]TJ (ra)Tj [5.39999 ]TJ (m, )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 500.66429 Tm +0.59568 Tc +(x=0)Tj [597.89999 ]TJ (;)Tj +0 -1.11959 TD +-0.00219 Tc +(while)Tj [-597.89999 ]TJ (\(x)Tj [-597.89999 ]TJ (<)Tj [-597.89999 ]TJ (3)Tj [0 ]TJ (\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(print)Tj [-597.89999 ]TJ (x;)Tj +T* +0.59568 Tc +(x=x+1)Tj [597.89999 ]TJ (;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 436.58969 Tm +( )Tj +0 -1.14999 TD +-0.00059 Tc +0.00059 Tw +(with output for the interpretive version, )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 396.99288 Tm +(0)Tj +0 -1.13038 TD +(1)Tj +0 -1.11959 TD +(2)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 357.87619 Tm +( )Tj +0 -1.14999 TD +-0.00059 Tc +0.00059 Tw +(and output for the compil)Tj [-12.79998 ]TJ (er version. )Tj +/N173 1 Tf +11.03909 0 0 11.03909 152.42808 319.59939 Tm +-0.00219 Tc +0 Tw +(push)Tj [-1739.09999 ]TJ (0)Tj +0 -1.13038 TD +(pop)Tj [-2391.39999 ]TJ (x)Tj +-2.39129 -1.13038 TD +(L000:)Tj +2.39129 -1.13038 TD +(push)Tj [-1793.5 ]TJ (x)Tj +0 -1.11959 TD +(push)Tj [-1739.19999 ]TJ (3)Tj +0 -1.13038 TD +(compLT)Tj +T* +(jz)Tj [-1304.39999 ]TJ (L001)Tj +T* +(push)Tj [-1793.5 ]TJ (x)Tj +T* +(print)Tj +T* +(push)Tj [-1793.5 ]TJ (x)Tj +0 -1.11959 TD +(push)Tj [-1793.5 ]TJ (1)Tj +0 -1.13038 TD +(add)Tj +T* +(pop)Tj [-2391.39999 ]TJ (x)Tj +T* +(jmp)Tj [-2391.39999 ]TJ (L000)Tj +-2.39129 -1.13038 TD +(L001:)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 130.85508 Tm +0 Tc +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 21 21 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 21)Tj +0 55.84999 TD +-0.00209 Tc +1.25209 Tw +( The )Tj +0 0 1 sc +3.53999 0 TD +0.00109 Tc +0.23889 Tw +(inc)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (ude)Tj [4.89999 ]TJ ( f)Tj [4.09999 ]TJ (ile)Tj +ET + +132.50999 707.88699 57.11499 -0.59999 rf +BT +11.99899 0 0 11.99899 189.62489 709.20689 Tm +0 0 0 sc +-0.00178 Tc +0.24179 Tw +( cont)Tj [-4 ]TJ (ai)Tj [-14 ]TJ (ns decl)Tj [-4 ]TJ (ar)Tj [-8.79998 ]TJ (at)Tj [-4 ]TJ (i)Tj [-4 ]TJ (ons for t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (e )Tj [-10 ]TJ (s)Tj [-12.59999 ]TJ (y)Tj [18.19999 ]TJ (nt)Tj [-4 ]TJ (ax)Tj [-11.79998 ]TJ ( t)Tj [-4 ]TJ (r)Tj [1.19999 ]TJ (ee and s)Tj [-22.59999 ]TJ (y)Tj [18.19999 ]TJ (m)Tj [-4 ]TJ (bol)Tj [-14 ]TJ ( t)Tj [-4 ]TJ (a)Tj [2 ]TJ (bl)Tj [-4 ]TJ (e. The )Tj +-8.29998 -1.16999 TD +0.00009 Tc +0.05989 Tw +(s)Tj [-10.69999 ]TJ (y)Tj [20.09999 ]TJ (mbol table, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 159.02738 695.16809 Tm +-0.00219 Tc +0 Tw +(sym)Tj +/N231 1 Tf +11.99899 0 0 11.99899 178.82579 695.16809 Tm +-0.00099 Tc +0.06098 Tw +(, allows for sing)Tj [9 ]TJ (le-)Tj [-8 ]TJ (c)Tj [2.79998 ]TJ (har)Tj [-8 ]TJ (acte)Tj [-7.19999 ]TJ (r)Tj [2 ]TJ ( var)Tj [-8 ]TJ (i)Tj [-3.19999 ]TJ (able names. A node in the s)Tj [-11.79998 ]TJ (y)Tj [19 ]TJ (ntax)Tj [-11 ]TJ ( tree)Tj [-7.19999 ]TJ ( )Tj +-7.39999 -1.20999 TD +-0.00019 Tc +0.11019 Tw +(ma)Tj [-6.39999 ]TJ (y)Tj [19.79998 ]TJ ( hold a )Tj [-10 ]TJ (constant \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 198.50408 680.64929 Tm +-0.00219 Tc +0 Tw +(co)Tj [-10.89999 ]TJ (nNodeType)Tj +/N231 1 Tf +11.99899 0 0 11.99899 271.21809 680.64929 Tm +0.00178 Tc +0.10818 Tw +(\))Tj [4.79998 ]TJ (,)Tj [1.79998 ]TJ ( a)Tj [5.59999 ]TJ (n)Tj [1.79998 ]TJ ( ide)Tj [5.59999 ]TJ (n)Tj [1.79998 ]TJ (tif)Tj [4.79998 ]TJ (i)Tj [-10.39999 ]TJ (e)Tj [5.59999 ]TJ (r)Tj [4.79998 ]TJ ( \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 350.41149 680.64929 Tm +-0.00219 Tc +0 Tw +(idNodeType)Tj +/N231 1 Tf +11.99899 0 0 11.99899 416.40599 680.64929 Tm +-0.00119 Tc +0.11119 Tw +(\), o)Tj [-11.19999 ]TJ (r)Tj [1.79998 ]TJ ( an)Tj [-11.19999 ]TJ ( internal node )Tj +-27.19999 -1.20999 TD +0.00048 Tc +0.03948 Tw +(with a)Tj [4.29998 ]TJ (n)Tj [0.5 ]TJ ( ope)Tj [4.29998 ]TJ (r)Tj [3.5 ]TJ (a)Tj [4.29998 ]TJ (tor)Tj [3.5 ]TJ ( \()Tj +/N173 1 Tf +11.03909 0 0 11.03909 176.90589 666.13049 Tm +-0.00219 Tc +0 Tw +(oprNo)Tj [-10.89999 ]TJ (deType)Tj +/N231 1 Tf +11.99899 0 0 11.99899 249.61988 666.13049 Tm +-0.00039 Tc +0.04039 Tw +(\). Union )Tj +/N173 1 Tf +11.03909 0 0 11.03909 293.53619 666.13049 Tm +-0.00219 Tc +0 Tw +(nodeType)Tj +/N231 1 Tf +11.99899 0 0 11.99899 346.33178 666.13049 Tm +-0.00178 Tc +0.04179 Tw +( encapsul)Tj [-4 ]TJ (a)Tj [2 ]TJ (t)Tj [-4 ]TJ (e)Tj [2 ]TJ (s al)Tj [-4 ]TJ (l)Tj [-4 ]TJ ( t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (re)Tj [-8 ]TJ (e vari)Tj [-4 ]TJ (ant)Tj [-4 ]TJ (s)Tj [-2.59999 ]TJ (, and)Tj [-11.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 651.61169 Tm +-0.00219 Tc +0 Tw +(nodeType.type)Tj +/N231 1 Tf +11.99899 0 0 11.99899 175.82598 651.61169 Tm +-0.00079 Tc +0.00079 Tw +( is used to determine which struc)Tj [-7 ]TJ (t)Tj [-3 ]TJ (ure we hav)Tj [-10.79998 ]TJ (e)Tj [3 ]TJ (. )Tj +-7.14999 -1.20999 TD +-0.00209 Tc +1.25209 Tw +( The )Tj +0 0 1 sc +3.35998 0 TD +0.00059 Tc +0.05938 Tw +(lex)Tj [-9.39999 ]TJ ( input file)Tj +ET +130.34999 635.77299 62.875 -0.59999 rf +BT +11.99899 0 0 11.99899 193.22459 637.09289 Tm +0 0 0 sc +-0.00119 Tc +0.06118 Tw +( contai)Tj [-13.39999 ]TJ (ns patterns fo)Tj [-11.19999 ]TJ (r )Tj +/N173 1 Tf +11.03909 0 0 11.03909 300.13569 637.09289 Tm +-0.00219 Tc +0 Tw +(VARIABL)Tj [-10.89999 ]TJ (E)Tj +/N231 1 Tf +11.99899 0 0 11.99899 353.05119 637.09289 Tm +-0.00099 Tc +0.06098 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 377.76919 637.09289 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 423.96528 637.09289 Tm +0.00039 Tc +0.05958 Tw +( tok)Tj [-9.59999 ]TJ (e)Tj [4.19999 ]TJ (ns. )Tj [-10 ]TJ (I)Tj [13.39999 ]TJ (n)Tj [-9.59999 ]TJ ( addition, )Tj +-27.82998 -1.19999 TD +-0.00138 Tc +0.36138 Tw +(tokens are defined fo)Tj [-11.39999 ]TJ (r)Tj [-8.39999 ]TJ ( 2-chara)Tj [-7.59999 ]TJ (c)Tj [2.39999 ]TJ (ter ope)Tj [-7.59999 ]TJ (rators )Tj [-10 ]TJ (such as )Tj +/N173 1 Tf +11.03909 0 0 11.03909 374.88938 622.69409 Tm +-0.00219 Tc +0 Tw +(EQ)Tj +/N231 1 Tf +11.99899 0 0 11.99899 388.08828 622.69409 Tm +-0.00099 Tc +0.36099 Tw +( and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 420.00569 622.69409 Tm +-0.00219 Tc +0 Tw +(NE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 433.20458 622.69409 Tm +-0.00099 Tc +0.36099 Tw +(. S)Tj [5.09999 ]TJ (i)Tj [-3.19999 ]TJ (ng)Tj [9 ]TJ (le-)Tj [-8 ]TJ (c)Tj [2.79998 ]TJ (har)Tj [-8 ]TJ (acte)Tj [-7.19999 ]TJ (r)Tj [2 ]TJ ( )Tj +-28.59999 -1.18998 TD +0.00129 Tc +-0.00129 Tw +(ope)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ (a)Tj [5.09999 ]TJ (tor)Tj [4.29998 ]TJ (s)Tj [0.5 ]TJ ( ar)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ ( simpl)Tj [-10.89999 ]TJ (y)Tj [21.29998 ]TJ ( )Tj [-10 ]TJ (r)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ (tu)Tj [-8.69999 ]TJ (r)Tj [4.29998 ]TJ (n)Tj [1.29998 ]TJ (e)Tj [5.09999 ]TJ (d)Tj [1.39999 ]TJ ( a)Tj [5.09999 ]TJ (s)Tj [0.5 ]TJ ( the)Tj [5.09999 ]TJ (m)Tj [-0.89999 ]TJ (se)Tj [5.09999 ]TJ (lve)Tj [5.09999 ]TJ (s)Tj [0.5 ]TJ (. )Tj +0 -1.16999 TD +-0.00209 Tc +1.25209 Tw +( The )Tj +0 0 1 sc +3.30999 0 TD +0.00068 Tc +-0.00068 Tw +(y)Tj [20.69999 ]TJ (a)Tj [-5.5 ]TJ (c)Tj [-5.5 ]TJ (c)Tj [4.5 ]TJ ( input file)Tj +ET +129.75 593.05699 68.51399 -0.59999 rf +BT +11.99899 0 0 11.99899 198.26419 594.37649 Tm +0 0 0 sc +-0.00039 Tc +0.00039 Tw +( defin)Tj [-10.39999 ]TJ (e)Tj [3.39999 ]TJ (s )Tj +/N173 1 Tf +11.03909 0 0 11.03909 238.94079 594.37649 Tm +-0.00219 Tc +0 Tw +(YYSTYPE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 285.13688 594.37649 Tm +-0.00088 Tc +0.00088 Tw +(, the t)Tj [-13.09999 ]TJ (y)Tj [19.09999 ]TJ (p)Tj [-10.89999 ]TJ (e)Tj [2.89999 ]TJ ( of )Tj +/N173 1 Tf +11.03909 0 0 11.03909 345.49189 594.37649 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 385.08859 594.37649 Tm +-0.00079 Tc +0.00079 Tw +(, as )Tj +-24.58999 -1.18998 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 568.09869 Tm +-0.00219 Tc +(%union)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (iValue;)Tj [-7336.89999 ]TJ (/*)Tj [-597.89999 ]TJ (integer)Tj [-597.89999 ]TJ (value)Tj [-597.89999 ]TJ (*/)Tj +T* +(char)Tj [-597.89999 ]TJ (sIndex;)Tj [-6739.09999 ]TJ (/*)Tj [-597.89999 ]TJ (symbol)Tj [-597.89999 ]TJ (table)Tj [-597.89999 ]TJ (index)Tj [-597.89999 ]TJ (*/)Tj +T* +(nodeType)Tj [-597.89999 ]TJ (*nPtr;)Tj [-4945.59999 ]TJ (/*)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (pointer)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(};)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 504.02398 Tm +0 Tc +( )Tj +0 -1.16999 TD +0.00099 Tc +-0.00099 Tw +(This c)Tj [4.79998 ]TJ (a)Tj [4.79998 ]TJ (u)Tj [1 ]TJ (se)Tj [4.79998 ]TJ (s the)Tj [4.79998 ]TJ ( f)Tj [4 ]TJ (o)Tj [1 ]TJ (llowin)Tj [-9 ]TJ (g)Tj [11 ]TJ ( to be)Tj [4.79998 ]TJ ( )Tj [-10 ]TJ (ge)Tj [4.79998 ]TJ (ne)Tj [4.79998 ]TJ (ra)Tj [4.79998 ]TJ (te)Tj [4.79998 ]TJ (d in )Tj +/N173 1 Tf +11.03909 0 0 11.03909 304.57528 489.98519 Tm +-0.00219 Tc +0 Tw +(y.t)Tj [-10.89999 ]TJ (ab.h)Tj +/N231 1 Tf +11.99899 0 0 11.99899 350.89138 489.98519 Tm +0.00219 Tc +(: )Tj +-21.73999 -1.18998 TD +0 Tc +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 463.70739 Tm +-0.00219 Tc +(typedef)Tj [-597.89999 ]TJ (union)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (iValue;)Tj [-7336.89999 ]TJ (/*)Tj [-597.89999 ]TJ (integer)Tj [-597.89999 ]TJ (value)Tj [-597.89999 ]TJ (*/)Tj +T* +(char)Tj [-597.89999 ]TJ (sIndex;)Tj [-6739.09999 ]TJ (/*)Tj [-597.89999 ]TJ (symbol)Tj [-597.89999 ]TJ (table)Tj [-597.89999 ]TJ (index)Tj [-597.89999 ]TJ (*/)Tj +T* +(nodeType)Tj [-597.89999 ]TJ (*nPtr;)Tj [-4945.59999 ]TJ (/*)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (pointer)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (YYSTYPE;)Tj +0 -1.11959 TD +(extern)Tj [-597.89999 ]TJ (YYSTYPE)Tj [-597.89999 ]TJ (yylval;)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 387.15368 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00048 Tc +0.00048 Tw +(Constants, variables, )Tj [-10 ]TJ (and)Tj [-10.5 ]TJ ( nodes c)Tj [-6.59999 ]TJ (a)Tj [3.29998 ]TJ (n b)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ ( r)Tj [-7.5 ]TJ (e)Tj [3.29998 ]TJ (pres)Tj [-11.29998 ]TJ (ente)Tj [-6.69999 ]TJ (d b)Tj [-10.5 ]TJ (y)Tj [19.5 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 351.61138 373.11489 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 391.20809 373.11489 Tm +-0.00068 Tc +0.00068 Tw +( in the)Tj [-6.89999 ]TJ ( pars)Tj [-11.5 ]TJ (e)Tj [-6.89999 ]TJ (r\222s value)Tj [-6.89999 ]TJ ( stack. )Tj +-25.09999 -1.18998 TD +-0.00048 Tc +0.00048 Tw +(Notice the t)Tj [-22.69999 ]TJ (y)Tj [19.5 ]TJ (pe de)Tj [-6.69999 ]TJ (finitions )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 333.03829 Tm +-0.00219 Tc +(%token)Tj [-597.89999 ]TJ ()Tj [-597.89999 ]TJ (INTEGER)Tj +0 -1.13038 TD +(%type)Tj [-597.89999 ]TJ ()Tj [-597.89999 ]TJ (expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 306.28048 Tm +0 Tc +( )Tj +0 -1.16999 TD +0.00059 Tc +0.20939 Tw +(This binds )Tj +/N173 1 Tf +11.03909 0 0 11.03909 148.46829 292.24159 Tm +-0.00219 Tc +0 Tw +(expr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 174.86608 292.24159 Tm +0.00109 Tc +0.20889 Tw +( to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 195.26438 292.24159 Tm +-0.00219 Tc +0 Tw +(nP)Tj [10.79998 ]TJ (tr)Tj +/N231 1 Tf +11.99899 0 0 11.99899 221.54219 292.24159 Tm +-0.00059 Tc +0.21058 Tw +(, and )Tj +/N173 1 Tf +11.03909 0 0 11.03909 252.85958 292.24159 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 299.05578 292.24159 Tm +0.00109 Tc +0.20889 Tw +( to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 319.45408 292.24159 Tm +-0.00219 Tc +0 Tw +(iValue)Tj +/N231 1 Tf +11.99899 0 0 11.99899 359.05079 292.24159 Tm +0.00109 Tc +0.20889 Tw +( in the)Tj [4.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 399.60739 292.24159 Tm +-0.00219 Tc +0 Tw +(YYSTYPE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 445.80349 292.24159 Tm +0.00068 Tc +0.20928 Tw +( union. This is)Tj [9.89999 ]TJ ( )Tj +-29.64999 -1.18998 TD +-0.00219 Tc +0.00219 Tw +(requi)Tj [-4.39999 ]TJ (red so t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (at)Tj [-4.39999 ]TJ ( )Tj [-20 ]TJ (y)Tj [17.79998 ]TJ (a)Tj [-8.39999 ]TJ (cc )Tj [-10 ]TJ (can )Tj [-10 ]TJ (g)Tj [7.79998 ]TJ (e)Tj [1.59999 ]TJ (n)Tj [-12.19999 ]TJ (e)Tj [1.59999 ]TJ (rat)Tj [-14.39999 ]TJ (e)Tj [1.59999 ]TJ ( t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e co)Tj [-12.19999 ]TJ (rre)Tj [-8.39999 ]TJ (ct)Tj [-4.39999 ]TJ ( code)Tj [-8.39999 ]TJ (. For ex)Tj [-12.19999 ]TJ (am)Tj [-4.39999 ]TJ (pl)Tj [-4.39999 ]TJ (e, t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e rul)Tj [-4.39999 ]TJ (e)Tj [1.69999 ]TJ ( )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 252.16499 Tm +-0.00219 Tc +(expr:)Tj [-597.89999 ]TJ (INTEGER)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (con\($1\);)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 237.88619 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00019 Tc +0.08018 Tw +(should g)Tj [9.79998 ]TJ (e)Tj [3.59999 ]TJ (n)Tj [-10.19999 ]TJ (e)Tj [3.59999 ]TJ (rate)Tj [-6.39999 ]TJ ( the follo)Tj [-10.19999 ]TJ (wing)Tj [9.79998 ]TJ ( )Tj [-10 ]TJ (code. Note)Tj [-6.39999 ]TJ ( that )Tj +/N173 1 Tf +11.03909 0 0 11.03909 318.73408 223.84739 Tm +-0.00219 Tc +0 Tw +(yy)Tj [-10.89999 ]TJ (vsp[0])Tj +/N231 1 Tf +11.99899 0 0 11.99899 371.64968 223.84739 Tm +-0.00109 Tc +0.08108 Tw +( addresses)Tj [-11.89999 ]TJ ( the to)Tj [-11.09999 ]TJ (p of the value )Tj +-23.46998 -1.19999 TD +-0.00178 Tc +0.00178 Tw +(st)Tj [-4 ]TJ (ack, or t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (e val)Tj [-4 ]TJ (u)Tj [-11.79998 ]TJ (e associ)Tj [-14 ]TJ (at)Tj [-4 ]TJ (ed wi)Tj [-4 ]TJ (t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 256.93919 209.44859 Tm +-0.00219 Tc +0 Tw +(INTEGER)Tj +/N231 1 Tf +11.99899 0 0 11.99899 303.13539 209.44859 Tm +0 Tc +(. )Tj +-17.75999 -1.18998 TD +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 183.17079 Tm +-0.00219 Tc +(yylval.nPtr)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (con\(yyvsp[0].iValue\);)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 168.89199 Tm +0 Tc +( )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 22 22 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 22)Tj +0 55.84999 TD +-0.00028 Tc +0.00028 Tw +(The unar)Tj [-17.29998 ]TJ (y)Tj [19.69999 ]TJ ( minus oper)Tj [-7.29998 ]TJ (a)Tj [3.5 ]TJ (to)Tj [-10.29998 ]TJ (r is g)Tj [9.69999 ]TJ (i)Tj [-2.5 ]TJ (ven hi)Tj [-12.5 ]TJ (g)Tj [9.69999 ]TJ (h)Tj [-0.29998 ]TJ (e)Tj [-6.5 ]TJ (r)Tj [2.69999 ]TJ ( priorit)Tj [-22.5 ]TJ (y)Tj [19.69999 ]TJ ( )Tj [-10 ]TJ (than binar)Tj [-17.29998 ]TJ (y)Tj [19.69999 ]TJ ( oper)Tj [-7.29998 ]TJ (a)Tj [3.5 ]TJ (tors as f)Tj [-7.29998 ]TJ (o)Tj [-0.29998 ]TJ (llows: )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 683.40908 Tm +-0.00219 Tc +(%left)Tj [-597.89999 ]TJ (GE)Tj [-597.89999 ]TJ (LE)Tj [-597.89999 ]TJ (EQ)Tj [-597.89999 ]TJ (NE)Tj [-597.89999 ]TJ ('>')Tj [-597.89999 ]TJ ('<')Tj +0 -1.13038 TD +(%left)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ ('-')Tj +T* +(%left)Tj [-597.89999 ]TJ ('*')Tj [-597.89999 ]TJ ('/')Tj +T* +(%nonassoc)Tj [-597.89999 ]TJ (UMINUS)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 631.81338 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00209 Tc +(The )Tj +/N173 1 Tf +11.03909 0 0 11.03909 111.87139 617.77449 Tm +-0.00219 Tc +(%nonassoc)Tj +/N231 1 Tf +11.99899 0 0 11.99899 171.26638 617.77449 Tm +0.00109 Tc +0.01889 Tw +( indic)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ (es no a)Tj [4.89999 ]TJ (ssoc)Tj [4.89999 ]TJ (i)Tj [-1.09999 ]TJ (a)Tj [4.89999 ]TJ (tivit)Tj [-11.09999 ]TJ (y)Tj [21.09999 ]TJ ( is implie)Tj [4.89999 ]TJ (d. )Tj [-10 ]TJ (I)Tj [24.09999 ]TJ (t)Tj [-1.09999 ]TJ ( is )Tj [-10 ]TJ (f)Tj [4.09999 ]TJ (r)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (qu)Tj [-8.89999 ]TJ (e)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ (tl)Tj [-11.09999 ]TJ (y)Tj [21.09999 ]TJ ( us)Tj [-9.69999 ]TJ (e)Tj [4.89999 ]TJ (d)Tj [1.09999 ]TJ ( )Tj [-10 ]TJ (in c)Tj [4.89999 ]TJ (onjunc)Tj [4.89999 ]TJ (tion )Tj +-6.76998 -1.20999 TD +0.00059 Tc +0 Tw +(with )Tj +/N173 1 Tf +11.03909 0 0 11.03909 114.39109 603.25569 Tm +-0.00219 Tc +(%prec)Tj +/N231 1 Tf +11.99899 0 0 11.99899 147.38839 603.25569 Tm +-0.00189 Tc +0.00189 Tw +( t)Tj [-4.09999 ]TJ (o)Tj [-1.89999 ]TJ ( speci)Tj [-4.09999 ]TJ (f)Tj [-8.89999 ]TJ (y)Tj [18.09999 ]TJ ( p)Tj [-11.89999 ]TJ (r)Tj [-8.89999 ]TJ (eced)Tj [-11.89999 ]TJ (ence o)Tj [-11.89999 ]TJ (f)Tj [1.09999 ]TJ ( a rul)Tj [-14.09999 ]TJ (e)Tj [1.89999 ]TJ (. Thus,)Tj [-11.89999 ]TJ ( we have )Tj +-4.77999 -1.18998 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 576.97789 Tm +-0.00219 Tc +(expr:)Tj [-597.89999 ]TJ ('-')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (%prec)Tj [-597.89999 ]TJ (UMINUS)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (node\(UMINUS,)Tj [-597.89999 ]TJ (1,)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 562.69909 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00209 Tc +0.02209 Tw +(i)Tj [-4.29998 ]TJ (ndi)Tj [-4.29998 ]TJ (cat)Tj [-4.29998 ]TJ (i)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ (g)Tj [7.89999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (at)Tj [-4.29998 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e)Tj [-8.29998 ]TJ ( pre)Tj [-8.29998 ]TJ (ced)Tj [-12.09999 ]TJ (ence o)Tj [-12.09999 ]TJ (f)Tj [0.89999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e rul)Tj [-14.29998 ]TJ (e)Tj [1.69999 ]TJ ( i)Tj [-4.29998 ]TJ (s)Tj [-2.89999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e sa)Tj [-8.29998 ]TJ (m)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ ( as t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e pr)Tj [-9.09999 ]TJ (ec)Tj [-8.29998 ]TJ (edenc)Tj [-8.29998 ]TJ (e)Tj [1.69999 ]TJ ( of )Tj [-10 ]TJ (t)Tj [-4.29998 ]TJ (oken )Tj +/N173 1 Tf +11.03909 0 0 11.03909 479.28079 548.66029 Tm +-0.00219 Tc +0 Tw +(UMINUS)Tj +/N231 1 Tf +11.99899 0 0 11.99899 518.87739 548.66029 Tm +0.00999 Tc +(. )Tj +-35.73999 -1.20999 TD +-0.00079 Tc +0.01078 Tw +(And, as de)Tj [-7 ]TJ (fined abov)Tj [-10.79998 ]TJ (e, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 203.78369 534.14149 Tm +-0.00219 Tc +0 Tw +(U)Tj [-10.89999 ]TJ (MINUS)Tj +/N231 1 Tf +11.99899 0 0 11.99899 243.50039 534.14149 Tm +-0.00178 Tc +0.01179 Tw +( has hi)Tj [-14 ]TJ (g)Tj [8.19999 ]TJ (h)Tj [-1.79998 ]TJ (er p)Tj [-11.79998 ]TJ (r)Tj [1.19999 ]TJ (e)Tj [-8 ]TJ (ced)Tj [-11.79998 ]TJ (ence t)Tj [-4 ]TJ (h)Tj [-11.79998 ]TJ (an t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (e ot)Tj [-4 ]TJ (he)Tj [-8 ]TJ (r ope)Tj [-8 ]TJ (ra)Tj [-8 ]TJ (t)Tj [-4 ]TJ (o)Tj [-1.79998 ]TJ (rs. A si)Tj [-4 ]TJ (m)Tj [-4 ]TJ (i)Tj [-3.79998 ]TJ (l)Tj [-4 ]TJ (a)Tj [2 ]TJ (r )Tj +-12.78999 -1.18998 TD +-0.00199 Tc +0.08198 Tw +(t)Tj [-4.19999 ]TJ (echni)Tj [-4.19999 ]TJ (que i)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( us)Tj [-12.79998 ]TJ (ed t)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ ( )Tj [-10 ]TJ (rem)Tj [-14.19999 ]TJ (ove am)Tj [-4.19999 ]TJ (bi)Tj [-14.19999 ]TJ (g)Tj [8 ]TJ (u)Tj [-2 ]TJ (i)Tj [-4.19999 ]TJ (t)Tj [-14.19999 ]TJ (y)Tj [18 ]TJ ( )Tj [-10 ]TJ (associ)Tj [-14.19999 ]TJ (at)Tj [-4.19999 ]TJ (e)Tj [-8.19999 ]TJ (d)Tj [-2 ]TJ ( wi)Tj [-4.19999 ]TJ (t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e i)Tj [-4.19999 ]TJ (f)Tj [-8.79998 ]TJ (-el)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ (e)Tj [-8.19999 ]TJ ( st)Tj [-4.19999 ]TJ (at)Tj [-4.19999 ]TJ (em)Tj [-14.19999 ]TJ (ent)Tj [-4.19999 ]TJ ( \(se)Tj [-8.19999 ]TJ (e)Tj [1.79998 ]TJ ( )Tj +0 0 1 sc +33.28999 0 TD +-0.01298 Tc +0 Tw +(If)Tj [-20 ]TJ (-)Tj [-10 ]TJ (E)Tj [-12.19999 ]TJ (l)Tj [-15.19999 ]TJ (s)Tj [-13.79998 ]TJ (e)Tj [-9.19999 ]TJ ( )Tj +ET + +489.47999 518.54299 32.51699 -0.59999 rf +BT +11.99899 0 0 11.99899 90.03318 506.06379 Tm +0.00109 Tc +(Ambig)Tj [11.09999 ]TJ (u)Tj [1.09999 ]TJ (it)Tj [-11.09999 ]TJ (y)Tj +ET +90.03298 504.74398 51.83599 -0.59999 rf +BT +11.99899 0 0 11.99899 141.86889 506.06379 Tm +0 0 0 sc +-0.00028 Tc +0.00028 Tw +(, p. 35)Tj [-10.29998 ]TJ (\). )Tj +-4.31999 -1.14999 TD +-0.00079 Tc +0.15078 Tw +( )Tj [-1100 ]TJ (The s)Tj [-11.59999 ]TJ (y)Tj [19.19999 ]TJ (ntax)Tj [-10.79998 ]TJ ( tree is constructed bottom-up, alloca)Tj [-7 ]TJ (ting)Tj [9.19999 ]TJ ( the leaf nodes wh)Tj [-10.79998 ]TJ (e)Tj [-7 ]TJ (n)Tj [-0.79998 ]TJ ( variables )Tj +T* +-0.00138 Tc +0.27139 Tw +(and integ)Tj [8.59999 ]TJ (e)Tj [-7.59999 ]TJ (rs are redu)Tj [-11.39999 ]TJ (ce)Tj [-7.59999 ]TJ (d. W)Tj [-7.59999 ]TJ (h)Tj [-1.39999 ]TJ (en operators are encounter)Tj [-8.39999 ]TJ (ed, a node is allocated and )Tj +T* +-0.00088 Tc +0.00088 Tw +(pointers to previousl)Tj [-13.09999 ]TJ (y)Tj [19.09999 ]TJ ( )Tj [-10 ]TJ (allocated nodes)Tj [-11.69999 ]TJ ( ar)Tj [-7.89999 ]TJ (e ente)Tj [-7.09999 ]TJ (red )Tj [-10 ]TJ (as oper)Tj [-7.89999 ]TJ (a)Tj [2.89999 ]TJ (nds. As statemen)Tj [-10.89999 ]TJ (ts are r)Tj [-7.89999 ]TJ (e)Tj [2.89999 ]TJ (duced)Tj [-10.89999 ]TJ (,)Tj [-10.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 450.62849 Tm +-0.00219 Tc +0 Tw +(ex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 103.23208 450.62849 Tm +0.00149 Tc +0.11849 Tw +( is c)Tj [5.29998 ]TJ (a)Tj [5.29998 ]TJ (lle)Tj [5.29998 ]TJ (d)Tj [-8.5 ]TJ ( to do)Tj [-8.5 ]TJ ( a)Tj [5.29998 ]TJ ( d)Tj [-8.5 ]TJ (e)Tj [5.29998 ]TJ (p)Tj [-8.5 ]TJ (t)Tj [-0.69999 ]TJ (h-)Tj [4.5 ]TJ (f)Tj [4.5 ]TJ (i)Tj [-0.69999 ]TJ (r)Tj [4.5 ]TJ (s)Tj [0.69999 ]TJ (t wa)Tj [5.29998 ]TJ (lk)Tj [-8.5 ]TJ ( of)Tj [4.5 ]TJ ( the s)Tj [-19.29998 ]TJ (y)Tj [21.5 ]TJ (nt)Tj [-10.69999 ]TJ (a)Tj [5.29998 ]TJ (x)Tj [-8.5 ]TJ ( tr)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (e)Tj [5.29998 ]TJ (.)Tj [1.5 ]TJ ( Sinc)Tj [5.29998 ]TJ (e the)Tj [5.29998 ]TJ ( t)Tj [-10.69999 ]TJ (r)Tj [4.5 ]TJ (e)Tj [5.29998 ]TJ (e)Tj [-4.69999 ]TJ ( w)Tj [-6.29998 ]TJ (a)Tj [5.29998 ]TJ (s c)Tj [5.29998 ]TJ (onstr)Tj [4.5 ]TJ (u)Tj [-8.5 ]TJ (c)Tj [5.5 ]TJ (te)Tj [5.29998 ]TJ (d )Tj +-1.09999 -1.18998 TD +-0.00039 Tc +0.02038 Tw +(bottom-up, a depth-)Tj [-7.39999 ]TJ (first )Tj [-10 ]TJ (walk visits nodes in th)Tj [-10.39999 ]TJ (e )Tj [-10 ]TJ (order th)Tj [-10.39999 ]TJ (at the)Tj [-16.59999 ]TJ (y)Tj [19.59999 ]TJ ( )Tj [-10 ]TJ (wer)Tj [-7.39999 ]TJ (e)Tj [3.39999 ]TJ ( ori)Tj [-12.59999 ]TJ (g)Tj [-0.39999 ]TJ (inall)Tj [-12.59999 ]TJ (y)Tj [19.59999 ]TJ ( )Tj [-10 ]TJ (allocated.)Tj [-10.39999 ]TJ ( )Tj +0 -1.14999 TD +0.00119 Tc +0.14878 Tw +(This r)Tj [4.19999 ]TJ (e)Tj [5 ]TJ (sults in ope)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (a)Tj [5 ]TJ (tor)Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ ( be)Tj [5 ]TJ (ing)Tj [11.19999 ]TJ ( a)Tj [5 ]TJ (pplie)Tj [5 ]TJ (d in the)Tj [5 ]TJ ( orde)Tj [5 ]TJ (r)Tj [4.19999 ]TJ ( tha)Tj [5 ]TJ (t)Tj [-1 ]TJ ( they)Tj [21.19999 ]TJ ( )Tj [-10 ]TJ (we)Tj [5 ]TJ (re)Tj [5 ]TJ ( e)Tj [5 ]TJ (n)Tj [1.19999 ]TJ (c)Tj [5 ]TJ (o)Tj [-8.79998 ]TJ (unte)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (e)Tj [5 ]TJ (d)Tj [1.19999 ]TJ ( dur)Tj [4.19999 ]TJ (in)Tj [-8.79998 ]TJ (g )Tj +0 -1.16999 TD +-0.00048 Tc +0.32049 Tw +(parsing)Tj [9.5 ]TJ (.)Tj [-10.5 ]TJ ( Two ve)Tj [-6.69999 ]TJ (rsions of )Tj +/N173 1 Tf +11.03909 0 0 11.03909 227.66169 408.51199 Tm +-0.00219 Tc +0 Tw +(ex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 240.86059 408.51199 Tm +-0.00099 Tc +0.32099 Tw +(, an )Tj +0 0 1 sc +2.32998 0 TD +0.00119 Tc +0.32879 Tw +(inte)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (p)Tj [-8.79998 ]TJ (r)Tj [4.19999 ]TJ (e)Tj [5 ]TJ (tive)Tj [5 ]TJ ( ve)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (s)Tj [0.39999 ]TJ (ion)Tj +ET +268.81799 407.19198 97.55198 -0.59999 rf +BT +11.99899 0 0 11.99899 366.37008 408.51199 Tm +0 0 0 sc +-0.00059 Tc +0.32058 Tw +(, and a)Tj [-6.79998 ]TJ ( )Tj +0 0 1 sc +3.84999 0 TD +0.00169 Tc +0.31829 Tw +(c)Tj [5.5 ]TJ (o)Tj [1.69999 ]TJ (mpiler)Tj [4.69999 ]TJ ( ve)Tj [5.5 ]TJ (r)Tj [4.69999 ]TJ (s)Tj [0.89999 ]TJ (ion)Tj +ET +412.56599 407.19198 84.83299 -0.59999 rf +BT +11.99899 0 0 11.99899 497.39918 408.51199 Tm +0 0 0 sc +0.00619 Tc +0.31379 Tw +(,)Tj [6.19999 ]TJ ( ar)Tj [9.19999 ]TJ (e )Tj +-33.94999 -1.17999 TD +-0.00028 Tc +0 Tw +(included. )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 23 23 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 23)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 687.24879 Tm +-0.00009 Tc +0.58689 Tw +(4.2 Inclu)Tj [-5.79998 ]TJ (d)Tj [1.69999 ]TJ (e )Tj [586.39999 ]TJ (Fil)Tj [-8 ]TJ (e)Tj [-0.29998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 656.17138 Tm +-0.00219 Tc +0 Tw +(typedef)Tj [-597.89999 ]TJ (enum)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (typeCon,)Tj [-597.89999 ]TJ (typeId,)Tj [-597.89999 ]TJ (typeOpr)Tj [-597.89999 ]TJ (})Tj [-597.89999 ]TJ (nodeEnum;)Tj +0 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (constants)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(typedef)Tj [-597.89999 ]TJ (struct)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeEnum)Tj [-597.89999 ]TJ (type;)Tj [-8369.69999 ]TJ (/*)Tj [-597.89999 ]TJ (type)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(int)Tj [-597.89999 ]TJ (value;)Tj [-10760.89999 ]TJ (/*)Tj [-597.89999 ]TJ (value)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (constant)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (conNodeType;)Tj +0 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (identifiers)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(typedef)Tj [-597.89999 ]TJ (struct)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeEnum)Tj [-597.89999 ]TJ (type;)Tj [-8369.69999 ]TJ (/*)Tj [-597.89999 ]TJ (type)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(int)Tj [-597.89999 ]TJ (i;)Tj [-13152.29998 ]TJ (/*)Tj [-597.89999 ]TJ (subscript)Tj [-597.89999 ]TJ (to)Tj [-597.89999 ]TJ (ident)Tj [-597.89999 ]TJ (array)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (idNodeType;)Tj +0 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (operators)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(typedef)Tj [-597.89999 ]TJ (struct)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeEnum)Tj [-597.89999 ]TJ (type;)Tj [-8369.69999 ]TJ (/*)Tj [-597.89999 ]TJ (type)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(int)Tj [-597.89999 ]TJ (oper;)Tj [-11358.79998 ]TJ (/*)Tj [-597.89999 ]TJ (operator)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(int)Tj [-597.89999 ]TJ (nops;)Tj [-11358.79998 ]TJ (/*)Tj [-597.89999 ]TJ (number)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (operands)Tj [-597.89999 ]TJ (*/)Tj +T* +(union)Tj [-597.89999 ]TJ (nodeTypeTag)Tj [-597.89999 ]TJ (*op[1];)Tj [-1793.5 ]TJ (/*)Tj [-597.89999 ]TJ (operands)Tj [-597.89999 ]TJ (\(expandable\))Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (oprNodeType;)Tj +0 -2.26089 TD +(typedef)Tj [-597.89999 ]TJ (union)Tj [-597.89999 ]TJ (nodeTypeTag)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeEnum)Tj [-597.89999 ]TJ (type;)Tj [-8369.69999 ]TJ (/*)Tj [-597.89999 ]TJ (type)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(conNodeType)Tj [-597.89999 ]TJ (con;)Tj [-7174 ]TJ (/*)Tj [-597.89999 ]TJ (constants)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(idNodeType)Tj [-597.89999 ]TJ (id;)Tj [-8369.69999 ]TJ (/*)Tj [-597.89999 ]TJ (identifiers)Tj [-597.89999 ]TJ (*/)Tj +T* +(oprNodeType)Tj [-597.89999 ]TJ (opr;)Tj [-7174 ]TJ (/*)Tj [-597.89999 ]TJ (operators)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (nodeType;)Tj +0 -2.26089 TD +(extern)Tj [-597.89999 ]TJ (int)Tj [-597.89999 ]TJ (sym[26];)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 24 24 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 24)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 687.24879 Tm +-0.00048 Tc +0.58729 Tw +(4.3 Lex )Tj [586.39999 ]TJ (In)Tj [-6.19999 ]TJ (pu)Tj [-6.19999 ]TJ (t )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 656.17138 Tm +-0.00219 Tc +0 Tw +(%{)Tj +0 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ()Tj +T* +(#include)Tj [-597.89999 ]TJ ("calc3.h")Tj +T* +(#include)Tj [-597.89999 ]TJ ("y.tab.h")Tj +T* +(%})Tj +0 -2.25 TD +(%%)Tj +0 -2.26089 TD +([a-z])Tj [-4184.79998 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval.sIndex)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (*yytext)Tj [-597.69999 ]TJ (-)Tj [-597.89999 ]TJ ('a';)Tj +T* +(return)Tj [-597.89999 ]TJ (VARIABLE;)Tj +-2.39129 -1.11959 TD +0 Tc +(})Tj +-7.17399 -2.26089 TD +-0.00219 Tc +([0-9]+)Tj [-3587 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval.iValue)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (atoi\(yytext\);)Tj +T* +(return)Tj [-597.89999 ]TJ (INTEGER;)Tj +-2.39138 -1.13038 TD +0 Tc +(})Tj +-7.17388 -2.25 TD +-0.00219 Tc +([-\(\)<>=+*/;{}.])Tj [-597.89999 ]TJ ({)Tj +9.56529 -1.13038 TD +(return)Tj [-597.89999 ]TJ (*yytext;)Tj +-1.79348 -1.13038 TD +0 Tc +(})Tj +-7.77178 -2.26089 TD +-0.00219 Tc +(">=")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (GE;)Tj +0 -1.13038 TD +("<=")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (LE;)Tj +0 -1.11959 TD +("==")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (EQ;)Tj +0 -1.13038 TD +("!=")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (NE;)Tj +T* +("while")Tj [-5380.5 ]TJ (return)Tj [-597.89999 ]TJ (WHILE;)Tj +T* +("if")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (IF;)Tj +T* +("else")Tj [-5978.29998 ]TJ (return)Tj [-597.79998 ]TJ (ELSE;)Tj +T* +("print")Tj [-5380.5 ]TJ (return)Tj [-597.89999 ]TJ (PRINT;)Tj +0 -2.25 TD +([)Tj [-597.89999 ]TJ (\\t\\n]+)Tj [-4782.69999 ]TJ (;)Tj [-4184.79998 ]TJ (/)Tj [0 ]TJ (*)Tj [-597.89999 ]TJ (ignore)Tj [-597.89999 ]TJ (whitespace)Tj [-597.89999 ]TJ (*/)Tj +0 -2.26089 TD +(.)Tj [-8967.5 ]TJ (yyerror\("Unknown)Tj [-597.89999 ]TJ (character"\);)Tj +0 -1.13038 TD +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (yywrap\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(return)Tj [-597.89999 ]TJ (1;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 25 25 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 25)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 687.24879 Tm +-0.00009 Tc +0.58689 Tw +(4.4 Yacc )Tj [586.39999 ]TJ (Inp)Tj [-5.79998 ]TJ (u)Tj [1.69999 ]TJ (t )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 656.17138 Tm +-0.00219 Tc +0 Tw +(%{)Tj +0 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ()Tj +T* +(#include)Tj [-597.89999 ]TJ ()Tj +T* +(#include)Tj [-597.89999 ]TJ ()Tj +T* +(#include)Tj [-597.79998 ]TJ ("calc3.h")Tj +0 -2.25 TD +(/*)Tj [-597.89999 ]TJ (prototypes)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(nodeType)Tj [-597.89999 ]TJ (*opr\(int)Tj [-597.89999 ]TJ (oper,)Tj [-597.89999 ]TJ (int)Tj [-597.89999 ]TJ (nops,)Tj [-597.89999 ]TJ (...\);)Tj +T* +(nodeType)Tj [-597.89999 ]TJ (*id\(int)Tj [-597.89999 ]TJ (i\);)Tj +T* +(nodeType)Tj [-597.89999 ]TJ (*con\(int)Tj [-597.89999 ]TJ (value\);)Tj +T* +(void)Tj [-597.89999 ]TJ (freeNode\(nodeType)Tj [-597.89999 ]TJ (*p\);)Tj +0 -2.25 TD +(void)Tj [-597.89999 ]TJ (yyerror\(char)Tj [-597.89999 ]TJ (*s\);)Tj +0 -1.13038 TD +(int)Tj [-597.89999 ]TJ (sym[26];)Tj [-11956.59999 ]TJ (/*)Tj [-597.89999 ]TJ (symbol)Tj [-597.89999 ]TJ (table)Tj [-597.89999 ]TJ (*/)Tj +T* +(%})Tj +0 -2.26089 TD +(%union)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(int)Tj [-597.89999 ]TJ (iValue;)Tj [-10163 ]TJ (/*)Tj [-597.89999 ]TJ (integer)Tj [-597.89999 ]TJ (value)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(char)Tj [-597.89999 ]TJ (sIndex;)Tj [-9565.29998 ]TJ (/*)Tj [-597.89999 ]TJ (symbol)Tj [-597.89999 ]TJ (table)Tj [-597.89999 ]TJ (index)Tj [-597.89999 ]TJ (*/)Tj +T* +(nodeType)Tj [-597.89999 ]TJ (*nPtr;)Tj [-7771.79998 ]TJ (/*)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (pointer)Tj [-597.89999 ]TJ (*/)Tj +-2.39129 -1.13038 TD +(};)Tj +0 -2.26089 TD +(%token)Tj [-597.89999 ]TJ ()Tj [-597.89999 ]TJ (INTEGER)Tj +0 -1.13038 TD +(%token)Tj [-597.89999 ]TJ ()Tj [-597.89999 ]TJ (VARIABLE)Tj +0 -1.11959 TD +(%token)Tj [-597.89999 ]TJ (WHILE)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (PRINT)Tj +0 -1.13038 TD +(%nonassoc)Tj [-597.89999 ]TJ (IFX)Tj +T* +(%nonassoc)Tj [-597.89999 ]TJ (ELSE)Tj +0 -2.26089 TD +(%left)Tj [-597.89999 ]TJ (GE)Tj [-597.89999 ]TJ (LE)Tj [-597.89999 ]TJ (EQ)Tj [-597.89999 ]TJ (NE)Tj [-597.89999 ]TJ ('>')Tj [-597.89999 ]TJ ('<')Tj +0 -1.13038 TD +(%left)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ ('-')Tj +0 -1.11959 TD +(%left)Tj [-597.89999 ]TJ ('*')Tj [-597.89999 ]TJ ('/')Tj +0 -1.13038 TD +(%nonassoc)Tj [-597.89999 ]TJ (UMINUS)Tj +0 -2.26089 TD +(%type)Tj [-597.89999 ]TJ ()Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt_list)Tj +T* +(%%)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 26 26 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 26)Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 711.00679 Tm +-0.00219 Tc +0 Tw +(program:)Tj +4.78259 -1.13038 TD +(function)Tj [-9565.29998 ]TJ ({)Tj [-597.89999 ]TJ (exit\(0\);)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.25 TD +-0.00219 Tc +(function:)Tj +5.97828 -1.13038 TD +(function)Tj [-597.89999 ]TJ (stmt)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ (ex\($2\);)Tj [-597.89999 ]TJ (freeNode\($2\);)Tj [-597.89999 ]TJ (})Tj +-1.19569 -1.13038 TD +(|)Tj [-597.89999 ]TJ (/)Tj [0 ]TJ (*)Tj [-597.89999 ]TJ (NULL)Tj [-597.89999 ]TJ (*/)Tj +T* +0 Tc +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(stmt:)Tj +5.97828 -1.11959 TD +(';')Tj [-11358.79998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(';',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ (NULL,)Tj [-597.89999 ]TJ (NULL\);)Tj [-597.89999 ]TJ (})Tj +-1.19569 -1.13038 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';')Tj [-8369.69999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($1;)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (PRINT)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';')Tj [-4782.69999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(PRINT,)Tj [-597.89999 ]TJ (1,)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (VARIABLE)Tj [-597.89999 ]TJ ('=')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';')Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('=',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ (id\($1\),)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.79998 ]TJ (WHILE)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj +4.78259 -1.13038 TD +({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(WHILE,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($3,)Tj [-597.89999 ]TJ ($5\);)Tj [-597.89999 ]TJ (})Tj +-4.78259 -1.11959 TD +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (%prec)Tj [-597.89999 ]TJ (IFX)Tj +4.78259 -1.13038 TD +({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(IF,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($3,)Tj [-597.89999 ]TJ ($5\);)Tj [-597.89999 ]TJ (})Tj +-4.78259 -1.13038 TD +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +4.78259 -1.13038 TD +({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(IF,)Tj [-597.89999 ]TJ (3,)Tj [-597.89999 ]TJ ($3,)Tj [-597.89999 ]TJ ($5,)Tj [-597.89999 ]TJ ($7\);)Tj [-597.69999 ]TJ (})Tj +-4.78259 -1.13038 TD +(|)Tj [-597.89999 ]TJ ('{')Tj [-597.89999 ]TJ (stmt_list)Tj [-597.89999 ]TJ ('}')Tj [-2989.19999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($2;)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.25 TD +-0.00219 Tc +(stmt_list:)Tj +5.97828 -1.13038 TD +(stmt)Tj [-10761 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($1;)Tj [-597.89999 ]TJ (})Tj +-1.19569 -1.13038 TD +(|)Tj [-597.89999 ]TJ (stmt_list)Tj [-597.89999 ]TJ (stmt)Tj [-4782.69999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(';',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(expr:)Tj +5.97828 -1.11959 TD +(INTEGER)Tj [-8967.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (con\($1\);)Tj [-597.89999 ]TJ (})Tj +-1.19569 -1.13038 TD +(|)Tj [-597.89999 ]TJ (VARIABLE)Tj [-8369.69999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (id\($1\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ ('-')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (%prec)Tj [-597.89999 ]TJ (UMINUS)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(UMINUS,)Tj [-597.89999 ]TJ (1,)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('+',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('-')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('-',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('*')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.69999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('*',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('/')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('/',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('<')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('<',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('>')Tj [-597.89999 ]TJ (expr)Tj [-5380.5 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\('>',)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (GE)Tj [-597.89999 ]TJ (expr)Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(GE,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (LE)Tj [-597.89999 ]TJ (expr)Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(LE,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +T* +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (NE)Tj [-597.89999 ]TJ (expr)Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(NE,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (EQ)Tj [-597.89999 ]TJ (expr)Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (opr\(EQ,)Tj [-597.89999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($3\);)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-5978.29998 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($2;)Tj [-597.89999 ]TJ (})Tj +T* +0 Tc +(;)Tj +-4.78259 -2.26089 TD +-0.00219 Tc +(%%)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 27 27 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 27)Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 711.00679 Tm +-0.00219 Tc +0 Tw +(nodeType)Tj [-597.89999 ]TJ (*con\(int)Tj [-597.89999 ]TJ (value\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeType)Tj [-597.89999 ]TJ (*p;)Tj +0 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (allocate)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(if)Tj [-597.89999 ]TJ (\(\(p)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (malloc\(sizeof\(conNodeType\)\)\))Tj [-597.89999 ]TJ (==)Tj [-597.89999 ]TJ (NULL\))Tj +2.39129 -1.13038 TD +(yyerror\("out)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (memory"\);)Tj +-2.39129 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (copy)Tj [-597.89999 ]TJ (information)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(p->type)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (typeCon;)Tj +T* +(p->con.value)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (value;)Tj +0 -2.25 TD +(return)Tj [-597.89999 ]TJ (p;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.26089 TD +-0.00219 Tc +(nodeType)Tj [-597.89999 ]TJ (*id\(int)Tj [-597.89999 ]TJ (i\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(nodeType)Tj [-597.89999 ]TJ (*p;)Tj +0 -2.25 TD +(/*)Tj [-597.89999 ]TJ (allocate)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(if)Tj [-597.89999 ]TJ (\(\(p)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (malloc\(sizeof\(idNodeType\)\)\))Tj [-597.89999 ]TJ (==)Tj [-597.89999 ]TJ (NULL\))Tj +2.39129 -1.13038 TD +(yyerror\("out)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (memory"\);)Tj +-2.39129 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (copy)Tj [-597.89999 ]TJ (information)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(p->type)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (typeId;)Tj +0 -1.11959 TD +(p->id.i)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (i)Tj [0 ]TJ (;)Tj +0 -2.26089 TD +(return)Tj [-597.89999 ]TJ (p;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.26089 TD +-0.00219 Tc +(nodeType)Tj [-597.89999 ]TJ (*opr\(int)Tj [-597.89999 ]TJ (oper,)Tj [-597.79998 ]TJ (int)Tj [-597.89999 ]TJ (nops,)Tj [-597.89999 ]TJ (...\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(va_list)Tj [-597.89999 ]TJ (ap;)Tj +0 -1.13038 TD +(nodeType)Tj [-597.89999 ]TJ (*p;)Tj +T* +(size_t)Tj [-597.89999 ]TJ (size;)Tj +T* +(int)Tj [-597.89999 ]TJ (i;)Tj +0 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (allocate)Tj [-597.89999 ]TJ (node)Tj [-597.89999 ]TJ (*/)Tj +0 -1.11959 TD +(size)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (sizeof\(oprNodeType\))Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ (\(nops)Tj [-597.69999 ]TJ (-)Tj [-597.89999 ]TJ (1)Tj [0 ]TJ (\))Tj [-597.89999 ]TJ (*)Tj [-597.89999 ]TJ (sizeof\(nodeType*\);)Tj +0 -1.13038 TD +(if)Tj [-597.89999 ]TJ (\(\(p)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (malloc\(size\)\))Tj [-597.89999 ]TJ (==)Tj [-597.89999 ]TJ (NULL\))Tj +2.39129 -1.13038 TD +(yyerror\("out)Tj [-597.89999 ]TJ (of)Tj [-597.89999 ]TJ (memory"\);)Tj +-2.39129 -2.26089 TD +(/*)Tj [-597.89999 ]TJ (copy)Tj [-597.89999 ]TJ (information)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(p->type)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (typeOpr;)Tj +0 -1.11959 TD +(p->opr.oper)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (oper;)Tj +0 -1.13038 TD +(p->opr.nops)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (nops;)Tj +T* +(va_start\(ap,)Tj [-597.89999 ]TJ (nops\);)Tj +T* +(for)Tj [-597.89999 ]TJ (\(i)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (0)Tj [0 ]TJ (;)Tj [-597.89999 ]TJ (i)Tj [-597.89999 ]TJ (<)Tj [-597.89999 ]TJ (nops;)Tj [-597.89999 ]TJ (i++\))Tj +2.39129 -1.13038 TD +(p->opr.op[i])Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (va_arg\(ap,)Tj [-597.89999 ]TJ (nodeType*\);)Tj +-2.39129 -1.13038 TD +(va_end\(ap\);)Tj +T* +(return)Tj [-597.89999 ]TJ (p;)Tj +-2.39129 -1.11959 TD +0 Tc +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 28 28 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 28)Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 711.00679 Tm +-0.00219 Tc +0 Tw +(void)Tj [-597.89999 ]TJ (freeNode\(nodeType)Tj [-597.89999 ]TJ (*p\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (i;)Tj +0 -2.26089 TD +(if)Tj [-597.89999 ]TJ (\(!p\))Tj [-597.89999 ]TJ (return;)Tj +0 -1.11959 TD +(if)Tj [-597.89999 ]TJ (\(p->type)Tj [-597.89999 ]TJ (==)Tj [-597.89999 ]TJ (typeOpr\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +0.59568 Tc +(f)Tj [597.89999 ]TJ (o)Tj [597.89999 ]TJ (r)Tj [0 ]TJ (\()Tj [597.89999 ]TJ (i=0)Tj [597.89999 ]TJ (;iopr.nops;)Tj [-597.89999 ]TJ (i++\))Tj +-7.77169 -1.13038 TD +(freeNode\(p->opr.op[i]\);)Tj +-4.78259 -1.13038 TD +0 Tc +(})Tj +T* +-0.00219 Tc +(free)Tj [-597.89999 ]TJ (\(p\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.25 TD +-0.00219 Tc +(void)Tj [-597.89999 ]TJ (yyerror\(char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(fprintf\(stdout,)Tj [-597.89999 ]TJ ("%s\\n",)Tj [-597.89999 ]TJ (s\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -2.26089 TD +-0.00219 Tc +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(yyparse\(\);)Tj +0 -1.13038 TD +(return)Tj [-597.89999 ]TJ (0;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 29 29 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 29)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 687.24879 Tm +0.00019 Tc +0.58659 Tw +(4.5 Interpre)Tj [-7.59999 ]TJ (ter )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 656.17138 Tm +-0.00219 Tc +0 Tw +(#include)Tj [-597.89999 ]TJ ()Tj +0 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ("calc3.h")Tj +T* +(#include)Tj [-597.89999 ]TJ ("y.tab.h")Tj +0 -2.26089 TD +(int)Tj [-597.89999 ]TJ (ex\(nodeType)Tj [-597.89999 ]TJ (*p\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(if)Tj [-597.89999 ]TJ (\(!p\))Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (0;)Tj +0 -1.13038 TD +(switch\(p->type\))Tj [-597.89999 ]TJ ({)Tj +T* +(case)Tj [-597.89999 ]TJ (typeCon:)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (p->con.value;)Tj +T* +(case)Tj [-597.89999 ]TJ (typeId:)Tj [-2989.19999 ]TJ (return)Tj [-597.89999 ]TJ (sym[p->id.i];)Tj +T* +(case)Tj [-597.89999 ]TJ (typeOpr:)Tj +2.39129 -1.13038 TD +(switch\(p->opr.oper\))Tj [-597.89999 ]TJ ({)Tj +0 -1.11959 TD +(case)Tj [-597.89999 ]TJ (WHILE:)Tj [-1195.69999 ]TJ (while\(ex\(p->opr.op[0]\)\))Tj +10.16308 -1.13038 TD +(ex\(p->opr.op[1]\);)Tj +-2.39129 -1.13038 TD +(return)Tj [-597.89999 ]TJ (0;)Tj +-7.77178 -1.13038 TD +(case)Tj [-597.89999 ]TJ (IF:)Tj [-2989.19999 ]TJ (if)Tj [-597.89999 ]TJ (\(ex\(p->opr.op[0]\)\))Tj +10.16308 -1.13038 TD +(ex\(p->opr.op[1]\);)Tj +-2.39129 -1.13038 TD +(else)Tj [-597.89999 ]TJ (if)Tj [-597.69999 ]TJ (\(p->opr.nops)Tj [-597.89999 ]TJ (>)Tj [-597.89999 ]TJ (2)Tj [0 ]TJ (\))Tj +2.39129 -1.11959 TD +(ex\(p->opr.op[2]\);)Tj +-2.39129 -1.13038 TD +(return)Tj [-597.89999 ]TJ (0;)Tj +-7.77178 -1.13038 TD +(case)Tj [-597.89999 ]TJ (PRINT:)Tj [-1195.69999 ]TJ (printf\("%d\\n",)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\)\);)Tj +7.77178 -1.13038 TD +(return)Tj [-597.89999 ]TJ (0;)Tj +-7.77178 -1.13038 TD +(case)Tj [-597.89999 ]TJ (';':)Tj [-2391.39999 ]TJ (ex\(p->opr.op[0]\);)Tj +7.77178 -1.13038 TD +(return)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +-7.77178 -1.13038 TD +(case)Tj [-597.89999 ]TJ ('=':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (sym[p->opr.op[0]->id.i])Tj [-597.89999 ]TJ (=)Tj +10.16308 -1.11959 TD +(ex\(p->opr.op[1]\);)Tj +-10.16308 -1.13038 TD +(case)Tj [-597.89999 ]TJ (UMINUS:)Tj [-597.89999 ]TJ (return)Tj [-597.69999 ]TJ (-ex\(p->opr.op[0]\);)Tj +T* +(case)Tj [-597.89999 ]TJ ('+':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ ('-':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.79998 ]TJ (-)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ ('*':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (*)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ ('/':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (/)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +0 -1.11959 TD +(case)Tj [-597.89999 ]TJ ('<':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (<)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +0 -1.13038 TD +(case)Tj [-597.89999 ]TJ ('>':)Tj [-2391.39999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (>)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ (GE:)Tj [-2989.19999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (>=)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ (LE:)Tj [-2989.19999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (<=)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ (NE:)Tj [-2989.19999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (!=)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +T* +(case)Tj [-597.89999 ]TJ (EQ:)Tj [-2989.19999 ]TJ (return)Tj [-597.89999 ]TJ (ex\(p->opr.op[0]\))Tj [-597.89999 ]TJ (==)Tj [-597.89999 ]TJ (ex\(p->opr.op[1]\);)Tj +0 -1.11959 TD +0 Tc +(})Tj +-2.39129 -1.13038 TD +(})Tj +-2.39129 -1.13038 TD +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 30 30 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 30)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 687.24879 Tm +0.00028 Tc +0.58648 Tw +(4.6 Com)Tj [-5.29998 ]TJ (p)Tj [2.09999 ]TJ (iler )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 656.17138 Tm +-0.00219 Tc +0 Tw +(#include)Tj [-597.89999 ]TJ ()Tj +0 -1.13038 TD +(#include)Tj [-597.89999 ]TJ ("calc3.h")Tj +T* +(#include)Tj [-597.89999 ]TJ ("y.tab.h")Tj +0 -2.26089 TD +(static)Tj [-597.89999 ]TJ (int)Tj [-597.89999 ]TJ (lbl;)Tj +0 -2.25 TD +(int)Tj [-597.89999 ]TJ (ex\(nodeType)Tj [-597.89999 ]TJ (*p\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (lbl1,)Tj [-597.89999 ]TJ (lbl2;)Tj +0 -2.26089 TD +(if)Tj [-597.89999 ]TJ (\(!p\))Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (0;)Tj +0 -1.13038 TD +(switch\(p->type\))Tj [-597.89999 ]TJ ({)Tj +0 -1.11959 TD +(case)Tj [-597.89999 ]TJ (typeCon:)Tj +2.39129 -1.13038 TD +(printf\("\\tpush\\t%d\\n",)Tj [-597.89999 ]TJ (p->con.value\);)Tj +T* +(break;)Tj +-2.39129 -1.13038 TD +(case)Tj [-597.89999 ]TJ (typeId:)Tj +2.39129 -1.13038 TD +(printf\("\\tpush\\t%c\\n",)Tj [-597.89999 ]TJ (p->id.i)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ('a'\);)Tj +T* +(break;)Tj +-2.39129 -1.11959 TD +(case)Tj [-597.89999 ]TJ (typeOpr:)Tj +2.39129 -1.13038 TD +(switch\(p->opr.oper\))Tj [-597.89999 ]TJ ({)Tj +T* +(case)Tj [-597.89999 ]TJ (WHILE:)Tj +2.39129 -1.13038 TD +(printf\("L%03d:\\n",)Tj [-597.89999 ]TJ (lbl1)Tj [-597.89999 ]TJ (=)Tj [-597.79998 ]TJ (lbl++\);)Tj +T* +(ex\(p->opr.op[0]\);)Tj +T* +(printf\("\\tjz\\tL%03d\\n",)Tj [-597.89999 ]TJ (lbl2)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (lbl++\);)Tj +T* +(ex\(p->opr.op[1]\);)Tj +0 -1.11959 TD +(printf\("\\tjmp\\tL%03d\\n",)Tj [-597.89999 ]TJ (lbl1\);)Tj +0 -1.13038 TD +(printf\("L%03d:\\n",)Tj [-597.89999 ]TJ (lbl2\);)Tj +T* +(break;)Tj +-2.39129 -1.13038 TD +(case)Tj [-597.89999 ]TJ (IF:)Tj +2.39129 -1.13038 TD +(ex\(p->opr.op[0]\);)Tj +T* +(if)Tj [-597.89999 ]TJ (\(p->opr.nops)Tj [-597.89999 ]TJ (>)Tj [-597.89999 ]TJ (2)Tj [0 ]TJ (\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(/*)Tj [-597.89999 ]TJ (if)Tj [-597.89999 ]TJ (else)Tj [-597.89999 ]TJ (*/)Tj +0 -1.13038 TD +(printf\("\\tjz\\tL%03d\\n",)Tj [-597.89999 ]TJ (lbl1)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (lbl++\);)Tj +T* +(ex\(p->opr.op[1]\);)Tj +T* +(printf\("\\tjmp\\tL%03d\\n",)Tj [-597.89999 ]TJ (lbl2)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (lbl++\);)Tj +T* +(printf\("L%03d:\\n",)Tj [-597.79998 ]TJ (lbl1\);)Tj +T* +(ex\(p->opr.op[2]\);)Tj +0 -1.11959 TD +(printf\("L%03d:\\n",)Tj [-597.89999 ]TJ (lbl2\);)Tj +-2.39129 -1.13038 TD +(})Tj [-597.89999 ]TJ (else)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(/*)Tj [-597.89999 ]TJ (if)Tj [-597.89999 ]TJ (*/)Tj +T* +(printf\("\\tjz\\tL%03d\\n",)Tj [-597.89999 ]TJ (lbl1)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (lbl++\);)Tj +T* +(ex\(p->opr.op[1]\);)Tj +T* +(printf\("L%03d:\\n",)Tj [-597.89999 ]TJ (lbl1\);)Tj +-2.39129 -1.11959 TD +0 Tc +(})Tj +0 -1.13038 TD +-0.00219 Tc +(break;)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 31 31 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 31)Tj +/N173 1 Tf +11.03909 0 0 11.03909 142.82908 711.00679 Tm +-0.00219 Tc +0 Tw +(case)Tj [-597.89999 ]TJ (PRINT:)Tj +2.39129 -1.13038 TD +(ex\(p->opr.op[0]\);)Tj +T* +(printf\("\\tprint\\n"\);)Tj +T* +(break;)Tj +-2.39129 -1.11959 TD +(case)Tj [-597.89999 ]TJ ('=':)Tj +2.39129 -1.13038 TD +(ex\(p->opr.op[1]\);)Tj +T* +(printf\("\\tpop\\t%c\\n",)Tj [-597.89999 ]TJ (p->opr.op[0]->id.i)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ('a'\);)Tj +T* +(break;)Tj +-2.39129 -1.13038 TD +(case)Tj [-597.89999 ]TJ (UMINUS:)Tj +2.39129 -1.13038 TD +(ex\(p->opr.op[0]\);)Tj +0 -1.11959 TD +(printf\("\\tneg\\n"\);)Tj +0 -1.13038 TD +(break;)Tj +-2.39129 -1.13038 TD +(default:)Tj +2.39129 -1.13038 TD +(ex\(p->opr.op[0]\);)Tj +T* +(ex\(p->opr.op[1]\);)Tj +T* +(switch\(p->opr.oper\))Tj [-597.89999 ]TJ ({)Tj +0 -1.11959 TD +(case)Tj [-597.89999 ]TJ ('+':)Tj [-1793.5 ]TJ (printf\("\\tadd\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +0 -1.13038 TD +(case)Tj [-597.89999 ]TJ ('-':)Tj [-1793.5 ]TJ (printf\("\\tsub\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ ('*':)Tj [-1793.5 ]TJ (printf\("\\tmul\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ ('/':)Tj [-1793.5 ]TJ (printf\("\\tdiv\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ ('<':)Tj [-1793.5 ]TJ (printf\("\\tcompLT\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ ('>':)Tj [-1793.5 ]TJ (printf\("\\tcompGT\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ (GE:)Tj [-2391.39999 ]TJ (printf\("\\tcompGE\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +0 -1.11959 TD +(case)Tj [-597.89999 ]TJ (LE:)Tj [-2391.39999 ]TJ (printf\("\\tcompLE\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +0 -1.13038 TD +(case)Tj [-597.89999 ]TJ (NE:)Tj [-2391.39999 ]TJ (printf\("\\tcompNE\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +(case)Tj [-597.89999 ]TJ (EQ:)Tj [-2391.39999 ]TJ (printf\("\\tcompEQ\\n"\);)Tj [-597.89999 ]TJ (break;)Tj +T* +0 Tc +(})Tj +-2.39129 -1.13038 TD +(})Tj +-2.39129 -1.13038 TD +(})Tj +-2.39129 -1.11959 TD +(})Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 32 32 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 32)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +-0.00119 Tc +0.48999 Tw +(5. Mo)Tj [-3.69999 ]TJ (re )Tj [486.59999 ]TJ (L)Tj [-3.69999 ]TJ (ex )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +15.95869 0 0 15.95869 90.03318 659.05108 Tm +0 Tc +0.58679 Tw +(5.1 Strings )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 638.65278 Tm +0.00138 Tc +0.03858 Tw +(Quote)Tj [5.19999 ]TJ (d)Tj [1.39999 ]TJ ( str)Tj [4.39999 ]TJ (i)Tj [-0.79998 ]TJ (ng)Tj [11.39999 ]TJ (s fr)Tj [4.39999 ]TJ (e)Tj [5.19999 ]TJ (que)Tj [5.19999 ]TJ (ntl)Tj [-10.79998 ]TJ (y)Tj [21.39999 ]TJ ( )Tj [-10 ]TJ (a)Tj [5.19999 ]TJ (p)Tj [1.39999 ]TJ (p)Tj [-8.59999 ]TJ (e)Tj [5.19999 ]TJ (a)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ ( in pr)Tj [4.39999 ]TJ (o)Tj [-8.59999 ]TJ (g)Tj [1.39999 ]TJ (r)Tj [4.39999 ]TJ (a)Tj [5.19999 ]TJ (mming)Tj [11.39999 ]TJ ( la)Tj [5.19999 ]TJ (n)Tj [-8.59999 ]TJ (g)Tj [11.39999 ]TJ (u)Tj [-8.59999 ]TJ (a)Tj [-4.79998 ]TJ (g)Tj [11.39999 ]TJ (e)Tj [5.19999 ]TJ (s. Her)Tj [4.39999 ]TJ (e)Tj [5.19999 ]TJ ( is one wa)Tj [-14.79998 ]TJ (y)Tj [31.39999 ]TJ ( to ma)Tj [5.19999 ]TJ (t)Tj [-10.79998 ]TJ (c)Tj [5.19999 ]TJ (h a )Tj +0 -1.14999 TD +0.00019 Tc +-0.00019 Tw +(string)Tj [10.19999 ]TJ ( in lex)Tj [-9.79998 ]TJ (:)Tj [-1.89999 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 599.05609 Tm +-0.00219 Tc +(%{)Tj +2.39129 -1.13038 TD +(char)Tj [-597.89999 ]TJ (*yylval;)Tj +T* +(#include)Tj [-597.89999 ]TJ ()Tj +-2.39129 -1.13038 TD +(%})Tj +T* +(%%)Tj +0 -1.11959 TD +(\\"[^"\\n]*["\\n])Tj [-597.89999 ]TJ ({)Tj +6.57609 -1.13038 TD +(yylval)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (strdup\(yytext+1\);)Tj +T* +(if)Tj [-597.89999 ]TJ (\(yylval[yyleng-2])Tj [-597.89999 ]TJ (!=)Tj [-597.89999 ]TJ ('"'\))Tj +2.39129 -1.13038 TD +(warning\("improperly)Tj [-597.89999 ]TJ (terminated)Tj [-597.89999 ]TJ (string"\);)Tj +-2.39129 -1.13038 TD +(else)Tj +2.39129 -1.13038 TD +(yylval[yyleng-2])Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (0)Tj [0 ]TJ (;)Tj +-2.39129 -1.13038 TD +(printf\("found)Tj [-597.89999 ]TJ ('%s'\\n",)Tj [-597.89999 ]TJ (yylval\);)Tj +-2.55439 -1.11959 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 435.26969 Tm +( )Tj +0 -1.14999 TD +-0.00099 Tc +0.33099 Tw +(The above ex)Tj [-11 ]TJ (ample en)Tj [-11 ]TJ (sures that string)Tj [9 ]TJ (s don\222t)Tj [-13.19999 ]TJ ( cross line boundaries,)Tj [-11 ]TJ ( and removes)Tj [-11.79998 ]TJ ( )Tj +0 -1.16999 TD +-0.00059 Tc +0.18058 Tw +(enclosing quotes. )Tj [-10 ]TJ (I)Tj [12.39999 ]TJ (f)Tj [-7.59999 ]TJ ( w)Tj [-8.39999 ]TJ (e)Tj [-6.79998 ]TJ ( wish to add)Tj [-10.59999 ]TJ ( esc)Tj [-6.79998 ]TJ (a)Tj [3.19999 ]TJ (pe s)Tj [-11.39999 ]TJ (e)Tj [-6.79998 ]TJ (quences, su)Tj [-10.59999 ]TJ (ch )Tj [-10 ]TJ (as )Tj +/N173 1 Tf +11.03909 0 0 11.03909 414.48609 407.43209 Tm +-0.00219 Tc +0 Tw +(\\n)Tj +/N231 1 Tf +11.99899 0 0 11.99899 427.68499 407.43209 Tm +0 Tc +0.17999 Tw +( or)Tj [-7 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 448.08329 407.43209 Tm +-0.00219 Tc +0 Tw +(\\")Tj +/N231 1 Tf +11.99899 0 0 11.99899 461.28219 407.43209 Tm +-0.00119 Tc +0.18119 Tw +(, st)Tj [-3.39999 ]TJ (art)Tj [-3.39999 ]TJ ( st)Tj [-3.39999 ]TJ (at)Tj [-13.39999 ]TJ (es )Tj +-30.93998 -1.18998 TD +0.00228 Tc +-0.00228 Tw +(simplify)Tj [32.29998 ]TJ ( m)Tj [-9.89999 ]TJ (a)Tj [6.09999 ]TJ (tte)Tj [6.09999 ]TJ (r)Tj [5.29998 ]TJ (s)Tj [1.5 ]TJ (: )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.42959 367.35539 Tm +-0.00219 Tc +(%{)Tj +0 -1.13038 TD +(char)Tj [-597.89999 ]TJ (buf[100];)Tj +T* +(char)Tj [-597.89999 ]TJ (*s;)Tj +T* +(%})Tj +0 -1.11959 TD +(%x)Tj [-597.89999 ]TJ (STRING)Tj +0 -2.26089 TD +(%%)Tj +T* +(\\")Tj [-8369.69999 ]TJ ({)Tj [-597.89999 ]TJ (BEGIN)Tj [-597.89999 ]TJ (STRING)Tj +17.93489 0 TD +(;)Tj [-597.89999 ]TJ (s)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (buf;)Tj [-597.89999 ]TJ (})Tj +-17.93489 -1.13038 TD +(\\\\n)Tj [-2989.19999 ]TJ ({)Tj [-597.89999 ]TJ (*s++)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ('\\n';)Tj [-597.89999 ]TJ (})Tj +0 -1.11959 TD +(\\\\t)Tj [-2989.19999 ]TJ ({)Tj [-597.89999 ]TJ (*s++)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ('\\t';)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(\\\\\\")Tj [-2391.39999 ]TJ ({)Tj [-597.89999 ]TJ (*s++)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ('\\"';)Tj [-597.89999 ]TJ (})Tj +T* +(\\")Tj [-3587 ]TJ ({)Tj +10.76098 -1.13038 TD +0.59568 Tc +(*)Tj [597.89999 ]TJ (s=0)Tj [597.89999 ]TJ (;)Tj +T* +-0.00219 Tc +(BEGIN)Tj [-597.89999 ]TJ (0;)Tj +T* +(printf\("found)Tj [-597.89999 ]TJ ('%s'\\n",)Tj [-597.89999 ]TJ (buf\);)Tj +-1.19558 -1.13038 TD +0 Tc +(})Tj +-9.56529 -1.11959 TD +-0.00219 Tc +(\\n)Tj [-3587 ]TJ ({)Tj [-597.89999 ]TJ (printf\("invalid)Tj [-597.89999 ]TJ (string"\);)Tj [-597.89999 ]TJ (exit\(1\);)Tj [-597.89999 ]TJ (})Tj +0 -1.13038 TD +(.)Tj [-4184.79998 ]TJ ({)Tj [-597.89999 ]TJ (*s++)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (*yytext;)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 128.81529 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00189 Tc +0.24189 Tw +(Ex)Tj [-11.89999 ]TJ (cl)Tj [-4.09999 ]TJ (usi)Tj [-4.09999 ]TJ (v)Tj [-1.89999 ]TJ (e st)Tj [-4.09999 ]TJ (art)Tj [-4.09999 ]TJ ( st)Tj [-4.09999 ]TJ (at)Tj [-4.09999 ]TJ (e )Tj +/N173 1 Tf +11.03909 0 0 11.03909 197.66419 114.77648 Tm +-0.00219 Tc +0 Tw +(STRING)Tj +/N231 1 Tf +11.99899 0 0 11.99899 237.26089 114.77648 Tm +-0.00028 Tc +0.24029 Tw +( is defined in the)Tj [-6.5 ]TJ ( definition section. W)Tj [-6.5 ]TJ (h)Tj [-0.29998 ]TJ (en the sc)Tj [-6.5 ]TJ (anne)Tj [-6.5 ]TJ (r)Tj [-7.29998 ]TJ ( )Tj +-12.26998 -1.20999 TD +-0.00099 Tc +0.20098 Tw +(detects a quote, the )Tj +/N173 1 Tf +11.03909 0 0 11.03909 194.42449 100.25769 Tm +-0.00219 Tc +0 Tw +(BE)Tj [-10.89999 ]TJ (GIN)Tj +/N231 1 Tf +11.99899 0 0 11.99899 227.54168 100.25769 Tm +0.00138 Tc +0.19859 Tw +( ma)Tj [5.19999 ]TJ (c)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ (o shif)Tj [4.39999 ]TJ (ts le)Tj [5.19999 ]TJ (x)Tj [-8.59999 ]TJ ( in)Tj [11.39999 ]TJ (to the)Tj [5.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 363.85029 100.25769 Tm +-0.00219 Tc +0 Tw +(STRING)Tj +/N231 1 Tf +11.99899 0 0 11.99899 403.44699 100.25769 Tm +0.00048 Tc +0.19949 Tw +( state. )Tj [-10 ]TJ (L)Tj [21.29998 ]TJ (e)Tj [-5.69999 ]TJ (x)Tj [-9.5 ]TJ ( sta)Tj [-5.69999 ]TJ (y)Tj [30.5 ]TJ (s in the)Tj [-5.69999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 85.73889 Tm +-0.00219 Tc +0 Tw +(STRING)Tj +/N231 1 Tf +11.99899 0 0 11.99899 129.62989 85.73889 Tm +0.00138 Tc +0.03858 Tw +( sta)Tj [5.19999 ]TJ (t)Tj [-0.79998 ]TJ (e)Tj [5.19999 ]TJ (,)Tj [1.39999 ]TJ ( re)Tj [5.19999 ]TJ (c)Tj [5.19999 ]TJ (o)Tj [-8.59999 ]TJ (g)Tj [11.39999 ]TJ (n)Tj [1.39999 ]TJ (izing)Tj [11.39999 ]TJ ( onl)Tj [-20.79998 ]TJ (y)Tj [21.39999 ]TJ ( p)Tj [-8.59999 ]TJ (a)Tj [5.19999 ]TJ (tte)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ (n)Tj [1.39999 ]TJ (s tha)Tj [5.19999 ]TJ (t)Tj [-0.79998 ]TJ ( b)Tj [-8.59999 ]TJ (e)Tj [-4.79998 ]TJ (g)Tj [11.39999 ]TJ (i)Tj [-10.79998 ]TJ (n with )Tj +/N173 1 Tf +11.03909 0 0 11.03909 364.69029 85.73889 Tm +-0.00219 Tc +0 Tw +()Tj +/N231 1 Tf +11.99899 0 0 11.99899 417.48588 85.73889 Tm +0.00079 Tc +0.03919 Tw +(, until a)Tj [4.59999 ]TJ (nothe)Tj [4.59999 ]TJ (r)Tj [3.79998 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 488.87989 85.73889 Tm +-0.00219 Tc +0 Tw +(BEGIN)Tj +/N231 1 Tf +11.99899 0 0 11.99899 521.99708 85.73889 Tm +0 Tc +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 33 33 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 33)Tj +0 55.84999 TD +-0.00068 Tc +0.12069 Tw +(is ex)Tj [-10.69999 ]TJ (ecuted. Thus, we have a mini-environment )Tj [-10 ]TJ (for scannin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ ( strin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ (s. W)Tj [-6.89999 ]TJ (h)Tj [-0.69999 ]TJ (en the trailing )Tj +0 -1.14999 TD +-0.00048 Tc +0.00048 Tw +(quote is reco)Tj [-10.5 ]TJ (g)Tj [9.5 ]TJ (n)Tj [-0.5 ]TJ (iz)Tj [-6.69999 ]TJ (ed, we s)Tj [-11.29998 ]TJ (w)Tj [1.69999 ]TJ (itch back to state 0, the )Tj [-10 ]TJ (initial state. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 659.65109 Tm +0.00009 Tc +0.58668 Tw +(5.2 Reser)Tj [-16.79998 ]TJ (v)Tj [14.89999 ]TJ (e)Tj [-0.09999 ]TJ (d )Tj [586.39999 ]TJ (W)Tj [-10.89999 ]TJ (o)Tj [1.89999 ]TJ (rd)Tj [-5.59999 ]TJ (s )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 639.25268 Tm +0.00119 Tc +0.09878 Tw +(I)Tj [14.19999 ]TJ (f)Tj [4.19999 ]TJ ( )Tj [-20 ]TJ (y)Tj [21.19999 ]TJ (our)Tj [4.19999 ]TJ ( pr)Tj [4.19999 ]TJ (o)Tj [-8.79998 ]TJ (g)Tj [1.19999 ]TJ (r)Tj [4.19999 ]TJ (a)Tj [5 ]TJ (m ha)Tj [5 ]TJ (s a)Tj [5 ]TJ ( la)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (g)Tj [1.19999 ]TJ (e)Tj [5 ]TJ ( c)Tj [5 ]TJ (o)Tj [1.19999 ]TJ (lle)Tj [5 ]TJ (c)Tj [5 ]TJ (tion of)Tj [4.19999 ]TJ ( r)Tj [4.19999 ]TJ (e)Tj [5 ]TJ (se)Tj [5 ]TJ (r)Tj [4.19999 ]TJ (v)Tj [-8.79998 ]TJ (ed wor)Tj [4.19999 ]TJ (d)Tj [1.19999 ]TJ (s, it)Tj [9 ]TJ ( is)Tj [10.39999 ]TJ ( mor)Tj [4.19999 ]TJ (e)Tj [5 ]TJ ( e)Tj [5 ]TJ (f)Tj [4.19999 ]TJ (f)Tj [4.19999 ]TJ (i)Tj [-1 ]TJ (c)Tj [5 ]TJ (i)Tj [-1 ]TJ (e)Tj [5 ]TJ (n)Tj [1.19999 ]TJ (t to le)Tj [5 ]TJ (t le)Tj [15 ]TJ (x )Tj +T* +0.00138 Tc +0.22859 Tw +(simpl)Tj [-10.79998 ]TJ (y)Tj [21.39999 ]TJ ( ma)Tj [5.19999 ]TJ (tc)Tj [5.19999 ]TJ (h )Tj [-10 ]TJ (a)Tj [5.19999 ]TJ ( str)Tj [4.39999 ]TJ (i)Tj [-0.79998 ]TJ (n)Tj [-8.59999 ]TJ (g)Tj [11.39999 ]TJ (, )Tj [-10 ]TJ (a)Tj [5.19999 ]TJ (nd de)Tj [5.19999 ]TJ (ter)Tj [4.39999 ]TJ (mine)Tj [5.19999 ]TJ ( in )Tj [-20 ]TJ (y)Tj [21.39999 ]TJ (o)Tj [1.39999 ]TJ (u)Tj [-8.59999 ]TJ (r)Tj [4.39999 ]TJ ( )Tj [-10 ]TJ (own c)Tj [5.19999 ]TJ (ode whe)Tj [5.19999 ]TJ (t)Tj [-0.79998 ]TJ (h)Tj [-8.59999 ]TJ (e)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ ( it is)Tj [-9.39999 ]TJ ( a)Tj [5.19999 ]TJ ( v)Tj [-8.59999 ]TJ (a)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ (i)Tj [-0.79998 ]TJ (a)Tj [5.19999 ]TJ (b)Tj [1.39999 ]TJ (le or )Tj +T* +-0.00119 Tc +0.00119 Tw +(reserv)Tj [-11.19999 ]TJ (ed word. )Tj [-10 ]TJ (F)Tj [4.89999 ]TJ (o)Tj [-1.19999 ]TJ (r )Tj [-10 ]TJ (ex)Tj [-11.19999 ]TJ (ample, instead of codin)Tj [-11.19999 ]TJ (g)Tj [8.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 587.17709 Tm +-0.00219 Tc +0 Tw +("if")Tj [-7174 ]TJ (return)Tj [-597.89999 ]TJ (IF;)Tj +0 -1.13038 TD +("then")Tj [-5978.29998 ]TJ (return)Tj [-597.89999 ]TJ (THEN;)Tj +T* +("else")Tj [-5978.29998 ]TJ (return)Tj [-597.89999 ]TJ (ELSE;)Tj +0 -2.25 TD +({letter}\({letter}|{digit}\)*)Tj [-1195.69999 ]TJ ({)Tj +5.38049 -1.13038 TD +(yylval.id)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (symLookup\(yytext\);)Tj +T* +(return)Tj [-597.89999 ]TJ (IDENTIFIER;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 485.66558 Tm +( )Tj +0 -1.16999 TD +-0.00279 Tc +(where )Tj +/N173 1 Tf +11.03909 0 0 11.03909 123.27038 471.62669 Tm +-0.00219 Tc +(symLookup)Tj +/N231 1 Tf +11.99899 0 0 11.99899 182.66549 471.62669 Tm +0.00138 Tc +0.08859 Tw +( r)Tj [4.39999 ]TJ (e)Tj [5.19999 ]TJ (turns a)Tj [5.19999 ]TJ (n)Tj [1.39999 ]TJ ( inde)Tj [5.19999 ]TJ (x into)Tj [11.39999 ]TJ ( the)Tj [5.19999 ]TJ ( s)Tj [-9.39999 ]TJ (y)Tj [31.39999 ]TJ (m)Tj [-10.79998 ]TJ (bol ta)Tj [5.19999 ]TJ (ble)Tj [5.19999 ]TJ (,)Tj [1.39999 ]TJ ( it)Tj [9.19999 ]TJ ( is be)Tj [5.19999 ]TJ (tte)Tj [5.19999 ]TJ (r)Tj [4.39999 ]TJ ( to)Tj [11.39999 ]TJ ( )Tj [10 ]TJ (de)Tj [5.19999 ]TJ (te)Tj [5.19999 ]TJ (c)Tj [5.19999 ]TJ (t)Tj [-0.79998 ]TJ ( r)Tj [4.39999 ]TJ (e)Tj [5.19999 ]TJ (ser)Tj [4.39999 ]TJ (v)Tj [1.39999 ]TJ (e)Tj [5.19999 ]TJ (d)Tj [-8.59999 ]TJ ( )Tj +-7.71998 -1.18998 TD +0.00088 Tc +-0.00088 Tw +(wor)Tj [3.89999 ]TJ (d)Tj [0.89999 ]TJ (s a)Tj [4.69999 ]TJ (nd ide)Tj [4.69999 ]TJ (n)Tj [0.89999 ]TJ (tif)Tj [3.89999 ]TJ (ie)Tj [4.69999 ]TJ (r)Tj [3.89999 ]TJ (s)Tj [0.09999 ]TJ ( sim)Tj [-11.29998 ]TJ (u)Tj [0.89999 ]TJ (lta)Tj [4.69999 ]TJ (ne)Tj [4.69999 ]TJ (ousl)Tj [-11.29998 ]TJ (y)Tj [20.89999 ]TJ (, a)Tj [4.69999 ]TJ (s)Tj [0.09999 ]TJ ( )Tj [-10 ]TJ (f)Tj [3.89999 ]TJ (o)Tj [0.89999 ]TJ (llows: )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 432.86988 Tm +-0.00219 Tc +0 Tw +({letter}\({letter}|{digit}\)*)Tj [-1195.69999 ]TJ ({)Tj +5.38049 -1.11959 TD +(int)Tj [-597.89999 ]TJ (i;)Tj +0 -2.26089 TD +(if)Tj [-597.89999 ]TJ (\(\(i)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (resWord\(yytext\)\))Tj [-597.89999 ]TJ (!=)Tj [-597.89999 ]TJ (0\))Tj +2.39129 -1.13038 TD +(return)Tj [-597.89999 ]TJ (\(i\);)Tj +-2.39129 -1.13038 TD +(yylval.id)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (symLookup\(yytext\);)Tj +T* +(return)Tj [-597.89999 ]TJ (\(IDENTIFIER\);)Tj +-2.39129 -1.11959 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 331.47839 Tm +( )Tj +0 -1.14999 TD +-0.00048 Tc +0.05049 Tw +(This technique sig)Tj [9.5 ]TJ (n)Tj [-0.5 ]TJ (ific)Tj [-6.69999 ]TJ (an)Tj [-10.5 ]TJ (tl)Tj [-12.69999 ]TJ (y)Tj [19.5 ]TJ ( redu)Tj [-10.5 ]TJ (ces the number o)Tj [-10.5 ]TJ (f)Tj [2.5 ]TJ ( states requir)Tj [-7.5 ]TJ (e)Tj [3.29998 ]TJ (d, and r)Tj [-7.5 ]TJ (e)Tj [3.29998 ]TJ (sults in smaller )Tj +T* +-0.00119 Tc +0.00119 Tw +(scanner t)Tj [-13.39999 ]TJ (a)Tj [2.59999 ]TJ (bles. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 268.12368 Tm +-0.00099 Tc +0.58779 Tw +(5.3 Debu)Tj [-6.69999 ]TJ (ggi)Tj [-8.89999 ]TJ (ng )Tj [578.89999 ]TJ (Lex)Tj [-8.69999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 247.60539 Tm +0.00158 Tc +0.02839 Tw +(L)Tj [12.39999 ]TJ (e)Tj [5.39999 ]TJ (x)Tj [-8.39999 ]TJ ( ha)Tj [5.39999 ]TJ (s fa)Tj [5.39999 ]TJ (c)Tj [5.39999 ]TJ (ilitie)Tj [5.39999 ]TJ (s tha)Tj [5.39999 ]TJ (t)Tj [-0.59999 ]TJ ( e)Tj [5.39999 ]TJ (n)Tj [-8.39999 ]TJ (a)Tj [5.39999 ]TJ (b)Tj [1.59999 ]TJ (le)Tj [5.39999 ]TJ ( de)Tj [5.39999 ]TJ (bu)Tj [-8.39999 ]TJ (gg)Tj [11.59999 ]TJ (in)Tj [-8.39999 ]TJ (g)Tj [11.59999 ]TJ (.)Tj [1.59999 ]TJ ( This fe)Tj [5.39999 ]TJ (atur)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ ( ma)Tj [-14.59999 ]TJ (y)Tj [21.59999 ]TJ ( var)Tj [-15.39999 ]TJ (y)Tj [21.59999 ]TJ ( with dif)Tj [4.59999 ]TJ (f)Tj [4.59999 ]TJ (e)Tj [-4.59999 ]TJ (re)Tj [5.39999 ]TJ (nt ve)Tj [5.39999 ]TJ (r)Tj [4.59999 ]TJ (s)Tj [0.79998 ]TJ (ions of)Tj [4.59999 ]TJ ( )Tj +T* +-0.00009 Tc +0.10009 Tw +(lex)Tj [-10.09999 ]TJ (,)Tj [-0.09999 ]TJ ( so )Tj [-10 ]TJ (y)Tj [19.89999 ]TJ (ou should )Tj [-10 ]TJ (cons)Tj [-10.89999 ]TJ (ult documentation for)Tj [-7.09999 ]TJ ( de)Tj [-6.29998 ]TJ (tails. The cod)Tj [-10.09999 ]TJ (e)Tj [3.69999 ]TJ ( )Tj [-10 ]TJ (g)Tj [9.89999 ]TJ (e)Tj [3.69999 ]TJ (n)Tj [-10.09999 ]TJ (e)Tj [3.69999 ]TJ (r)Tj [-7.09999 ]TJ (a)Tj [3.69999 ]TJ (te)Tj [-6.29998 ]TJ (d b)Tj [-10.09999 ]TJ (y)Tj [19.89999 ]TJ ( )Tj [-10 ]TJ (lex)Tj [-10.09999 ]TJ ( in file )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 219.76768 Tm +-0.00219 Tc +0 Tw +(lex.yy.c)Tj +/N231 1 Tf +11.99899 0 0 11.99899 142.82879 219.76768 Tm +-0.00178 Tc +0.09179 Tw +( i)Tj [-4 ]TJ (n)Tj [-1.79998 ]TJ (cl)Tj [-4 ]TJ (udes deb)Tj [-11.79998 ]TJ (ugg)Tj [8.19999 ]TJ (i)Tj [-4 ]TJ (n)Tj [-11.79998 ]TJ (g)Tj [8.19999 ]TJ ( st)Tj [-4 ]TJ (at)Tj [-4 ]TJ (em)Tj [-4 ]TJ (ent)Tj [-4 ]TJ (s)Tj [-2.59999 ]TJ ( t)Tj [-4 ]TJ (h)Tj [-1.79998 ]TJ (at)Tj [-4 ]TJ ( a)Tj [-8 ]TJ (r)Tj [1.19999 ]TJ (e enabl)Tj [-14 ]TJ (e)Tj [2 ]TJ (d b)Tj [-21.79998 ]TJ (y)Tj [28.19999 ]TJ ( sp)Tj [-11.79998 ]TJ (eci)Tj [-4 ]TJ (f)Tj [-18.79998 ]TJ (y)Tj [18.19999 ]TJ (i)Tj [-4 ]TJ (n)Tj [-11.79998 ]TJ (g com)Tj [-4 ]TJ (m)Tj [-4 ]TJ (a)Tj [2 ]TJ (nd-l)Tj [-4 ]TJ (i)Tj [-4 ]TJ (n)Tj [-1.79998 ]TJ (e )Tj +-4.39999 -1.19999 TD +0.00059 Tc +0.21939 Tw +(option \223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 131.66969 205.36889 Tm +-0.00219 Tc +0 Tw +(-d)Tj +/N231 1 Tf +11.99899 0 0 11.99899 144.86859 205.36889 Tm +0.00068 Tc +0.21929 Tw +(\224)Tj [4.5 ]TJ (.)Tj [0.69999 ]TJ ( De)Tj [4.5 ]TJ (bu)Tj [-9.29998 ]TJ (g)Tj [10.69999 ]TJ ( out)Tj [-11.5 ]TJ (put may)Tj [20.69999 ]TJ ( be)Tj [4.5 ]TJ ( to)Tj [-9.29998 ]TJ (gg)Tj [10.69999 ]TJ (le)Tj [4.5 ]TJ (d on)Tj [-9.29998 ]TJ ( a)Tj [4.5 ]TJ (nd of)Tj [3.69999 ]TJ (f)Tj [3.69999 ]TJ ( b)Tj [-19.29998 ]TJ (y)Tj [20.69999 ]TJ ( se)Tj [4.5 ]TJ (ttin)Tj [-9.29998 ]TJ (g)Tj [10.69999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 433.08459 205.36889 Tm +-0.00219 Tc +0 Tw +(yy)Tj [-10.89999 ]TJ (_flex_debug)Tj +/N231 1 Tf +11.99899 0 0 11.99899 518.99739 205.36889 Tm +0 Tc +(. )Tj +-35.75 -1.18998 TD +-0.00048 Tc +0.11048 Tw +(Output includes the rule)Tj [13.29998 ]TJ ( applied and corresponding)Tj [9.5 ]TJ ( matched tex)Tj [-10.5 ]TJ (t)Tj [-2.69999 ]TJ (. )Tj [-10 ]TJ (I)Tj [22.5 ]TJ (f)Tj [2.5 ]TJ ( )Tj [-10 ]TJ (y)Tj [19.5 ]TJ (o)Tj [-0.5 ]TJ (u)Tj [-10.5 ]TJ (\222)Tj [-7.5 ]TJ (re running)Tj [9.5 ]TJ ( lex)Tj [-10.5 ]TJ ( )Tj +0 -1.14999 TD +0.00048 Tw +(and )Tj [-10 ]TJ (y)Tj [19.5 ]TJ (a)Tj [-6.69999 ]TJ (c)Tj [-6.69999 ]TJ (c)Tj [3.29998 ]TJ ( together, sp)Tj [-10.5 ]TJ (ecif)Tj [-7.5 ]TJ (y)Tj [19.5 ]TJ ( )Tj [-10 ]TJ (the followin)Tj [-10.5 ]TJ (g)Tj [9.5 ]TJ ( in )Tj [-20 ]TJ (y)Tj [19.5 ]TJ (our )Tj [-20 ]TJ (y)Tj [9.5 ]TJ (acc input file: )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 152.81329 Tm +-0.00219 Tc +0 Tw +(extern)Tj [-597.89999 ]TJ (int)Tj [-597.89999 ]TJ (yy_flex_debug;)Tj +0 -1.13038 TD +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(yy_flex_debug)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (1)Tj [0 ]TJ (;)Tj +T* +(yyparse\(\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 88.73858 Tm +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 34 34 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 34)Tj +0 55.84999 TD +-0.00039 Tc +0.16038 Tw +(Alternativel)Tj [-22.59999 ]TJ (y)Tj [19.59999 ]TJ (,)Tj [-0.39999 ]TJ ( )Tj [-10 ]TJ (y)Tj [19.59999 ]TJ (ou ma)Tj [-16.59999 ]TJ (y)Tj [19.59999 ]TJ ( )Tj [-10 ]TJ (write )Tj [-10 ]TJ (y)Tj [19.59999 ]TJ (our own debu)Tj [-10.39999 ]TJ (g)Tj [9.59999 ]TJ ( c)Tj [-6.59999 ]TJ (ode b)Tj [-10.39999 ]TJ (y)Tj [19.59999 ]TJ ( definin)Tj [-10.39999 ]TJ (g)Tj [9.59999 ]TJ ( functio)Tj [-10.39999 ]TJ (ns that displa)Tj [-6.59999 ]TJ (y)Tj [29.59999 ]TJ ( )Tj +0 -1.16999 TD +-0.00189 Tc +0.03189 Tw +(i)Tj [-4.09999 ]TJ (n)Tj [-1.89999 ]TJ (form)Tj [-4.09999 ]TJ (at)Tj [-4.09999 ]TJ (i)Tj [-4.09999 ]TJ (on for t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (e t)Tj [-4.09999 ]TJ (oken val)Tj [-4.09999 ]TJ (u)Tj [-1.89999 ]TJ (e, and each va)Tj [-8.09999 ]TJ (ri)Tj [-4.09999 ]TJ (ant)Tj [-4.09999 ]TJ ( of t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (e )Tj +/N173 1 Tf +11.03909 0 0 11.03909 361.45059 695.16809 Tm +-0.00219 Tc +0 Tw +(yylval)Tj +/N231 1 Tf +11.99899 0 0 11.99899 401.04719 695.16809 Tm +0.00019 Tc +0.02978 Tw +( union. Th)Tj [10.19999 ]TJ (is is i)Tj [8 ]TJ (llustrated )Tj +-25.91999 -1.20999 TD +-0.00199 Tc +0.03189 Tw +(i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (e fol)Tj [-4.19999 ]TJ (l)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ (wi)Tj [-4.19999 ]TJ (ng ex)Tj [-12 ]TJ (am)Tj [-4.19999 ]TJ (pl)Tj [-4.19999 ]TJ (e. W)Tj [-8.19999 ]TJ (h)Tj [-2 ]TJ (en )Tj +/N173 1 Tf +11.03909 0 0 11.03909 249.85989 680.64929 Tm +-0.00219 Tc +0 Tw +(DEBUG)Tj +/N231 1 Tf +11.99899 0 0 11.99899 282.85708 680.64929 Tm +-0.00099 Tc +0.03099 Tw +( is defined)Tj [-11 ]TJ (,)Tj [-1 ]TJ ( the debu)Tj [-11 ]TJ (g)Tj [9 ]TJ ( )Tj [-10 ]TJ (functions tak)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ ( ef)Tj [-8 ]TJ (fect, )Tj [-10 ]TJ (and )Tj [-10 ]TJ (a)Tj [-7.19999 ]TJ ( )Tj +-16.06999 -1.18998 TD +0.00109 Tw +(t)Tj [-3.29998 ]TJ (r)Tj [1.89999 ]TJ (ace o)Tj [-11.09999 ]TJ (f)Tj [1.89999 ]TJ ( t)Tj [-3.29998 ]TJ (okens and asso)Tj [-11.09999 ]TJ (c)Tj [-7.29998 ]TJ (i)Tj [-3.29998 ]TJ (at)Tj [-3.29998 ]TJ (ed val)Tj [-3.29998 ]TJ (u)Tj [-1.09999 ]TJ (es i)Tj [-3.29998 ]TJ (s)Tj [-1.89999 ]TJ ( di)Tj [-3.29998 ]TJ (spl)Tj [-3.29998 ]TJ (a)Tj [-7.29998 ]TJ (y)Tj [18.89999 ]TJ (e)Tj [-7.29998 ]TJ (d.)Tj [-11 ]TJ ( )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 640.57258 Tm +-0.00219 Tc +(%union)Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (ivalue;)Tj +0 -1.11959 TD +(...)Tj +-2.39129 -1.13038 TD +(};)Tj +0 -2.26089 TD +(%{)Tj +0 -1.13038 TD +(#ifdef)Tj [-597.89999 ]TJ (DEBUG)Tj +2.39129 -1.13038 TD +(int)Tj [-597.89999 ]TJ (dbgToken\(int)Tj [-597.89999 ]TJ (tok,)Tj [-597.89999 ]TJ (char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(printf\("token)Tj [-597.89999 ]TJ (%s\\n",)Tj [-597.89999 ]TJ (s\);)Tj +0 -1.13038 TD +(return)Tj [-597.89999 ]TJ (tok;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +T* +-0.00219 Tc +(int)Tj [-597.89999 ]TJ (dbgTokenIvalue\(int)Tj [-597.89999 ]TJ (tok,)Tj [-597.89999 ]TJ (char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(printf\("token)Tj [-597.89999 ]TJ (%s)Tj [-597.89999 ]TJ (\(%d\)\\n",)Tj [-597.89999 ]TJ (s,)Tj [-597.89999 ]TJ (yylval.ivalue\);)Tj +T* +(return)Tj [-597.89999 ]TJ (tok;)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +0 -1.11959 TD +-0.00219 Tc +(#define)Tj [-597.89999 ]TJ (RETURN\(x\))Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (dbgToken\(x,)Tj [-597.89999 ]TJ (#x\))Tj +0 -1.13038 TD +(#define)Tj [-597.89999 ]TJ (RETURN_ivalue\(x\))Tj [-597.89999 ]TJ (return)Tj [-597.89999 ]TJ (dbgTokenIvalue\(x,)Tj [-597.89999 ]TJ (#x\))Tj +-2.39129 -1.13038 TD +(#else)Tj +2.39129 -1.13038 TD +(#define)Tj [-597.89999 ]TJ (RETURN\(x\))Tj [-597.89999 ]TJ (return\(x\))Tj +T* +(#define)Tj [-597.89999 ]TJ (RETURN_ivalue\(x\))Tj [-597.89999 ]TJ (return\(x\))Tj +-2.39129 -1.13038 TD +(#endif)Tj +0 -1.11959 TD +(%})Tj +0 -2.26089 TD +(%%)Tj +T* +([0-9]+)Tj [-3587 ]TJ ({)Tj +9.56529 -1.13038 TD +(yylval.ivalue)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (atoi\(yytext\);)Tj +0 -1.11959 TD +(RETURN_ivalue\(INTEGER\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +-7.17399 -2.26089 TD +-0.00219 Tc +("if")Tj [-4782.69999 ]TJ (RETURN\(IF\);)Tj +0 -1.13038 TD +("else")Tj [-3587 ]TJ (RETURN\(ELSE\);)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 240.04609 Tm +0 Tc +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 35 35 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 35)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +-0.00169 Tc +0.49049 Tw +(6. Mo)Tj [-4.19999 ]TJ (re )Tj [506.59999 ]TJ (Y)Tj [52 ]TJ (acc )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +15.95869 0 0 15.95869 90.03318 659.05108 Tm +-0.00028 Tc +0.58709 Tw +(6.1 Recursi)Tj [-8.19999 ]TJ (on )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 638.65278 Tm +0.00088 Tc +-0.00088 Tw +(Whe)Tj [4.69999 ]TJ (n)Tj [0.89999 ]TJ ( spe)Tj [4.69999 ]TJ (c)Tj [4.69999 ]TJ (i)Tj [-1.29998 ]TJ (f)Tj [-16.09999 ]TJ (y)Tj [30.89999 ]TJ (in)Tj [-9.09999 ]TJ (g)Tj [10.89999 ]TJ ( )Tj [-10 ]TJ (a)Tj [4.69999 ]TJ ( list, we)Tj [4.69999 ]TJ ( ma)Tj [-15.29998 ]TJ (y)Tj [20.89999 ]TJ ( do so using)Tj [10.89999 ]TJ ( lef)Tj [3.89999 ]TJ (t)Tj [-1.29998 ]TJ ( r)Tj [3.89999 ]TJ (e)Tj [-5.29998 ]TJ (c)Tj [4.69999 ]TJ (u)Tj [0.89999 ]TJ (r)Tj [3.89999 ]TJ (s)Tj [0.09999 ]TJ (ion, )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 612.85499 Tm +-0.00219 Tc +(list:)Tj +3.26089 -1.13038 TD +(item)Tj +T* +(|)Tj [-597.89999 ]TJ (list)Tj [-597.89999 ]TJ (',')Tj [-597.89999 ]TJ (item)Tj +T* +0 Tc +(;)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 561.13929 Tm +( )Tj +0 -1.14999 TD +-0.00048 Tc +0.00048 Tw +(or rig)Tj [9.5 ]TJ (h)Tj [-0.5 ]TJ (t r)Tj [-7.5 ]TJ (ecu)Tj [-10.5 ]TJ (rsion: )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 521.54249 Tm +-0.00219 Tc +(list:)Tj +3.26089 -1.11959 TD +(item)Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ (item)Tj [-597.89999 ]TJ (',')Tj [-597.89999 ]TJ (list)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 482.42579 Tm +0 Tc +( )Tj +0 -1.14999 TD +0.00169 Tc +0.03829 Tw +(I)Tj [14.69999 ]TJ (f)Tj [-5.29998 ]TJ ( r)Tj [4.69999 ]TJ (i)Tj [-10.5 ]TJ (g)Tj [11.69999 ]TJ (h)Tj [1.69999 ]TJ (t )Tj [-10 ]TJ (r)Tj [4.69999 ]TJ (e)Tj [5.5 ]TJ (c)Tj [5.5 ]TJ (u)Tj [-8.29998 ]TJ (r)Tj [4.69999 ]TJ (s)Tj [0.89999 ]TJ (ion is use)Tj [5.5 ]TJ (d)Tj [1.69999 ]TJ (,)Tj [-8.29998 ]TJ ( a)Tj [5.5 ]TJ (ll ite)Tj [5.5 ]TJ (ms on the list a)Tj [5.5 ]TJ (r)Tj [4.69999 ]TJ (e )Tj [-10 ]TJ (pushe)Tj [5.5 ]TJ (d on the sta)Tj [5.5 ]TJ (c)Tj [5.5 ]TJ (k. )Tj [-10 ]TJ (Af)Tj [4.69999 ]TJ (t)Tj [-10.5 ]TJ (e)Tj [5.5 ]TJ (r)Tj [4.69999 ]TJ ( the la)Tj [5.5 ]TJ (st ite)Tj [5.5 ]TJ (m )Tj +T* +-0.00079 Tc +0.02079 Tw +(is pushed, we start redu)Tj [-10.79998 ]TJ (cing)Tj [9.19999 ]TJ (. W)Tj [-7 ]TJ (ith left recursion, )Tj [-10 ]TJ (we neve)Tj [-7 ]TJ (r have mor)Tj [-7.79998 ]TJ (e)Tj [3 ]TJ ( than)Tj [-10.79998 ]TJ ( three terms on)Tj [-10.79998 ]TJ ( )Tj +T* +-0.00059 Tc +0.06059 Tw +(the stack, sinc)Tj [-6.79998 ]TJ (e w)Tj [-8.39999 ]TJ (e)Tj [3.19999 ]TJ ( r)Tj [-7.59999 ]TJ (e)Tj [3.19999 ]TJ (duc)Tj [-6.79998 ]TJ (e as w)Tj [-8.39999 ]TJ (e)Tj [3.19999 ]TJ ( )Tj [-10 ]TJ (g)Tj [9.39999 ]TJ (o)Tj [-0.59999 ]TJ ( )Tj [-10 ]TJ (alon)Tj [-10.59999 ]TJ (g)Tj [9.39999 ]TJ (.)Tj [-0.59999 ]TJ ( F)Tj [5.5 ]TJ (o)Tj [-10.59999 ]TJ (r th)Tj [-10.59999 ]TJ (is reason, it is adv)Tj [-10.59999 ]TJ (a)Tj [3.19999 ]TJ (nta)Tj [-6.79998 ]TJ (g)Tj [9.39999 ]TJ (e)Tj [-6.79998 ]TJ (ous to use left)Tj [-12.79998 ]TJ ( )Tj +T* +-0.00099 Tc +0 Tw +(recursion. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 391.47338 Tm +-0.00019 Tc +0.58699 Tw +(6.2 If-Else )Tj [563.89999 ]TJ (A)Tj [22.69999 ]TJ (m)Tj [-5.79998 ]TJ (b)Tj [-5.89999 ]TJ (i)Tj [-0.59999 ]TJ (gu)Tj [-5.89999 ]TJ (it)Tj [-5.5 ]TJ (y)Tj [14.59999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 371.07508 Tm +-0.00088 Tc +0.10089 Tw +(A shift-redu)Tj [-10.89999 ]TJ (ce )Tj [-10 ]TJ (conflict t)Tj [-13.09999 ]TJ (h)Tj [-0.89999 ]TJ (at frequ)Tj [-10.89999 ]TJ (entl)Tj [-13.09999 ]TJ (y)Tj [19.09999 ]TJ ( )Tj [-10 ]TJ (occu)Tj [-10.89999 ]TJ (rs in)Tj [-10.89999 ]TJ (volves the )Tj +/N171 1 Tf +24.19999 0 TD +0.00158 Tc +0 Tw +(if-)Tj [4.59999 ]TJ (e)Tj [5.39999 ]TJ (l)Tj [-0.59999 ]TJ (se)Tj [5.39999 ]TJ ( )Tj +/N231 1 Tf +2.79998 0 TD +0.00068 Tc +0.09928 Tw +(c)Tj [4.5 ]TJ (onstruc)Tj [4.5 ]TJ (t. Assume)Tj [4.5 ]TJ ( we)Tj [4.5 ]TJ ( )Tj +-27 -1.14999 TD +-0.00068 Tw +(ha)Tj [4.5 ]TJ (ve)Tj [4.5 ]TJ ( the)Tj [4.5 ]TJ ( f)Tj [3.69999 ]TJ (o)Tj [0.69999 ]TJ (llowin)Tj [-9.29998 ]TJ (g)Tj [10.69999 ]TJ ( r)Tj [3.69999 ]TJ (u)Tj [0.69999 ]TJ (le)Tj [4.5 ]TJ (s:)Tj [-11.39999 ]TJ ( )Tj +3 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 331.47839 Tm +-0.00219 Tc +(stmt:)Tj +1.63038 -1.13038 TD +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj +T* +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.79998 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +0.16308 -1.13038 TD +(...)Tj +/N231 1 Tf +11.99899 0 0 11.99899 108.03169 279.76269 Tm +0 Tc +( )Tj +-1.5 -1.14999 TD +-0.00169 Tc +0.00169 Tw +(and t)Tj [-3.89999 ]TJ (h)Tj [-1.69999 ]TJ (e fol)Tj [-3.89999 ]TJ (l)Tj [-3.89999 ]TJ (o)Tj [-1.69999 ]TJ (wi)Tj [-3.89999 ]TJ (ng)Tj [8.29998 ]TJ ( st)Tj [-13.89999 ]TJ (at)Tj [-3.89999 ]TJ (e:)Tj [-3.79998 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 240.16598 Tm +-0.00219 Tc +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 225.88719 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00048 Tc +0.05049 Tw +(W)Tj [-6.69999 ]TJ (e)Tj [3.29998 ]TJ ( need to decide if )Tj [-10 ]TJ (we)Tj [-6.69999 ]TJ ( should shift the )Tj +/N173 1 Tf +11.03909 0 0 11.03909 291.73638 211.84838 Tm +-0.00219 Tc +0 Tw +(ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 318.13418 211.84838 Tm +-0.00149 Tc +0.05149 Tw +(, or reduc)Tj [-7.69999 ]TJ (e the )Tj +/N173 1 Tf +11.03909 0 0 11.03909 392.04798 211.84838 Tm +-0.00219 Tc +0 Tw +(IF)Tj [-652.19999 ]TJ (expr)Tj [-652.19999 ]TJ (s)Tj [-10.89999 ]TJ (tmt)Tj +/N231 1 Tf +11.99899 0 0 11.99899 472.56129 211.84838 Tm +0.05218 Tw +( at)Tj [-4.39999 ]TJ ( t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e t)Tj [-4.39999 ]TJ (op )Tj +-31.87998 -1.17999 TD +-0.00088 Tc +0.00088 Tw +(of the stack. )Tj [-10 ]TJ (I)Tj [12.09999 ]TJ (f)Tj [-7.89999 ]TJ ( we shift, t)Tj [-13.09999 ]TJ (h)Tj [-0.89999 ]TJ (en we hav)Tj [-10.89999 ]TJ (e)Tj [3.09999 ]TJ ( )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 171.89169 Tm +-0.00219 Tc +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +0 -1.13038 TD +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (stmt)Tj +T* +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj +T* +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 120.17599 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00189 Tc +0.00189 Tw +(where the s)Tj [-12.69999 ]TJ (econd )Tj +/N173 1 Tf +11.03909 0 0 11.03909 176.18598 106.13719 Tm +-0.00219 Tc +0 Tw +(ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 202.58378 106.13719 Tm +-0.00068 Tc +0.00068 Tw +( i)Tj [-12.89999 ]TJ (s)Tj [-1.5 ]TJ ( paired with the second )Tj +/N173 1 Tf +11.03909 0 0 11.03909 327.97329 106.13719 Tm +-0.00219 Tc +0 Tw +(IF)Tj +/N231 1 Tf +11.99899 0 0 11.99899 341.17219 106.13719 Tm +-0.00138 Tc +0.00138 Tw +(. )Tj [-10 ]TJ (I)Tj [11.59999 ]TJ (f)Tj [1.59999 ]TJ ( we )Tj [-10 ]TJ (reduc)Tj [-7.59999 ]TJ (e, we h)Tj [-11.39999 ]TJ (a)Tj [2.39999 ]TJ (v)Tj [-11.39999 ]TJ (e)Tj [2.5 ]TJ ( )Tj +-20.92999 -1.18998 TD +0 Tc +0 Tw +( )Tj +0 -1.14999 TD +( )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 36 36 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 36)Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 711.00679 Tm +-0.00219 Tc +0 Tw +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +0 -1.13038 TD +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +T* +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.79998 ]TJ (.)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +T* +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (stmt)Tj +0 -1.11959 TD +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (.)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 646.93209 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00109 Tc +0.06109 Tw +(where)Tj [-7.29998 ]TJ ( the se)Tj [-7.29998 ]TJ (cond )Tj +/N173 1 Tf +11.03909 0 0 11.03909 178.46578 632.89329 Tm +-0.00219 Tc +0 Tw +(ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 204.86358 632.89329 Tm +0.00109 Tc +0.05889 Tw +( i)Tj [-11.09999 ]TJ (s)Tj [0.29998 ]TJ ( pa)Tj [4.89999 ]TJ (ir)Tj [4.09999 ]TJ (e)Tj [4.89999 ]TJ (d)Tj [1.09999 ]TJ ( )Tj [-10 ]TJ (with the)Tj [4.89999 ]TJ ( f)Tj [4.09999 ]TJ (i)Tj [-1.09999 ]TJ (r)Tj [4.09999 ]TJ (s)Tj [0.29998 ]TJ (t )Tj +/N173 1 Tf +11.03909 0 0 11.03909 320.65388 632.89329 Tm +-0.00219 Tc +0 Tw +(IF)Tj +/N231 1 Tf +11.99899 0 0 11.99899 333.97279 632.89329 Tm +0.00129 Tc +0.05868 Tw +(. Mode)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ (n)Tj [1.29998 ]TJ ( p)Tj [-8.69999 ]TJ (r)Tj [4.29998 ]TJ (o)Tj [-8.69999 ]TJ (g)Tj [11.29998 ]TJ (r)Tj [4.29998 ]TJ (a)Tj [5.09999 ]TJ (mmin)Tj [-8.69999 ]TJ (g)Tj [11.29998 ]TJ ( l)Tj [-10.89999 ]TJ (a)Tj [5.09999 ]TJ (ng)Tj [11.29998 ]TJ (u)Tj [-8.69999 ]TJ (a)Tj [-4.89999 ]TJ (g)Tj [11.29998 ]TJ (e)Tj [5.09999 ]TJ (s p)Tj [-8.69999 ]TJ (a)Tj [5.09999 ]TJ (ir )Tj +-20.32998 -1.20999 TD +-0.00189 Tc +0 Tw +(an )Tj +/N173 1 Tf +11.03909 0 0 11.03909 106.47178 618.37449 Tm +-0.00219 Tc +(ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 132.86959 618.37449 Tm +-0.00068 Tc +0.18069 Tw +( with the most)Tj [-12.89999 ]TJ ( rec)Tj [-6.89999 ]TJ (e)Tj [3.09999 ]TJ (nt unpaired)Tj [-10.69999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 294.61608 618.37449 Tm +-0.00219 Tc +0 Tw +(IF)Tj +/N231 1 Tf +11.99899 0 0 11.99899 307.81498 618.37449 Tm +-0.00068 Tc +0.18069 Tw +(, so)Tj [-10.69999 ]TJ ( the forme)Tj [-6.89999 ]TJ (r)Tj [2.29998 ]TJ ( beh)Tj [-10.69999 ]TJ (a)Tj [3.09999 ]TJ (vior is ex)Tj [-10.69999 ]TJ (pected. This )Tj +-18.14999 -1.18998 TD +-0.00088 Tc +0.01089 Tw +(works well with )Tj [-20 ]TJ (y)Tj [19.09999 ]TJ (a)Tj [-7.09999 ]TJ (cc,)Tj [-10.89999 ]TJ ( since de)Tj [-7.09999 ]TJ (fault beh)Tj [-10.89999 ]TJ (a)Tj [2.89999 ]TJ (vior, wh)Tj [-10.89999 ]TJ (en a shift-)Tj [-7.89999 ]TJ (redu)Tj [-10.89999 ]TJ (ce )Tj [-10 ]TJ (conflict)Tj [-13.09999 ]TJ ( is encounte)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (ed,)Tj [-10.89999 ]TJ ( )Tj +0 -1.14999 TD +0.00109 Tc +-0.00109 Tw +(is to shif)Tj [4.09999 ]TJ (t. )Tj +T* +-0.00028 Tc +0.05029 Tw +( )Tj [-1200 ]TJ (Althoug)Tj [9.69999 ]TJ (h )Tj [-10 ]TJ (y)Tj [19.69999 ]TJ (a)Tj [-6.5 ]TJ (c)Tj [-6.5 ]TJ (c)Tj [3.5 ]TJ ( does the rig)Tj [9.69999 ]TJ (h)Tj [-0.29998 ]TJ (t thing)Tj [9.69999 ]TJ (,)Tj [-0.29998 ]TJ ( it also issues )Tj [10 ]TJ (a shift-reduc)Tj [-6.5 ]TJ (e warnin)Tj [-10.29998 ]TJ (g)Tj [9.69999 ]TJ ( messa)Tj [-6.5 ]TJ (g)Tj [9.69999 ]TJ (e)Tj [3.5 ]TJ (. To )Tj +0 -1.16999 TD +-0.00079 Tc +0.00079 Tw +(remove the messa)Tj [-7 ]TJ (ge, )Tj [-10 ]TJ (g)Tj [9.19999 ]TJ (i)Tj [-3 ]TJ (v)Tj [-10.79998 ]TJ (e)Tj [3 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 216.98258 562.45919 Tm +-0.00219 Tc +0 Tw +(IF-ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 263.17869 562.45919 Tm +-0.00189 Tc +0.00189 Tw +( a hi)Tj [-14.09999 ]TJ (g)Tj [8.09999 ]TJ (h)Tj [-1.89999 ]TJ (er p)Tj [-11.89999 ]TJ (r)Tj [1.09999 ]TJ (ec)Tj [-8.09999 ]TJ (edenc)Tj [-8.09999 ]TJ (e)Tj [1.89999 ]TJ ( t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (an t)Tj [-4.09999 ]TJ (h)Tj [-1.89999 ]TJ (e si)Tj [-4.09999 ]TJ (m)Tj [-4.09999 ]TJ (p)Tj [-1.89999 ]TJ (l)Tj [-4.09999 ]TJ (e)Tj [1.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 441.36389 562.45919 Tm +0.00869 Tc +0 Tw +(IF)Tj +/N231 1 Tf +11.99899 0 0 11.99899 454.68278 562.45919 Tm +-0.00189 Tc +0.00189 Tw +( st)Tj [-4.09999 ]TJ (at)Tj [-4.09999 ]TJ (em)Tj [-4.09999 ]TJ (ent)Tj [-4.09999 ]TJ (:)Tj [-4 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 537.50119 Tm +-0.00219 Tc +0 Tw +(%nonassoc)Tj [-597.89999 ]TJ (IFX)Tj +0 -1.13038 TD +(%nonassoc)Tj [-597.89999 ]TJ (ELSE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 510.86338 Tm +0 Tc +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 127.83018 498.86439 Tm +-0.00219 Tc +(stmt:)Tj +2.22828 -1.13038 TD +(IF)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (%prec)Tj [-597.89999 ]TJ (IFX)Tj +T* +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 437.66958 Tm +0.00059 Tc +0.58619 Tw +(6.3 Error )Tj [586.39999 ]TJ (Message)Tj [-7.19999 ]TJ (s)Tj [-7.09999 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 417.27128 Tm +-0.00169 Tc +0.25169 Tw +(A ni)Tj [-3.89999 ]TJ (ce com)Tj [-3.89999 ]TJ (p)Tj [-1.69999 ]TJ (i)Tj [-3.89999 ]TJ (l)Tj [-3.89999 ]TJ (e)Tj [2.09999 ]TJ (r )Tj [-10 ]TJ (g)Tj [8.29998 ]TJ (i)Tj [-3.89999 ]TJ (v)Tj [-11.69999 ]TJ (e)Tj [2.09999 ]TJ (s )Tj [-10 ]TJ (t)Tj [-3.89999 ]TJ (h)Tj [-1.69999 ]TJ (e user m)Tj [-3.89999 ]TJ (e)Tj [-7.89999 ]TJ (ani)Tj [-3.89999 ]TJ (ngful)Tj [-3.89999 ]TJ ( err)Tj [-8.69999 ]TJ (o)Tj [-1.69999 ]TJ (r m)Tj [-3.89999 ]TJ (e)Tj [2.09999 ]TJ (ssa)Tj [-7.89999 ]TJ (g)Tj [8.29998 ]TJ (e)Tj [2.09999 ]TJ (s. )Tj [-10 ]TJ (For )Tj [-10 ]TJ (ex)Tj [-11.69999 ]TJ (am)Tj [-3.89999 ]TJ (pl)Tj [-3.89999 ]TJ (e, not)Tj [-3.89999 ]TJ ( m)Tj [-3.89999 ]TJ (u)Tj [-1.69999 ]TJ (ch )Tj +0 -1.14999 TD +-0.00009 Tc +0.00009 Tw +(information is conve)Tj [-16.29998 ]TJ (y)Tj [19.89999 ]TJ (e)Tj [3.69999 ]TJ (d )Tj [-10 ]TJ (b)Tj [-10.09999 ]TJ (y)Tj [19.89999 ]TJ ( the followin)Tj [-10.09999 ]TJ (g)Tj [9.89999 ]TJ ( messa)Tj [-6.29998 ]TJ (ge: )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 377.67449 Tm +-0.00219 Tc +(syntax)Tj [-597.89999 ]TJ (error)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 363.39579 Tm +0 Tc +( )Tj +T* +-0.00219 Tc +0.00219 Tw +(I)Tj [10.79998 ]TJ (f)Tj [-9.19999 ]TJ ( we t)Tj [-4.39999 ]TJ (r)Tj [-9.19999 ]TJ (ack t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e l)Tj [-4.39999 ]TJ (i)Tj [-4.39999 ]TJ (n)Tj [-2.19999 ]TJ (e num)Tj [-4.39999 ]TJ (b)Tj [-12.19999 ]TJ (e)Tj [1.59999 ]TJ (r i)Tj [-4.39999 ]TJ (n)Tj [-2.19999 ]TJ ( l)Tj [-4.39999 ]TJ (e)Tj [1.59999 ]TJ (x)Tj [-12.19999 ]TJ (,)Tj [-2.19999 ]TJ ( t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (en we can )Tj [-10 ]TJ (at)Tj [-4.39999 ]TJ ( l)Tj [-4.39999 ]TJ (east)Tj [-4.39999 ]TJ ( g)Tj [7.79998 ]TJ (i)Tj [-4.39999 ]TJ (v)Tj [-12.19999 ]TJ (e)Tj [1.59999 ]TJ ( t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (e user )Tj [-10 ]TJ (a l)Tj [-4.39999 ]TJ (i)Tj [-4.39999 ]TJ (n)Tj [-2.19999 ]TJ (e n)Tj [-12.19999 ]TJ (u)Tj [-2.19999 ]TJ (m)Tj [-4.39999 ]TJ (b)Tj [-2.19999 ]TJ (er:)Tj [-4.09999 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 323.79899 Tm +-0.00219 Tc +(void)Tj [-597.89999 ]TJ (yyerror\(char)Tj [-597.89999 ]TJ (*s\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.13038 TD +(fprintf\(stderr,)Tj [-597.89999 ]TJ ("line)Tj [-597.89999 ]TJ (%d:)Tj [-597.89999 ]TJ (%s\\n",)Tj [-597.89999 ]TJ (yylineno,)Tj [-597.89999 ]TJ (s\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 284.68229 Tm +( )Tj +0 -1.16999 TD +-0.00099 Tc +0.08099 Tw +(W)Tj [-7.19999 ]TJ (h)Tj [-1 ]TJ (en )Tj [-10 ]TJ (y)Tj [19 ]TJ (a)Tj [-7.19999 ]TJ (cc)Tj [-7.19999 ]TJ ( discovers)Tj [-11.79998 ]TJ ( a )Tj [-10 ]TJ (parsing er)Tj [-8 ]TJ (ror, d)Tj [-11 ]TJ (e)Tj [2.79998 ]TJ (fault )Tj [-10 ]TJ (act)Tj [-13.19999 ]TJ (ion is to call )Tj +/N173 1 Tf +11.03909 0 0 11.03909 394.08779 270.64349 Tm +-0.00219 Tc +0 Tw +(yyerror)Tj +/N231 1 Tf +11.99899 0 0 11.99899 440.28399 270.64349 Tm +-0.00068 Tc +0.08068 Tw +(, )Tj [-10 ]TJ (and then r)Tj [-7.69999 ]TJ (e)Tj [3.09999 ]TJ (turn)Tj [-10.69999 ]TJ ( )Tj +-29.18998 -1.20999 TD +-0.00199 Tc +0 Tw +(from)Tj [-4.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 117.15089 256.12469 Tm +-0.00219 Tc +(yylex)Tj +/N231 1 Tf +11.99899 0 0 11.99899 150.14819 256.12469 Tm +-0.00099 Tc +0.07099 Tw +( with a return value of one. A more )Tj [10 ]TJ (g)Tj [9 ]TJ (r)Tj [-8 ]TJ (ace)Tj [-7.19999 ]TJ (ful action flushes the input stream)Tj [6.79998 ]TJ ( )Tj +-5.00999 -1.18998 TD +0.00109 Tc +-0.00109 Tw +(to a)Tj [4.89999 ]TJ ( sta)Tj [4.89999 ]TJ (t)Tj [-1.09999 ]TJ (e)Tj [4.89999 ]TJ (m)Tj [-1.09999 ]TJ (e)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ (t de)Tj [4.89999 ]TJ (limite)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (,)Tj [1.09999 ]TJ ( a)Tj [4.89999 ]TJ (nd c)Tj [4.89999 ]TJ (ontinue)Tj [4.89999 ]TJ (s to sc)Tj [4.89999 ]TJ (a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ (: )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 217.36788 Tm +-0.00219 Tc +0 Tw +(stmt:)Tj +5.38049 -1.13038 TD +(';')Tj +-0.59779 -1.13038 TD +(|)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';')Tj +T* +(|)Tj [-597.89999 ]TJ (PRINT)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';')Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (VARIABLE)Tj [-597.89999 ]TJ ('=')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ (';)Tj +0 -1.13038 TD +(|)Tj [-597.89999 ]TJ (WHILE)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj +T* +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (%prec)Tj [-597.89999 ]TJ (IFX)Tj +T* +(|)Tj [-597.89999 ]TJ (I)Tj [0 ]TJ (F)Tj [-597.89999 ]TJ ('\(')Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('\)')Tj [-597.89999 ]TJ (stmt)Tj [-597.89999 ]TJ (ELSE)Tj [-597.89999 ]TJ (stmt)Tj +T* +(|)Tj [-597.89999 ]TJ ('{')Tj [-597.89999 ]TJ (stmt_list)Tj [-597.89999 ]TJ ('}')Tj +T* +(|)Tj [-597.89999 ]TJ (error)Tj [-597.89999 ]TJ (';')Tj +0 -1.11959 TD +(|)Tj [-597.89999 ]TJ (error)Tj [-597.89999 ]TJ ('}')Tj +0 -1.13038 TD +0 Tc +(;)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 37 37 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 37)Tj +0 55.82998 TD +-0.00209 Tc +0 Tw +(The )Tj +/N173 1 Tf +11.03909 0 0 11.03909 113.31118 708.96688 Tm +-0.00219 Tc +(error)Tj +/N231 1 Tf +11.99899 0 0 11.99899 146.42849 708.96688 Tm +-0.00039 Tc +0.14039 Tw +( token is )Tj [-10 ]TJ (a s)Tj [-11.19999 ]TJ (p)Tj [-0.39999 ]TJ (ecial )Tj [-10 ]TJ (featur)Tj [-7.39999 ]TJ (e o)Tj [-10.39999 ]TJ (f)Tj [2.59999 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.59999 ]TJ (a)Tj [-6.59999 ]TJ (cc)Tj [-6.59999 ]TJ ( that will match)Tj [-10.39999 ]TJ ( all input )Tj [-10 ]TJ (until the token)Tj [-10.39999 ]TJ ( )Tj +-4.69999 -1.20999 TD +0.00059 Tc +0 Tw +(f)Tj [3.59999 ]TJ (o)Tj [0.59999 ]TJ (llowing)Tj [10.59999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 140.06898 694.44808 Tm +-0.00219 Tc +(error)Tj +/N231 1 Tf +11.99899 0 0 11.99899 173.06619 694.44808 Tm +0.04219 Tw +( i)Tj [-4.39999 ]TJ (s)Tj [-3 ]TJ ( foun)Tj [-12.19999 ]TJ (d. For t)Tj [-4.39999 ]TJ (h)Tj [-2.19999 ]TJ (i)Tj [-4.39999 ]TJ (s)Tj [-3 ]TJ ( ex)Tj [-12.19999 ]TJ (am)Tj [-4.39999 ]TJ (pl)Tj [-4.39999 ]TJ (e, whe)Tj [-8.39999 ]TJ (n)Tj [-2.19999 ]TJ ( )Tj [-10 ]TJ (y)Tj [17.79998 ]TJ (a)Tj [-8.39999 ]TJ (cc d)Tj [-12.19999 ]TJ (e)Tj [1.59999 ]TJ (t)Tj [-4.39999 ]TJ (ect)Tj [-4.39999 ]TJ (s )Tj [-10 ]TJ (an er)Tj [-9.19999 ]TJ (ror i)Tj [-4.39999 ]TJ (n)Tj [-12.19999 ]TJ ( a st)Tj [-4.39999 ]TJ (at)Tj [-4.39999 ]TJ (em)Tj [-4.39999 ]TJ (ent)Tj [-4.39999 ]TJ ( i)Tj [-4.39999 ]TJ (t)Tj [-14.39999 ]TJ ( )Tj +-6.91999 -1.20999 TD +0.00169 Tc +-0.00169 Tw +(will c)Tj [5.5 ]TJ (a)Tj [5.5 ]TJ (ll )Tj +/N173 1 Tf +11.03909 0 0 11.03909 132.02969 679.92929 Tm +-0.00219 Tc +0 Tw +(yyerror)Tj +/N231 1 Tf +11.99899 0 0 11.99899 178.22579 679.92929 Tm +-0.00048 Tc +0.00048 Tw +(, flush input up to the nex)Tj [-10.5 ]TJ (t)Tj [-2.69999 ]TJ ( semi)Tj [7.29998 ]TJ (colon or bra)Tj [-6.69999 ]TJ (ce, and )Tj [-10 ]TJ (resu)Tj [-10.5 ]TJ (me scannin)Tj [-10.5 ]TJ (g)Tj [9.5 ]TJ (. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 643.69239 Tm +-0.00039 Tc +0.58718 Tw +(6.4 Inherit)Tj [-5.69999 ]TJ (e)Tj [-0.59999 ]TJ (d )Tj [571.39999 ]TJ (A)Tj [15 ]TJ (t)Tj [-5.69999 ]TJ (tri)Tj [-8.29998 ]TJ (b)Tj [-6.09999 ]TJ (utes )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 623.29409 Tm +-0.00149 Tc +0.00149 Tw +(The ex)Tj [-11.5 ]TJ (am)Tj [-3.69999 ]TJ (pl)Tj [-3.69999 ]TJ (es so f)Tj [-8.5 ]TJ (a)Tj [2.29998 ]TJ (r hav)Tj [-11.5 ]TJ (e)Tj [-7.69999 ]TJ ( used )Tj +/N171 1 Tf +12.55999 0 TD +-0.00048 Tc +0 Tw +(synthesized)Tj +/N231 1 Tf +4.55999 0 TD +-0.00099 Tc +0.00099 Tw +( attributes. At an)Tj [-21 ]TJ (y)Tj [19 ]TJ ( point in )Tj [-10 ]TJ (a s)Tj [-21.79998 ]TJ (y)Tj [19 ]TJ (nt)Tj [-13.19999 ]TJ (ax)Tj [-11 ]TJ ( tree we)Tj [-7.19999 ]TJ ( can)Tj [-11 ]TJ ( )Tj +-17.11999 -1.14999 TD +-0.00059 Tc +0.00059 Tw +(determine the attributes o)Tj [-10.59999 ]TJ (f)Tj [2.39999 ]TJ ( a node bas)Tj [-11.39999 ]TJ (e)Tj [3.19999 ]TJ (d on the attr)Tj [-7.59999 ]TJ (ibutes of its children. Consider the rule )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 583.69738 Tm +-0.00219 Tc +(expr:)Tj [-597.89999 ]TJ (expr)Tj [-597.89999 ]TJ ('+')Tj [-597.89999 ]TJ (expr)Tj [-6467.39999 ]TJ ({)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ ($)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($)Tj [0 ]TJ (1)Tj [-597.89999 ]TJ (+)Tj [-597.89999 ]TJ ($3;)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 569.41859 Tm +0 Tc +( )Tj +T* +-0.00129 Tc +0.10128 Tw +(Since we)Tj [-7.5 ]TJ ( ar)Tj [-8.29998 ]TJ (e p)Tj [-11.29998 ]TJ (a)Tj [2.5 ]TJ (rsin)Tj [-11.29998 ]TJ (g)Tj [8.69999 ]TJ ( bo)Tj [-11.29998 ]TJ (ttom-up, the values)Tj [-12.09999 ]TJ ( of b)Tj [-11.29998 ]TJ (o)Tj [-1.29998 ]TJ (th operands)Tj [-12.09999 ]TJ ( ar)Tj [-8.29998 ]TJ (e )Tj [-10 ]TJ (availab)Tj [-11.29998 ]TJ (l)Tj [-3.5 ]TJ (e, and )Tj [-10 ]TJ (we )Tj [-10 ]TJ (can)Tj [-11.29998 ]TJ ( )Tj +T* +-0.00209 Tc +0.11209 Tw +(det)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (rm)Tj [-4.29998 ]TJ (i)Tj [-4.29998 ]TJ (n)Tj [-2.09999 ]TJ (e t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e val)Tj [-4.29998 ]TJ (u)Tj [-2.09999 ]TJ (e asso)Tj [-12.09999 ]TJ (ci)Tj [-4.29998 ]TJ (at)Tj [-4.29998 ]TJ (ed wi)Tj [-4.29998 ]TJ (t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ ( t)Tj [-4.29998 ]TJ (h)Tj [-2.09999 ]TJ (e l)Tj [-4.29998 ]TJ (e)Tj [1.69999 ]TJ (ft)Tj [-4.09999 ]TJ (-hand)Tj [-12.09999 ]TJ ( si)Tj [-4.29998 ]TJ (de. An )Tj +/N171 1 Tf +24.40998 0 TD +0.00119 Tc +0 Tw +(inhe)Tj [5 ]TJ (rite)Tj [5 ]TJ (d)Tj +/N231 1 Tf +3.60998 0 TD +-0.00109 Tc +0.11109 Tw +( attribute of a node )Tj +-28.01998 -1.14999 TD +-0.00068 Tc +0.13069 Tw +(depends on)Tj [-10.69999 ]TJ ( the valu)Tj [-10.69999 ]TJ (e of)Tj [-7.69999 ]TJ ( a p)Tj [-10.69999 ]TJ (a)Tj [3.09999 ]TJ (rent o)Tj [-10.69999 ]TJ (r)Tj [2.29998 ]TJ ( sibling nod)Tj [-10.69999 ]TJ (e. The)Tj [-6.89999 ]TJ ( followin)Tj [-10.69999 ]TJ (g)Tj [9.29998 ]TJ ( )Tj [-10 ]TJ (g)Tj [9.29998 ]TJ (r)Tj [-7.69999 ]TJ (ammar de)Tj [-6.89999 ]TJ (fines )Tj [-10 ]TJ (a C)Tj [-13.69999 ]TJ ( )Tj +T* +-0.00079 Tc +0.00079 Tw +(variable de)Tj [-7 ]TJ (clar)Tj [-7.79998 ]TJ (ation: )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 488.42529 Tm +-0.00219 Tc +(decl:)Tj [-597.89999 ]TJ (type)Tj [-597.89999 ]TJ (varlist)Tj +0 -1.13038 TD +(type:)Tj [-597.89999 ]TJ (INT)Tj [-597.89999 ]TJ (|)Tj [-597.89999 ]TJ (FLOAT)Tj +0 -1.11959 TD +(varlist:)Tj +4.78259 -1.13038 TD +(VAR)Tj [-11358.69999 ]TJ ({)Tj [-597.89999 ]TJ (setType\($1,)Tj [-597.89999 ]TJ ($0\);)Tj [-597.89999 ]TJ (})Tj +-0.32609 -1.13038 TD +(|)Tj [-597.89999 ]TJ (varlist)Tj [-597.89999 ]TJ (',')Tj [-597.89999 ]TJ (VAR)Tj [-3315.19999 ]TJ ({)Tj [-597.89999 ]TJ (setType\($3,)Tj [-597.89999 ]TJ ($0\);)Tj [-597.89999 ]TJ (})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 424.35069 Tm +0 Tc +( )Tj +0 -1.14999 TD +0.00039 Tc +-0.00039 Tw +(He)Tj [4.19999 ]TJ (r)Tj [3.39999 ]TJ (e)Tj [4.19999 ]TJ ( is a)Tj [4.19999 ]TJ ( s)Tj [-10.39999 ]TJ (a)Tj [4.19999 ]TJ (mple)Tj [4.19999 ]TJ ( pa)Tj [4.19999 ]TJ (r)Tj [3.39999 ]TJ (s)Tj [-10.39999 ]TJ (e)Tj [4.19999 ]TJ (:)Tj [-1.69999 ]TJ ( )Tj +T* +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 384.75399 Tm +-0.00219 Tc +(.)Tj [-597.89999 ]TJ (INT)Tj [-597.89999 ]TJ (VAR)Tj +0 -1.13038 TD +(INT)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (VAR)Tj +T* +(type)Tj [-597.89999 ]TJ (.)Tj [-597.89999 ]TJ (VAR)Tj +0 -1.11959 TD +(type)Tj [-597.89999 ]TJ (VAR)Tj [-597.89999 ]TJ (.)Tj +0 -1.13038 TD +(type)Tj [-597.89999 ]TJ (varlist)Tj [-597.89999 ]TJ (.)Tj +T* +(decl)Tj [-597.89999 ]TJ (.)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 308.20028 Tm +0 Tc +( )Tj +0 -1.16999 TD +-0.00248 Tc +0.04249 Tw +(W)Tj [-8.69999 ]TJ (h)Tj [-2.5 ]TJ (en we redu)Tj [-12.5 ]TJ (ce )Tj +/N173 1 Tf +11.03909 0 0 11.03909 174.98609 294.16149 Tm +-0.00219 Tc +0 Tw +(VAR)Tj +/N231 1 Tf +11.99899 0 0 11.99899 194.78448 294.16149 Tm +0.00109 Tc +0.03889 Tw +( to )Tj +/N173 1 Tf +11.03909 0 0 11.03909 211.22309 294.16149 Tm +-0.00219 Tc +0 Tw +(varlist)Tj +/N231 1 Tf +11.99899 0 0 11.99899 257.41918 294.16149 Tm +-0.00068 Tc +0.04069 Tw +(, we should an)Tj [-10.69999 ]TJ (notate the s)Tj [-21.5 ]TJ (y)Tj [29.29998 ]TJ (m)Tj [-12.89999 ]TJ (bol table )Tj [-10 ]TJ (with the t)Tj [-12.89999 ]TJ (y)Tj [19.29998 ]TJ (pe)Tj [-6.89999 ]TJ ( of)Tj [-7.69999 ]TJ ( )Tj +-13.94999 -1.18998 TD +-0.00079 Tc +0.23078 Tw +(the variabl)Tj [-13 ]TJ (e)Tj [3 ]TJ (. How)Tj [-8.59999 ]TJ (e)Tj [3 ]TJ (ver,)Tj [-10.79998 ]TJ ( )Tj [-10 ]TJ (the t)Tj [-13 ]TJ (y)Tj [19.19999 ]TJ (p)Tj [-10.79998 ]TJ (e)Tj [3 ]TJ ( is buried)Tj [-10.79998 ]TJ ( in th)Tj [-10.79998 ]TJ (e stack. )Tj [-10 ]TJ (This problem i)Tj [-13 ]TJ (s)Tj [-1.59999 ]TJ ( resolved b)Tj [-20.79998 ]TJ (y)Tj [19.19999 ]TJ ( )Tj +0 -1.16999 TD +0.00099 Tc +0.11898 Tw +(inde)Tj [4.79998 ]TJ (x)Tj [-9 ]TJ (i)Tj [-1.19999 ]TJ (ng)Tj [11 ]TJ ( ba)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (k)Tj [1 ]TJ ( into the)Tj [4.79998 ]TJ ( sta)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (k. Re)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (a)Tj [4.79998 ]TJ (ll tha)Tj [4.79998 ]TJ (t)Tj [-1.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 295.21609 265.84388 Tm +-0.00219 Tc +0 Tw +($1)Tj +/N231 1 Tf +11.99899 0 0 11.99899 308.41499 265.84388 Tm +0.00099 Tc +0.11898 Tw +( de)Tj [4.79998 ]TJ (si)Tj [-11.19999 ]TJ (g)Tj [11 ]TJ (n)Tj [1 ]TJ (a)Tj [4.79998 ]TJ (t)Tj [-11.19999 ]TJ (e)Tj [4.79998 ]TJ (s)Tj [0.19999 ]TJ ( the)Tj [4.79998 ]TJ ( f)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (r)Tj [4 ]TJ (s)Tj [0.19999 ]TJ (t te)Tj [4.79998 ]TJ (r)Tj [4 ]TJ (m)Tj [-1.19999 ]TJ ( on the)Tj [4.79998 ]TJ ( r)Tj [4 ]TJ (i)Tj [-1.19999 ]TJ (g)Tj [11 ]TJ (h)Tj [1 ]TJ (t-)Tj [4 ]TJ (h)Tj [-9 ]TJ (a)Tj [4.79998 ]TJ (nd )Tj +-18.19999 -1.20999 TD +-0.00079 Tc +0.12078 Tw +(side. W)Tj [-7 ]TJ (e)Tj [3 ]TJ ( can index)Tj [-10.79998 ]TJ ( backwards, using)Tj [9.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 279.01739 251.32508 Tm +-0.00219 Tc +0 Tw +($0)Tj +/N231 1 Tf +11.99899 0 0 11.99899 292.21629 251.32508 Tm +0 Tc +(, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 299.65568 251.32508 Tm +-0.00219 Tc +($-1)Tj +/N231 1 Tf +11.99899 0 0 11.99899 319.45408 251.32508 Tm +-0.00019 Tc +0.12019 Tw +(, a)Tj [-6.39999 ]TJ (nd so on. )Tj [-10 ]TJ (I)Tj [22.79998 ]TJ (n)Tj [-0.19999 ]TJ ( this case, )Tj +/N173 1 Tf +11.03909 0 0 11.03909 447.36338 251.32508 Tm +0.00869 Tc +0 Tw +($0)Tj +/N231 1 Tf +11.99899 0 0 11.99899 460.68229 251.32508 Tm +0.00088 Tc +0.11909 Tw +( will do just)Tj [8.69999 ]TJ ( )Tj +-30.88999 -1.20999 TD +-0.00079 Tc +0.07078 Tw +(fine. )Tj [-10 ]TJ (I)Tj [12.19999 ]TJ (f)Tj [2.19999 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.19999 ]TJ (ou need to spec)Tj [-7 ]TJ (if)Tj [-7.79998 ]TJ (y)Tj [19.19999 ]TJ ( a token t)Tj [-23 ]TJ (y)Tj [19.19999 ]TJ (pe, the s)Tj [-21.59999 ]TJ (y)Tj [19.19999 ]TJ (ntax)Tj [-10.79998 ]TJ ( is )Tj +/N173 1 Tf +11.03909 0 0 11.03909 359.77069 236.80628 Tm +-0.00219 Tc +0 Tw +($0)Tj +/N231 1 Tf +11.99899 0 0 11.99899 445.56349 236.80628 Tm +-0.00299 Tc +0.06298 Tw +(,)Tj [7 ]TJ ( ang)Tj [7 ]TJ (l)Tj [-15.19999 ]TJ (e )Tj [-10 ]TJ (brack)Tj [-13 ]TJ (et)Tj [-5.19999 ]TJ (s)Tj [-13.79998 ]TJ ( )Tj +-29.62998 -1.19999 TD +-0.00199 Tc +0.21199 Tw +(i)Tj [-4.19999 ]TJ (n)Tj [-2 ]TJ (cl)Tj [-4.19999 ]TJ (uded. )Tj [-10 ]TJ (I)Tj [11 ]TJ (n)Tj [-2 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (i)Tj [-4.19999 ]TJ (s)Tj [-2.79998 ]TJ ( part)Tj [-4.19999 ]TJ (i)Tj [-4.19999 ]TJ (c)Tj [1.79998 ]TJ (u)Tj [-12 ]TJ (l)Tj [-4.19999 ]TJ (ar ex)Tj [-12 ]TJ (am)Tj [-4.19999 ]TJ (pl)Tj [-4.19999 ]TJ (e, car)Tj [-9 ]TJ (e m)Tj [-4.19999 ]TJ (u)Tj [-2 ]TJ (st)Tj [-4.19999 ]TJ ( be t)Tj [-4.19999 ]TJ (a)Tj [1.79998 ]TJ (ken t)Tj [-4.19999 ]TJ (o)Tj [-2 ]TJ ( ensur)Tj [-9 ]TJ (e)Tj [1.79998 ]TJ ( t)Tj [-4.19999 ]TJ (h)Tj [-2 ]TJ (at)Tj [-14.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 456.84259 222.40748 Tm +-0.00219 Tc +0 Tw +(type)Tj +/N231 1 Tf +11.99899 0 0 11.99899 483.24038 222.40748 Tm +0 Tc +( )Tj +/N171 1 Tf +0.45999 0 TD +-0.00039 Tc +(always)Tj +/N231 1 Tf +2.76998 0 TD +0 Tc +( )Tj +-36 -1.20999 TD +-0.00268 Tc +(preced)Tj [-12.69999 ]TJ (es )Tj +/N173 1 Tf +11.03909 0 0 11.03909 134.90939 207.88868 Tm +-0.00219 Tc +(varlist)Tj +/N231 1 Tf +11.99899 0 0 11.99899 181.10559 207.88868 Tm +0 Tc +(. )Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 171.65168 Tm +-0.00088 Tc +0.58769 Tw +(6.5 Embe)Tj [-8.69999 ]TJ (dde)Tj [-8.69999 ]TJ (d )Tj [571.39999 ]TJ (A)Tj [22 ]TJ (c)Tj [-8.69999 ]TJ (t)Tj [-6.19999 ]TJ (i)Tj [-8.79998 ]TJ (ons )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 151.13339 Tm +0.00009 Tc +-0.00009 Tw +(Rules in )Tj [-10 ]TJ (y)Tj [20.09999 ]TJ (a)Tj [3.89999 ]TJ (c)Tj [-6.09999 ]TJ (c)Tj [3.89999 ]TJ ( ma)Tj [-16.09999 ]TJ (y)Tj [20.09999 ]TJ ( cont)Tj [-12.09999 ]TJ (ain embedded a)Tj [-6.09999 ]TJ (c)Tj [3.89999 ]TJ (tions: )Tj +0 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 125.33558 Tm +-0.00219 Tc +(list:)Tj [-597.89999 ]TJ (item1)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (do_item1\($1\);)Tj [-597.89999 ]TJ (})Tj [-597.89999 ]TJ (item2)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (do_item2\($3\);)Tj [-597.89999 ]TJ (})Tj [-597.89999 ]TJ (item3)Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 111.17678 Tm +0 Tc +( )Tj +0 -1.16999 TD +0.00099 Tc +0.15899 Tw +(Note)Tj [4.79998 ]TJ ( tha)Tj [4.79998 ]TJ (t)Tj [-1.19999 ]TJ ( the)Tj [4.79998 ]TJ ( a)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (tions ta)Tj [14.79998 ]TJ (ke)Tj [4.79998 ]TJ ( a)Tj [4.79998 ]TJ ( slot in)Tj [11 ]TJ ( the)Tj [4.79998 ]TJ ( s)Tj [10.19999 ]TJ (t)Tj [-1.19999 ]TJ (a)Tj [4.79998 ]TJ (c)Tj [4.79998 ]TJ (k, so )Tj +/N173 1 Tf +11.03909 0 0 11.03909 338.53239 97.13789 Tm +-0.00219 Tc +0 Tw +(do_item2)Tj +/N231 1 Tf +11.99899 0 0 11.99899 391.32809 97.13789 Tm +0.00079 Tc +0.15919 Tw +( must)Tj [8.59999 ]TJ ( use)Tj [4.59999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 445.20359 97.13789 Tm +-0.00219 Tc +0 Tw +($3)Tj +/N231 1 Tf +11.99899 0 0 11.99899 458.40249 97.13789 Tm +-0.00279 Tc +0.16279 Tw +( t)Tj [-5 ]TJ (o)Tj [-2.79998 ]TJ ( referenc)Tj [-9 ]TJ (e )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 82.61918 Tm +-0.00219 Tc +0 Tw +(item2)Tj +/N231 1 Tf +11.99899 0 0 11.99899 123.03039 82.61918 Tm +0.00129 Tc +-0.00129 Tw +(. Ac)Tj [5.09999 ]TJ (tua)Tj [5.09999 ]TJ (l)Tj [-0.89999 ]TJ (l)Tj [-10.89999 ]TJ (y)Tj [21.29998 ]TJ (, this )Tj [-10 ]TJ (g)Tj [11.29998 ]TJ (r)Tj [-5.69999 ]TJ (amma)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ ( is tr)Tj [4.29998 ]TJ (a)Tj [5.09999 ]TJ (n)Tj [1.29998 ]TJ (sf)Tj [4.29998 ]TJ (or)Tj [4.29998 ]TJ (me)Tj [5.09999 ]TJ (d b)Tj [-18.69999 ]TJ (y)Tj [21.29998 ]TJ ( )Tj [-10 ]TJ (y)Tj [21.29998 ]TJ (acc)Tj [5.09999 ]TJ ( into the)Tj [5.09999 ]TJ ( f)Tj [4.29998 ]TJ (o)Tj [1.29998 ]TJ (llowin)Tj [-8.69999 ]TJ (g)Tj [11.29998 ]TJ (: )Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 38 38 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 38)Tj +0 55.84999 TD +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 697.20788 Tm +-0.00219 Tc +(list:)Tj [-597.89999 ]TJ (item1)Tj [-597.89999 ]TJ (_rule01)Tj [-597.89999 ]TJ (item2)Tj [-597.89999 ]TJ (_rule02)Tj [-597.89999 ]TJ (item3)Tj +/N177 1 Tf +0 -1.13038 TD +0 Tc +(_)Tj +/N173 1 Tf +0.59779 0 TD +-0.00219 Tc +(rule01:)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (do_item1\($0\);)Tj [-597.89999 ]TJ (})Tj +-0.59779 -1.13038 TD +(_rule02:)Tj [-597.89999 ]TJ ({)Tj [-597.89999 ]TJ (do_item2\($0\);)Tj [-597.89999 ]TJ (})Tj +/N223 1 Tf +15.95869 0 0 15.95869 90.03318 636.01298 Tm +-0.00079 Tc +0.58758 Tw +(6.6 Debu)Tj [-6.5 ]TJ (ggi)Tj [-8.69999 ]TJ (ng )Tj [586.39999 ]TJ (Ya)Tj [-8.59999 ]TJ (c)Tj [-8.59999 ]TJ (c)Tj [-1 ]TJ ( )Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 615.61468 Tm +0.00129 Tc +0.07868 Tw +(Ya)Tj [5.09999 ]TJ (c)Tj [5.09999 ]TJ (c)Tj [-4.89999 ]TJ ( ha)Tj [5.09999 ]TJ (s fa)Tj [5.09999 ]TJ (c)Tj [5.09999 ]TJ (ilitie)Tj [5.09999 ]TJ (s tha)Tj [5.09999 ]TJ (t)Tj [-0.89999 ]TJ ( ena)Tj [5.09999 ]TJ (b)Tj [1.29998 ]TJ (le)Tj [5.09999 ]TJ ( de)Tj [5.09999 ]TJ (bu)Tj [-8.69999 ]TJ (gg)Tj [11.29998 ]TJ (in)Tj [-8.69999 ]TJ (g)Tj [11.29998 ]TJ (.)Tj [1.29998 ]TJ ( This )Tj [-10 ]TJ (f)Tj [4.29998 ]TJ (e)Tj [-4.89999 ]TJ (a)Tj [5.09999 ]TJ (t)Tj [-0.89999 ]TJ (ur)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ ( ma)Tj [-14.89999 ]TJ (y)Tj [21.29998 ]TJ ( v)Tj [-8.69999 ]TJ (a)Tj [5.09999 ]TJ (r)Tj [-15.69999 ]TJ (y)Tj [21.29998 ]TJ ( )Tj [-10 ]TJ (with dif)Tj [4.29998 ]TJ (f)Tj [-5.69999 ]TJ (e)Tj [5.09999 ]TJ (r)Tj [4.29998 ]TJ (e)Tj [5.09999 ]TJ (n)Tj [1.29998 ]TJ (t ver)Tj [4.29998 ]TJ (s)Tj [0.5 ]TJ (ions )Tj +0 -1.14999 TD +-0.00028 Tc +0.05029 Tw +(of )Tj [-20 ]TJ (y)Tj [19.69999 ]TJ (a)Tj [3.5 ]TJ (c)Tj [-6.5 ]TJ (c)Tj [3.5 ]TJ (, so )Tj [-20 ]TJ (y)Tj [19.69999 ]TJ (ou should )Tj [-10 ]TJ (c)Tj [-6.5 ]TJ (onsult documentation for)Tj [-7.29998 ]TJ ( details. The )Tj [-10 ]TJ (code )Tj [-10 ]TJ (gener)Tj [-7.29998 ]TJ (a)Tj [-6.5 ]TJ (ted b)Tj [-10.29998 ]TJ (y)Tj [19.69999 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.69999 ]TJ (a)Tj [-6.5 ]TJ (c)Tj [-6.5 ]TJ (c)Tj [3.5 ]TJ ( in )Tj +0 -1.16999 TD +0.00219 Tc +0 Tw +(f)Tj [5.19999 ]TJ (ile)Tj [6 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 109.95149 587.77699 Tm +-0.00219 Tc +(y.tab.c)Tj +/N231 1 Tf +11.99899 0 0 11.99899 156.14768 587.77699 Tm +-0.00039 Tc +0.08039 Tw +( includes d)Tj [9.59999 ]TJ (e)Tj [3.39999 ]TJ (bugg)Tj [9.59999 ]TJ (in)Tj [-10.39999 ]TJ (g)Tj [9.59999 ]TJ ( statements that are enabled b)Tj [-20.39999 ]TJ (y)Tj [29.59999 ]TJ ( d)Tj [-10.39999 ]TJ (e)Tj [3.39999 ]TJ (finin)Tj [-10.39999 ]TJ (g)Tj [-0.39999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 454.56278 587.77699 Tm +-0.00219 Tc +0 Tw +(YYDEBUG)Tj +/N231 1 Tf +11.99899 0 0 11.99899 500.75898 587.77699 Tm +-0.00099 Tc +0.08099 Tw +( and )Tj +-34.22999 -1.18998 TD +0.00109 Tc +0.03889 Tw +(se)Tj [4.89999 ]TJ (tting)Tj [11.09999 ]TJ ( it to a)Tj [4.89999 ]TJ ( non)Tj [-8.89999 ]TJ (-)Tj [4.09999 ]TJ (z)Tj [-5.09999 ]TJ (e)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (o v)Tj [-8.89999 ]TJ (a)Tj [4.89999 ]TJ (lue)Tj [4.89999 ]TJ (.)Tj [1.09999 ]TJ ( This ma)Tj [-15.09999 ]TJ (y)Tj [21.09999 ]TJ ( )Tj [-10 ]TJ (a)Tj [4.89999 ]TJ (l)Tj [-1.09999 ]TJ (so be)Tj [4.89999 ]TJ ( d)Tj [-8.89999 ]TJ (one)Tj [4.89999 ]TJ ( b)Tj [-18.89999 ]TJ (y)Tj [21.09999 ]TJ ( spec)Tj [4.89999 ]TJ (if)Tj [-15.89999 ]TJ (y)Tj [31.09999 ]TJ (i)Tj [-1.09999 ]TJ (n)Tj [-8.89999 ]TJ (g)Tj [1.09999 ]TJ ( c)Tj [4.89999 ]TJ (o)Tj [1.09999 ]TJ (mm)Tj [-11.09999 ]TJ (a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ (d-)Tj [4.09999 ]TJ (line)Tj [4.89999 ]TJ ( option )Tj +0 -1.16999 TD +0 Tc +0 Tw +(\223)Tj +/N173 1 Tf +11.03909 0 0 11.03909 95.31269 559.45939 Tm +-0.00219 Tc +(-t)Tj +/N231 1 Tf +11.99899 0 0 11.99899 108.51159 559.45939 Tm +0.00268 Tc +0.11729 Tw +(\224)Tj [6.5 ]TJ (.)Tj [2.69999 ]TJ ( With )Tj +/N173 1 Tf +11.03909 0 0 11.03909 149.78819 559.45939 Tm +-0.00219 Tc +0 Tw +(YYDEBUG)Tj +/N231 1 Tf +11.99899 0 0 11.99899 195.98429 559.45939 Tm +0.00109 Tc +0.11889 Tw +( prope)Tj [4.89999 ]TJ (r)Tj [4.09999 ]TJ (l)Tj [-11.09999 ]TJ (y)Tj [21.09999 ]TJ ( )Tj [-10 ]TJ (se)Tj [4.89999 ]TJ (t, d)Tj [-8.89999 ]TJ (e)Tj [4.89999 ]TJ (bu)Tj [-8.89999 ]TJ (g)Tj [11.09999 ]TJ ( output may)Tj [21.09999 ]TJ ( )Tj [-10 ]TJ (be)Tj [4.89999 ]TJ ( to)Tj [-8.89999 ]TJ (gg)Tj [11.09999 ]TJ (le)Tj [4.89999 ]TJ (d)Tj [-8.89999 ]TJ ( on a)Tj [4.89999 ]TJ (n)Tj [1.09999 ]TJ (d)Tj [-8.89999 ]TJ ( of)Tj [4.09999 ]TJ (f)Tj [4.09999 ]TJ ( b)Tj [-18.89999 ]TJ (y)Tj [21.09999 ]TJ ( s)Tj [-9.69999 ]TJ (e)Tj [4.89999 ]TJ (ttin)Tj [-8.89999 ]TJ (g )Tj +/N173 1 Tf +11.03909 0 0 11.03909 90.03318 544.94059 Tm +-0.00219 Tc +0 Tw +(yydebug)Tj +/N231 1 Tf +11.99899 0 0 11.99899 136.22929 544.94059 Tm +-0.00048 Tc +0.00048 Tw +(. Output includes tokens scann)Tj [-10.5 ]TJ (e)Tj [3.29998 ]TJ (d and sh)Tj [-10.5 ]TJ (ift/reduce )Tj [-10 ]TJ (actions. )Tj +-3.84999 -1.17999 TD +0 Tc +0 Tw +( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 518.78279 Tm +-0.00219 Tc +(%{)Tj +0 -1.13038 TD +(#define)Tj [-597.89999 ]TJ (YYDEBUG)Tj [-597.89999 ]TJ (1)Tj +T* +(%})Tj +T* +(%%)Tj +T* +(...)Tj +T* +(%%)Tj +T* +(int)Tj [-597.89999 ]TJ (main\(void\))Tj [-597.89999 ]TJ ({)Tj +2.39129 -1.11959 TD +(#if)Tj [-597.89999 ]TJ (YYDEBUG)Tj +2.39129 -1.13038 TD +(yydebug)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (1)Tj [0 ]TJ (;)Tj +-2.39129 -1.13038 TD +(#endif)Tj +T* +(yylex\(\);)Tj +-2.39129 -1.13038 TD +0 Tc +(})Tj +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 367.35539 Tm +( )Tj +0 -1.16999 TD +-0.00039 Tc +0.19039 Tw +(I)Tj [12.59999 ]TJ (n)Tj [-0.39999 ]TJ ( )Tj [-10 ]TJ (addition, )Tj [-10 ]TJ (y)Tj [19.59999 ]TJ (ou can du)Tj [-10.39999 ]TJ (mp the parse states b)Tj [-10.39999 ]TJ (y)Tj [19.59999 ]TJ ( )Tj [-10 ]TJ (specif)Tj [-17.39999 ]TJ (y)Tj [19.59999 ]TJ (in)Tj [-10.39999 ]TJ (g)Tj [9.59999 ]TJ ( command-lin)Tj [-10.39999 ]TJ (e option ")Tj +/N173 1 Tf +11.03909 0 0 11.03909 500.87899 353.31658 Tm +-0.00219 Tc +0 Tw +(-v)Tj +/N231 1 Tf +11.99899 0 0 11.99899 514.07778 353.31658 Tm +-0.00819 Tc +(".)Tj [-18.19999 ]TJ ( )Tj +-35.33999 -1.19999 TD +-0.00059 Tc +0.10058 Tw +(States are dumped to fil)Tj [-12.79998 ]TJ (e)Tj [3.19999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 218.30249 338.91778 Tm +-0.00219 Tc +0 Tw +(y.output)Tj +/N231 1 Tf +11.99899 0 0 11.99899 271.09809 338.91778 Tm +-0.00088 Tc +0.10089 Tw +(, and a)Tj [-7.09999 ]TJ (r)Tj [2.09999 ]TJ (e of)Tj [-7.89999 ]TJ (ten useful when d)Tj [-10.89999 ]TJ (e)Tj [2.89999 ]TJ (bu)Tj [-10.89999 ]TJ (gg)Tj [9.09999 ]TJ (ing)Tj [9.09999 ]TJ ( a )Tj [-10 ]TJ (grammar)Tj [-7.89999 ]TJ (.)Tj [-10.89999 ]TJ ( )Tj +-15.08999 -1.20999 TD +0.25088 Tw +(Alternativel)Tj [-23.09999 ]TJ (y)Tj [19.09999 ]TJ (,)Tj [-0.89999 ]TJ ( )Tj [-20 ]TJ (y)Tj [19.09999 ]TJ (ou )Tj [-10 ]TJ (can )Tj [-10 ]TJ (write )Tj [-20 ]TJ (y)Tj [19.09999 ]TJ (our o)Tj [-10.89999 ]TJ (w)Tj [1.29998 ]TJ (n debu)Tj [-10.89999 ]TJ (g )Tj [-10 ]TJ (code b)Tj [-20.89999 ]TJ (y)Tj [19.09999 ]TJ ( d)Tj [-10.89999 ]TJ (e)Tj [2.89999 ]TJ (finin)Tj [-10.89999 ]TJ (g)Tj [9.09999 ]TJ ( a)Tj [-7.09999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 433.92449 324.39898 Tm +-0.00219 Tc +0 Tw +(TR)Tj [-10.89999 ]TJ (ACE)Tj +/N231 1 Tf +11.99899 0 0 11.99899 467.04168 324.39898 Tm +-0.00169 Tc +0.25169 Tw +( m)Tj [-3.89999 ]TJ (acro, )Tj [-10 ]TJ (as )Tj +-31.41999 -1.20999 TD +0.00109 Tc +0.21879 Tw +(illustr)Tj [4.09999 ]TJ (a)Tj [4.89999 ]TJ (te)Tj [4.89999 ]TJ (d be)Tj [4.89999 ]TJ (low. Whe)Tj [4.89999 ]TJ (n)Tj [-8.89999 ]TJ ( )Tj +/N173 1 Tf +11.03909 0 0 11.03909 216.02268 309.88018 Tm +-0.00219 Tc +0 Tw +(DEBUG)Tj +/N231 1 Tf +11.99899 0 0 11.99899 249.01989 309.88018 Tm +-0.00149 Tc +0.22149 Tw +( i)Tj [-3.69999 ]TJ (s)Tj [-2.29998 ]TJ ( defi)Tj [-3.69999 ]TJ (n)Tj [-11.5 ]TJ (e)Tj [2.29998 ]TJ (d, a t)Tj [-13.69999 ]TJ (r)Tj [-8.5 ]TJ (ace o)Tj [-11.5 ]TJ (f)Tj [1.5 ]TJ ( r)Tj [-8.5 ]TJ (e)Tj [2.29998 ]TJ (duct)Tj [-3.69999 ]TJ (i)Tj [-3.69999 ]TJ (ons, b)Tj [-21.5 ]TJ (y)Tj [18.5 ]TJ ( l)Tj [-3.69999 ]TJ (i)Tj [-13.69999 ]TJ (ne num)Tj [-3.69999 ]TJ (ber, i)Tj [-3.69999 ]TJ (s)Tj [-2.29998 ]TJ ( )Tj +-13.25 -1.18998 TD +0.00079 Tc +0 Tw +(displa)Tj [-5.39999 ]TJ (y)Tj [20.79998 ]TJ (e)Tj [4.59999 ]TJ (d. )Tj +/N173 1 Tf +11.03909 0 0 11.03909 126.03019 271.12339 Tm +-0.00219 Tc +(%{)Tj +0 -1.13038 TD +(#ifdef)Tj [-597.89999 ]TJ (DEBUG)Tj +T* +(#define)Tj [-597.89999 ]TJ (TRACE)Tj [-597.89999 ]TJ (printf\("reduce)Tj [-597.89999 ]TJ (at)Tj [-597.89999 ]TJ (line)Tj [-597.89999 ]TJ (%d\\n",)Tj [-597.89999 ]TJ (__LINE__\);)Tj +0 -1.11959 TD +(#else)Tj +0 -1.13038 TD +(#define)Tj [-597.89999 ]TJ (TRACE)Tj +T* +(#endif)Tj +T* +(%})Tj +0 -2.26089 TD +(%%)Tj +0 -2.25 TD +(statement_list:)Tj +5.97828 -1.13038 TD +(statement)Tj +3.58699 -1.13038 TD +({)Tj [-597.89999 ]TJ (TRACE)Tj [-597.89999 ]TJ ($$)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ ($1;)Tj [-597.89999 ]TJ (})Tj +-4.78259 -1.13038 TD +(|)Tj [-597.89999 ]TJ (statement_list)Tj [-597.89999 ]TJ (statement)Tj +4.78259 -1.13038 TD +({)Tj [-597.89999 ]TJ (TRACE)Tj [-597.89999 ]TJ ($$)Tj [-597.89999 ]TJ (=)Tj [-597.89999 ]TJ (newNode\(';',)Tj [-597.69999 ]TJ (2,)Tj [-597.89999 ]TJ ($1,)Tj [-597.89999 ]TJ ($2\);)Tj [-597.89999 ]TJ (})Tj +-4.78259 -1.13038 TD +0 Tc +(;)Tj +ET +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Page: 39 39 +%%BeginPageSetup +userdict /pgsave save put +% Removing the following ten lines is illegal, subject to the Digital Copyright Act of 1998. +currentfile eexec +087329a1c14f91c06b1beed88c3a017a57dc55b72c277c307a6dad3699d3 +7e17892296d7d6c6922fa0c5f42f128b79df36afc85b6fdb03e144d6ef74 +3ecd328b687f222274a77d79e6c485ff08bdbc5e61ca58e5c125176d5974 +d0f16615e05ffaca44ab3a1e4ffb6c21823f8babbdadc183c8217b8b402d +20f939f69910daf2801ce82493f35f170d31fcd898c4fe7cf03596daac2d +55e0f71e44cd5c1f3dc3132f073c6a34973eab3171fb86168707f4e5c16b +e2ad87cdaf9ae7089ff83e958e17d6e20ee05dee82af02015d8cedea1ebb +86284aa7 +exec +0 0 612 792 true PDF begin PDFVars begin AS end end +%%EndPageSetup +0 0 612 792 RC +save +BT +/N231 1 Tf +11.99899 0 0 11.99899 90.03318 39.06278 Tm +/N224 /ColorSpace findRes cs +0 0 0 sc +/N232 /ExtGState findRes gsDI +0 Tc +17.25 Tw +( 39)Tj +/N223 1 Tf +17.99848 0 0 17.99848 90.03318 703.44738 Tm +0.00149 Tc +0.48728 Tw +(7)Tj [4.29998 ]TJ (.)Tj [-0.69999 ]TJ ( Biblio)Tj [5.69999 ]TJ (gra)Tj [4.29998 ]TJ (phy)Tj [11 ]TJ ( )Tj +ET + +88.59298 698.28799 434.84399 -0.47999 rf +BT +/N170 1 Tf +11.99899 0 0 11.99899 90.03318 681.00929 Tm +-0.00219 Tc +0 Tw +(Ah)Tj [-6.09999 ]TJ (o)Tj +/N231 1 Tf +1.77999 0 TD +-0.00048 Tc +0.33049 Tw +(, Alfred)Tj [-10.5 ]TJ ( V., Ravi)Tj [-12.69999 ]TJ ( )Tj [-10 ]TJ (Sethi and J)Tj [-11.29998 ]TJ (e)Tj [3.29998 ]TJ (ffre)Tj [-16.69999 ]TJ (y)Tj [19.5 ]TJ ( )Tj [-10 ]TJ (D. )Tj [-10 ]TJ (Ullman [)Tj [-7.5 ]TJ (1986])Tj [-7.5 ]TJ (. )Tj +0 0 1 sc +24.97999 0 TD +0.00149 Tc +0.32849 Tw +(Compi)Tj [9.29998 ]TJ (l)Tj [9.29998 ]TJ (e)Tj [5.29998 ]TJ (r)Tj [4.5 ]TJ (s)Tj [0.69999 ]TJ (, Pr)Tj [4.5 ]TJ (inic)Tj [5.29998 ]TJ (ple)Tj [5.29998 ]TJ (s)Tj [0.69999 ]TJ (,)Tj [-8.5 ]TJ ( )Tj +ET +411.12599 679.68899 110.87098 -0.59999 rf +BT +11.99899 0 0 11.99899 90.03318 667.21038 Tm +-0.00059 Tc +0.00059 Tw +(Techniques and Tools)Tj +ET +90.03298 665.89099 105.83099 -0.59999 rf +BT +11.99899 0 0 11.99899 195.86428 667.21038 Tm +0 0 0 sc +-0.00009 Tc +0.00009 Tw +(. A)Tj [-7.89999 ]TJ (ddison-W)Tj [-6.29998 ]TJ (e)Tj [3.69999 ]TJ (sle)Tj [-6.29998 ]TJ (y)Tj [19.89999 ]TJ (, Readin)Tj [-10.09999 ]TJ (g)Tj [9.89999 ]TJ (,)Tj [-10.09999 ]TJ ( Massachusetts. )Tj +-8.81999 -1.14999 TD +0 Tc +0 Tw +( )Tj +/N170 1 Tf +T* +0.00389 Tc +(G)Tj [11.69999 ]TJ (a)Tj [3.89999 ]TJ (r)Tj [7.69999 ]TJ (dne)Tj [7.69999 ]TJ (r)Tj +/N231 1 Tf +3.70999 0 TD +-0.00009 Tc +0.07998 Tw +(,)Tj [-10.09999 ]TJ ( J)Tj [-10.89999 ]TJ (im, Chris Ret)Tj [7.69999 ]TJ (t)Tj [-2.29998 ]TJ (erath and)Tj [-10.09999 ]TJ ( Eric)Tj [-6.29998 ]TJ ( Gisin [)Tj [-7.09999 ]TJ (1988])Tj [-7.09999 ]TJ (. MKS )Tj [-10.09999 ]TJ (L)Tj [20.69999 ]TJ (e)Tj [3.69999 ]TJ (x)Tj [-10.09999 ]TJ ( )Tj [-10.09999 ]TJ (&)Tj [7.69999 ]TJ ( Y)Tj [-7.89999 ]TJ (acc)Tj +ET +358.33099 638.29299 90.47198 -0.59999 rf +BT +11.99899 0 0 11.99899 448.80329 639.61268 Tm +-0.00248 Tc +0.09249 Tw +(.)Tj [-12.5 ]TJ ( Mort)Tj [-4.69999 ]TJ (i)Tj [-4.69999 ]TJ (ce )Tj [10 ]TJ (K)Tj [-10.29998 ]TJ (e)Tj [1.29998 ]TJ (rn)Tj [-12.5 ]TJ ( )Tj +-29.89999 -1.14999 TD +-0.00048 Tc +0.01049 Tw +(S)Tj [-14.39999 ]TJ (y)Tj [19.5 ]TJ (stems I)Tj [12.5 ]TJ (n)Tj [-0.5 ]TJ (c., )Tj [10 ]TJ (W)Tj [-6.69999 ]TJ (a)Tj [3.29998 ]TJ (terloo, Ontario, )Tj [10 ]TJ (Canada. )Tj +T* +0 Tc +0 Tw +( )Tj +/N170 1 Tf +T* +0.00119 Tc +(Johnson)Tj +/N231 1 Tf +3.56999 0 TD +0.00009 Tc +0.00988 Tw +(, Stephen )Tj [-10 ]TJ (C. [)Tj [-6.89999 ]TJ (1)Tj [0.09999 ]TJ (9)Tj [10.09999 ]TJ (75])Tj [-6.89999 ]TJ (. )Tj +0 0 1 sc +8.36999 0 TD +-0.00239 Tc +0.02239 Tw +(Yacc:)Tj [-4.59999 ]TJ ( Yet)Tj [-4.59999 ]TJ ( Anot)Tj [-4.59999 ]TJ (her C)Tj [-5.39999 ]TJ (o)Tj [-2.39999 ]TJ (m)Tj [-4.59999 ]TJ (p)Tj [-2.39999 ]TJ (i)Tj [-4.59999 ]TJ (l)Tj [-4.59999 ]TJ (e)Tj [1.39999 ]TJ (r C)Tj [-5.39999 ]TJ (o)Tj [-2.39999 ]TJ (m)Tj [-4.59999 ]TJ (p)Tj [-2.39999 ]TJ (i)Tj [-4.59999 ]TJ (l)Tj [-4.59999 ]TJ (e)Tj [1.39999 ]TJ (r)Tj +ET +233.30099 596.89599 188.02398 -0.59999 rf +BT +11.99899 0 0 11.99899 421.32559 598.21618 Tm +0 0 0 sc +0.00209 Tc +0.01789 Tw +(. Co)Tj [12.09999 ]TJ (mputing)Tj [12.09999 ]TJ ( Sc)Tj [5.89999 ]TJ (ie)Tj [5.89999 ]TJ (nc)Tj [5.89999 ]TJ (e )Tj +-27.60998 -1.14999 TD +0.00059 Tc +0.07939 Tw +(Te)Tj [4.39999 ]TJ (c)Tj [4.39999 ]TJ (hnic)Tj [4.39999 ]TJ (a)Tj [4.39999 ]TJ (l)Tj [-1.59999 ]TJ ( Re)Tj [4.39999 ]TJ (por)Tj [3.59999 ]TJ (t No. 32)Tj [-9.39999 ]TJ (, B)Tj [7.59999 ]TJ (e)Tj [4.39999 ]TJ (ll )Tj [-10 ]TJ (L)Tj [11.39999 ]TJ (a)Tj [4.39999 ]TJ (bor)Tj [3.59999 ]TJ (a)Tj [4.39999 ]TJ (t)Tj [-1.59999 ]TJ (or)Tj [3.59999 ]TJ (i)Tj [-11.59999 ]TJ (e)Tj [4.39999 ]TJ (s, Murr)Tj [3.59999 ]TJ (a)Tj [-15.59999 ]TJ (y)Tj [30.59999 ]TJ ( hill, Ne)Tj [4.39999 ]TJ (w J)Tj [-10.19999 ]TJ (e)Tj [4.39999 ]TJ (r)Tj [3.59999 ]TJ (s)Tj [-0.19999 ]TJ (e)Tj [-15.59999 ]TJ (y)Tj [20.59999 ]TJ (. A )Tj [-10 ]TJ (PDF)Tj [6.69999 ]TJ ( ve)Tj [4.39999 ]TJ (r)Tj [3.59999 ]TJ (s)Tj [-0.19999 ]TJ (ion is)Tj [9.79998 ]TJ ( )Tj +T* +-0.00228 Tc +0.00228 Tw +(avai)Tj [-4.5 ]TJ (l)Tj [-4.5 ]TJ (a)Tj [1.5 ]TJ (bl)Tj [-4.5 ]TJ (e at)Tj [-4.5 ]TJ ( eP)Tj [-6.19999 ]TJ (ap)Tj [-12.29998 ]TJ (erP)Tj [-6.19999 ]TJ (r)Tj [0.69999 ]TJ (ess.)Tj [-12.19999 ]TJ ( )Tj +/N170 1 Tf +0 -1.16999 TD +0 Tc +0 Tw +( )Tj +0 -1.12998 TD +0.00178 Tc +(Le)Tj [5.59999 ]TJ (sk, )Tj +/N231 1 Tf +2.68998 0 TD +0.00019 Tc +0.12979 Tw +(M. E. and E. Sch)Tj [-9.79998 ]TJ (midt [)Tj [-6.79998 ]TJ (1975)Tj [10.19999 ]TJ (])Tj [-6.79998 ]TJ (.)Tj [0.19999 ]TJ ( )Tj +0 0 1 sc +12.84999 0 TD +-0.00239 Tc +0.13238 Tw +(L)Tj [8.39999 ]TJ (e)Tj [1.39999 ]TJ (x)Tj [-12.39999 ]TJ ( \226 A )Tj [-10 ]TJ (L)Tj [8.39999 ]TJ (e)Tj [1.39999 ]TJ (x)Tj [-12.39999 ]TJ (i)Tj [-4.59999 ]TJ (cal)Tj [-4.59999 ]TJ ( Anal)Tj [-14.59999 ]TJ (y)Tj [17.59999 ]TJ (z)Tj [-8.59999 ]TJ (er )Tj [-10 ]TJ (Gene)Tj [-8.59999 ]TJ (rat)Tj [-14.59999 ]TJ (o)Tj [-2.39999 ]TJ (r)Tj +ET +276.49798 541.70098 183.94499 -0.59999 rf +BT +11.99899 0 0 11.99899 460.44229 543.02079 Tm +0 0 0 sc +0.00099 Tc +0.12899 Tw +(. Computing)Tj [11 ]TJ ( )Tj +-30.86999 -1.14999 TD +-0.00048 Tc +0.13049 Tw +(Science Te)Tj [-6.69999 ]TJ (chnical Repo)Tj [-10.5 ]TJ (rt No. 39, B)Tj [6.5 ]TJ (e)Tj [3.29998 ]TJ (ll )Tj [-10 ]TJ (L)Tj [10.29998 ]TJ (a)Tj [3.29998 ]TJ (borato)Tj [-10.5 ]TJ (r)Tj [2.5 ]TJ (ies, Murra)Tj [-16.69999 ]TJ (y)Tj [19.5 ]TJ ( Hill, New )Tj [-10 ]TJ (J)Tj [-11.29998 ]TJ (e)Tj [3.29998 ]TJ (rse)Tj [-6.69999 ]TJ (y)Tj [19.5 ]TJ (. A PDF )Tj +T* +-0.00178 Tc +0.00178 Tw +(versi)Tj [-4 ]TJ (on i)Tj [-4 ]TJ (s)Tj [-2.59999 ]TJ ( avai)Tj [-4 ]TJ (l)Tj [-4 ]TJ (a)Tj [2 ]TJ (bl)Tj [-4 ]TJ (e at)Tj [-4 ]TJ ( )Tj [-10 ]TJ (eP)Tj [-5.69999 ]TJ (aperP)Tj [-5.69999 ]TJ (r)Tj [1.19999 ]TJ (ess. )Tj +T* +0 Tc +0 Tw +( )Tj +/N170 1 Tf +T* +0.00268 Tc +(Le)Tj [6.5 ]TJ (vine)Tj +/N231 1 Tf +2.88999 0 TD +-0.00019 Tc +0.27018 Tw +(, J)Tj [-11 ]TJ (ohn )Tj [10 ]TJ (R., Ton)Tj [-10.19999 ]TJ (y)Tj [9.79998 ]TJ ( Mason and Dou)Tj [-10.19999 ]TJ (g)Tj [9.79998 ]TJ ( Bro)Tj [-10.19999 ]TJ (w)Tj [2 ]TJ (n [)Tj [-7.19999 ]TJ (1992])Tj [-7.19999 ]TJ (. )Tj +0 0 1 sc +22.13999 0 TD +-0.02079 Tc +0.29078 Tw +(Le)Tj [-17 ]TJ (x)Tj [-30.79998 ]TJ ( &)Tj [-13 ]TJ ( Y)Tj [-28.59999 ]TJ (a)Tj [-17 ]TJ (c)Tj [-27 ]TJ (c)Tj +ET +390.36799 486.50498 64.91499 -0.59999 rf +BT +11.99899 0 0 11.99899 455.28269 487.82539 Tm +0 0 0 sc +0.00088 Tc +0.26908 Tw +(. O\222)Tj [3.89999 ]TJ (Re)Tj [4.69999 ]TJ (ill)Tj [-11.29998 ]TJ (y)Tj [20.89999 ]TJ ( )Tj [-10 ]TJ (&)Tj [8.69999 ]TJ ( )Tj +-30.43998 -1.14999 TD +-0.00028 Tc +0.00028 Tw +(Associates, )Tj [-10 ]TJ (I)Tj [12.69999 ]TJ (n)Tj [-0.29998 ]TJ (c. Seb)Tj [-10.29998 ]TJ (a)Tj [3.5 ]TJ (stop)Tj [-10.29998 ]TJ (ol, California. )Tj +ET +restore +PDFVars/TermAll get exec end end +userdict /pgsave get restore +showpage +%%PageTrailer +%%EndPage +%%Trailer +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentNeededResources: +%%+ font Courier-Oblique +%%+ font Courier +%%+ font Courier-Bold +%%+ font Courier-BoldOblique +%%+ font Symbol +%%DocumentSuppliedResources: +%%+ font TimesNewRomanPS-ItalicMT +%%+ font Arial-ItalicMT +%%+ font TimesNewRomanPSMT +%%+ font TimesNewRomanPS-BoldMT +%%+ font ArialMT +%%+ font Arial-BoldMT +%%+ procset (Adobe Acrobat - PDF operators) 1.2 0 +%%+ procset (Adobe Acrobat - type operators) 1.2 0 +%%+ procset (Adobe Acrobat - general image support) 1.2 0 +%%+ procset (Adobe Acrobat - monochrome image support) 1.2 0 +%%+ procset (Adobe Acrobat - color image support) 1.2 0 +%%+ procset (Adobe Acrobat - indexed color image support) 1.2 0 +%%EOF Index: ossp-adm/autotools/libtool.html RCS File: /v/ossp/cvs/ossp-adm/autotools/libtool.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/libtool.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/libtool.html' 2>/dev/null --- ossp-adm/autotools/libtool.html +++ - 2025-04-19 11:54:39.076989548 +0200 @@ -0,0 +1,7077 @@ + + + + +Libtool + + +

    GNU Libtool

    +

    For version 1.4.2, 10 September 2001

    +
    Gordon Matzigkeit
    +
    Alexandre Oliva
    +
    Thomas Tanner
    +
    Gary V. Vaughan
    +

    +


    + +

    +@dircategory GNU programming tools +* Libtool: (libtool). Generic shared library support script. + + +

    +@dircategory Individual utilities +* libtoolize: (libtool)Invoking libtoolize. Adding libtool support. + + +

    +Copyright (C) 1996-2000 Free Software Foundation, Inc. + + +

    +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 +or any later version published by the Free Software Foundation; +with the no Invariant Sections, with no Front-Cover Texts, +and with no Back-Cover Texts. A copy of the license is included in +the section entitled "GNU Free Documentation License". + + + + +

    Introduction

    + +

    +In the past, if a source code package developer wanted to take advantage +of the power of shared libraries, he needed to write custom support code +for each platform on which his package ran. He also had to design a +configuration interface so that the package installer could choose what sort of +libraries were built. + + +

    +GNU Libtool simplifies the developer's job by encapsulating both the +platform-specific dependencies, and the user interface, in a single +script. GNU Libtool is designed so that the complete functionality of +each host type is available via a generic interface, but nasty quirks +are hidden from the programmer. + + +

    +GNU Libtool's consistent interface is reassuring... users don't need +to read obscure documentation in order to have their favorite source +package build shared libraries. They just run your package +configure script (or equivalent), and libtool does all the dirty +work. + + +

    +There are several examples throughout this document. All assume the +same environment: we want to build a library, `libhello', in a +generic way. + + +

    +`libhello' could be a shared library, a static library, or +both... whatever is available on the host system, as long as libtool +has been ported to it. + + +

    +This chapter explains the original design philosophy of libtool. Feel +free to skip to the next chapter, unless you are interested in history, +or want to write code to extend libtool in a consistent way. + + + + +

    Motivation for writing libtool

    + +

    + + +Since early 1995, several different GNU developers have recognized the +importance of having shared library support for their packages. The +primary motivation for such a change is to encourage modularity and +reuse of code (both conceptually and physically) in GNU programs. + + +

    +Such a demand means that the way libraries are built in GNU packages +needs to be general, to allow for any library type the package installer +might want. The problem is compounded by the absence of a standard +procedure for creating shared libraries on different platforms. + + +

    +The following sections outline the major issues facing shared library +support in GNU, and how shared library support could be standardized +with libtool. + + +

    + + +The following specifications were used in developing and evaluating this +system: + + + +

      +
    1. + +The system must be as elegant as possible. + +
    2. + +The system must be fully integrated with the GNU Autoconf and Automake +utilities, so that it will be easy for GNU maintainers to use. However, +the system must not require these tools, so that it can be used by +non-GNU packages. + +
    3. + +Portability to other (non-GNU) architectures and tools is desirable. +
    + + + +

    Implementation issues

    + +

    + + +The following issues need to be addressed in any reusable shared library +system, specifically libtool: + + + +

      +
    1. + +The package installer should be able to control what sort of libraries +are built. + +
    2. + +It can be tricky to run dynamically linked programs whose libraries have +not yet been installed. LD_LIBRARY_PATH must be set properly (if +it is supported), or programs fail to run. + +
    3. + +The system must operate consistently even on hosts which don't support +shared libraries. + +
    4. + +The commands required to build shared libraries may differ wildly from +host to host. These need to be determined at configure time in +a consistent way. + +
    5. + +It is not always obvious with which suffix a shared library should be +installed. This makes it difficult for `Makefile' rules, since they +generally assume that file names are the same from host to host. + +
    6. + +The system needs a simple library version number abstraction, so that +shared libraries can be upgraded in place. The programmer should be +informed how to design the interfaces to the library to maximize binary +compatibility. + +
    7. + +The install `Makefile' target should warn the package installer to set +the proper environment variables (LD_LIBRARY_PATH or equivalent), +or run ldconfig. +
    + + + +

    Other implementations

    + +

    +Even before libtool was developed, many free software packages built and +installed their own shared libraries. At first, these packages were +examined to avoid reinventing existing features. + + +

    +Now it is clear that none of these packages have documented the details +of shared library systems that libtool requires. So, other packages +have been more or less abandoned as influences. + + + + +

    A postmortem analysis of other implementations

    + +

    + + +In all fairness, each of the implementations that were examined do the +job that they were intended to do, for a number of different host +systems. However, none of these solutions seem to function well as a +generalized, reusable component. + + +

    + +Most were too complex to use (much less modify) without understanding +exactly what the implementation does, and they were generally not +documented. + + +

    +The main difficulty is that different vendors have different views of +what libraries are, and none of the packages which were examined seemed +to be confident enough to settle on a single paradigm that just +works. + + +

    +Ideally, libtool would be a standard that would be implemented as series +of extensions and modifications to existing library systems to make them +work consistently. However, it is not an easy task to convince +operating system developers to mend their evil ways, and people want to +build shared libraries right now, even on buggy, broken, confused +operating systems. + + +

    +For this reason, libtool was designed as an independent shell script. +It isolates the problems and inconsistencies in library building that +plague `Makefile' writers by wrapping the compiler suite on +different platforms with a consistent, powerful interface. + + +

    +With luck, libtool will be useful to and used by the GNU community, and +that the lessons that were learned in writing it will be taken up by +designers of future library systems. + + + + +

    The libtool paradigm

    + +

    +At first, libtool was designed to support an arbitrary number of library +object types. After libtool was ported to more platforms, a new +paradigm gradually developed for describing the relationship between +libraries and programs. + + +

    + + +In summary, "libraries are programs with multiple entry points, and +more formally defined interfaces." + + +

    +Version 0.7 of libtool was a complete redesign and rewrite of libtool to +reflect this new paradigm. So far, it has proved to be successful: +libtool is simpler and more useful than before. + + +

    +The best way to introduce the libtool paradigm is to contrast it with +the paradigm of existing library systems, with examples from each. It +is a new way of thinking, so it may take a little time to absorb, but +when you understand it, the world becomes simpler. + + + + +

    Using libtool

    + +

    + + +It makes little sense to talk about using libtool in your own packages +until you have seen how it makes your life simpler. The examples in +this chapter introduce the main features of libtool by comparing the +standard library building procedure to libtool's operation on two +different platforms: + + +

    + +
    `a23' +
    +An Ultrix 4.2 platform with only static libraries. + +
    `burger' +
    +A NetBSD/i386 1.2 platform with shared libraries. +
    + +

    +You can follow these examples on your own platform, using the +preconfigured libtool script that was installed with libtool +(see section Configuring libtool). + + +

    +Source files for the following examples are taken from the `demo' +subdirectory of the libtool distribution. Assume that we are building a +library, `libhello', out of the files `foo.c' and +`hello.c'. + + +

    +Note that the `foo.c' source file uses the cos math library +function, which is usually found in the standalone math library, and not +the C library (see section `Trigonometric Functions' in The GNU C Library Reference Manual). So, we need to add -lm to +the end of the link line whenever we link `foo.o' or `foo.lo' +into an executable or a library (see section Inter-library dependencies). + + +

    +The same rule applies whenever you use functions that don't appear in +the standard C library... you need to add the appropriate +-lname flag to the end of the link line when you link +against those objects. + + +

    +After we have built that library, we want to create a program by linking +`main.o' against `libhello'. + + + + +

    Creating object files

    + +

    + + +To create an object file from a source file, the compiler is invoked +with the `-c' flag (and any other desired flags): + + + +

    +burger$ gcc -g -O -c main.c
    +burger$
    +
    + +

    +The above compiler command produces an object file, `main.o', from +the source file `main.c'. + + +

    +For most library systems, creating object files that become part of a +static library is as simple as creating object files that are linked to +form an executable: + + + +

    +burger$ gcc -g -O -c foo.c
    +burger$ gcc -g -O -c hello.c
    +burger$
    +
    + +

    + + +Shared libraries, however, may only be built from +position-independent code (PIC). So, special flags must be passed +to the compiler to tell it to generate PIC rather than the standard +position-dependent code. + + +

    + + + +Since this is a library implementation detail, libtool hides the +complexity of PIC compiler flags by using separate library object files +(which end in `.lo' instead of `.o'). On systems without shared +libraries (or without special PIC compiler flags), these library object +files are identical to "standard" object files. + + +

    +To create library object files for `foo.c' and `hello.c', +simply invoke libtool with the standard compilation command as +arguments (see section Compile mode): + + + +

    +a23$ libtool gcc -g -O -c foo.c
    +gcc -g -O -c foo.c
    +echo timestamp > foo.lo
    +a23$ libtool gcc -g -O -c hello.c
    +gcc -g -O -c hello.c
    +echo timestamp > hello.lo
    +a23$
    +
    + +

    +Note that libtool creates two files for each invocation. The `.lo' +file is a library object, which may be built into a shared library, and +the `.o' file is a standard object file. On `a23', the +library objects are just timestamps, because only static libraries are +supported. + + +

    +On shared library systems, libtool automatically inserts the PIC +generation flags into the compilation command, so that the library +object and the standard object differ: + + + +

    +burger$ libtool gcc -g -O -c foo.c
    +gcc -g -O -c -fPIC -DPIC foo.c
    +mv -f foo.o foo.lo
    +gcc -g -O -c foo.c >/dev/null 2>&1
    +burger$ libtool gcc -g -O -c hello.c
    +gcc -g -O -c -fPIC -DPIC hello.c
    +mv -f hello.o hello.lo
    +gcc -g -O -c hello.c >/dev/null 2>&1
    +burger$
    +
    + +

    +Notice that the second run of GCC has its output discarded. This is +done so that compiler warnings aren't annoyingly duplicated. + + + + +

    Linking libraries

    + +

    + +Without libtool, the programmer would invoke the ar command to +create a static library: + + + +

    +burger$ ar cru libhello.a hello.o foo.o
    +burger$
    +
    + +

    + +But of course, that would be too simple, so many systems require that +you run the ranlib command on the resulting library (to give it +better karma, or something): + + + +

    +burger$ ranlib libhello.a
    +burger$
    +
    + +

    +It seems more natural to use the C compiler for this task, given +libtool's "libraries are programs" approach. So, on platforms without +shared libraries, libtool simply acts as a wrapper for the system +ar (and possibly ranlib) commands. + + +

    + + +Again, the libtool library name differs from the standard name (it has a +`.la' suffix instead of a `.a' suffix). The arguments to libtool are +the same ones you would use to produce an executable named +`libhello.la' with your compiler (see section Link mode): + + + +

    +a23$ libtool gcc -g -O -o libhello.la foo.o hello.o
    +libtool: cannot build libtool library `libhello.la' from non-libtool \
    +                objects
    +a23$
    +
    + +

    +Aha! Libtool caught a common error... trying to build a library +from standard objects instead of library objects. This doesn't matter +for static libraries, but on shared library systems, it is of great +importance. + + +

    +So, let's try again, this time with the library object files. Remember +also that we need to add -lm to the link command line because +`foo.c' uses the cos math library function (see section Using libtool). + + +

    +Another complication in building shared libraries is that we need to +specify the path to the directory in which they (eventually) will be +installed (in this case, `/usr/local/lib')(1): + + + +

    +a23$ libtool gcc -g -O -o libhello.la foo.lo hello.lo \
    +                -rpath /usr/local/lib -lm
    +mkdir .libs
    +ar cru .libs/libhello.a foo.o hello.o
    +ranlib .libs/libhello.a
    +creating libhello.la
    +a23$
    +
    + +

    +Now, let's try the same trick on the shared library platform: + + + +

    +burger$ libtool gcc -g -O -o libhello.la foo.lo hello.lo \
    +                -rpath /usr/local/lib -lm
    +mkdir .libs
    +ld -Bshareable -o .libs/libhello.so.0.0 foo.lo hello.lo -lm
    +ar cru .libs/libhello.a foo.o hello.o
    +ranlib .libs/libhello.a
    +creating libhello.la
    +burger$
    +
    + +

    +Now that's significantly cooler... libtool just ran an obscure +ld command to create a shared library, as well as the static +library. + + +

    + +Note how libtool creates extra files in the `.libs' +subdirectory, rather than the current directory. This feature is to +make it easier to clean up the build directory, and to help ensure that +other programs fail horribly if you accidentally forget to use libtool +when you should. + + + + +

    Linking executables

    + +

    + +If you choose at this point to install the library (put it in a +permanent location) before linking executables against it, then you +don't need to use libtool to do the linking. Simply use the appropriate +`-L' and `-l' flags to specify the library's location. + + +

    + +Some system linkers insist on encoding the full directory name of each +shared library in the resulting executable. Libtool has to work around +this misfeature by special magic to ensure that only permanent directory +names are put into installed executables. + + +

    + + +The importance of this bug must not be overlooked: it won't cause +programs to crash in obvious ways. It creates a security hole, +and possibly even worse, if you are modifying the library source code +after you have installed the package, you will change the behaviour of +the installed programs! + + +

    +So, if you want to link programs against the library before you install +it, you must use libtool to do the linking. + + +

    + +Here's the old way of linking against an uninstalled library: + + + +

    +burger$ gcc -g -O -o hell.old main.o libhello.a -lm
    +burger$
    +
    + +

    +Libtool's way is almost the same(2) +(see section Link mode): + + + +

    +a23$ libtool gcc -g -O -o hell main.o libhello.la -lm
    +gcc -g -O -o hell main.o ./.libs/libhello.a -lm
    +a23$
    +
    + +

    +That looks too simple to be true. All libtool did was transform +`libhello.la' to `./.libs/libhello.a', but remember +that `a23' has no shared libraries. + + +

    +On `burger' the situation is different: + + + +

    +burger$ libtool gcc -g -O -o hell main.o libhello.la -lm
    +gcc -g -O -o .libs/hell main.o -L./.libs -R/usr/local/lib -lhello -lm
    +creating hell
    +burger$
    +
    + +

    + + + +

    +Now assume `libhello.la' had already been installed, and you want +to link a new program with it. You could figure out where it lives by +yourself, then run: + + + +

    +burger$ gcc -g -O -o test test.o -L/usr/local/lib -lhello
    +
    + +

    +However, unless `/usr/local/lib' is in the standard library search +path, you won't be able to run test. However, if you use libtool +to link the already-installed libtool library, it will do The Right +Thing (TM) for you: + + + +

    +burger$ libtool gcc -g -O -o test test.o /usr/local/lib/libhello.la
    +gcc -g -O -o .libs/test test.o -Wl,--rpath
    +-Wl,/usr/local/lib /usr/local/lib/libhello.a -lm
    +creating test
    +burger$
    +
    + +

    +Note that libtool added the necessary run-time path flag, as well as +`-lm', the library libhello.la depended upon. Nice, huh? + + +

    +Since libtool created a wrapper script, you should use libtool to +install it and debug it too. However, since the program does not depend +on any uninstalled libtool library, it is probably usable even without +the wrapper script. Libtool could probably be made smarter to avoid the +creation of the wrapper script in this case, but this is left as an +exercise for the reader. + + +

    + + +Notice that the executable, hell, was actually created in the +`.libs' subdirectory. Then, a wrapper script was created +in the current directory. + + +

    +On NetBSD 1.2, libtool encodes the installation directory of +`libhello', by using the `-R/usr/local/lib' compiler flag. +Then, the wrapper script guarantees that the executable finds the +correct shared library (the one in `./.libs') until it is +properly installed. + + +

    +Let's compare the two different programs: + + + +

    +burger$ time ./hell.old
    +Welcome to GNU Hell!
    +** This is not GNU Hello.  There is no built-in mail reader. **
    +        0.21 real         0.02 user         0.08 sys
    +burger$ time ./hell
    +Welcome to GNU Hell!
    +** This is not GNU Hello.  There is no built-in mail reader. **
    +        0.63 real         0.09 user         0.59 sys
    +burger$
    +
    + +

    +The wrapper script takes significantly longer to execute, but at least +the results are correct, even though the shared library hasn't been +installed yet. + + +

    +So, what about all the space savings that shared libraries are supposed +to yield? + + + +

    +burger$ ls -l hell.old libhello.a
    +-rwxr-xr-x  1 gord  gord  15481 Nov 14 12:11 hell.old
    +-rw-r--r--  1 gord  gord   4274 Nov 13 18:02 libhello.a
    +burger$ ls -l .libs/hell .libs/libhello.*
    +-rwxr-xr-x  1 gord  gord  11647 Nov 14 12:10 .libs/hell
    +-rw-r--r--  1 gord  gord   4274 Nov 13 18:44 .libs/libhello.a
    +-rwxr-xr-x  1 gord  gord  12205 Nov 13 18:44 .libs/libhello.so.0.0
    +burger$
    +
    + +

    +Well, that sucks. Maybe I should just scrap this project and take up +basket weaving. + + +

    +Actually, it just proves an important point: shared libraries incur +overhead because of their (relative) complexity. In this situation, the +price of being dynamic is eight kilobytes, and the payoff is about four +kilobytes. So, having a shared `libhello' won't be an advantage +until we link it against at least a few more programs. + + + + +

    Debugging executables

    + +

    +If `hell' was a complicated program, you would certainly want to +test and debug it before installing it on your system. In the above +section, you saw how the libtool wrapper script makes it possible to run +the program directly, but unfortunately, this mechanism interferes with +the debugger: + + + +

    +burger$ gdb hell
    +GDB is free software and you are welcome to distribute copies of it
    + under certain conditions; type "show copying" to see the conditions.
    +There is no warranty for GDB; type "show warranty" for details.
    +GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc.
    +
    +"hell": not in executable format: File format not recognized
    +
    +(gdb) quit
    +burger$
    +
    + +

    +Sad. It doesn't work because GDB doesn't know where the executable +lives. So, let's try again, by invoking GDB directly on the executable: + + + +

    +burger$ gdb .libs/hell
    +trick:/home/src/libtool/demo$ gdb .libs/hell
    +GDB is free software and you are welcome to distribute copies of it
    + under certain conditions; type "show copying" to see the conditions.
    +There is no warranty for GDB; type "show warranty" for details.
    +GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc.
    +(gdb) break main
    +Breakpoint 1 at 0x8048547: file main.c, line 29.
    +(gdb) run
    +Starting program: /home/src/libtool/demo/.libs/hell
    +/home/src/libtool/demo/.libs/hell: can't load library 'libhello.so.2'
    +
    +Program exited with code 020.
    +(gdb) quit
    +burger$
    +
    + +

    +Argh. Now GDB complains because it cannot find the shared library that +`hell' is linked against. So, we must use libtool in order to +properly set the library path and run the debugger. Fortunately, we can +forget all about the `.libs' directory, and just run it on +the executable wrapper (see section Execute mode): + + + +

    +burger$ libtool gdb hell
    +GDB is free software and you are welcome to distribute copies of it
    + under certain conditions; type "show copying" to see the conditions.
    +There is no warranty for GDB; type "show warranty" for details.
    +GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc.
    +(gdb) break main
    +Breakpoint 1 at 0x8048547: file main.c, line 29.
    +(gdb) run
    +Starting program: /home/src/libtool/demo/.libs/hell
    +
    +Breakpoint 1, main (argc=1, argv=0xbffffc40) at main.c:29
    +29	  printf ("Welcome to GNU Hell!\n");
    +(gdb) quit
    +The program is running.  Quit anyway (and kill it)? (y or n) y
    +burger$
    +
    + + + +

    Installing libraries

    + +

    + +Installing libraries on a non-libtool system is quite +straightforward... just copy them into place:(3) + + +

    + + +

    +burger$ su
    +Password: ********
    +burger# cp libhello.a /usr/local/lib/libhello.a
    +burger#
    +
    + +

    +Oops, don't forget the ranlib command: + + + +

    +burger# ranlib /usr/local/lib/libhello.a
    +burger#
    +
    + +

    + +Libtool installation is quite simple, as well. Just use the +install or cp command that you normally would +(see section Install mode): + + + +

    +a23# libtool cp libhello.la /usr/local/lib/libhello.la
    +cp libhello.la /usr/local/lib/libhello.la
    +cp .libs/libhello.a /usr/local/lib/libhello.a
    +ranlib /usr/local/lib/libhello.a
    +a23#
    +
    + +

    +Note that the libtool library `libhello.la' is also installed, to +help libtool with uninstallation (see section Uninstall mode) and linking +(see section Linking executables) and to help programs with dlopening +(see section Dlopened modules). + + +

    +Here is the shared library example: + + + +

    +burger# libtool install -c libhello.la /usr/local/lib/libhello.la
    +install -c .libs/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
    +install -c libhello.la /usr/local/lib/libhello.la
    +install -c .libs/libhello.a /usr/local/lib/libhello.a
    +ranlib /usr/local/lib/libhello.a
    +burger#
    +
    + +

    + + +It is safe to specify the `-s' (strip symbols) flag if you use a +BSD-compatible install program when installing libraries. +Libtool will either ignore the `-s' flag, or will run a program +that will strip only debugging and compiler symbols from the library. + + +

    +Once the libraries have been put in place, there may be some additional +configuration that you need to do before using them. First, you must +make sure that where the library is installed actually agrees with the +`-rpath' flag you used to build it. + + +

    + + + +Then, running `libtool -n --finish libdir' can give you +further hints on what to do (see section Finish mode): + + + +

    +burger# libtool -n --finish /usr/local/lib
    +PATH="$PATH:/sbin" ldconfig -m /usr/local/lib
    +-----------------------------------------------------------------
    +Libraries have been installed in:
    +   /usr/local/lib
    +
    +To link against installed libraries in a given directory, LIBDIR,
    +you must use the `-LLIBDIR' flag during linking.
    +
    + You will also need to do one of the following:
    +   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
    +     during execution
    +   - add LIBDIR to the `LD_RUN_PATH' environment variable
    +     during linking
    +   - use the `-RLIBDIR' linker flag
    +
    +See any operating system documentation about shared libraries for
    +more information, such as the ld and ld.so manual pages.
    +-----------------------------------------------------------------
    +burger#
    +
    + +

    +After you have completed these steps, you can go on to begin using the +installed libraries. You may also install any executables that depend +on libraries you created. + + + + +

    Installing executables

    + +

    +If you used libtool to link any executables against uninstalled libtool +libraries (see section Linking executables), you need to use libtool to +install the executables after the libraries have been installed +(see section Installing libraries). + + +

    +So, for our Ultrix example, we would run: + + + +

    +a23# libtool install -c hell /usr/local/bin/hell
    +install -c hell /usr/local/bin/hell
    +a23#
    +
    + +

    +On shared library systems, libtool just ignores the wrapper script and +installs the correct binary: + + + +

    +burger# libtool install -c hell /usr/local/bin/hell
    +install -c .libs/hell /usr/local/bin/hell
    +burger#
    +
    + + + +

    Linking static libraries

    + +

    + + +Why return to ar and ranlib silliness when you've had a +taste of libtool? Well, sometimes it is desirable to create a static +archive that can never be shared. The most frequent case is when you +have a set of object files that you use to build several different +programs. You can create a "convenience library" out of those +objects, and link programs with the library, instead of listing all +object files for every program. This technique is often used to +overcome GNU automake's lack of support for linking object files built +from sources in other directories, because it supports linking with +libraries from other directories. This limitation applies to GNU +automake up to release 1.4; newer releases should support sources in +other directories. + + +

    +If you just want to link this convenience library into programs, then +you could just ignore libtool entirely, and use the old ar and +ranlib commands (or the corresponding GNU automake +`_LIBRARIES' rules). You can even install a convenience library +(but you probably don't want to) using libtool: + + + +

    +burger$ libtool ./install-sh -c libhello.a /local/lib/libhello.a
    +./install-sh -c libhello.a /local/lib/libhello.a
    +ranlib /local/lib/libhello.a
    +burger$
    +
    + +

    +Using libtool for static library installation protects your library from +being accidentally stripped (if the installer used the `-s' flag), +as well as automatically running the correct ranlib command. + + +

    +But libtool libraries are more than just collections of object files: +they can also carry library dependency information, which old archives +do not. If you want to create a libtool static convenience library, you +can omit the `-rpath' flag and use `-static' to indicate that +you're only interested in a static library. When you link a program +with such a library, libtool will actually link all object files and +dependency libraries into the program. + + +

    +If you omit both `-rpath' and `-static', libtool will create a +convenience library that can be used to create other libtool +libraries, even shared ones. Just like in the static case, the library +behaves as an alias to a set of object files and dependency libraries, +but in this case the object files are suitable for inclusion in shared +libraries. But be careful not to link a single convenience library, +directly or indirectly, into a single program or library, otherwise you +may get errors about symbol redefinitions. + + +

    +When GNU automake is used, you should use noinst_LTLIBRARIES +instead of lib_LTLIBRARIES for convenience libraries, so that +the `-rpath' option is not passed when they are linked. + + +

    +As a rule of thumb, link a libtool convenience library into at most one +libtool library, and never into a program, and link libtool static +convenience libraries only into programs, and only if you need to carry +library dependency information to the user of the static convenience +library. + + +

    + +Another common situation where static linking is desirable is in +creating a standalone binary. Use libtool to do the linking and add the +`-all-static' flag. + + + + +

    Invoking libtool

    +

    + + + + + + +

    +The libtool program has the following synopsis: + + + +

    +libtool [option]... [mode-arg]...
    +
    + +

    +and accepts the following options: + + +

    + +
    `--config' +
    +Display libtool configuration variables and exit. + +
    `--debug' +
    +Dump a trace of shell script execution to standard output. This +produces a lot of output, so you may wish to pipe it to less (or +more) or redirect to a file. + +
    `-n' +
    +
    `--dry-run' +
    +Don't create, modify, or delete any files, just show what commands would +be executed by libtool. + +
    `--features' +
    +Display basic configuration options. This provides a way for packages +to determine whether shared or static libraries will be built. + +
    `--finish' +
    +Same as `--mode=finish'. + +
    `--help' +
    +Display a help message and exit. If `--mode=mode' is +specified, then detailed help for mode is +displayed. + +
    `--mode=mode' +
    +Use mode as the operation mode. By default, the operation mode is +inferred from the mode-args. + +If mode is specified, it must be one of the following: + +
    + +
    `compile' +
    +Compile a source file into a libtool object. + +
    `execute' +
    +Automatically set the library path so that another program can use +uninstalled libtool-generated programs or libraries. + +
    `finish' +
    +Complete the installation of libtool libraries on the system. + +
    `install' +
    +Install libraries or executables. + +
    `link' +
    +Create a library or an executable. + +
    `uninstall' +
    +Delete installed libraries or executables. + +
    `clean' +
    +Delete uninstalled libraries or executables. +
    + +
    `--version' +
    +Print libtool version information and exit. +
    + +

    +The mode-args are a variable number of arguments, depending on the +selected operation mode. In general, each mode-arg is interpreted +by programs libtool invokes, rather than libtool itself. + + + + +

    Compile mode

    +

    + + + + +

    +For compile mode, mode-args is a compiler command to be used +in creating a `standard' object file. These arguments should begin with +the name of the C compiler, and contain the `-c' compiler flag so +that only an object file is created. + + +

    +Libtool determines the name of the output file by removing the directory +component from the source file name, then substituting the source code +suffix (e.g. `.c' for C source code) with the library object suffix, +`.lo'. + + +

    +If shared libraries are being built, any necessary PIC generation flags +are substituted into the compilation command. +You can pass compiler and linker specific flags using `-Wc,flag' +and `-Xcompiler flag' or `-Wl,flag' and +`-Xlinker flag', respectively. + + +

    +If the `-static' option is given, then a `.o' file is built, +even if libtool was configured with `--disable-static'. + + +

    +Note that the `-o' option is now fully supported. It is emulated +on the platforms that don't support it (by locking and moving the +objects), so it is really easy to use libtool, just with minor +modifications to your Makefiles. Typing for example + +

    +libtool gcc -c foo/x.c -o foo/x.lo
    +
    + +

    +will do what you expect. + + +

    +Note, however, that, if the compiler does not support `-c' and +`-o', it is impossible to compile `foo/x.c' without +overwriting an existing `./x.o'. Therefore, if you do have a +source file `./x.c', make sure you introduce dependencies in your +`Makefile' to make sure `./x.o' (or `./x.lo') is +re-created after any sub-directory's `x.lo': + +

    +x.o x.lo: foo/x.lo bar/x.lo
    +
    + +

    +This will also ensure that make won't try to use a temporarily corrupted +`x.o' to create a program or library. It may cause needless +recompilation on platforms that support `-c' and `-o' +together, but it's the only way to make it safe for those that don't. + + + + +

    Link mode

    +

    + + + + +

    +Link mode links together object files (including library +objects) to form another library or to create an executable program. + + +

    +mode-args consist of a command using the C compiler to create an +output file (with the `-o' flag) from several object files. + + +

    +The following components of mode-args are treated specially: + + +

    + +
    `-all-static' +
    + + + +If output-file is a program, then do not link it against any +shared libraries at all. If output-file is a library, then only +create a static library. + +
    `-avoid-version' +
    +Tries to avoid versioning (see section Library interface versions) for libraries and modules, +i.e. no version information is stored and no symbolic links are created. +If the platform requires versioning, this option has no effect. + +
    `-dlopen file' +
    +Same as `-dlpreopen file', if native dlopening is not +supported on the host platform (see section Dlopened modules) or if +the program is linked with `-static' or `-all-static'. +Otherwise, no effect. If file is self libtool will make +sure that the program can dlopen itself, either by enabling +-export-dynamic or by falling back to `-dlpreopen self'. + +
    `-dlpreopen file' +
    +Link file into the output program, and add its symbols to +lt_preloaded_symbols (see section Dlpreopening). If file is +self, the symbols of the program itself will be added to +lt_preloaded_symbols. +If file is force libtool will make sure that +lt_preloaded_symbols is always defined, regardless of whether +it's empty or not. + +
    `-export-dynamic' +
    +Allow symbols from output-file to be resolved with dlsym +(see section Dlopened modules). + +
    `-export-symbols symfile' +
    +Tells the linker to export only the symbols listed in symfile. +The symbol file should end in `.sym' and must contain the name of one +symbol per line. This option has no effect on some platforms. +By default all symbols are exported. + +
    `-export-symbols-regex regex' +
    +Same as `-export-symbols', except that only symbols matching +the regular expression regex are exported. +By default all symbols are exported. + +
    `-Llibdir' +
    +Search libdir for required libraries that have already been +installed. + +
    `-lname' +
    +output-file requires the installed library `libname'. +This option is required even when output-file is not an +executable. + +
    `-module' +
    +Creates a library that can be dlopened (see section Dlopened modules). +This option doesn't work for programs. +Module names don't need to be prefixed with 'lib'. +In order to prevent name clashes, however, 'libname' and 'name' +must not be used at the same time in your package. + +
    `-no-fast-install' +
    +Disable fast-install mode for the executable output-file. Useful +if the program won't be necessarily installed. + +
    `-no-install' +
    +Link an executable output-file that can't be installed and +therefore doesn't need a wrapper script. Useful if the program is only +used in the build tree, e.g., for testing or generating other files. + +
    `-no-undefined' +
    +Declare that output-file does not depend on any other libraries. +Some platforms cannot create shared libraries that depend on other +libraries (see section Inter-library dependencies). + +
    `-o output-file' +
    +Create output-file from the specified objects and libraries. + +
    `-release release' +
    +Specify that the library was generated by release release of your +package, so that users can easily tell which versions are newer than +others. Be warned that no two releases of your package will be binary +compatible if you use this flag. If you want binary compatibility, use +the `-version-info' flag instead (see section Library interface versions). + +
    `-rpath libdir' +
    +If output-file is a library, it will eventually be installed in +libdir. If output-file is a program, add libdir to +the run-time path of the program. + +
    `-R libdir' +
    +If output-file is a program, add libdir to its run-time +path. If output-file is a library, add -Rlibdir to its +dependency_libs, so that, whenever the library is linked into a +program, libdir will be added to its run-time path. + +
    `-static' +
    +If output-file is a program, then do not link it against any +uninstalled shared libtool libraries. If output-file is a +library, then only create a static library. + +
    `-version-info current[:revision[:age]]' +
    +If output-file is a libtool library, use interface version +information current, revision, and age to build it +(see section Library interface versions). Do not use this flag to specify package +release information, rather see the `-release' flag. + +
    `-Wl,flag' +
    +
    `-Xlinker flag' +
    +Pass a linker specific flag directly to the linker. +
    + +

    +If the output-file ends in `.la', then a libtool library is +created, which must be built only from library objects (`.lo' files). +The `-rpath' option is required. In the current implementation, +libtool libraries may not depend on other uninstalled libtool libraries +(see section Inter-library dependencies). + + +

    +If the output-file ends in `.a', then a standard library is +created using ar and possibly ranlib. + + +

    + + +If output-file ends in `.o' or `.lo', then a reloadable object +file is created from the input files (generally using `ld -r'). +This method is often called partial linking. + + +

    +Otherwise, an executable program is created. + + + + +

    Execute mode

    +

    + + + + +

    +For execute mode, the library path is automatically set, then a +program is executed. + + +

    +The first of the mode-args is treated as a program name, with the +rest as arguments to that program. + + +

    +The following components of mode-args are treated specially: + + +

    + +
    `-dlopen file' +
    +Add the directory containing file to the library path. +
    + +

    +This mode sets the library path environment variable according to any +`-dlopen' flags. + + +

    +If any of the args are libtool executable wrappers, then they are +translated into the name of their corresponding uninstalled binary, and +any of their required library directories are added to the library path. + + + + +

    Install mode

    +

    + + + + +

    +In install mode, libtool interprets mode-args as an +installation command beginning with cp, or a BSD-compatible +install program. + + +

    +The rest of the mode-args are interpreted as arguments to that +command. + + +

    +The command is run, and any necessary unprivileged post-installation +commands are also completed. + + + + +

    Finish mode

    +

    + + + + +

    +Finish mode helps system administrators install libtool libraries +so that they can be located and linked into user programs. + + +

    +Each mode-arg is interpreted as the name of a library directory. +Running this command may require superuser privileges, so the +`--dry-run' option may be useful. + + + + +

    Uninstall mode

    +

    + + + + +

    +Uninstall mode deletes installed libraries, executables and objects. + + +

    +The first mode-arg is the name of the program to use to delete +files (typically `/bin/rm'). + + +

    +The remaining mode-args are either flags for the deletion program +(beginning with a `-'), or the names of files to delete. + + + + +

    Clean mode

    +

    + + + + +

    +Clean mode deletes uninstalled libraries, executables, objects +and libtool's temporary files associated with them. + + +

    +The first mode-arg is the name of the program to use to delete +files (typically `/bin/rm'). + + +

    +The remaining mode-args are either flags for the deletion program +(beginning with a `-'), or the names of files to delete. + + + + +

    Integrating libtool with your package

    + +

    +This chapter describes how to integrate libtool with your packages so +that your users can install hassle-free shared libraries. + + + + +

    Writing `Makefile' rules for libtool

    +

    + + + + + +

    +Libtool is fully integrated with Automake (see section `Introduction' in The Automake Manual), starting with Automake version 1.2. + + +

    +If you want to use libtool in a regular `Makefile' (or +`Makefile.in'), you are on your own. If you're not using Automake +1.2, and you don't know how to incorporate libtool into your package you +need to do one of the following: + + + +

      +
    1. + +Download Automake (version 1.2 or later) from your nearest GNU mirror, +install it, and start using it. + +
    2. + +Learn how to write `Makefile' rules by hand. They're sometimes complex, +but if you're clever enough to write rules for compiling your old +libraries, then you should be able to figure out new rules for libtool +libraries (hint: examine the `Makefile.in' in the `demo' +subdirectory of the libtool distribution... note especially that it +was automatically generated from the `Makefile.am' by Automake). +
    + + + +

    Using Automake with libtool

    + +

    + +Libtool library support is implemented under the `LTLIBRARIES' +primary. + + +

    +Here are some samples from the Automake `Makefile.am' in the +libtool distribution's `demo' subdirectory. + + +

    +First, to link a program against a libtool library, just use the +`program_LDADD' variable: + + + +

    +bin_PROGRAMS = hell hell.debug
    +
    +# Build hell from main.c and libhello.la
    +hell_SOURCES = main.c
    +hell_LDADD = libhello.la
    +
    +# Create an easier-to-debug version of hell.
    +hell_debug_SOURCES = main.c
    +hell_debug_LDADD = libhello.la
    +hell_debug_LDFLAGS = -static
    +
    + +

    +The flags `-dlopen' or `-dlpreopen' (see section Link mode) would +fit better in the program_LDADD variable. Unfortunately, GNU +automake, up to release 1.4, doesn't accept these flags in a +program_LDADD variable, so you have the following alternatives: + + + +

    + +

    +You may use the `program_LDFLAGS' variable to stuff in any flags +you want to pass to libtool while linking `program' (such as +`-static' to avoid linking uninstalled shared libtool libraries). + + +

    +Building a libtool library is almost as trivial... note the use of +`libhello_la_LDFLAGS' to pass the `-version-info' +(see section Library interface versions) option to libtool: + + + +

    +# Build a libtool library, libhello.la for installation in libdir.
    +lib_LTLIBRARIES = libhello.la
    +libhello_la_SOURCES = hello.c foo.c
    +libhello_la_LDFLAGS = -version-info 3:12:1
    +
    + +

    +The `-rpath' option is passed automatically by Automake (except for +libraries listed as noinst_LTLIBRARIES), so you +should not specify it. + + +

    +See section `The Automake Manual' in The Automake Manual, for more information. + + + + +

    Configuring libtool

    +

    + + + +

    +Libtool requires intimate knowledge of your compiler suite and operating +system in order to be able to create shared libraries and link against +them properly. When you install the libtool distribution, a +system-specific libtool script is installed into your binary directory. + + +

    +However, when you distribute libtool with your own packages +(see section Including libtool in your package), you do not always know which compiler suite and +operating system are used to compile your package. + + +

    +For this reason, libtool must be configured before it can be +used. This idea should be familiar to anybody who has used a GNU +configure script. configure runs a number of tests for +system features, then generates the `Makefiles' (and possibly a +`config.h' header file), after which you can run make and +build the package. + + +

    +Libtool adds its own tests to your configure script in order to +generate a libtool script for the installer's host machine. + + + + +

    The AC_PROG_LIBTOOL macro

    + +

    +If you are using GNU Autoconf (or Automake), you should add a call to +AC_PROG_LIBTOOL to your `configure.in' file. This macro +adds many new tests to the configure script so that the generated +libtool script will understand the characteristics of the host: + + +

    +

    +
    Macro: AC_PROG_LIBTOOL +
    +
    Macro: AM_PROG_LIBTOOL +
    +Add support for the `--enable-shared' and `--disable-shared' +configure flags.(4) AM_PROG_LIBTOOL was the +old name for this macro, and although supported at the moment is +deprecated. + + +

    +By default, this macro turns on shared libraries if they are available, +and also enables static libraries if they don't conflict with the shared +libraries. You can modify these defaults by calling either the +AC_DISABLE_SHARED or AC_DISABLE_STATIC macros: + + + +

    +# Turn off shared libraries during beta-testing, since they
    +# make the build process take too long.
    +AC_DISABLE_SHARED
    +AC_PROG_LIBTOOL
    +
    + +

    +The user may specify modified forms of the configure flags +`--enable-shared' and `--enable-static' to choose whether +shared or static libraries are built based on the name of the package. +For example, to have shared `bfd' and `gdb' libraries built, +but not shared `libg++', you can run all three configure +scripts as follows: + + + +

    +trick$ ./configure --enable-shared=bfd,gdb
    +
    + +

    +In general, specifying `--enable-shared=pkgs' is the same as +configuring with `--enable-shared' every package named in the +comma-separated pkgs list, and every other package with +`--disable-shared'. The `--enable-static=pkgs' flag +behaves similarly, but it uses `--enable-static' and +`--disable-static'. The same applies to the +`--enable-fast-install=pkgs' flag, which uses +`--enable-fast-install' and `--disable-fast-install'. + + +

    +The package name `default' matches any packages which have not set +their name in the PACKAGE environment variable. + + +

    +This macro also sets the shell variable LIBTOOL_DEPS, that you can +use to automatically update the libtool script if it becomes +out-of-date. In order to do that, add to your `configure.in': + + + +

    +AC_PROG_LIBTOOL
    +AC_SUBST(LIBTOOL_DEPS)
    +
    + +

    +and, to `Makefile.in' or `Makefile.am': + + + +

    +LIBTOOL_DEPS = @LIBTOOL_DEPS@
    +libtool: $(LIBTOOL_DEPS)
    +        $(SHELL) ./config.status --recheck
    +
    + +

    +If you are using GNU automake, you can omit the assignment, as automake +will take care of it. You'll obviously have to create some dependency +on `libtool'. + + +

    + +

    +

    +
    Macro: AC_LIBTOOL_DLOPEN +
    +Enable checking for dlopen support. This macro should be used if +the package makes use of the `-dlopen' and `-dlpreopen' flags, +otherwise libtool will assume that the system does not support dlopening. +The macro must be called before AC_PROG_LIBTOOL. +
    + + +

    +

    +
    Macro: AC_LIBTOOL_WIN32_DLL +
    +This macro should be used if the package has been ported to build clean +dlls on win32 platforms. Usually this means that any library data items +are exported with __declspec(dllexport) and imported with +__declspec(dllimport). If this macro is not used, libtool will +assume that the package libraries are not dll clean and will build only +static libraries on win32 hosts. + + +

    +This macro must be called before AC_PROG_LIBTOOL, and +provision must be made to pass `-no-undefined' to libtool +in link mode from the package Makefile. Naturally, if you pass +`-no-undefined', you must ensure that all the library symbols +really are defined at link time! +

    + + +

    +

    +
    Macro: AC_DISABLE_FAST_INSTALL +
    +Change the default behaviour for AC_PROG_LIBTOOL to disable +optimization for fast installation. The user may still override this +default, depending on platform support, by specifying +`--enable-fast-install'. +
    + + +

    +

    +
    Macro: AC_DISABLE_SHARED +
    +
    Macro: AM_DISABLE_SHARED +
    +Change the default behaviour for AC_PROG_LIBTOOL to disable +shared libraries. The user may still override this default by +specifying `--enable-shared'. +
    + + +

    +

    +
    Macro: AC_DISABLE_STATIC +
    +
    Macro: AM_DISABLE_STATIC +
    +Change the default behaviour for AC_PROG_LIBTOOL to disable +static libraries. The user may still override this default by +specifying `--enable-static'. +
    + + +

    +The tests in AC_PROG_LIBTOOL also recognize the following +environment variables: + + +

    +

    +
    Variable: CC +
    +The C compiler that will be used by the generated libtool. If +this is not set, AC_PROG_LIBTOOL will look for gcc or +cc. +
    + + +

    +

    +
    Variable: CFLAGS +
    +Compiler flags used to generate standard object files. If this is not +set, AC_PROG_LIBTOOL will not use any such flags. It affects +only the way AC_PROG_LIBTOOL runs tests, not the produced +libtool. +
    + + +

    +

    +
    Variable: CPPFLAGS +
    +C preprocessor flags. If this is not set, AC_PROG_LIBTOOL will +not use any such flags. It affects only the way AC_PROG_LIBTOOL +runs tests, not the produced libtool. +
    + + +

    +

    +
    Variable: LD +
    +The system linker to use (if the generated libtool requires one). +If this is not set, AC_PROG_LIBTOOL will try to find out what is +the linker used by CC. +
    + + +

    +

    +
    Variable: LDFLAGS +
    +The flags to be used by libtool when it links a program. If +this is not set, AC_PROG_LIBTOOL will not use any such flags. It +affects only the way AC_PROG_LIBTOOL runs tests, not the produced +libtool. +
    + + +

    +

    +
    Variable: LIBS +
    +The libraries to be used by AC_PROG_LIBTOOL when it links a +program. If this is not set, AC_PROG_LIBTOOL will not use any +such flags. It affects only the way AC_PROG_LIBTOOL runs tests, +not the produced libtool. +
    + + +

    +

    +
    Variable: NM +
    +Program to use rather than checking for nm. +
    + + +

    +

    +
    Variable: RANLIB +
    +Program to use rather than checking for ranlib. +
    + + +

    +

    +
    Variable: LN_S +
    +A command that creates a link of a program, a soft-link if possible, a +hard-link otherwise. AC_PROG_LIBTOOL will check for a suitable +program if this variable is not set. +
    + + +

    +

    +
    Variable: DLLTOOL +
    +Program to use rather than checking for dlltool. Only meaningful +for Cygwin/MS-Windows. +
    + + +

    +

    +
    Variable: OBJDUMP +
    +Program to use rather than checking for objdump. Only meaningful +for Cygwin/MS-Windows. +
    + + +

    +

    +
    Variable: AS +
    +Program to use rather than checking for as. Only used on +Cygwin/MS-Windows at the moment. +
    + + +

    + +When you invoke the libtoolize program (see section Invoking libtoolize), it will tell you where to find a definition of +AC_PROG_LIBTOOL. If you use Automake, the aclocal program +will automatically add AC_PROG_LIBTOOL support to your +configure script. + + +

    +Nevertheless, it is advisable to include a copy of `libtool.m4' in +`acinclude.m4', so that, even if `aclocal.m4' and +`configure' are rebuilt for any reason, the appropriate libtool +macros will be used. The alternative is to hope the user will have a +compatible version of `libtool.m4' installed and accessible for +aclocal. This may lead to weird errors when versions don't +match. + + + + +

    Including libtool in your package

    + +

    +In order to use libtool, you need to include the following files with +your package: + + +

    + +
    `config.guess' +
    + +Attempt to guess a canonical system name. + +
    `config.sub' +
    + +Canonical system name validation subroutine script. + +
    `ltmain.sh' +
    + +A generic script implementing basic libtool functionality. +
    + +

    +Note that the libtool script itself should not be included with +your package. See section Configuring libtool. + + +

    +You should use the libtoolize program, rather than manually +copying these files into your package. + + + + +

    Invoking libtoolize

    +

    + + + + + + +

    +The libtoolize program provides a standard way to add libtool +support to your package. In the future, it may implement better usage +checking, or other features to make libtool even easier to use. + + +

    +The libtoolize program has the following synopsis: + + + +

    +libtoolize [option]...
    +
    + +

    +and accepts the following options: + + +

    + +
    `--automake' +
    +Work silently, and assume that Automake libtool support is used. + +`libtoolize --automake' is used by Automake to add libtool files to +your package, when AC_PROG_LIBTOOL appears in your +`configure.in'. + +
    `--copy' +
    +
    `-c' +
    +Copy files from the libtool data directory rather than creating +symlinks. + +
    `--debug' +
    +Dump a trace of shell script execution to standard output. This +produces a lot of output, so you may wish to pipe it to less (or +more) or redirect to a file. + +
    `--dry-run' +
    +
    `-n' +
    +Don't run any commands that modify the file system, just print them +out. + +
    `--force' +
    +
    `-f' +
    +Replace existing libtool files. By default, libtoolize won't +overwrite existing files. + +
    `--help' +
    +Display a help message and exit. + +
    `--ltdl' +
    +Install libltdl in a subdirectory of your package. + +
    `--ltdl-tar' +
    +Add the file libltdl.tar.gz to your package. + +
    `--version' +
    +Print libtoolize version information and exit. +
    + +

    + +If libtoolize detects an explicit call to +AC_CONFIG_AUX_DIR (see section `The Autoconf Manual' in The Autoconf Manual) in your `configure.in', it +will put the files in the specified directory. + + +

    +libtoolize displays hints for adding libtool support to your +package, as well. + + + + +

    Autoconf `.o' macros

    + +

    +The Autoconf package comes with a few macros that run tests, then set a +variable corresponding to the name of an object file. Sometimes it is +necessary to use corresponding names for libtool objects. + + +

    +Here are the names of variables that list libtool objects: + + +

    +

    +
    Variable: LTALLOCA +
    + +Substituted by AC_FUNC_ALLOCA (see section `The Autoconf Manual' in The Autoconf Manual). Is either empty, or contains `alloca.lo'. +
    + + +

    +

    +
    Variable: LTLIBOBJS +
    + +Substituted by AC_REPLACE_FUNCS (see section `The Autoconf Manual' in The Autoconf Manual), and a few other functions. +
    + + +

    +Unfortunately, the stable release of Autoconf (2.13, at the time of +this writing) does not have any way for libtool to provide support for +these variables. So, if you depend on them, use the following code +immediately before the call to AC_OUTPUT in your +`configure.in': + + + +

    +LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'`
    +AC_SUBST(LTLIBOBJS)
    +LTALLOCA=`echo "$ALLOCA" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'`
    +AC_SUBST(LTALLOCA)
    +AC_OUTPUT(...)
    +
    + + + +

    Static-only libraries

    +

    + + + + + + + + + + + +

    +When you are developing a package, it is often worthwhile to configure +your package with the `--disable-shared' flag, or to override the +defaults for AC_PROG_LIBTOOL by using the +AC_DISABLE_SHARED Autoconf macro (see section The AC_PROG_LIBTOOL macro). This prevents libtool from building +shared libraries, which has several advantages: + + + +

    + +

    +You may want to put a small note in your package `README' to let +other developers know that `--disable-shared' can save them time. +The following example note is taken from the GIMP(5) distribution `README': + + + +

    +The GIMP uses GNU Libtool in order to build shared libraries on a
    +variety of systems. While this is very nice for making usable
    +binaries, it can be a pain when trying to debug a program. For that
    +reason, compilation of shared libraries can be turned off by
    +specifying the `--disable-shared' option to `configure'.
    +
    + + + +

    Library interface versions

    +

    + + + + + +

    +The most difficult issue introduced by shared libraries is that of +creating and resolving runtime dependencies. Dependencies on programs +and libraries are often described in terms of a single name, such as +sed. So, one may say "libtool depends on sed," and that is +good enough for most purposes. + + +

    +However, when an interface changes regularly, we need to be more +specific: "Gnus 5.1 requires Emacs 19.28 or above." Here, the +description of an interface consists of a name, and a "version +number." + + +

    +Even that sort of description is not accurate enough for some purposes. +What if Emacs 20 changes enough to break Gnus 5.1? + + +

    +The same problem exists in shared libraries: we require a formal version +system to describe the sorts of dependencies that programs have on +shared libraries, so that the dynamic linker can guarantee that programs +are linked only against libraries that provide the interface they +require. + + + + +

    What are library interfaces?

    +

    + + + +

    +Interfaces for libraries may be any of the following (and more): + + + +

    + +

    +Note that static functions do not count as interfaces, because they are +not directly available to the user of the library. + + + + +

    Libtool's versioning system

    +

    + + + + + +

    +Libtool has its own formal versioning system. It is not as flexible as +some, but it is definitely the simplest of the more powerful versioning +systems. + + +

    +Think of a library as exporting several sets of interfaces, arbitrarily +represented by integers. When a program is linked against a library, it +may use any subset of those interfaces. + + +

    +Libtool's description of the interfaces that a program uses is simple: +it encodes the least and the greatest interface numbers in the resulting +binary (first-interface, last-interface). + + +

    +The dynamic linker is guaranteed that if a library supports every +interface number between first-interface and last-interface, +then the program can be relinked against that library. + + +

    +Note that this can cause problems because libtool's compatibility +requirements are actually stricter than is necessary. + + +

    +Say `libhello' supports interfaces 5, 16, 17, 18, and 19, and that +libtool is used to link `test' against `libhello'. + + +

    +Libtool encodes the numbers 5 and 19 in `test', and the dynamic +linker will only link `test' against libraries that support +every interface between 5 and 19. So, the dynamic linker refuses +to link `test' against `libhello'! + + +

    +In order to eliminate this problem, libtool only allows libraries to +declare consecutive interface numbers. So, `libhello' can declare at +most that it supports interfaces 16 through 19. Then, the dynamic +linker will link `test' against `libhello'. + + +

    +So, libtool library versions are described by three integers: + + +

    + +
    current +
    +The most recent interface number that this library implements. + +
    revision +
    +The implementation number of the current interface. + +
    age +
    +The difference between the newest and oldest interfaces that this +library implements. In other words, the library implements all the +interface numbers in the range from number current - +age to current. +
    + +

    +If two libraries have identical current and age numbers, +then the dynamic linker chooses the library with the greater +revision number. + + + + +

    Updating library version information

    + +

    +If you want to use libtool's versioning system, then you must specify +the version information to libtool using the `-version-info' flag +during link mode (see section Link mode). + + +

    +This flag accepts an argument of the form +`current[:revision[:age]]'. So, passing +`-version-info 3:12:1' sets current to 3, revision to +12, and age to 1. + + +

    +If either revision or age are omitted, they default to 0. +Also note that age must be less than or equal to the current +interface number. + + +

    +Here are a set of rules to help you update your library version +information: + + + +

      +
    1. + +Start with version information of `0:0:0' for each libtool library. + +
    2. + +Update the version information only immediately before a public release +of your software. More frequent updates are unnecessary, and only +guarantee that the current interface number gets larger faster. + +
    3. + +If the library source code has changed at all since the last update, +then increment revision (`c:r:a' becomes +`c:r+1:a'). + +
    4. + +If any interfaces have been added, removed, or changed since the last +update, increment current, and set revision to 0. + +
    5. + +If any interfaces have been added since the last public release, then +increment age. + +
    6. + +If any interfaces have been removed since the last public release, then +set age to 0. +
    + +

    +Never try to set the interface numbers so that they +correspond to the release number of your package. This is an abuse that +only fosters misunderstanding of the purpose of library versions. +Instead, use the `-release' flag (see section Managing release information), but be +warned that every release of your package will not be binary compatible +with any other release. + + + + +

    Managing release information

    + +

    +Often, people want to encode the name of the package release into the +shared library so that it is obvious to the user which package their +programs are linked against. This convention is used especially on +GNU/Linux: + + + +

    +trick$ ls /usr/lib/libbfd*
    +/usr/lib/libbfd.a	    /usr/lib/libbfd.so.2.7.0.2
    +/usr/lib/libbfd.so
    +trick$
    +
    + +

    +On `trick', `/usr/lib/libbfd.so' is a symbolic link to +`libbfd.so.2.7.0.2', which was distributed as a part of +`binutils-2.7.0.2'. + + +

    +Unfortunately, this convention conflicts directly with libtool's idea of +library interface versions, because the library interface rarely changes +at the same time that the release number does, and the library suffix is +never the same across all platforms. + + +

    +So, in order to accommodate both views, you can use the `-release' +flag in order to set release information for libraries which you do not +want to use `-version-info'. For the `libbfd' example, the +next release which uses libtool should be built with `-release +2.9.0', which will produce the following files on GNU/Linux: + + + +

    +trick$ ls /usr/lib/libbfd*
    +/usr/lib/libbfd-2.9.0.so     /usr/lib/libbfd.a
    +/usr/lib/libbfd.so
    +trick$
    +
    + +

    +In this case, `/usr/lib/libbfd.so' is a symbolic link to +`libbfd-2.9.0.so'. This makes it obvious that the user is dealing +with `binutils-2.9.0', without compromising libtool's idea of +interface versions. + + +

    +Note that this option causes a modification of the library name, so do +not use it unless you want to break binary compatibility with any past +library releases. In general, you should only use `-release' for +package-internal libraries or for ones whose interfaces change very +frequently. + + + + +

    Tips for interface design

    +

    + + + + +

    +Writing a good library interface takes a lot of practice and thorough +understanding of the problem that the library is intended to solve. + + +

    +If you design a good interface, it won't have to change often, you won't +have to keep updating documentation, and users won't have to keep +relearning how to use the library. + + +

    +Here is a brief list of tips for library interface design, which may +help you in your exploits: + + +

    + +
    Plan ahead +
    +Try to make every interface truly minimal, so that you won't need to +delete entry points very often. + +
    Avoid interface changes +
    + +Some people love redesigning and changing entry points just for the heck +of it (note: renaming a function is considered changing an entry +point). Don't be one of those people. If you must redesign an +interface, then try to leave compatibility functions behind so that +users don't need to rewrite their existing code. + +
    Use opaque data types +
    + +The fewer data type definitions a library user has access to, the +better. If possible, design your functions to accept a generic pointer +(which you can cast to an internal data type), and provide access +functions rather than allowing the library user to directly manipulate +the data. +That way, you have the freedom to change the data structures without +changing the interface. + +This is essentially the same thing as using abstract data types and +inheritance in an object-oriented system. + +
    Use header files +
    + +If you are careful to document each of your library's global functions +and variables in header files, and include them in your library source +files, then the compiler will let you know if you make any interface +changes by accident (see section Writing C header files). + +
    Use the static keyword (or equivalent) whenever possible +
    + +The fewer global functions your library has, the more flexibility you'll +have in changing them. Static functions and variables may change forms +as often as you like... your users cannot access them, so they +aren't interface changes. +
    + + + +

    Writing C header files

    +

    + + + + + +

    +Writing portable C header files can be difficult, since they may be read +by different types of compilers: + + +

    + +
    C++ compilers +
    +C++ compilers require that functions be declared with full prototypes, +since C++ is more strongly typed than C. C functions and variables also +need to be declared with the extern "C" directive, so that the +names aren't mangled. See section Writing libraries for C++, for other issues relevant +to using C++ with libtool. + +
    ANSI C compilers +
    +ANSI C compilers are not as strict as C++ compilers, but functions +should be prototyped to avoid unnecessary warnings when the header file +is #included. + +
    non-ANSI C compilers +
    +Non-ANSI compilers will report errors if functions are prototyped. +
    + +

    +These complications mean that your library interface headers must use +some C preprocessor magic in order to be usable by each of the above +compilers. + + +

    +`foo.h' in the `demo' subdirectory of the libtool distribution +serves as an example for how to write a header file that can be +safely installed in a system directory. + + +

    +Here are the relevant portions of that file: + + + +

    +/* BEGIN_C_DECLS should be used at the beginning of your declarations,
    +   so that C++ compilers don't mangle their names.  Use END_C_DECLS at
    +   the end of C declarations. */
    +#undef BEGIN_C_DECLS
    +#undef END_C_DECLS
    +#ifdef __cplusplus
    +# define BEGIN_C_DECLS extern "C" {
    +# define END_C_DECLS }
    +#else
    +# define BEGIN_C_DECLS /* empty */
    +# define END_C_DECLS /* empty */
    +#endif
    +
    +/* PARAMS is a macro used to wrap function prototypes, so that
    +   compilers that don't understand ANSI C prototypes still work,
    +   and ANSI C compilers can issue warnings about type mismatches. */
    +#undef PARAMS
    +#if defined (__STDC__) || defined (_AIX) \
    +        || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
    +        || defined(WIN32) || defined(__cplusplus)
    +# define PARAMS(protos) protos
    +#else
    +# define PARAMS(protos) ()
    +#endif
    +
    + +

    +These macros are used in `foo.h' as follows: + + + +

    +#ifndef FOO_H
    +#define FOO_H 1
    +
    +/* The above macro definitions. */
    +#include "..."
    +
    +BEGIN_C_DECLS
    +
    +int foo PARAMS((void));
    +int hello PARAMS((void));
    +
    +END_C_DECLS
    +
    +#endif /* !FOO_H */
    +
    + +

    +Note that the `#ifndef FOO_H' prevents the body of `foo.h' +from being read more than once in a given compilation. + + +

    +Also the only thing that must go outside the +BEGIN_C_DECLS/END_C_DECLS pair are #include lines. +Strictly speaking it is only C symbol names that need to be protected, +but your header files will be more maintainable if you have a single +pair of of these macros around the majority of the header contents. + + +

    +You should use these definitions of PARAMS, BEGIN_C_DECLS, +and END_C_DECLS into your own headers. Then, you may use them to +create header files that are valid for C++, ANSI, and non-ANSI +compilers(6). + + +

    +Do not be naive about writing portable code. Following the tips given +above will help you miss the most obvious problems, but there are +definitely other subtle portability issues. You may need to cope with +some of the following issues: + + + +

    + + + +

    Inter-library dependencies

    +

    + + + + +

    +By definition, every shared library system provides a way for +executables to depend on libraries, so that symbol resolution is +deferred until runtime. + + +

    +An inter-library dependency is one in which a library depends on +other libraries. For example, if the libtool library `libhello' +uses the cos function, then it has an inter-library dependency +on `libm', the math library that implements cos. + + +

    +Some shared library systems provide this feature in an +internally-consistent way: these systems allow chains of dependencies of +potentially infinite length. + + +

    +However, most shared library systems are restricted in that they only +allow a single level of dependencies. In these systems, programs may +depend on shared libraries, but shared libraries may not depend on other +shared libraries. + + +

    +In any event, libtool provides a simple mechanism for you to declare +inter-library dependencies: for every library `libname' that +your own library depends on, simply add a corresponding +-lname option to the link line when you create your +library. To make an example of our +`libhello' that depends on `libm': + + + +

    +burger$ libtool gcc -g -O -o libhello.la foo.lo hello.lo \
    +                -rpath /usr/local/lib -lm
    +burger$
    +
    + +

    +When you link a program against `libhello', you don't need to +specify the same `-l' options again: libtool will do that for you, +in order to guarantee that all the required libraries are found. This +restriction is only necessary to preserve compatibility with static +library systems and simple dynamic library systems. + + +

    +Some platforms, such as AIX, do not even allow you this +flexibility. In order to build a shared library, it must be entirely +self-contained (that is, have references only to symbols that are found +in the `.lo' files or the specified `-l' libraries), and you +need to specify the -no-undefined flag. By default, libtool +builds only static libraries on these kinds of platforms. + + +

    +The simple-minded inter-library dependency tracking code of libtool +releases prior to 1.2 was disabled because it was not clear when it was +possible to link one library with another, and complex failures would +occur. A more complex implementation of this concept was re-introduced +before release 1.3, but it has not been ported to all platforms that +libtool supports. The default, conservative behavior is to avoid +linking one library with another, introducing their inter-dependencies +only when a program is linked with them. + + + + +

    Dlopened modules

    +

    + + + + + + + + + + +

    +It can sometimes be confusing to discuss dynamic linking, because +the term is used to refer to two different concepts: + + + +

      +
    1. + +Compiling and linking a program against a shared library, which is +resolved automatically at run time by the dynamic linker. In this +process, dynamic linking is transparent to the application. + +
    2. + +The application calling functions such as dlopen,(7) which load +arbitrary, user-specified modules at runtime. This type of dynamic +linking is explicitly controlled by the application. +
    + +

    +To mitigate confusion, this manual refers to the second type of dynamic +linking as dlopening a module. + + +

    +The main benefit to dlopening object modules is the ability to access +compiled object code to extend your program, rather than using an +interpreted language. In fact, dlopen calls are frequently used in +language interpreters to provide an efficient way to extend the +language. + + +

    +As of version 1.4.2, libtool provides support for dlopened +modules. However, you should indicate that your package is willing to +use such support, by using the macro `AC_LIBTOOL_DLOPEN' in +`configure.in'. If this macro is not used (or it is used +after `AC_PROG_LIBTOOL'), libtool will assume no dlopening +mechanism is available, and will try to simulate it. + + +

    +This chapter discusses how you as a dlopen application developer might +use libtool to generate dlopen-accessible modules. + + + + +

    Building modules to dlopen

    + +

    +On some operating systems, a program symbol must be specially declared +in order to be dynamically resolved with the dlsym (or +equivalent) function. + + +

    +Libtool provides the `-export-dynamic' and `-module' +link flags (see section Link mode), which do this declaration. +You need to use these flags if you are linking an application program that +dlopens other modules or a libtool library that will also be dlopened. + + +

    +For example, if we wanted to build a shared library, `libhello', +that would later be dlopened by an application, we would add +`-module' to the other link flags: + + + +

    +burger$ libtool gcc -module -o libhello.la foo.lo \
    +                hello.lo -rpath /usr/local/lib -lm
    +burger$
    +
    + +

    +If symbols from your executable are needed to satisfy unresolved +references in a library you want to dlopen you will have to use the flag +`-export-dynamic'. +You should use `-export-dynamic' while linking the executable that calls +dlopen: + + + +

    +burger$ libtool gcc -export-dynamic -o hell-dlopener main.o
    +burger$
    +
    + + + +

    Dlpreopening

    + +

    +Libtool provides special support for dlopening libtool object and +libtool library files, so that their symbols can be resolved even +on platforms without any dlopen and dlsym +functions. + + +

    +Consider the following alternative ways of loading code into your +program, in order of increasing "laziness": + + + +

      +
    1. + +Linking against object files that become part of the program executable, +whether or not they are referenced. If an object file cannot be found, +then the linker refuses to create the executable. + +
    2. + +Declaring a static library to the linker, so that it is searched at link +time in order to satisfy any undefined references in the above object +files. If the static library cannot be found, then the linker refuses +to link the executable. + +
    3. + +Declaring a shared library to the runtime linker, so that it is searched +at runtime in order to satisfy any undefined references in the above +files. If the shared library cannot be found, then the dynamic linker +aborts the program before it runs. + +
    4. + +Dlopening a module, so that the application can resolve its own, +dynamically-computed references. If there is an error opening the +module, or the module is not found, then the application can recover +without crashing. +
    + +

    +Libtool emulates `-dlopen' on static platforms by linking objects +into the program at compile time, and creating data structures that +represent the program's symbol table. + + +

    +In order to use this feature, you must declare the objects you want your +application to dlopen by using the `-dlopen' or `-dlpreopen' +flags when you link your program (see section Link mode). + + +

    +

    +
    Structure: struct lt_dlsymlist { const char *name; lt_ptr address; } +
    +The name attribute is a null-terminated character string of the +symbol name, such as "fprintf". The address attribute is a +generic pointer to the appropriate object, such as &fprintf. +
    + + +

    +

    +
    Variable: const lt_dlsymlist * lt_preloaded_symbols +
    +An array of lt_symbol structures, representing all the preloaded +symbols linked into the program. For each `-dlpreloaded' file +there is an element with the name of the file and a address +of 0, followed by all symbols exported from this file. +For the executable itself the special name @PROGRAM@ is used. +The last element has a name and address of 0. +
    + + +

    +Some compilers may allow identifiers which are not valid in ANSI C, such +as dollar signs. Libtool only recognizes valid ANSI C symbols (an +initial ASCII letter or underscore, followed by zero or more ASCII +letters, digits, and underscores), so non-ANSI symbols will not appear +in lt_preloaded_symbols. + + + + +

    Finding the correct name to dlopen

    +

    + + + + +

    +After a library has been linked with `-module', it can be dlopened. +Unfortunately, because of the variation in library names, +your package needs to determine the correct file to dlopen. + + +

    +The most straightforward and flexible implementation is to determine the +name at runtime, by finding the installed `.la' file, and searching +it for the following lines: + + + +

    +# The name that we can dlopen.
    +dlname='dlname'
    +
    + +

    +If dlname is empty, then the library cannot be dlopened. +Otherwise, it gives the dlname of the library. So, if the library was +installed as `/usr/local/lib/libhello.la', and the dlname was +`libhello.so.3', then `/usr/local/lib/libhello.so.3' should be +dlopened. + + +

    +If your program uses this approach, then it should search the +directories listed in the LD_LIBRARY_PATH(8) environment variable, as well as +the directory where libraries will eventually be installed. Searching +this variable (or equivalent) will guarantee that your program can find +its dlopened modules, even before installation, provided you have linked +them using libtool. + + + + +

    Unresolved dlopen issues

    +

    + + + + + +

    +The following problems are not solved by using libtool's dlopen support: + + + +

    + + + +

    Using libltdl

    +

    + + + + + + + + + + + + +

    +Libtool provides a small library, called `libltdl', that aims at +hiding the various difficulties of dlopening libraries from programmers. +It consists of a header-file and a small C source file that can be +distributed with applications that need dlopening functionality. On +some platforms, whose dynamic linkers are too limited for a simple +implementation of `libltdl' services, it requires GNU DLD, or it +will only emulate dynamic linking with libtool's dlpreopening mechanism. + + +

    +libltdl supports currently the following dynamic linking mechanisms: + + + +

    + +

    +libltdl is licensed under the terms of the GNU Library General Public License, +with the following exception: + + + +

    +

    +As a special exception to the GNU Lesser General Public License, +if you distribute this file as part of a program or library that +is built using GNU libtool, you may include it under the same +distribution terms that you use for the rest of that program. +

    + + + +

    How to use libltdl in your programs

    + +

    +The libltdl API is similar to the dlopen interface of Solaris and Linux, +which is very simple but powerful. + + +

    +To use libltdl in your program you have to include the header file `ltdl.h': + + + +

    +#include <ltdl.h>
    +
    + +

    +The last release of libltdl used some symbols that violated the +POSIX namespace conventions. These symbols are now deprecated, +and have been replaced by those described here. If you have code that +relies on the old deprecated symbol names, defining +`LT_NON_POSIX_NAMESPACE' before you include `ltdl.h' provides +conversion macros. Whichever set of symbols you use, the new api is +not binary compatible with the last, so you will need to recompile +your application in order to use this version of libltdl. + + +

    +Note that libltdl is not threadsafe, i.e. a multithreaded application +has to use a mutex for libltdl. It was reported that GNU/Linux's glibc +2.0's dlopen with `RTLD_LAZY' (which libltdl uses by +default) is not thread-safe, but this problem is supposed to be fixed in +glibc 2.1. On the other hand, `RTLD_NOW' was reported to introduce +problems in multi-threaded applications on FreeBSD. Working around +these problems is left as an exercise for the reader; contributions are +certainly welcome. + + +

    +The following types are defined in `ltdl.h': + + +

    +

    +
    Type: lt_ptr +
    +lt_ptr is a generic pointer. +
    + + +

    +

    +
    Type: lt_dlhandle +
    +lt_dlhandle is a module "handle". +Every lt_dlopened module has a handle associated with it. +
    + + +

    +

    +
    Type: lt_dlsymlist +
    +lt_dlsymlist is a symbol list for dlpreopened modules. +This structure is described in see section Dlpreopening. +
    + + +

    +libltdl provides the following functions: + + +

    +

    +
    Function: int lt_dlinit (void) +
    +Initialize libltdl. +This function must be called before using libltdl +and may be called several times. +Return 0 on success, otherwise the number of errors. +
    + + +

    +

    +
    Function: int lt_dlexit (void) +
    +Shut down libltdl and close all modules. +This function will only then shut down libltdl when it was called as +many times as lt_dlinit has been successfully called. +Return 0 on success, otherwise the number of errors. +
    + + +

    +

    +
    Function: lt_dlhandle lt_dlopen (const char *filename) +
    +Open the module with the file name filename and return a +handle for it. lt_dlopen is able to open libtool dynamic +modules, preloaded static modules, the program itself and +native dynamic libraries. + + +

    +Unresolved symbols in the module are resolved using its dependency +libraries (not implemented yet) and previously dlopened modules. If the +executable using this module was linked with the -export-dynamic +flag, then the global symbols in the executable will also be used to +resolve references in the module. + + +

    +If filename is NULL and the program was linked with +-export-dynamic or -dlopen self, lt_dlopen will +return a handle for the program itself, which can be used to access its +symbols. + + +

    +If libltdl cannot find the library and the file name filename does +not have a directory component it will additionally search in the +following search paths for the module (in the order as follows): + + + +

      +
    1. user-defined search path: + +This search path can be set by the program using the +functions lt_dlsetsearchpath and lt_dladdsearchdir. + +
    2. libltdl's search path: + +This search path is the value of the environment variable +LTDL_LIBRARY_PATH. + +
    3. system library search path: + +The system dependent library search path +(e.g. on Linux it is LD_LIBRARY_PATH). +
    + +

    +Each search path must be a colon-separated list of absolute directories, +for example, "/usr/lib/mypkg:/lib/foo". + + +

    +If the same module is loaded several times, the same handle is returned. +If lt_dlopen fails for any reason, it returns NULL. +

    + + +

    +

    +
    Function: lt_dlhandle lt_dlopenext (const char *filename) +
    +The same as lt_dlopen, except that it tries to append +different file name extensions to the file name. +If the file with the file name filename cannot be found +libltdl tries to append the following extensions: + + + +
      +
    1. the libtool archive extension `.la' + +
    2. the extension used for native dynamic libraries on the host platform, + +e.g., `.so', `.sl', etc. +
    + +

    +This lookup strategy was designed to allow programs that don't +have knowledge about native dynamic libraries naming conventions +to be able to dlopen such libraries as well as libtool modules +transparently. +

    + + +

    +

    +
    Function: int lt_dlclose (lt_dlhandle handle) +
    +Decrement the reference count on the module handle. +If it drops to zero and no other module depends on this module, +then the module is unloaded. +Return 0 on success. +
    + + +

    +

    +
    Function: lt_ptr lt_dlsym (lt_dlhandle handle, const char *name) +
    +Return the address in the module handle, where the symbol given +by the null-terminated string name is loaded. +If the symbol cannot be found, NULL is returned. +
    + + +

    +

    +
    Function: {const char *}lt_dlerror (void) +
    +Return a human readable string describing the most +recent error that occurred from any of libltdl's functions. +Return NULL if no errors have occurred since initialization +or since it was last called. +
    + + +

    +

    +
    Function: int lt_dlpreload (const lt_dlsymlist *preloaded) +
    +Register the list of preloaded modules preloaded. +If preloaded is NULL, then all previously registered +symbol lists, except the list set by lt_dlpreload_default, +are deleted. Return 0 on success. +
    + + +

    +

    +
    Function: int lt_dlpreload_default (const lt_dlsymlist *preloaded) +
    +Set the default list of preloaded modules to preloaded, which +won't be deleted by lt_dlpreload. Note that this function does +not require libltdl to be initialized using lt_dlinit and +can be used in the program to register the default preloaded modules. +Instead of calling this function directly, most programs will use the +macro LTDL_SET_PRELOADED_SYMBOLS. + + +

    +Return 0 on success. +

    + + +

    +

    +
    Macro: LTDL_SET_PRELOADED_SYMBOLS() +
    +Set the default list of preloaded symbols. +Should be used in your program to initialize libltdl's +list of preloaded modules. + + + +
    +#include <ltdl.h>
    +
    +int main() {
    +  /* ... */
    +  LTDL_SET_PRELOADED_SYMBOLS();
    +  /* ... */
    +}
    +
    + +
    + +

    +

    +
    Function: int lt_dladdsearchdir (const char *search_dir) +
    +Add the search directory search_dir to the user-defined library +search path. Return 0 on success. +
    + + +

    +

    +
    Function: int lt_dlsetsearchpath (const char *search_path) +
    +Replace the current user-defined library search path with +search_path, which must be a colon-separated list of absolute +directories. Return 0 on success. +
    + + +

    +

    +
    Function: {const char *}lt_dlgetsearchpath (void) +
    +Return the current user-defined library search path. +
    + + +

    +

    +
    Function: int lt_dlmakeresident (lt_dlhandle handle) +
    +Mark a module so that it cannot be `lt_dlclose'd. This can be +useful if a module implements some core functionality in your project, +which would cause your code to crash if removed. Return 0 on success. + + +

    +If you use `lt_dlopen (NULL)' to get a handle for the running +binary, that handle will always be marked as resident, and consequently +cannot be successfully `lt_dlclose'd. +

    + + +

    +

    +
    Function: int lt_dlisresident (lt_dlhandle handle) +
    +Check whether a particular module has been marked as resident, returning 1 +if it has or 0 otherwise. If there is an error while executing this +function, return -1 and set an error message for retrieval with +lt_dlerror. +
    + + +

    +

    +
    Variable: lt_ptr (*) (size_t size) lt_dlmalloc +
    +
    Variable: void (*) (lt_ptr ptr) lt_dlfree +
    +These variables are set to malloc and free, by default, +but you can set them to any other functions that provides equivalent +functionality. However, you must not modify their values after calling +any libltdl function other than lt_dlpreopen_default or the macro +LTDL_SET_PRELOADED_SYMBOLS. +
    + + + + +

    Creating modules that can be dlopened

    + +

    +Libtool modules are like normal libtool libraries with a few exceptions: + + +

    +You have to link the module with libtool's `-module' switch, +and you should link any program that is intended to dlopen the module with +`-dlopen modulename.la' so that libtool can dlpreopen the module +on platforms which don't support dlopening. If the module depends on any +other libraries, make sure you specify them either when you link the module +or when you link programs that dlopen it. +If you want to disable see section Library interface versions for a specific module +you should link it with the `-avoid-version' switch. +Note that libtool modules don't need to have a "lib" prefix. +However, automake 1.4 or higher is required to build such modules. + + +

    +Usually a set of modules provide the same interface, i.e, exports the same +symbols, so that a program can dlopen them without having to know more +about their internals. +In order to avoid symbol conflicts all exported symbols must be prefixed +with "modulename_LTX_" (`modulename' is the name of the module). +Internal symbols must be named in such a way that they won't conflict +with other modules, for example, by prefixing them with "_modulename_". +Although some platforms support having the same symbols defined more than +once it is generally not portable and it makes it impossible to dlpreopen +such modules. libltdl will automatically cut the prefix off to get +the real name of the symbol. Additionally, it supports modules which +don't use a prefix so that you can also dlopen non-libtool modules. + + +

    +`foo1.c' gives an example of a portable libtool module. +Exported symbols are prefixed with "foo1_LTX_", internal symbols +with "_foo1_". Aliases are defined at the beginning so that the code +is more readable. + + + +

    +/* aliases for the exported symbols */
    +#define foo	foo1_LTX_foo
    +#define bar	foo1_LTX_bar
    +
    +/* a global variable definition */
    +int bar = 1;
    +
    +/* a private function */
    +int _foo1_helper() {
    +  return bar;
    +}
    +
    +/* an exported function */
    +int foo() {
    +  return _foo1_helper();
    +}
    +
    + +

    +The `Makefile.am' contains the necessary rules to build the +module `foo1.la': + + + +

    +...
    +lib_LTLIBRARIES = foo1.la
    +
    +foo1_la_SOURCES = foo1.c
    +foo1_la_LDFLAGS = -module
    +...
    +
    + + + +

    Using libtldl in a multi threaded environment

    + +

    +Using the lt_dlmutex_register() function, and by providing some +appropriate callback function definitions, libltdl can be used in a +multi-threaded environment. + + +

    +

    +
    Type: void lt_dlmutex_lock (void) +
    +This is the type of a function pointer holding the address of a function +which will be called at the start of parts of the libltdl implementation +code which require a mutex lock. + + +

    +Because libltdl is inherantly recursive, it is important that the +locking mechanism employed by these callback functions are reentrant, or +else strange problems will occur. +

    + + +

    +

    +
    Type: void lt_dlmutex_unlock (void) +
    +The type of a matching unlock function. +
    + + +

    +

    +
    Type: void lt_dlmutex_seterror (const char *error); +
    +Many of the functions in the libltdl API have a special return +value to indicate to the client that an error has occured. Normally (in +single threaded applications) a string describing that error can be +retrieved from internal storage with lt_dlerror(). + + +

    +A function of this type must be registered with the library in order for +it to work in a multi-threaded context. The function should store any +error message passed in thread local storage. +

    + + +

    +

    +
    Type: const char * lt_dlmutex_geterror (void) +
    +The type of a matching callback function to retrieve the last stored +error message from thread local storage. + + +

    +When regeistered correctly this function will be used by +lt_dlerror()) from all threads to retrieve error messages for the +client. +

    + + +

    +

    +
    Function: int lt_dlmutex_register (lt_dlmutex_lock *lock, lt_dlmutex_unlock *unlock, lt_dlmutex_set_error *seterror, lt_dlmutex_geterror *geterror) +
    +Use this function to register one of each of function ttypes described +above in preparation for multi-threaded use of libltdl. All arguments +must be valid non-NULL function addresses, or else all +NULL to return to single threaded operation. +
    + + + + +

    Data associated with loaded modules

    + +

    +Some of the internal information about each loaded module that is +maintained by libltdl is available to the user, in the form of this +structure: + + +

    +

    +
    Type: struct lt_dlinfo { char *filename; char *name; int ref_count; } +
    +lt_dlinfo is used to store information about a module. +The filename attribute is a null-terminated character string of +the real module file name. If the module is a libtool module then +name is its module name (e.g. "libfoo" for +"dir/libfoo.la"), otherwise it is set to NULL. The +ref_count attribute is a reference counter that describes how +often the same module is currently loaded. +
    + + +

    +The following function will return a pointer to libltdl's internal copy +of this structure for the given handle: + + +

    +

    +
    Function: const lt_dlinfo * lt_dlgetinfo (lt_dlhandle handle) +
    +Return a pointer to a struct that contains some information about +the module handle. The contents of the struct must not be modified. +Return NULL on failure. +
    + + +

    +Furthermore, in order to save you from having to keep a list of the +handles of all the modules you have loaded, these functions allow you to +iterate over libltdl's list of loaded modules: + + +

    +

    +
    Function: int lt_dlforeach (int (*func) (lt_dlhandle handle, lt_ptr data), lt_ptr data) +
    +For each loaded module call the function func. The argument +handle is the handle of one of the loaded modules, data is +the data argument passed to lt_dlforeach. +As soon as func returns a non-zero value for one of the handles, +lt_dlforeach will stop calling func and immediately return 1. +Otherwise 0 is returned. +
    + + +

    +

    +
    Function: lt_dlhandle lt_dlhandle_next (lt_dlhandle place) +
    +Iterate over the loaded module handles, returning the first handle in the +list if place is NULL, and the next one on subsequent calls. +If place is the last element in the list of loaded modules, this +function returns NULL. +
    + + +

    +Of course, you would still need to maintain your own list of loaded +module handles to parallel the list maintained by libltdl if there are +any other data that you need to associate with each handle for the +purposes of your application. However, if you use the following +API calls to associate your application data with individual module +handles as they are loaded there is actually no need to do that. You +must first obtain a unique caller id from libltdl which you subsequently +use to retrieve the data you stored earlier. This allows for different +libraries that each wish to store their own data against loaded modules +to do so without interfering with one another's data. + + +

    +

    +
    Type: lt_dlcaller_id +
    +The opaque type used to hold individual data set keys. +
    + + +

    +

    +
    Function: lt_dlcaller_id lt_dlcaller_register (void) +
    +Use this to obtain a unique key to store and retrieve individual sets of +per module data. +
    + + +

    +

    +
    Function: lt_ptr lt_dlcaller_set_data (lt_dlcaller_id key, lt_dlhandle handle, lt_ptr data) +
    +Set data as the set of data uniquely associated with key and +handle for later retrieval. This function returns the data +previously associated with key and handle if any. A result of +0, may indicate that a diagnostic for the last error (if any) is available +from lt_dlerror(). + + +

    +For example, to correctly remove some associated data: + + + +

    +    lt_ptr stale = lt_dlcaller_set_data (key, handle, 0);
    +    if (stale == NULL)
    +      {
    +        char *error_msg = lt_dlerror ();
    +
    +        if (error_msg != NULL)
    +          {
    +            my_error_handler (error_msg);
    +            return STATUS_FAILED;
    +          }
    +      }
    +    else
    +      {
    +        free (stale);
    +      }
    +
    + +
    + +

    +

    +
    Function: lt_ptr lt_dlcaller_get_data (lt_dlcaller_id key, lt_dlhandle handle) +
    +Return the address of the data associated with key and +handle, or else NULL if there is none. +
    + + +

    +The preceding functions can be combined with lt_dlforeach to +implement search and apply operations without the need for your +application to track the modules that have been loaded and unloaded: + + + +

    +int
    +my_dlcaller_callback (lt_dlhandle handle, lt_ptr key_ptr)
    +{
    +  struct my_module_data *my_data;
    +
    +  my_data = lt_dlcaller_get_data (handle, (lt_dlcaller_id) *key_ptr);
    +
    +  return process (my_data);
    +}
    +
    +int
    +my_dlcaller_foreach (lt_dlcaller_id key)
    +{
    +  lt_dlforeach (my_dlcaller_callback, (lt_ptr) &key);
    +}
    +
    + + + +

    How to create and register new module loaders

    + +

    +Sometimes libltdl's many ways of gaining access to modules are not +sufficient for the purposes of a project. You can write your own +loader, and register it with libltdl so that lt_dlopen will be +able to use it. + + +

    +Writing a loader involves writing at least three functions which can be +called by lt_dlopen, lt_dlsym and lt_dlclose. +Optionally, you can provide a finalisation function to perform any +cleanup operations when lt_dlexit executes, and a symbol prefix +string which will be prepended to any symbols passed to lt_dlsym. +These functions must match the function pointer types below, after +which they can be allocated to an instance of lt_user_dlloader +and registered. + + +

    +Registering the loader requires that you choose a name for it, so that it +can be recognised by lt_dlloader_find and removed with +lt_dlloader_remove. The name you choose must be unique, and not +already in use by libltdl's builtin loaders: + + +

    + +
    "dlopen" +
    +The system dynamic library loader, if one exists. +
    "dld" +
    +The GNU dld loader, if `libdld' was installed when libltdl was +built. +
    "dlpreload" +
    +The loader for lt_dlopening of preloaded static modules. +
    + +

    +The prefix "dl" is reserved for loaders supplied with future versions of +libltdl, so you should not use that for your own loader names. + + +

    +The following types are defined in `ltdl.h': + + +

    +

    +
    Type: lt_module +
    +lt_module is a dlloader dependent module. +The dynamic module loader extensions communicate using these low +level types. +
    + + +

    +

    +
    Type: lt_dlloader +
    +lt_dlloader is a handle for module loader types. +
    + + +

    +

    +
    Type: lt_dlloader_data +
    +lt_dlloader_data is used for specifying loader instance data. +
    + + +

    +

    +
    Type: struct lt_user_dlloader {const char *sym_prefix; lt_module_open *module_open;lt_module_close *module_close; lt_find_sym *find_sym; lt_dlloader_exit *dlloader_exit; lt_dlloader_data dlloader_data; } +
    +If you want to define a new way to open dynamic modules, and have the +lt_dlopen API use it, you need to instantiate one of these +structures and pass it to lt_dlloader_add. You can pass whatever +you like in the dlloader_data field, and it will be passed back as +the value of the first parameter to each of the functions specified in +the function pointer fields. +
    + + +

    +

    +
    Type: lt_module lt_module_open (lt_user_data loader_data, const char *filename) +
    +The type of the loader function for an lt_dlloader module +loader. The value set in the dlloader_data field of the struct +lt_user_dlloader structure will be passed into this function in the +loader_data parameter. Implementation of such a function should +attempt to load the named module, and return an lt_module +suitable for passing in to the associated lt_module_close and +lt_sym_find function pointers. If the function fails it should +return NULL, and set the error message with lt_dlseterror. +
    + + +

    +

    +
    Type: int lt_module_close (lt_dlloader_data loader_data, lt_module module) +
    +The type of the unloader function for a user defined module loader. +Implementatation of such a function should attempt to release +any resources tied up by the module module, and then unload it +from memory. If the function fails for some reason, set the error +message with lt_dlseterror and return non-zero. +
    + + +

    +

    +
    Type: lt_ptr lt_find_sym (lt_user_data loader_data, lt_module module, const char *symbol) +
    +The type of the symbol lookup function for a user defined module loader. +Implementation of such a function should return the address of the named +symbol in the module module, or else set the error message +with lt_dlseterror and return NULL if lookup fails. +
    + + +

    +

    +
    Type: int lt_dlloader_exit (lt_user_data loader_data) +
    +The type of the finalisation function for a user defined module loader. +Implementation of such a function should free any resources associated +with the loader, including any user specified data in the +dlloader_data field of the lt_user_dlloader. If non-NULL, +the function will be called by lt_dlexit, and +lt_dlloader_remove. +
    + + +

    +For example: + + + +

    +int
    +register_myloader (void)
    +{
    +  lt_user_dlloader dlloader;
    +
    +  /* User modules are responsible for their own initialisation. */
    +  if (myloader_init () != 0)
    +    return MYLOADER_INIT_ERROR;
    +
    +  dlloader.sym_prefix    = NULL;
    +  dlloader.module_open   = myloader_open;
    +  dlloader.module_close  = myloader_close;
    +  dlloader.find_sym      = myloader_find_sym.
    +  dlloader.dlloader_exit = myloader_exit;
    +  dlloader.dlloader_data = (lt_user_data)myloader_function;
    +
    +  /* Add my loader as the default module loader. */
    +  if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader, "myloader") != 0)
    +    return ERROR;
    +
    +  return OK;
    +}
    +
    + +

    +Note that if there is any initialisation required for the loader, +it must be performed manually before the loader is registered -- +libltdl doesn't handle user loader initialisation. + + +

    +Finalisation is handled by libltdl however, and it is important +to ensure the dlloader_exit callback releases any resources claimed +during the initialisation phase. + + +

    +libltdl provides the following functions for writing your own module +loaders: + + +

    +

    +
    Function: int lt_dlloader_add (lt_dlloader *place, lt_user_dlloader *dlloader, const char *loader_name) +
    +Add a new module loader to the list of all loaders, either as the +last loader (if place is NULL), else immediately before the +loader passed as place. loader_name will be returned by +lt_dlloader_name if it is subsequently passed a newly +registered loader. These loader_names must be unique, or +lt_dlloader_remove and lt_dlloader_find cannot +work. Returns 0 for success. + + + +
    +{
    +  /* Make myloader be the last one. */
    +  if (lt_dlloader_add (NULL, myloader) != 0)
    +    perror (lt_dlerror ());
    +}
    +
    + +
    + +

    +

    +
    Function: int lt_dlloader_remove (const char *loader_name) +
    +Remove the loader identified by the unique name, loader_name. +Before this can succeed, all modules opened by the named loader must +have been closed. Returns 0 for success, otherwise an error message can +be obtained from lt_dlerror. + + + +
    +{
    +  /* Remove myloader. */
    +  if (lt_dlloader_remove ("myloader") != 0)
    +    perror (lt_dlerror ());
    +}
    +
    + +
    + +

    +

    +
    Function: {lt_dlloader *}lt_dlloader_next (lt_dlloader *place) +
    +Iterate over the module loaders, returning the first loader if place is +NULL, and the next one on subsequent calls. The handle is for use with +lt_dlloader_add. + + + +
    +{
    +  /* Make myloader be the first one. */
    +  if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0)
    +    return ERROR;
    +}
    +
    + +
    + +

    +

    +
    Function: {lt_dlloader *}lt_dlloader_find (const char *loader_name) +
    +Return the first loader with a matching loader_name identifier, or else +NULL, if the identifier is not found. + + +

    +The identifiers which may be used by libltdl itself, if the host +architecture supports them are dlopen(9), dld and dlpreload. + + + +

    +{
    +  /* Add a user loader as the next module loader to be tried if
    +     the standard dlopen loader were to fail when lt_dlopening. */
    +  if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0)
    +    return ERROR;
    +}
    +
    + +
    + +

    +

    +
    Function: {const char *}lt_dlloader_name (lt_dlloader *place) +
    +Return the identifying name of PLACE, as obtained from +lt_dlloader_next or lt_dlloader_find. If this function fails, +it will return NULL and set an error for retrieval with +lt_dlerror. +
    + + +

    +

    +
    Function: {lt_user_data *}lt_dlloader_data (lt_dlloader *place) +
    +Return the address of the dlloader_data of PLACE, as +obtained from lt_dlloader_next or lt_dlloader_find. If +this function fails, it will return NULL and set an error for +retrieval with lt_dlerror. +
    + + + + +

    Error handling within user module loaders

    + +

    +

    +
    Function: int lt_dladderror (const char *diagnostic) +
    +This function allows you to integrate your own error messages into +lt_dlerror. Pass in a suitable diagnostic message for return by +lt_dlerror, and an error identifier for use with +lt_dlseterror is returned. + + +

    +If the allocation of an identifier fails, this function returns -1. + + + +

    +int myerror = lt_dladderror ("Doh!");
    +if (myerror < 0)
    +  perror (lt_dlerror ());
    +
    + +
    + +

    +

    +
    Function: int lt_dlseterror (int errorcode) +
    +When writing your own module loaders, you should use this function to +raise errors so that they are propogated through the lt_dlerror +interface. All of the standard errors used by libltdl are declared in +`ltdl.h', or you can add more of your own with +lt_dladderror. This function returns 0 on success. + + + +
    +if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0)
    +  perror (lt_dlerror ());
    +
    + +
    + + + +

    How to distribute libltdl with your package

    + +

    +Even though libltdl is installed together with libtool, you may wish to +include libltdl in the distribution of your package, for the convenience +of users of your package that don't have libtool or libltdl installed. +In this case, you must decide whether to manually add the ltdl +objects to your package, or else which flavor of libltdl you want to use: +a convenience library or an installable libtool library. + + +

    +The most simplistic way to add libltdl to your package is to copy +the source files, `ltdl.c' and `ltdl.h', to a source directory +withing your package and to build and link them along with the rest of +your sources. To help you do this, the m4 macros for autoconf are +available in `ltdl.m4'. You must ensure that they are available in +`aclocal.m4' before you run autoconf -- by appending the contents +of `ltdl.m4' to `acinclude.m4', if you are using automake, or +to `aclocal.m4' if you are not. Having made the macros available, +you must add a call to the `AC_LIB_LTDL' macro to your package's +`configure.in' to perform the configure time checks required to +build `ltdl.o' correctly. This method has problems if you then try +to link the package binaries with an installed libltdl, or a library +which depends on libltdl: you may have problems with duplicate symbol +definitions. + + +

    +One advantage of the convenience library is that it is not installed, so +the fact that you use libltdl will not be apparent to the user, and it +will not overwrite a pre-installed version of libltdl a user might have. +On the other hand, if you want to upgrade libltdl for any reason +(e.g. a bugfix) you'll have to recompile your package instead of just +replacing an installed version of libltdl. +However, if your programs or libraries are linked with other libraries +that use such a pre-installed version of libltdl, you may get linker +errors or run-time crashes. Another problem is that you cannot link the +convenience library into more than one libtool library, then link a +single program with these libraries, because you may get duplicate +symbols. In general you can safely use the convenience library in programs +which don't depend on other libraries that might use libltdl too. +In order to enable this flavor of libltdl, you should add the +line `AC_LIBLTDL_CONVENIENCE' to your `configure.in', +before `AC_PROG_LIBTOOL'. + + +

    +In order to select the installable version of libltdl, you should add a +call of the macro `AC_LIBLTDL_INSTALLABLE' to your +`configure.in' before `AC_PROG_LIBTOOL'. This macro +will check whether libltdl is already installed and, if not, request the +libltdl embedded in your package to be built and installed. Note, +however, that no version checking is performed. The user may override +the test and determine that the libltdl embedded must be installed, +regardless of the existence of another version, using the configure +switch `--enable-ltdl-install'. + + +

    +In order to embed libltdl into your package, just add `--ltdl' to +the libtoolize command line. It will copy the libltdl sources +to a subdirectory `libltdl' in your package. +Both macros accept an optional argument to specify the location +of the `libltdl' directory. By the default both macros assume that it +is `${top_srcdir}/libltdl'. + + +

    +Whatever macro you use, it is up to you to ensure that your +`configure.in' will configure libltdl, using +`AC_CONFIG_SUBDIRS', and that your `Makefile's will start +sub-makes within libltdl's directory, using automake's SUBDIRS, +for example. Both macros define the shell variables LIBLTDL, to +the link flag that you should use to link with libltdl, and +INCLTDL, to the preprocessor flag that you should use to compile +with programs that include `ltdl.h'. It is up to you to use +`AC_SUBST' to ensure that this variable will be available in +`Makefile's, or add them to variables that are `AC_SUBST'ed by +default, such as LIBS and CPPFLAGS. + + +

    +If you're using the convenience libltdl, LIBLTDL will be the +pathname for the convenience version of libltdl and INCLTDL will be +`-I' followed by the directory that contains libltdl, both starting +with `${top_builddir}/' or `${top_srcdir}/', respectively. + + +

    +If you request an installed version of libltdl and one is +found(10), LIBLTDL will +be set to `-lltdl' and INCLTDL will be empty (which is just a +blind assumption that `ltdl.h' is somewhere in the include path if +libltdl is in the library path). If an installable version of libltdl +must be built, its pathname, starting with `${top_builddir}/', +will be stored in LIBLTDL, and INCLTDL will be set just like +in the case of convenience library. + + +

    +So, when you want to link a program with libltdl, be it a convenience, +installed or installable library, just compile with `$(INCLTDL)' +and link it with `$(LIBLTDL)', using libtool. + + +

    +You should probably also add `AC_LIBTOOL_DLOPEN' to your +`configure.in' before `AC_PROG_LIBTOOL', otherwise +libtool will assume no dlopening mechanism is supported, and revert to +dlpreopening, which is probably not what you want. + + +

    +Avoid using the -static or -all-static switches when +linking programs with libltdl. This will not work on all platforms, +because the dlopening functions may not be available for static linking. + + +

    +The following example shows you how to embed the convenience libltdl in +your package. In order to use the installable variant just replace +`AC_LIBLTDL_CONVENIENCE' with `AC_LIBLTDL_INSTALLABLE'. We +assume that libltdl was embedded using `libtoolize --ltdl'. + + +

    +configure.in: + +

    +...
    +dnl Enable building of the convenience library
    +dnl and set LIBLTDL accordingly
    +AC_LIBLTDL_CONVENIENCE
    +dnl Substitute INCLTDL and LIBLTDL in the Makefiles
    +AC_SUBST(INCLTDL)
    +AC_SUBST(LIBLTDL)
    +dnl Check for dlopen support
    +AC_LIBTOOL_DLOPEN
    +dnl Configure libtool
    +AC_PROG_LIBTOOL
    +dnl Configure libltdl
    +AC_CONFIG_SUBDIRS(libltdl)
    +...
    +
    + +

    +Makefile.am: + +

    +...
    +SUBDIRS = libltdl
    +
    +INCLUDES = $(INCLTDL)
    +
    +myprog_LDFLAGS = -export-dynamic
    +# The quotes around -dlopen below fool automake <= 1.4 into accepting it
    +myprog_LDADD = $(LIBLTDL) "-dlopen" self "-dlopen" foo1.la
    +myprog_DEPENDENCIES = $(LIBLTDL) foo1.la
    +...
    +
    + + + +

    Using libtool with other languages

    +

    + + + + + +

    +Libtool was first implemented in order to add support for writing shared +libraries in the C language. However, over time, libtool is being +integrated with other languages, so that programmers are free to reap +the benefits of shared libraries in their favorite programming language. + + +

    +This chapter describes how libtool interacts with other languages, +and what special considerations you need to make if you do not use C. + + + + +

    Writing libraries for C++

    +

    + + + + + +

    +Creating libraries of C++ code should be a fairly straightforward +process, because its object files differ from C ones in only three ways: + + + +

      +
    1. + +Because of name mangling, C++ libraries are only usable by the C++ +compiler that created them. This decision was made by the designers of +C++ in order to protect users from conflicting implementations of +features such as constructors, exception handling, and RTTI. + +
    2. + +On some systems, the C++ compiler must take special actions for the +dynamic linker to run dynamic (i.e., run-time) initializers. This means +that we should not call `ld' directly to link such libraries, and +we should use the C++ compiler instead. + +
    3. + +C++ compilers will link some Standard C++ library in by default, but +libtool does not know which are these libraries, so it cannot even run +the inter-library dependence analyzer to check how to link it in. +Therefore, running `ld' to link a C++ program or library is deemed +to fail. However, running the C++ compiler directly may lead to +problems related with inter-library dependencies. +
    + +

    +The conclusion is that libtool is not ready for general use for C++ +libraries. You should avoid any global or static variable +initializations that would cause an "initializer element is not +constant" error if you compiled them with a standard C compiler. + + +

    +There are other ways of working around this problem, but they are beyond +the scope of this manual. + + +

    +Furthermore, you'd better find out, at configure time, what are the C++ +Standard libraries that the C++ compiler will link in by default, and +explicitly list them in the link command line. Hopefully, in the +future, libtool will be able to do this job by itself. + + + + +

    Troubleshooting

    +

    + + + + + + +

    +Libtool is under constant development, changing to remain up-to-date +with modern operating systems. If libtool doesn't work the way you +think it should on your platform, you should read this chapter to help +determine what the problem is, and how to resolve it. + + + + +

    The libtool test suite

    +

    + + + +

    +Libtool comes with its own set of programs that test its capabilities, +and report obvious bugs in the libtool program. These tests, too, are +constantly evolving, based on past problems with libtool, and known +deficiencies in other operating systems. + + +

    +As described in the `INSTALL' file, you may run make check +after you have built libtool (possibly before you install it) in order +to make sure that it meets basic functional requirements. + + + + +

    Description of test suite

    + +

    +Here is a list of the current programs in the test suite, and what they +test for: + + +

    + +
    `cdemo-conf.test' +
    +
    `cdemo-exec.test' +
    +
    `cdemo-make.test' +
    +
    `cdemo-static.test' +
    +
    `cdemo-shared.test' +
    + + + + + +These programs check to see that the `cdemo' subdirectory of the +libtool distribution can be configured and built correctly. + +The `cdemo' subdirectory contains a demonstration of libtool +convenience libraries, a mechanism that allows build-time static +libraries to be created, in a way that their components can be later +linked into programs or other libraries, even shared ones. + +The tests `cdemo-make.test' and `cdemo-exec.test' are executed +three times, under three different libtool configurations: +`cdemo-conf.test' configures `cdemo/libtool' to build both +static and shared libraries (the default for platforms that support +both), `cdemo-static.test' builds only static libraries +(`--disable-shared'), and `cdemo-shared.test' builds only +shared libraries (`--disable-static'). + +
    `demo-conf.test' +
    +
    `demo-exec.test' +
    +
    `demo-inst.test' +
    +
    `demo-make.test' +
    +
    `demo-unst.test' +
    +
    `demo-static.test' +
    +
    `demo-shared.test' +
    +
    `demo-nofast.test' +
    +
    `demo-pic.test' +
    +
    `demo-nopic.test' +
    + + + + + + + + + + +These programs check to see that the `demo' subdirectory of the +libtool distribution can be configured, built, installed, and +uninstalled correctly. + +The `demo' subdirectory contains a demonstration of a trivial +package that uses libtool. The tests `demo-make.test', +`demo-exec.test', `demo-inst.test' and +`demo-unst.test' are executed four times, under four different +libtool configurations: `demo-conf.test' configures +`demo/libtool' to build both static and shared libraries, +`demo-static.test' builds only static libraries +(`--disable-shared'), and `demo-shared.test' builds only +shared libraries (`--disable-static'). +`demo-nofast.test' configures `demo/libtool' to +disable the fast-install mode (`--enable-fast-install=no'). +`demo-pic.test' configures `demo/libtool' to +prefer building PIC code (`--with-pic'), `demo-nopic.test' +to prefer non-PIC code (`--without-pic'). + +
    `deplibs.test' +
    + +Many systems cannot link static libraries into shared libraries. +libtool uses a deplibs_check_method to prevent such cases. +This tests checks whether libtool's deplibs_check_method +works properly. + +
    `hardcode.test' +
    + +On all systems with shared libraries, the location of the library can be +encoded in executables that are linked against it see section Linking executables. This test checks the conditions under which your system +linker hardcodes the library location, and guarantees that they +correspond to libtool's own notion of how your linker behaves. + +
    `build-relink.test' +
    + +Checks whether variable shlibpath_overrides_runpath is properly +set. If the test fails and VERBOSE is set, it will indicate what +the variable should have been set to. + +
    `noinst-link.test' +
    + +Checks whether libtool will not try to link with a previously installed +version of a library when it should be linking with a just-built one. + +
    `depdemo-conf.test' +
    +
    `depdemo-exec.test' +
    +
    `depdemo-inst.test' +
    +
    `depdemo-make.test' +
    +
    `depdemo-unst.test' +
    +
    `depdemo-static.test' +
    +
    `depdemo-shared.test' +
    +
    `depdemo-nofast.test' +
    + + + + + + + + +These programs check to see that the `depdemo' subdirectory of the +libtool distribution can be configured, built, installed, and +uninstalled correctly. + +The `depdemo' subdirectory contains a demonstration of inter-library +dependencies with libtool. The test programs link some interdependent +libraries. + +The tests `depdemo-make.test', `depdemo-exec.test', +`depdemo-inst.test' and `depdemo-unst.test' are executed +four times, under four different libtool configurations: +`depdemo-conf.test' configures `depdemo/libtool' to build both +static and shared libraries, `depdemo-static.test' builds only static +libraries (`--disable-shared'), and `depdemo-shared.test' builds +only shared libraries (`--disable-static'). +`depdemo-nofast.test' configures `depdemo/libtool' to +disable the fast-install mode (`--enable-fast-install=no'. + +
    `mdemo-conf.test' +
    +
    `mdemo-exec.test' +
    +
    `mdemo-inst.test' +
    +
    `mdemo-make.test' +
    +
    `mdemo-unst.test' +
    +
    `mdemo-static.test' +
    +
    `mdemo-shared.test' +
    + + + + + + + +These programs check to see that the `mdemo' subdirectory of the +libtool distribution can be configured, built, installed, and +uninstalled correctly. + +The `mdemo' subdirectory contains a demonstration of a package that +uses libtool and the system independent dlopen wrapper `libltdl' to +load modules. The library `libltdl' provides a dlopen wrapper for +various platforms (Linux, Solaris, HP/UX etc.) including support for +dlpreopened modules (see section Dlpreopening). + +The tests `mdemo-make.test', `mdemo-exec.test', +`mdemo-inst.test' and `mdemo-unst.test' are executed +three times, under three different libtool configurations: +`mdemo-conf.test' configures `mdemo/libtool' to build both +static and shared libraries, `mdemo-static.test' builds only static +libraries (`--disable-shared'), and `mdemo-shared.test' builds +only shared libraries (`--disable-static'). + +
    `dryrun.test' +
    + +This test checks whether libtool's --dry-run mode works properly. + +
    `assign.test' +
    + +Checks whether we don't put break or continue on the same +line as an assignment in the libtool script. + +
    `link.test' +
    + +This test guarantees that linking directly against a non-libtool static +library works properly. + +
    `link-2.test' +
    + +This test makes sure that files ending in `.lo' are never linked +directly into a program file. + +
    `nomode.test' +
    + +Check whether we can actually get help for libtool. + +
    `quote.test' +
    + +This program checks libtool's metacharacter quoting. + +
    `sh.test' +
    + +Checks whether a `test' command was forgotten in libtool. + +
    `suffix.test' +
    + +When other programming languages are used with libtool (see section Using libtool with other languages), the source files may end in suffixes other than `.c'. +This test validates that libtool can handle suffixes for all the file +types that it supports, and that it fails when the suffix is invalid. + +
    + + + +

    When tests fail

    +

    + + + + +

    +Each of the above tests are designed to produce no output when they are +run via make check. The exit status of each program tells the +`Makefile' whether or not the test succeeded. + + +

    +If a test fails, it means that there is either a programming error in +libtool, or in the test program itself. + + +

    +To investigate a particular test, you may run it directly, as you would +a normal program. When the test is invoked in this way, it produces +output which may be useful in determining what the problem is. + + +

    +Another way to have the test programs produce output is to set the +VERBOSE environment variable to `yes' before running them. +For example, env VERBOSE=yes make check runs all the tests, and +has each of them display debugging information. + + + + +

    Reporting bugs

    +

    + + + + + +

    +If you think you have discovered a bug in libtool, you should think +twice: the libtool maintainer is notorious for passing the buck (or +maybe that should be "passing the bug"). Libtool was invented to fix +known deficiencies in shared library implementations, so, in a way, most +of the bugs in libtool are actually bugs in other operating systems. +However, the libtool maintainer would definitely be happy to add support +for somebody else's buggy operating system. [I wish there was a good +way to do winking smiley-faces in Texinfo.] + + +

    +Genuine bugs in libtool include problems with shell script portability, +documentation errors, and failures in the test suite (see section The libtool test suite). + + +

    +First, check the documentation and help screens to make sure that the +behaviour you think is a problem is not already mentioned as a feature. + + +

    +Then, you should read the Emacs guide to reporting bugs (see section `Reporting Bugs' in The Emacs Manual). Some of the details +listed there are specific to Emacs, but the principle behind them is a +general one. + + +

    +Finally, send a bug report to the libtool bug reporting address bug-libtool@gnu.org with any appropriate +facts, such as test suite output (see section When tests fail), all +the details needed to reproduce the bug, and a brief description of why +you think the behaviour is a bug. Be sure to include the word +"libtool" in the subject line, as well as the version number you are +using (which can be found by typing libtool --version). + + + + +

    Maintenance notes for libtool

    + +

    +This chapter contains information that the libtool maintainer finds +important. It will be of no use to you unless you are considering +porting libtool to new systems, or writing your own libtool. + + + + +

    Porting libtool to new systems

    + +

    +Before you embark on porting libtool to an unsupported system, it is +worthwhile to send e-mail to the libtool mailing list libtool@gnu.org, to make sure that you are +not duplicating existing work. + + +

    +If you find that any porting documentation is missing, please complain! +Complaints with patches and improvements to the documentation, or to +libtool itself, are more than welcome. + + + + +

    Information sources

    + +

    +Once it is clear that a new port is necessary, you'll generally need the +following information: + + +

    + +
    canonical system name +
    +You need the output of config.guess for this system, so that you +can make changes to the libtool configuration process without affecting +other systems. + +
    man pages for ld and cc +
    +These generally describe what flags are used to generate PIC, to create +shared libraries, and to link against only static libraries. You may +need to follow some cross references to find the information that is +required. + +
    man pages for ld.so, rtld, or equivalent +
    +These are a valuable resource for understanding how shared libraries are +loaded on the system. + +
    man page for ldconfig, or equivalent +
    +This page usually describes how to install shared libraries. + +
    output from ls -l /lib /usr/lib +
    +This shows the naming convention for shared libraries on the system, +including which names should be symbolic links. + +
    any additional documentation +
    +Some systems have special documentation on how to build and install +shared libraries. +
    + +

    +If you know how to program the Bourne shell, then you can complete the +port yourself; otherwise, you'll have to find somebody with the relevant +skills who will do the work. People on the libtool mailing list are +usually willing to volunteer to help you with new ports, so you can send +the information to them. + + +

    +To do the port yourself, you'll definitely need to modify the +libtool.m4 macros in order to make platform-specific changes to +the configuration process. You should search that file for the +PORTME keyword, which will give you some hints on what you'll +need to change. In general, all that is involved is modifying the +appropriate configuration variables (see section libtool script contents). + + +

    +Your best bet is to find an already-supported system that is similar to +yours, and make your changes based on that. In some cases, however, +your system will differ significantly from every other supported system, +and it may be necessary to add new configuration variables, and modify +the ltmain.in script accordingly. Be sure to write to the +mailing list before you make changes to ltmain.in, since they may +have advice on the most effective way of accomplishing what you want. + + + + +

    Porting inter-library dependencies support

    +

    + + + + +

    +Since version 1.2c, libtool has re-introduced the ability to do +inter-library dependency on some platforms, thanks to a patch by Toshio +Kuratomi badger@prtr-13.ucsc.edu. Here's a shortened version +of the message that contained his patch: + + +

    +The basic architecture is this: in `libtool.m4', the person who +writes libtool makes sure `$deplibs' is included in +`$archive_cmds' somewhere and also sets the variable +`$deplibs_check_method', and maybe `$file_magic_cmd' when +`deplibs_check_method' is file_magic. + + +

    +`deplibs_check_method' can be one of five things: +

    + +
    `file_magic [regex]' +
    + + + +looks in the library link path for libraries that have the right +libname. Then it runs `$file_magic_cmd' on the library and checks +for a match against regex using egrep. When +file_magic_test_file is set by `libtool.m4', it is used as an +argument to `$file_magic_cmd' in order to verify whether the +regular expression matches its output, and warn the user otherwise. + +
    `test_compile' +
    + +just checks whether it is possible to link a program out of a list of +libraries, and checks which of those are listed in the output of +ldd. It is currently unused, and will probably be dropped in the +future. + +
    `pass_all' +
    + +will pass everything without any checking. This may work on platforms +in which code is position-independent by default and inter-library +dependencies are properly supported by the dynamic linker, for example, +on DEC OSF/1 3 and 4. + +
    `none' +
    + +It causes deplibs to be reassigned deplibs="". That way +`archive_cmds' can contain deplibs on all platforms, but not have +deplibs used unless needed. + +
    `unknown' +
    + +is the default for all systems unless overridden in `libtool.m4'. +It is the same as `none', but it documents that we really don't +know what the correct value should be, and we welcome patches that +improve it. +
    + +

    +Then in `ltmain.in' we have the real workhorse: a little +initialization and postprocessing (to setup/release variables for use +with eval echo libname_spec etc.) and a case statement that decides +which method is being used. This is the real code... I wish I could +condense it a little more, but I don't think I can without function +calls. I've mostly optimized it (moved things out of loops, etc) but +there is probably some fat left. I thought I should stop while I was +ahead, work on whatever bugs you discover, etc before thinking about +more than obvious optimizations. + + + + +

    Tested platforms

    + +

    +This table describes when libtool was last known to be tested on +platforms where it claims to support shared libraries: + + + +

    +-------------------------------------------------------
    +canonical host name          compiler  libtool results
    +  (tools versions)                     release
    +-------------------------------------------------------
    +alpha-dec-osf5.1		cc	 1.3e	  ok (1.910)
    +alpha-dec-osf4.0f               gcc      1.3e     ok (1.910)
    +alpha-dec-osf4.0f               cc       1.3e     ok (1.910)
    +alpha-dec-osf3.2                gcc      0.8      ok
    +alpha-dec-osf3.2                cc       0.8      ok
    +alpha-dec-osf2.1                gcc      1.2f     NS
    +alpha*-unknown-linux-gnu        gcc      1.3b     ok
    +  (egcs-1.1.2, GNU ld 2.9.1.0.23)
    +hppa2.0w-hp-hpux11.00           cc       1.2f     ok
    +hppa2.0-hp-hpux10.20            cc       1.3.2    ok
    +hppa1.1-hp-hpux10.20            gcc      1.2f     ok
    +hppa1.1-hp-hpux10.20            cc       1.3c     ok (1.821)
    +hppa1.1-hp-hpux10.10            gcc      1.2f     ok
    +hppa1.1-hp-hpux10.10            cc       1.2f     ok
    +hppa1.1-hp-hpux9.07             gcc      1.2f     ok
    +hppa1.1-hp-hpux9.07             cc       1.2f     ok
    +hppa1.1-hp-hpux9.05             gcc      1.2f     ok
    +hppa1.1-hp-hpux9.05             cc       1.2f     ok
    +hppa1.1-hp-hpux9.01             gcc      1.2f     ok
    +hppa1.1-hp-hpux9.01             cc       1.2f     ok
    +i*86-*-beos                     gcc      1.2f     ok
    +i*86-*-bsdi4.0.1                gcc      1.3c     ok
    +  (gcc-2.7.2.1)
    +i*86-*-bsdi4.0                  gcc      1.2f     ok
    +i*86-*-bsdi3.1                  gcc      1.2e     NS
    +i*86-*-bsdi3.0                  gcc      1.2e     NS
    +i*86-*-bsdi2.1                  gcc      1.2e     NS
    +i*86-pc-cygwin                  gcc      1.3b     NS
    +  (egcs-1.1 stock b20.1 compiler)
    +i*86-*-dguxR4.20MU01            gcc      1.2      ok
    +i*86-*-freebsd4.3		gcc      1.3e     ok (1.912)
    +i*86-*-freebsdelf4.0            gcc      1.3c     ok
    +  (egcs-1.1.2)
    +i*86-*-freebsdelf3.2            gcc      1.3c     ok
    +  (gcc-2.7.2.1)
    +i*86-*-freebsdelf3.1            gcc      1.3c     ok
    +  (gcc-2.7.2.1)
    +i*86-*-freebsdelf3.0            gcc      1.3c     ok
    +i*86-*-freebsd3.0               gcc      1.2e     ok
    +i*86-*-freebsd2.2.8             gcc      1.3c     ok
    +  (gcc-2.7.2.1)
    +i*86-*-freebsd2.2.6             gcc      1.3b     ok
    +  (egcs-1.1 & gcc-2.7.2.1, native ld)
    +i*86-*-freebsd2.1.5             gcc      0.5      ok
    +i*86-*-netbsd1.5                gcc      1.3e     ok (1.901)
    +  (egcs-1.1.2)
    +i*86-*-netbsd1.4                gcc      1.3c     ok
    +  (egcs-1.1.1)
    +i*86-*-netbsd1.4.3A             gcc      1.3e     ok (1.901)
    +i*86-*-netbsd1.3.3              gcc      1.3c     ok
    +  (gcc-2.7.2.2+myc2)
    +i*86-*-netbsd1.3.2              gcc      1.2e     ok
    +i*86-*-netbsd1.3I               gcc      1.2e     ok
    +  (egcs 1.1?)
    +i*86-*-netbsd1.2                gcc      0.9g     ok
    +i*86-*-linux-gnu		gcc	 1.3e	  ok (1.901)
    +  (Red Hat 7.0, gcc "2.96")
    +i*86-*-linux-gnu		gcc	 1.4.2	  ok
    +  (SuSE 7.0, gcc 2.95.2)
    +i*86-*-linux-gnulibc1           gcc      1.2f     ok
    +i*86-*-openbsd2.5               gcc      1.3c     ok
    +  (gcc-2.8.1)
    +i*86-*-openbsd2.4               gcc      1.3c     ok
    +  (gcc-2.8.1)
    +i*86-*-solaris2.7               gcc      1.3b     ok
    +  (egcs-1.1.2, native ld)
    +i*86-*-solaris2.6               gcc      1.2f     ok
    +i*86-*-solaris2.5.1             gcc      1.2f     ok
    +i*86-ncr-sysv4.3.03             gcc      1.2f     ok
    +i*86-ncr-sysv4.3.03             cc       1.2e     ok
    +  (cc -Hnocopyr)
    +i*86-pc-sco3.2v5.0.5		cc	 1.3c	  ok
    +i*86-pc-sco3.2v5.0.5		gcc	 1.3c	  ok
    +  (gcc 95q4c)
    +i*86-pc-sco3.2v5.0.5		gcc	 1.3c	  ok
    +  (egcs-1.1.2)
    +i*86-sco-sysv5uw7.1.1		gcc	 1.3e	  ok (1.901)
    +  (gcc-2.95.2, SCO linker)
    +i*86-UnixWare7.1.0-sysv5	cc	 1.3c	  ok
    +i*86-UnixWare7.1.0-sysv5	gcc	 1.3c	  ok
    +  (egcs-1.1.1)
    +m68k-next-nextstep3             gcc      1.2f     NS
    +m68k-sun-sunos4.1.1             gcc      1.2f     NS
    +  (gcc-2.5.7)
    +m88k-dg-dguxR4.12TMU01          gcc      1.2      ok
    +m88k-motorola-sysv4             gcc      1.3      ok
    +  (egcs-1.1.2)
    +mips-sgi-irix6.5                gcc      1.2f     ok
    +  (gcc-2.8.1)
    +mips-sgi-irix6.4                gcc      1.2f     ok
    +mips-sgi-irix6.3                gcc      1.3b     ok
    +  (egcs-1.1.2, native ld)
    +mips-sgi-irix6.3                cc       1.3b     ok
    +  (cc 7.0)
    +mips-sgi-irix6.2                gcc      1.2f     ok
    +mips-sgi-irix6.2                cc       0.9      ok
    +mips-sgi-irix5.3                gcc      1.2f     ok
    +  (egcs-1.1.1)
    +mips-sgi-irix5.3                gcc      1.2f     NS
    +  (gcc-2.6.3)
    +mips-sgi-irix5.3                cc       0.8      ok
    +mips-sgi-irix5.2                gcc      1.3b     ok
    +  (egcs-1.1.2, native ld)
    +mips-sgi-irix5.2                cc       1.3b     ok
    +  (cc 3.18)
    +mips-sni-sysv4			cc       1.3.5    ok
    +  (Siemens C-compiler)
    +mips-sni-sysv4			gcc      1.3.5    ok
    +  (gcc-2.7.2.3, GNU assembler 2.8.1, native ld) 
    +mipsel-unknown-openbsd2.1       gcc      1.0      ok
    +powerpc-ibm-aix4.3.1.0          gcc      1.2f     ok
    +  (egcs-1.1.1)
    +powerpc-ibm-aix4.2.1.0          gcc      1.2f     ok
    +  (egcs-1.1.1)
    +powerpc-ibm-aix4.1.5.0          gcc      1.2f     ok
    +  (egcs-1.1.1)
    +powerpc-ibm-aix4.1.5.0          gcc      1.2f     NS
    +  (gcc-2.8.1)
    +powerpc-ibm-aix4.1.4.0          gcc      1.0      ok
    +powerpc-ibm-aix4.1.4.0          xlc      1.0i     ok
    +rs6000-ibm-aix4.1.5.0           gcc      1.2f     ok
    +  (gcc-2.7.2)
    +rs6000-ibm-aix4.1.4.0           gcc      1.2f     ok
    +  (gcc-2.7.2)
    +rs6000-ibm-aix3.2.5             gcc      1.0i     ok
    +rs6000-ibm-aix3.2.5             xlc      1.0i     ok
    +sparc-sun-solaris2.8		gcc	 1.4.2	  ok
    +  (gcc-2.95.2 & native ld)
    +sparc-sun-solaris2.8		gcc	 1.4.2	  ok
    +  (gcc-3.0.1 & GNU ld 2.11.2)
    +sparc-sun-solaris2.7            gcc      1.3e     ok (1.913)
    +  (gcc-2.95.3 & native ld)
    +sparc-sun-solaris2.6            gcc      1.3e     ok (1.913)
    +  (gcc-2.95.3 & native ld)
    +sparc-sun-solaris2.5.1          gcc      1.4.2    ok
    +  (gcc-2.95.1 & GNU ld 2.9.1)
    +sparc-sun-solaris2.5            gcc      1.3b     ok
    +  (egcs-1.1.2, GNU ld 2.9.1 & native ld)
    +sparc-sun-solaris2.5            cc       1.3b     ok
    +  (SC 3.0.1)
    +sparc-sun-solaris2.4            gcc      1.0a     ok
    +sparc-sun-solaris2.4            cc       1.0a     ok
    +sparc-sun-solaris2.3            gcc      1.2f     ok
    +sparc-sun-sunos4.1.4            gcc      1.2f     ok
    +sparc-sun-sunos4.1.4            cc       1.0f     ok
    +sparc-sun-sunos4.1.3_U1         gcc      1.2f     ok
    +sparc-sun-sunos4.1.3C           gcc      1.2f     ok
    +sparc-sun-sunos4.1.3            gcc      1.3b     ok
    +  (egcs-1.1.2, GNU ld 2.9.1 & native ld)
    +sparc-sun-sunos4.1.3            cc       1.3b     ok
    +sparc-unknown-bsdi4.0           gcc      1.2c     ok
    +sparc-unknown-linux-gnulibc1    gcc      1.2f     ok
    +sparc-unknown-linux-gnu         gcc      1.3b     ok
    +  (egcs-1.1.2, GNU ld 2.9.1.0.23)
    +sparc64-unknown-linux-gnu       gcc      1.2f     ok
    +
    +Notes:
    +- "ok" means "all tests passed".
    +- "NS" means "Not Shared", but OK for static libraries
    +
    + +

    +Note: The vendor-distributed HP-UX sed(1) programs are horribly +broken, and cannot handle libtool's requirements, so users may report +unusual problems. There is no workaround except to install a working +sed (such as GNU sed) on these systems. + + +

    +Note: The vendor-distributed NCR MP-RAS cc programs emits +copyright on standard error that confuse tests on size of +`conftest.err'. The workaround is to specify CC +when run configure with CC='cc -Hnocopyr'. + + + + +

    Platform quirks

    + +

    +This section is dedicated to the sanity of the libtool maintainers. It +describes the programs that libtool uses, how they vary from system to +system, and how to test for them. + + +

    +Because libtool is a shell script, it can be difficult to understand +just by reading it from top to bottom. This section helps show why +libtool does things a certain way. Combined with the scripts +themselves, you should have a better sense of how to improve libtool, or +write your own. + + + + +

    References

    + +

    +The following is a list of valuable documentation references: + + + +

    + + + +

    Compilers

    + +

    +The only compiler characteristics that affect libtool are the flags +needed (if any) to generate PIC objects. In general, if a C compiler +supports certain PIC flags, then any derivative compilers support the +same flags. Until there are some noteworthy exceptions to this rule, +this section will document only C compilers. + + +

    +The following C compilers have standard command line options, regardless +of the platform: + + +

    + +
    gcc +
    +This is the GNU C compiler, which is also the system compiler for many +free operating systems (FreeBSD, GNU/Hurd, GNU/Linux, Lites, NetBSD, and +OpenBSD, to name a few). + +The `-fpic' or `-fPIC' flags can be used to generate +position-independent code. `-fPIC' is guaranteed to generate +working code, but the code is slower on m68k, m88k, and Sparc chips. +However, using `-fpic' on those chips imposes arbitrary size limits +on the shared libraries. +
    + +

    +The rest of this subsection lists compilers by the operating system that +they are bundled with: + + +

    + +
    aix3* +
    +
    aix4* +
    +AIX compilers have no PIC flags, since AIX has been ported only to +PowerPC and RS/6000 chips. (11) + +
    hpux10* +
    +Use `+Z' to generate PIC. + +
    osf3* +
    +Digital/UNIX 3.x does not have PIC flags, at least not on the PowerPC +platform. + +
    solaris2* +
    +Use `-KPIC' to generate PIC. + +
    sunos4* +
    +Use `-PIC' to generate PIC. +
    + + + +

    Reloadable objects

    + +

    +On all known systems, a reloadable object can be created by running +ld -r -o output.o input1.o input2.o. This +reloadable object may be treated as exactly equivalent to other +objects. + + + + +

    Multiple dependencies

    + +

    +On most modern platforms the order that dependent libraries are listed +has no effect on object generation. In theory, there are platforms +which require libraries which provide missing symbols to other libraries +to listed after those libraries whose symbols they provide. + + +

    +Particularly, if a pair of static archives each resolve some of the +other's symbols, it might be necessary to list one of those archives +both before and after the other one. Libtool does not currently cope +with this situation well, since dupicate libraries are removed from +thr link line. + + +

    +If you find yourself developing on a host that requires you to list +libraries multiple times in order for it to generate correctly linked +objects, you can defeat libtool's removal algorithm like this: + + + +

    +$ libtool ... -lfoo -lbar -Wl,-lfoo
    +
    + + + +

    Archivers

    + +

    +On all known systems, building a static library can be accomplished by +running ar cru libname.a obj1.o obj2.o ..., +where the `.a' file is the output library, and each `.o' file is an +object file. + + +

    +On all known systems, if there is a program named ranlib, then it +must be used to "bless" the created library before linking against it, +with the ranlib libname.a command. Some systems, like Irix, +use the ar ts command, instead. + + + + +

    libtool script contents

    +

    + + + + +

    +Since version 1.4, the libtool script is generated by +configure (see section Configuring libtool). In earlier versions, +configure achieved this by calling a helper script called +`ltconfig'. From libtool version 0.7 to 1.0, this script +simply set shell variables, then sourced the libtool backend, +ltmain.sh. ltconfig from libtool version 1.1 through 1.3 +inlined the contents of ltmain.sh into the generated +libtool, which improved performance on many systems. The tests +that `ltconfig' used to perform are now kept in `libtool.m4' +where thay can be written using Autoconf. This has the runtime +performance benefits of inlined ltmain.sh, and improves +the build time a little while considerably easing the amount of raw +shell code that used to need maintaining. + + +

    +The convention used for naming variables which hold shell commands for +delayed evaluation, is to use the suffix _cmd where a single +line of valid shell script is needed, and the suffix _cmds where +multiple lines of shell script may be delayed for later +evaluation. By convention, _cmds variables delimit the +evaluation units with the ~ character where necessary. + + +

    +Here is a listing of each of the configuration variables, and how they +are used within ltmain.sh (see section Configuring libtool): + + +

    +

    +
    Variable: AR +
    +The name of the system library archiver. +
    + + +

    +

    +
    Variable: CC +
    +The name of the C compiler used to configure libtool. +
    + + +

    +

    +
    Variable: LD +
    +The name of the linker that libtool should use internally for reloadable +linking and possibly shared libraries. +
    + + +

    +

    +
    Variable: NM +
    +The name of a BSD-compatible nm program, which produces listings +of global symbols in one the following formats: + + + +
    +address C global-variable-name
    +address D global-variable-name
    +address T global-function-name
    +
    + +
    + +

    +

    +
    Variable: RANLIB +
    +Set to the name of the ranlib program, if any. +
    + + +

    +

    +
    Variable: allow_undefined_flag +
    +The flag that is used by `archive_cmds' in order to declare that +there will be unresolved symbols in the resulting shared library. +Empty, if no such flag is required. Set to `unsupported' if there +is no way to generate a shared library with references to symbols that +aren't defined in that library. +
    + + +

    +

    +
    Variable: always_export_symbols +
    +Whether libtool should automatically generate a list of exported symbols +using export_symbols_cmds before linking an archive. +Set to `yes' or `no'. Default is `no'. +
    + + +

    +

    +
    Variable: archive_cmds +
    +
    Variable: archive_expsym_cmds +
    +
    Variable: old_archive_cmds +
    +Commands used to create shared libraries, shared libraries with +`-export-symbols' and static libraries, respectively. +
    + + +

    +

    +
    Variable: old_archive_from_new_cmds +
    +If the shared library depends on a static library, +`old_archive_from_new_cmds' contains the commands used to create that +static library. If this variable is not empty, `old_archive_cmds' is +not used. +
    + + +

    +

    +
    Variable: old_archive_from_expsyms_cmds +
    +If a static library must be created from the export symbol list in order to +correctly link with a shared library, `old_archive_from_expsyms_cmds' +contains the commands needed to create that static library. When these +commands are executed, the variable soname contains the name of the +shared library in question, and the $objdir/$newlib contains the +path of the static library these commands should build. After executing +these commands, libtool will proceed to link against $objdir/$newlib +instead of soname. +
    + + +

    +

    +
    Variable: build_libtool_libs +
    +Whether libtool should build shared libraries on this system. Set to +`yes' or `no'. +
    + + +

    +

    +
    Variable: build_old_libs +
    +Whether libtool should build static libraries on this system. Set to +`yes' or `no'. +
    + + +

    +

    +
    Variable: compiler_c_o +
    +Whether the compiler supports the -c and -o options +simultaneously. Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: compiler_o_lo +
    +Whether the compiler supports compiling directly to a ".lo" file, +i.e whether object files do not have to have the suffix ".o". +Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: dlopen_support +
    +Whether dlopen is supported on the platform. +Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: dlopen_self +
    +Whether it is possible to dlopen the executable itself. +Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: dlopen_self_static +
    +Whether it is possible to dlopen the executable itself, when it +is linked statically (`-all-static'). Set to `yes' or +`no'. +
    + + +

    +

    +
    Variable: echo +
    +An echo program which does not interpret backslashes as an +escape character. +
    + + +

    +

    +
    Variable: exclude_expsyms +
    +List of symbols that should not be listed in the preloaded symbols. +
    + + +

    +

    +
    Variable: export_dynamic_flag_spec +
    +Compiler link flag that allows a dlopened shared library to reference +symbols that are defined in the program. +
    + + +

    +

    +
    Variable: export_symbols_cmds +
    +Commands to extract exported symbols from libobjs to the +file export_symbols. +
    + + +

    +

    +
    Variable: extract_expsyms_cmds +
    +Commands to extract the exported symbols list from a shared library. +These commands are executed if there is no file $objdir/$soname-def, +and should write the names of the exported symbols to that file, for +the use of `old_archive_from_expsyms_cmds'. +
    + + +

    +

    +
    Variable: fast_install +
    +Determines whether libtool will privilege the installer or the +developer. The assumption is that installers will seldom run programs +in the build tree, and the developer will seldom install. This is only +meaningful on platforms in which shlibpath_overrides_runpath is +not `yes', so fast_install will be set to `needless' in +this case. If fast_install set to `yes', libtool will create +programs that search for installed libraries, and, if a program is run +in the build tree, a new copy will be linked on-demand to use the +yet-to-be-installed libraries. If set to `no', libtool will create +programs that use the yet-to-be-installed libraries, and will link +a new copy of the program at install time. The default value is +`yes' or `needless', depending on platform and configuration +flags, and it can be turned from `yes' to `no' with the +configure flag `--disable-fast-install'. +
    + + +

    +

    +
    Variable: finish_cmds +
    +Commands to tell the dynamic linker how to find shared libraries in a +specific directory. +
    + + +

    +

    +
    Variable: finish_eval +
    +Same as finish_cmds, except the commands are not displayed. +
    + + +

    +

    +
    Variable: fix_srcfile_path +
    +Expression to fix the shell variable $srcfile for the compiler. +
    + + +

    +

    +
    Variable: global_symbol_pipe +
    +A pipeline that takes the output of NM, and produces a listing of +raw symbols followed by their C names. For example: + + + +
    +$ eval "$NM progname | $global_symbol_pipe"
    +D symbol1 C-symbol1
    +T symbol2 C-symbol2
    +C symbol3 C-symbol3
    +...
    +$
    +
    + +

    +The first column contains the symbol type (used to tell data from code +on some platforms), but its meaning is system dependent. +

    + + +

    +

    +
    Variable: global_symbol_to_cdecl +
    +A pipeline that translates the output of global_symbol_pipe into +proper C declarations. On platforms whose linkers differentiate code +from data, such as HP/UX, data symbols will be declared as such, and +code symbols will be declared as functions. On platforms that don't +care, everything is assumed to be data. +
    + + +

    +

    +
    Variable: hardcode_action +
    +Either `immediate' or `relink', depending on whether shared +library paths can be hardcoded into executables before they are installed, +or if they need to be relinked. +
    + + +

    +

    +
    Variable: hardcode_direct +
    +Set to `yes' or `no', depending on whether the linker +hardcodes directories if a library is directly specified on the command +line (such as `dir/libname.a') when +hardcode_libdir_flag_spec is specified. +
    + + +

    +

    +
    Variable: hardcode_into_libs +
    +Whether the platform supports hardcoding of run-paths into libraries. +If enabled, linking of programs will be much simpler but libraries will +need to be relinked during installation. Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: hardcode_libdir_flag_spec +
    +Flag to hardcode a libdir variable into a binary, so that the +dynamic linker searches libdir for shared libraries at runtime. +If it is empty, libtool will try to use some other hardcoding mechanism. +
    + + +

    +

    +
    Variable: hardcode_libdir_separator +
    +If the compiler only accepts a single hardcode_libdir_flag, then +this variable contains the string that should separate multiple +arguments to that flag. +
    + + +

    +

    +
    Variable: hardcode_minus_L +
    +Set to `yes' or `no', depending on whether the linker +hardcodes directories specified by `-L' flags into the resulting +executable when hardcode_libdir_flag_spec is specified. +
    + + +

    +

    +
    Variable: hardcode_shlibpath_var +
    +Set to `yes' or `no', depending on whether the linker +hardcodes directories by writing the contents of `$shlibpath_var' +into the resulting executable when hardcode_libdir_flag_spec is +specified. Set to `unsupported' if directories specified by +`$shlibpath_var' are searched at run time, but not at link time. +
    + + +

    +

    +
    Variable: host +
    +
    Variable: host_alias +
    +For information purposes, set to the specified and canonical names of +the system that libtool was configured for. +
    + + +

    +

    +
    Variable: include_expsyms +
    +List of symbols that must always be exported when using export_symbols. +
    + + +

    +

    +
    Variable: libext +
    +The standard old archive suffix (normally "a"). +
    + + +

    +

    +
    Variable: libname_spec +
    +The format of a library name prefix. On all Unix systems, static +libraries are called `libname.a', but on some systems (such +as OS/2 or MS-DOS), the library is just called `name.a'. +
    + + +

    +

    +
    Variable: library_names_spec +
    +A list of shared library names. The first is the name of the file, +the rest are symbolic links to the file. The name in the list is +the file name that the linker finds when given `-lname'. +
    + + +

    +

    +
    Variable: link_all_deplibs +
    +Whether libtool must link a program against all its dependency libraries. +Set to `yes' or `no'. Default is `unknown', which is +a synonym for `yes'. +
    + + +

    +

    +
    Variable: link_static_flag +
    +Linker flag (passed through the C compiler) used to prevent dynamic +linking. +
    + + +

    +

    +
    Variable: need_lib_prefix +
    +Whether libtool should automatically prefix module names with 'lib'. +Set to `yes' or `no'. By default, it is `unknown', which +means the same as `yes', but documents that we are not really sure +about it. +`yes' means that it is possible both to dlopen and to +link against a library without 'lib' prefix, +i.e. it requires hardcode_direct to be `yes'. +
    + + +

    +

    +
    Variable: need_version +
    +Whether versioning is required for libraries, i.e. whether the +dynamic linker requires a version suffix for all libraries. +Set to `yes' or `no'. By default, it is `unknown', which +means the same as `yes', but documents that we are not really sure +about it. +
    + + +

    +

    +
    Variable: need_locks +
    +Whether files must be locked to prevent conflicts when compiling +simultaneously. Set to `yes' or `no'. +
    + + +

    +

    +
    Variable: no_builtin_flag +
    +Compiler flag to disable builtin functions that conflict with declaring +external global symbols as char. +
    + + +

    +

    +
    Variable: no_undefined_flag +
    +The flag that is used by `archive_cmds' in order to declare that +there will be no unresolved symbols in the resulting shared library. +Empty, if no such flag is required. +
    + + +

    +

    +
    Variable: objdir +
    +The name of the directory that contains temporary libtool files. +
    + + +

    +

    +
    Variable: objext +
    +The standard object file suffix (normally "o"). +
    + + +

    +

    +
    Variable: pic_flag +
    +Any additional compiler flags for building library object files. +
    + + +

    +

    +
    Variable: postinstall_cmds +
    +
    Variable: old_postinstall_cmds +
    +Commands run after installing a shared or static library, respectively. +
    + + +

    +

    +
    Variable: postuninstall_cmds +
    +
    Variable: old_postuninstall_cmds +
    +Commands run after uninstalling a shared or static library, respectively. +
    + + +

    +

    +
    Variable: reload_cmds +
    +
    Variable: reload_flag +
    +Commands to create a reloadable object. +
    + + +

    +

    +
    Variable: runpath_var +
    +The environment variable that tells the linker which directories to +hardcode in the resulting executable. +
    + + +

    +

    +
    Variable: shlibpath_overrides_runpath +
    +Indicates whether it is possible to override the hard-coded library +search path of a program with an environment variable. If this is set +to no, libtool may have to create two copies of a program in the build +tree, one to be installed and one to be run in the build tree only. +When each of these copies is created depends on the value of +fast_install. The default value is `unknown', which is +equivalent to `no'. +
    + + +

    +

    +
    Variable: shlibpath_var +
    +The environment variable that tells the dynamic linker where to find +shared libraries. +
    + + +

    +

    +
    Variable: soname_spec +
    +The name coded into shared libraries, if different from the real name of +the file. +
    + + +

    +

    +
    Variable: striplib +
    +
    Variable: old_striplib +
    +Command to strip a shared (striplib) or static (old_striplib) +library, respectively. If these variables are empty, the strip flag +in the install mode will be ignored for libraries (see section Install mode). +
    + + +

    +

    +
    Variable: sys_lib_dlsearch_path_spec +
    +Expression to get the run-time system library search path. Directories +that appear in this list are never hard-coded into executables. +
    + + +

    +

    +
    Variable: sys_lib_search_path_spec +
    +Expression to get the compile-time system library search path. This +variable is used by libtool when it has to test whether a certain +library is shared or static. The directories listed in +shlibpath_var are automatically appended to this list, every time +libtool runs (i.e., not at configuration time), because some linkers use +this variable to extend the library search path. Linker switches such +as -L also augment the search path. +
    + + +

    +

    +
    Variable: thread_safe_flag_spec +
    +Linker flag (passed through the C compiler) used to generate thread-safe +libraries. +
    + + +

    +

    +
    Variable: version_type +
    +The library version numbering type. One of `libtool', +`freebsd-aout', `freebsd-elf', `irix', `linux', +`osf', `sunos', `windows', or `none'. +
    + + +

    +

    +
    Variable: whole_archive_flag_spec +
    +Compiler flag to generate shared objects from convenience archives. +
    + + +

    +

    +
    Variable: wl +
    +The C compiler flag that allows libtool to pass a flag directly to the +linker. Used as: ${wl}some-flag. +
    + + +

    +Variables ending in `_cmds' or `_eval' contain a +`~'-separated list of commands that are evaled one after +another. If any of the commands return a nonzero exit status, libtool +generally exits with an error message. + + +

    +Variables ending in `_spec' are evaled before being used by +libtool. + + + + +

    Cheap tricks

    + +

    +Here are a few tricks that you can use in order to make maintainership +easier: + + + +

    + +

    +The output of the final `libtool --version' command shows that the +ltmain.in script is being used directly. Now, modify +~/bin/libtool or /home/src/libtool/ltmain.in directly in +order to test new changes without having to rerun configure. + + + + +

    GNU Free Documentation License

    + +

    +Version 1.1, March 2000 + + + +

    +Copyright (C) 2000  Free Software Foundation, Inc.
    +    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    +Everyone is permitted to copy and distribute verbatim copies
    +of this license document, but changing it is not allowed.
    +
    + + + +

    Preamble

    + +

    +The purpose of this License is to make a manual, textbook, or other +written document "free" in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + + +

    +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + + +

    +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + + + +

    APPLICABILITY AND DEFINITIONS

    + +

    +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + + +

    +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + + +

    +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + + +

    +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + + +

    +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + + +

    +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + + +

    +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML designed for human modification. Opaque formats include +PostScript, PDF, proprietary formats that can be read and edited only +by proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML produced by some word processors for output +purposes only. + + +

    +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + + + + +

    VERBATIM COPYING

    + +

    +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + + +

    +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + + + +

    COPYING IN QUANTITY

    + +

    +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + + +

    +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + + +

    +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + + +

    +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + + + +

    MODIFICATIONS

    + +

    +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + + + +

      +
    1. + +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
    2. + + List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has less than five). + +
    3. + +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
    4. + + Preserve all the copyright notices of the Document. + +
    5. + +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
    6. + +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
    7. + +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +
    8. + +Include an unaltered copy of this License. + +
    9. + +Preserve the section entitled "History", and its title, and add to +it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section entitled "History" in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
    10. + +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the "History" section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
    11. + +In any section entitled "Acknowledgements" or "Dedications", +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgements +and/or dedications given therein. + +
    12. + +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
    13. + +Delete any section entitled "Endorsements". Such a section +may not be included in the Modified Version. + +
    14. + +Do not retitle any existing section as "Endorsements" +or to conflict in title with any Invariant Section. +
    + +

    +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + + +

    +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + + +

    +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + + +

    +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + + + +

    COMBINING DOCUMENTS

    + +

    +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + + +

    +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + + +

    +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgements", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + + + + +

    COLLECTIONS OF DOCUMENTS

    + +

    +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + + +

    +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + + + +

    AGGREGATION WITH INDEPENDENT WORKS

    + +

    +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + + +

    +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + + + + +

    TRANSLATION

    + +

    +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + + + + +

    TERMINATION

    + +

    +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + + + +

    FUTURE REVISIONS OF THIS LICENSE

    + +

    +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + + +

    +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + + + +

    ADDENDUM: How to use this License for your documents

    + +

    +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + + +

    +Copyright (c)  YEAR  YOUR NAME.
    +Permission is granted to copy, distribute and/or modify this document
    +under the terms of the GNU Free Documentation License, Version 1.1
    +or any later version published by the Free Software Foundation;
    +with the Invariant Sections being LIST THEIR TITLES, with the
    +Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
    +A copy of the license is included in the section entitled "GNU
    +Free Documentation License".
    +
    + +

    +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. + + +

    +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + + + + +

    Index

    + +

    +Jump to: +( +- +. +- +a +- +b +- +c +- +d +- +e +- +f +- +g +- +h +- +i +- +l +- +m +- +n +- +o +- +p +- +q +- +r +- +s +- +t +- +u +- +v +- +w +

    +

    (

    + +
  • (const char *loader_name) +
  • (lt_dlloader *place), (lt_dlloader *place), (lt_dlloader *place) +
  • (void), (void) +
  • +

    .

    + +
  • `.la' files +
  • `.libs' subdirectory +
  • `.lo' files +
  • +

    a

    + +
  • AC_CONFIG_AUX_DIR +
  • AC_DISABLE_FAST_INSTALL +
  • AC_DISABLE_SHARED +
  • AC_DISABLE_STATIC +
  • AC_FUNC_ALLOCA +
  • AC_LIBTOOL_DLOPEN +
  • AC_LIBTOOL_WIN32_DLL +
  • AC_PROG_LIBTOOL +
  • AC_REPLACE_FUNCS +
  • aclocal +
  • allow_undefined_flag +
  • always_export_symbols +
  • AM_DISABLE_SHARED +
  • AM_DISABLE_STATIC +
  • AM_PROG_LIBTOOL +
  • application-level dynamic linking, application-level dynamic linking +
  • ar +
  • AR +
  • archive_cmds +
  • archive_expsym_cmds +
  • AS +
  • assign.test +
  • avoiding shared libraries +
  • +

    b

    + +
  • bug reports +
  • buggy system linkers +
  • bugs, subtle ones caused by buggy linkers +
  • build-relink.test +
  • build_libtool_libs +
  • build_old_libs +
  • +

    c

    + +
  • C header files, portable +
  • C++, pitfalls +
  • C++, using +
  • C, not using +
  • CC, CC +
  • cdemo-conf.test +
  • cdemo-exec.test +
  • cdemo-make.test +
  • cdemo-shared.test +
  • cdemo-static.test +
  • CFLAGS +
  • clean mode +
  • command options, libtool +
  • command options, libtoolize +
  • compile mode +
  • compiler_c_o +
  • compiler_o_lo +
  • compiling object files +
  • complexity of library systems +
  • config.guess +
  • config.sub +
  • configuring libtool +
  • convenience libraries +
  • CPPFLAGS +
  • +

    d

    + +
  • debugging libraries +
  • definition of libraries +
  • demo-conf.test +
  • demo-exec.test +
  • demo-inst.test +
  • demo-make.test +
  • demo-nofast.test +
  • demo-nopic.test +
  • demo-pic.test +
  • demo-shared.test +
  • demo-static.test +
  • demo-unst.test +
  • depdemo-conf.test +
  • depdemo-exec.test +
  • depdemo-inst.test +
  • depdemo-make.test +
  • depdemo-nofast.test +
  • depdemo-shared.test +
  • depdemo-static.test +
  • depdemo-unst.test +
  • dependencies between libraries +
  • dependency versioning +
  • deplibs.test +
  • deplibs_check_method +
  • design issues +
  • design of library interfaces +
  • design philosophy +
  • developing libraries +
  • dlclose, dlclose +
  • dlerror +
  • DLLTOOL +
  • dlopen, dlopen +
  • dlopen_self +
  • dlopen_self_static +
  • dlopen_support +
  • dlopening modules, dlopening modules +
  • dlopening, pitfalls +
  • dlsym, dlsym +
  • double-compilation, avoiding +
  • dryrun.test +
  • dynamic dependencies +
  • dynamic linking, applications, dynamic linking, applications +
  • dynamic modules, names +
  • +

    e

    + +
  • echo +
  • eliding shared libraries +
  • examples of using libtool +
  • exclude_expsyms +
  • execute mode +
  • export_dynamic_flag_spec +
  • export_symbols_cmds +
  • extract_expsyms_cmds +
  • +

    f

    + +
  • failed tests +
  • fast_install +
  • file_magic +
  • file_magic_cmd +
  • file_magic_test_file +
  • finish mode +
  • finish_cmds +
  • finish_eval +
  • fix_srcfile_path +
  • formal versioning +
  • +

    g

    + +
  • global functions +
  • global_symbol_pipe +
  • global_symbol_to_cdecl +
  • +

    h

    + +
  • hardcode.test +
  • hardcode_action +
  • hardcode_direct +
  • hardcode_into_libs +
  • hardcode_libdir_flag_spec +
  • hardcode_libdir_separator +
  • hardcode_minus_L +
  • hardcode_shlibpath_var +
  • header files +
  • host +
  • host_alias +
  • +

    i

    + +
  • implementation of libtool +
  • include files, portable +
  • include_expsyms +
  • install +
  • install mode +
  • installation, finishing +
  • inter-library dependencies +
  • inter-library dependency +
  • +

    l

    + +
  • languages, non-C +
  • LD, LD +
  • LDFLAGS +
  • libext +
  • libltdl +
  • libname_spec +
  • libraries, definition of +
  • libraries, finishing installation +
  • libraries, stripping +
  • library interfaces +
  • library interfaces, design +
  • library object file +
  • library_names_spec +
  • LIBS +
  • libtool +
  • libtool command options +
  • libtool examples +
  • libtool implementation +
  • libtool libraries +
  • libtool library versions +
  • libtool specifications +
  • libtoolize +
  • libtoolize command options +
  • link mode +
  • link-2.test +
  • link.test +
  • link_all_deplibs +
  • link_static_flag +
  • linking against installed libraries +
  • linking against uninstalled libraries +
  • linking with installed libtool libraries +
  • linking, partial +
  • LN_S +
  • lt_dladderror +
  • lt_dladdsearchdir +
  • lt_dlcaller_get_data +
  • lt_dlcaller_id +
  • lt_dlcaller_register +
  • lt_dlcaller_set_data +
  • lt_dlclose +
  • lt_dlexit +
  • lt_dlforeach +
  • lt_dlfree +
  • lt_dlgetinfo +
  • lt_dlhandle +
  • lt_dlhandle_next +
  • lt_dlinfo +
  • lt_dlinit +
  • lt_dlisresident +
  • lt_dlloader +
  • lt_dlloader_add +
  • lt_dlloader_data +
  • lt_dlloader_exit +
  • lt_dlloader_remove +
  • lt_dlmakeresident +
  • lt_dlmalloc +
  • lt_dlmutex_geterror +
  • lt_dlmutex_lock +
  • lt_dlmutex_register +
  • lt_dlmutex_seterror +
  • lt_dlmutex_unlock +
  • lt_dlopen +
  • lt_dlopenext +
  • lt_dlpreload +
  • lt_dlpreload_default +
  • lt_dlseterror +
  • lt_dlsetsearchpath +
  • lt_dlsym +
  • lt_dlsymlist, lt_dlsymlist +
  • lt_find_sym +
  • lt_module +
  • lt_module_close +
  • lt_module_open +
  • lt_preloaded_symbols +
  • lt_ptr +
  • lt_user_dlloader +
  • LTALLOCA +
  • LTDL_SET_PRELOADED_SYMBOLS() +
  • LTLIBOBJS +
  • LTLIBRARIES +
  • ltmain.sh +
  • +

    m

    + +
  • Makefile +
  • Makefile.am +
  • Makefile.in +
  • mdemo-conf.test +
  • mdemo-exec.test +
  • mdemo-inst.test +
  • mdemo-make.test +
  • mdemo-shared.test +
  • mdemo-static.test +
  • mdemo-unst.test +
  • mode, clean +
  • mode, compile +
  • mode, execute +
  • mode, finish +
  • mode, install +
  • mode, link +
  • mode, uninstall +
  • modules, dynamic, modules, dynamic +
  • motivation for writing libtool +
  • +

    n

    + +
  • names of dynamic modules +
  • need_lib_prefix +
  • need_locks +
  • need_version +
  • NM, NM +
  • no_builtin_flag +
  • no_undefined_flag +
  • noinst-link.test +
  • nomode.test +
  • none +
  • +

    o

    + +
  • objdir +
  • OBJDUMP +
  • object files, compiling +
  • object files, library +
  • objext +
  • old_archive_cmds +
  • old_archive_from_expsyms_cmds +
  • old_archive_from_new_cmds +
  • old_postinstall_cmds +
  • old_postuninstall_cmds +
  • old_striplib +
  • opaque data types +
  • options, libtool command +
  • options, libtoolize command +
  • other implementations, flaws in +
  • +

    p

    + +
  • partial linking +
  • pass_all +
  • PIC (position-independent code) +
  • pic_flag +
  • pitfalls using C++ +
  • pitfalls with dlopen +
  • portable C headers +
  • position-independent code +
  • postinstall_cmds +
  • postinstallation +
  • postuninstall_cmds +
  • problem reports +
  • problems, blaming somebody else for +
  • problems, solving +
  • program wrapper scripts +
  • +

    q

    + +
  • quote.test +
  • +

    r

    + +
  • RANLIB, RANLIB +
  • ranlib +
  • reload_cmds +
  • reload_flag +
  • renaming interface functions +
  • reporting bugs +
  • reusability of library systems +
  • runpath_var +
  • +

    s

    + +
  • saving time +
  • security problems with buggy linkers +
  • sh.test +
  • shared libraries, not using +
  • shared library versions +
  • shl_load, shl_load +
  • shlibpath_overrides_runpath +
  • shlibpath_var +
  • solving problems +
  • soname_spec +
  • specifications for libtool +
  • standalone binaries +
  • static linking +
  • strip +
  • striplib +
  • stripping libraries +
  • su +
  • suffix.test +
  • sys_lib_dlsearch_path_spec +
  • sys_lib_search_path_spec +
  • +

    t

    + +
  • test suite +
  • test_compile +
  • tests, failed +
  • thread_safe_flag_spec +
  • time, saving +
  • tricky design issues +
  • trouble with C++ +
  • trouble with dlopen +
  • troubleshooting +
  • +

    u

    + +
  • undefined symbols, allowing +
  • uninstall mode +
  • unknown +
  • unresolved symbols, allowing +
  • using shared libraries, not +
  • +

    v

    + +
  • version_type +
  • versioning, formal +
  • +

    w

    + +
  • whole_archive_flag_spec +
  • wl +
  • wrapper scripts for programs +
  • + + +


    +This document was generated on 10 July 2002 using +texi2html 1.56k. + + Index: ossp-adm/autotools/shtool.html RCS File: /v/ossp/cvs/ossp-adm/autotools/shtool.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/shtool.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/shtool.html' 2>/dev/null --- ossp-adm/autotools/shtool.html +++ - 2025-04-19 11:54:39.082658926 +0200 @@ -0,0 +1,856 @@ + + +shtool> - The GNU Portable Shell Tool + + + + + + + + +

    + + +
    +

    +


    +

    NAME

    +

    GNU shtool - The GNU Portable Shell Tool

    +

    +


    +

    VERSION

    +

    GNU shtool SHTOOL_VERSION_STR

    +

    +


    +

    SYNOPSIS

    +

    shtool +[ global_options ] +command +[ command_options ] +[ command_args ]

    +

    +


    +

    DESCRIPTION

    +

    GNU shtool is a compilation of small but very stable and portable shell +scripts into a single shell tool. All ingredients were in successful use over +many years in various free software projects. The compiled shtool script is +intended to be used inside the source tree of those free software packages. +There it can take over various (usually non-portable) tasks related to the +building and installation of such packages.

    +

    +

    Context Background

    +

    For the configuration, build and installation environment of modern free +software packages one nowadays uses GNU autoconf and friends (i.e. +usually autoconf, automake and libtool). Autoconf covers the +configuration, automake covers the generation of the build environment and +libtool covers most of a libraries build process. But at least when it +comes to the installation step one usually have to use a few auxiliary scripts +like mkdir.sh, install.sh, etc. These scripts are usually replacements +for system tools and are required mainly for portability reasons. The result +is usually an etc/ subdirectory in the source tree where over time a +lot shell scripts accumulate.

    +

    +

    Maintainance Problem

    +

    The problem with those etc/ shell scripts starts if one has to maintain +lots of free software packages as it's the case for the author of shtool. +Then over time all etc/ directories diverge and with every day it gets more +and more nasty to always keep them in sync. Especially if some scripts +were locally adjusted because no centralized maintainance location exists, of +course. For autoconf no such problem exists, because the resulting +configure script is generated on-the-fly. The same applies to automake +and the various Makefile.in files.

    +

    Only for libtool one always has to grab the latest copy. But because it's +just two files (ltmain.sh and ltconfig), keeping a source trees in sync +is not too complicated (especially not if using the handy libtoolize +program). But the etc/ shell script mess is nasty, especially because there +is no master version on the net. Additionally everytime one starts a new +project, one has to establish a new source tree. For a GNU hacker it's +immediately clear that autoconf and friends are part of the game. But which +etc/ shell scripts are needed this time? And from which existing source +tree to copy them from? Hmmm... the same procedure as last year?!

    +

    +

    The Aesthetic Problem

    +

    When a free software package has a large source tree (say, more than 50 files +and especially with one or more subdirectories) it's usually no problem to +have an additional etc/ subdirectory with some scripts. They then totally +go down. But for smaller packages, especially those living in a single source +directory (a degenerated tree), some people (like the author of shtool) +have aesthetic problems. Because it looks strange to them that 20% of the +files in the source tree are just auxiliary scripts. Sure, the actual amount +of script code even shtool cannot reduce, but shtool merges them +together into a single file and this way they optically totally disappear from +the source tree.

    +

    This is a pure aesthetical issue, of course. But keep in mind that hacking is +a piece of art. And a well layouted source tree is a piece of art for real +hackers, too. Oh, and for those who really insist on a technical reason: it's +also easier to upgrade a single file than multiple files ;)

    +

    +

    Filling the gap

    +

    So, wouldn't it be nice to have a fourth package (beside autoconf, +automake and libtool) which fills the gap, i.e. which provides the +functionality of the old files in etc/, is maintained at a centralized +location and even consists of just a single (perhaps large) script one can +threat as a black box the same way one already does this for libtool? The +author thought this would be actually very useful and the result is the +current GNU shtool package which at least successfully solved the above +problems of the author.

    +

    +

    The goals in detail

    +

    To better understand the intentions behind shtool and to avoid confusion, +here are the original goals of the shtool script:

    +
      +
    1. 1. It has to be self-contained and reside in a single file
      + +This was achieved by compiling the resulting shtool script out of the +ingredient source scripts. The advantage is that shtool is still easily +maintainable, because one can test each script separately. But the final +functionality then resides in an all-in-one script which can be easily spread +over multiple source trees. +

      +
    2. 2. It has to cover all functionality of the old scripts
      + +This was achieved by (re)implementing really all functionality which +experience showed is important in source trees of typical free software +packages. +

      +
    3. 3. It has to be maximum portable over all Unix flavors
      + +This was achieved by basing the ingredient shell scripts only on well-proven +code which already survived practice in other projects over more than a few +months. Especially this means that a lot of complicated emulations are done to +avoid the use of unportable Unix programs (like fmt, tr, etc) or +unportable features of well-known Unix programs (like shell functions, special +sed features, etc. pp). That's why shtool's code sometimes looks crazy +and like overkill to you. Don't think this is because of the authors +crazyness. Instead it's most of the time mainly for portability reasons. +

      +
    4. 4. It has to be clean and fully documented
      + +This was achieved by reimplementing too ugly functionality from scratch and +cleaning up old shell script code plus writing this complete manual page. +

      +
    5. 5. It has to stay under a reasonable and common license
      + +This was achieved by placing the shtool package under the GNU General +Public License (GPL). This way the shtool package itself is well protected +and is guarrantied to be kept free software, but the resulting shtool +script can be nevertheless used in all types of source trees. Notice +here: given that one includes GNU shtool verbatim into an own source tree, +one is justified in saying that it remains separate from the own package, and +that this way one is simply just using shtool. So, in this situation, +there is no requirement that the package itself is licensed under the GNU +General Public License in order to take advantage of shtool. Keep this in +mind ;) +

      +
    6. 6. It has to be modularized for flexibility reasons
      + +This was achieved by using an auxiliary tool shtoolize(1) which can be used to +build individual shtool scripts out of the ingredient shell scripts. This +way if one don't need all the available functionality one can assemble +together an individual shtool script. +

    +

    +


    +

    GLOBAL OPTIONS

    +

    The following global options are available for shtool. Any commands +are ignored if one of them is present on the shtool command line.

    +
    +
    -h, --help
    +
    +Displays a short help page describing the usage of shtool and it's +ingredient commands in a compact way. +

    +
    -v, --version
    +
    +Displays the version number of shtool. +

    +
    -d, --debug
    +
    +Displays shell trace messages for debugging purposes. +

    +
    -r, --recreate
    +
    +Recreate the shtool script with its own individual shtoolize(1) call. +

    +

    +


    +

    COMMANDS

    +

    The following commands are provided by shtool. They are all called via +``shtool command''. Any trailing command_options are specific to the +particular command. They are listed (here and also below) sorted by topic, +i.e. related commands are listed side-by-side.

    +
    +
    echo
    +
    +echo(1) style print command providing special expansion constructs (terminal +bold mode, environment details, date) and newline control. +

    +
    mdate
    +
    +Pretty-prints the last modification time of a file or directory. +

    +
    table
    +
    +Pretty-prints a field-separately list as a table. +

    +
    prop
    +
    +Display a processing indication though a running propeller. +

    +
    move
    +
    +mv(1) style command, but can rename/move multiple files at once and allows +source files just to be deleted if contents didn't change. +

    +
    install
    +
    +Install a program, script or datafile in a portable way. +

    +
    mkdir
    +
    +mkdir(1) style command providing support for auto-parent-dir creation, +directory permission control and smart skipping if directory already +exists. +

    +
    mkln
    +
    +ln(1) style command providing automatic calculation and usage of relative +links if possible. +

    +
    mkshadow
    +
    +Create a shadow source tree by the help of symbolic links. +

    +
    fixperm
    +
    +Fix file permissions inside a source tree by cleaning up the permission bits. +

    +
    rotate
    +
    +Rotate a logfile. +

    +
    tarball
    +
    +Roll standardized distribution tarballs. +

    +
    subst
    +
    +Apply sed(1) substitution operations. +

    +
    guessos
    +
    +Simple operating system and platform architecture guesser which +determines a GNU platform-triple style identification string. +

    +
    arx
    +
    +Extended archive command which can even put existing archives into an archive. +

    +
    slo
    +
    +Separate linker options by library class. +

    +
    scpp
    +
    +An additional C source file pre-processor for sharing cpp(1) code, internal +variables and internal functions. +

    +
    version
    +
    +Maintain a version information file in either Text, C/C++, Perl or Python. +format. +

    +
    path
    +
    +Deal with shell path variables. +

    +

    +


    +

    COMMAND DESCRIPTION

    +

    In the following the available commands and their corresponding +command_options are described in detail.

    +
    +
    echo [-n|--newline] [-e|--expand] str
    +
    +This is an echo(1) style print command which provides special expansion +constructs (terminal bold mode, environment details, date) and newline +control. Per default string is written to stdout followed by a newline +character (``\n''). When option ``-n'' is used this newline character is +left out. +

    The str can contain special ``%x'' constructs which which +are expanded before the output is written if option ``-e'' is +used. Currently the following constructs are recognized: ``%B'' +for switching to terminal bold mode, ``%b'' for switching terminal +mode back to normal display mode, ``%u'' for the current user name, +``%U'' for the current user id (numerical), ``%g'' for the current +group name, ``%G'' for the current group id (numerical), ``%h'' +for the current hostname, ``%d'' for the current domain name, +``%D'' for the current day of the month, ``%M'' for the current +month (numerical), ``%m'' for the current month name and ``%Y'' +for the current year.

    +

    The trick of this command is that it provides a portable ``-n'' option and +hides the gory details needed to find out the environment details.

    +

    Examples:

    +
    + #   shell script
    + shtool echo -n -e "Enter your name [%B%u%b]: "; read name
    + shtool echo -e "Your Email address might be %u@%h%d"
    + shtool echo -e "The current date is %D-%m-%Y"
    +

    +
    mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep str] [-o|--order spec] path
    +
    +This command pretty-prints the last modification time of a file or directory +path. Option ``-n'' suppresses the output of a trailing newline +character, option ``-z'' pads numeric day (and optionally month) with a +leading zero, option ``-s'' shortens the months name to an abbreviation of +three characters, option ``-d'' replaces the month name with the +corresponding digits, option ``-f'' uses str as the field separator +(default is a single space character) and option ``-o'' specified the order +in which the fields are printed. +

    The default for spec is ``dmy'' which means an output of ``<day> <month> +<year>''. Any combination of the chars ``d'', ``m'' and ``y'' or +allowed for spec.

    +

    The trick of this command is that it provides a portable way to find out the +date of a file or directory while still allowing one to specify the format of +the date display.

    +

    Examples:

    +
    + #   shell script
    + shtool mdate -n /
    + shtool mdate -f '/' -z -d -o ymd foo.txt
    + shtool mdate -f '-' -s foo.txt
    +

    +
    table [-F|--field-sep sep] [-w|--width width] [-c|--columns cols] [-s|--strip strip] strsepstr...
    +
    +This pretty-prints a sep-separated list of strings as a table. Per +default a colon-separated list (sep=``:'') is pretty printed as a +three-column (<cols>=3) table no longer than 79 chars (strip=79) is +generated where each column is 15 characters wide (width=15). +

    The trick of this command is that it avoids to use the unportable tr(1) and +fmt(1) commands and instead is based entirely on sh(1), awk(1) and sed(1) +functionality.

    +

    Example:

    +
    + #   shell script
    + shtool table -F , -w 5 -c 4 "1,2,3,4,5,6,7,8,9,10,11,12"
    +

    +
    prop [-p|--prefix str]
    +
    +This command displays a processing indication though a running propeller. The +option ``-p'' can be used to set a particular prefix str which is +displayed in front of the propeller. The default is no prefix string, i.e. the +propeller is at the left border of the terminal. This command is intended to +be run at the end of a pipe (``|'') sequence where on stdin +logging/processing informations found. For every line on stdin the +propeller cycles one step clock-wise. +

    The trick of this command is that it provides a portable and easy to use way +to display such nice and psychologically important process indicators.

    +

    Example:

    +
    + #   shell script
    + configure 2>&1 |\
    +     tee logfile |\
    +     shtool prop -p "Configuring sources"
    +

    +
    move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] src-file dst-file
    +
    +This is a mv(1) style command, but with two special features: First if +option ``-e'' (`expand') is used and an asterisk occurs somewhere in src +one can use ``%n'' (where n is 1,2,...) in dst-file. This is +useful for renaming multiple files at once. Second, if option ``-p'' +(for `preserve') is used and src-file and dst-file are byte-wise the +same it just deletes src-file. The intention is that the permissions and +time stamps on dst aren't changed which is important if dst-file is +used in conjunction with Makefiles. Option ``-v'' (verbose) can be used to +enable the output of extra processing information. Option ``-t'' (trace) +can be used to enable the output of the essential shell commands which are +executed. +

    The trick of this command is that it can rename multiple files at once and +preserves the timestamps if the contents isn't changed.

    +

    Examples:

    +
    + #   shell script
    + shtool move -v -e '*.txt' %1.asc
    +
    + #   Makefile
    + scanner.c: scanner.l
    +     lex scanner.l
    +     shtool move -t -p lex.yy.c scanner.c
    +

    +
    install [-v|--verbose] [-t|--trace] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode mode] [-o|--owner owner] [-g|--group group] [-e|--exec sed-cmd] file path
    +
    +This command installs a program, script or datafile (dependent on mode) in +a portable way while providing all important options of the BSD install(1) +command. Per default file is moved to the target path, but with option +``-c'' file is copied. The target file is created with owner/group set +to the current active uid/gid, but if this script is called as root (uid 0) +the options ``-o'' and ``-g'' can be used to override this. +

    Additionally program executables is stripped with strip(1) after +installation if option ``-s'' is used. Option ``-C'' is like +``-c'', except if the destination file already exists and the files +are the same, the source is just removed. Option ``-e'' can be used +one or multiple times to apply one or more sed(1) commands on-the-fly +to the contents of the input file before the output file is created. +Option ``-v'' (verbose) can be used to enable the output of extra +processing information. Option ``-t'' (trace) can be used to enable +the output of the essential shell commands which are executed.

    +

    The trick of this command is that it provides the functionality of BSD +install(1) in a portable emulated way.

    +

    Example:

    +
    + #   Makefile
    + install:
    +      :
    +     shtool install -c -s -m 4755 foo $(bindir)/
    +     shtool install -c -m 644 foo.man $(mandir)/man1/foo.1
    +     shtool install -c -m 644 -e "s/@p@/$prefix/g" foo.conf $(etcdir)/
    +

    +
    mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode mode] dir [dir ...]
    +
    +This is a mkdir(1) style command providing support for automatic parent +directory creation (if option ``-p'' is used), directory permission +control (with option ``-m mode'' where mode can be in any of +the formats specified to the chmod(1) command) and smart skipping if +dir already exists (triggered by the force option ``-f''). Option +``-t'' (trace) can be used to enable the output of the essential +shell commands which are executed. +

    The trick of this command is that it provides both a portable ``-p'' +functionality and the ability to be smart if the directory already exists +which is important for installation procedures.

    +

    Example:

    +
    + #   Makefile
    + install:
    +     shtool mkdir -f -p -m 755 $(bindir)
    +     shtool mkdir -f -p -m 755 $(mandir)/man1
    +      :
    +

    +
    mkln [-t|--trace] [-f|--force] [-s|--symbolic] src-path [src-path ...] dst-path
    +
    +This is a ln(1) style command which provides automatic calculation and usage +of relative links if possible, i.e. usually if src-path and dst-path +are not absolute paths or at least they share a common prefix except the root +directory (``/''). When more than one src-path is specified, all of them +are linked into dst-path. Options ``-f'' and ``-s'' are similar to +ln(1), i.e. they force the creation of the link (even if it exists) and +create a symbolic link instead of a hard-link. Option ``-t'' (trace) can +be used to enable the output of the essential ``ln'' command which is +executed. +

    The trick of this command is that it tried hard to calculate the paths to get +the maximum possible relative paths.

    +

    Example:

    +
    + #   shell script
    + shtool mkln -s foo/bar baz/quux
    +

    +
    mkshadow [-v|--verbose] [-t|--trace] [-a|--all] src-dir dst-dir
    +
    +This command creates a shadow tree of src-dir under dst-dir by +recreating the directory hierarchy of src-dir under dst-dir and by +creating the files of src-dir by linking them into the corresponding +directories under dst-dir via symbolic links. When src-dir can be +reached via relative paths from dst-dir, relative symbolic links are used, +too. +

    Option ``-v'' (verbose) can be used to enable some displaying of processing +information. Option ``-t'' (trace) can be used to display all commands +which are executed in order to construct dst-dir. Option ``-a'' (all) +can be used to really shadow all files and directories in src-dir. Per +default CVS related files and directories, backup files, object files, etc. +are not shadowed.

    +

    The trick of this is that is provides such a high-level functionality with a +single command and hides all gory details.

    +

    Example:

    +
    + #   shell script
    + shtool mkshadow -v -a . /tmp/shadow
    +

    +
    fixperm [-v|--verbose] [-t|--trace] path [ path ... ]
    +
    +This command fixes file permissions inside a source tree under path by +cleaning up the permission bits. It determines the cleaned up permission from +the already set bits. It's intended to be run before a tarball is rolled out +of the source tree. Option ``-v'' can be used to display some processing +information. Option ``-t'' (trace) can be used to enable the output of the +essential shell commands which are executed. +

    The trick is that this is more convenient that having to set the permissions +manually or with a large file list.

    +

    Example:

    +
    +  #   Makefile.in
    +  dist:
    +      shtool fixperm -v *
    +      ...
    +

    +
    rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files count] [-s|--min-size size] [-c|--copy] [-r|--remove] [-a|--archive-dir dir] [-z|--compress [tool:]level] [-b|--background] [-d|--delay] [-p|--pad len] [-o|--owner owner] [-g|--group group] [-m|--mode mode] [-M|--migrate cmd] [-P|--prolog cmd] [-E|--epilog cmd] file [...]
    +
    +This command rotates a logfile file by subsequently creating up to +count (optionally compressed) archive files of it. Archive files are +named ``file.number[compress-suffix]'' where number is the +version number, 0 being the newest and ``count-1'' the oldest. +

    A rotation step consists of the following steps: 1. remove archive file +number count-1; 2. move archive file number N-1 to N for N +counting from 1 to count-1; 3. move file to archive file number 0; +4. creating a new and empty instance of file.

    +

    Option ``-s'' can be used to only start a rotation step if file is +at least size bytes long. The argument size can be specified also +with the trailing units K (kilo), M (mega) or G (giga).

    +

    Option ``-c'' changes the approach of moving file to archive file +number 0: instead of a move followed by the creation of a new file, a +copy is performed followed by a truncation of file. The difference is +that in the first case (the default), if an application has file +still opened, after the rotation step it will have archive file number +0 opened and usually has to reopen the new file, while in the second +case the application can keep its open file handles to file. The +drawback of the second approach is that logfile entries are lost when +they are written to file between the execution of the copy and the +subsequent truncation operation.

    +

    Option ``-r'' removes file after rotation instead of providing a +new empty file. Option ``-a'' forces archive files to be created in +the separate directory dir.

    +

    Option ``-z'' enables compression of archive files with compression +level level (if option ``-b'' is present, compression takes place in +background). By default, the tools bzip2(1), gzip(1) and compress(1) are +searched for in $PATH (in this order), but one also can override this +by prefixing the compression level with one of the three particular tool +names. Option ``-d'' delays the compression of archive file number 0. +This is useful if option ``-c'' is not used, because an application +might still write to archive file 0 (through an open file handle).

    +

    Option ``-p'' enables padding with leading zeros in the number +part of the filename ``file.numbercompress-suffix''. The default +padding len is 1. This is interesting if more than 10 archive files +are used, because it leads to still sorted directory listings.

    +

    Options ``-o'', ``-g'' and ``-m'' can be used to make sure that +the created files have particular file attributes. The valid arguments +are the same as for chown(1), chgrp(1) and chmod(1). Be aware that using +options ``-o'' and ``-g'' require root privileges.

    +

    Option ``-M'' allows one to execute a ``migration'' command just before +the archive file number count-1 is removed from the filesystem. The +specified cmd gets the archive filename as an argument appended. +Options ``-P'' (prolog) and ``-E'' (epilog) can be used to execute +commands before and after the rotation step. They are interesting in +conjunction with option ``-s'', because they are not executed at all +if it is decided that no rotation step is performed.

    +

    Option ``-f'' (force) can be used to allow the archive directory +(option ``-a'') to be silently created if it still does not exist and +that still not existing intermediate logfiles are silently skipped in +the rotation step.

    +

    Option ``-v'' (verbose) can be used to display the files which are +rotated. Option ``-t'' (trace) can be used to enable the output of +the essential shell commands which are executed for the rotation step.

    +

    Example:

    +
    +  #   shell script
    +  shtool rotate -n10 -s1M -zbzip2:9 -d -r /var/log/ap.access.log
    +  shtool rotate -n5 -s128K -zbzip2:9 -d -r /var/log/ap.error.log
    +  apachectl graceful
    +

    +
    tarball [-t|--trace] [-v|--verbose] [-o|--output tarball] [-c|--compress prog] [-u|--user user] [-g|--group group] [-e|--exclude pattern] path [path ...]
    +
    +This command is for `rolling' distribution `tarballs', i.e. for the creation +of distribution files generated by `tar'. The important aspects of +standardized free software tarballs are: first they have to unpack into a +single top-level directory; second this top-level directory should correspond +to the tarball filename (i.e. a tarball `foobar-0.8.15.tar' per convention +unpacks into a top-level directory `foobar-0.8.15/'); third the files in +the tarball should be sorted to allow users to use the `tar tvf -' command +in a reasonable way; fourth the owner and group of the files in the tarball +for security reasons can be set to arbitrary names. +

    The input files are given by the file or directory arguments path. +Directories are expanded before the comma-separated exclude (option -e) +patterns (grep regular expressions) are used to filter the list. The +default filter is ``CVS,\\.cvsignore,\\.[oa]\$''. Then the tarball is +created with its files owned by user (option -u) and group (option +-g). Finally the resulting tarball is piped through an optional compression +(option -c) program and written to the output file tarball (option +-o). Option ``-v'' can be used to display the files which are stored in +the tarball. Option ``-t'' (trace) can be used to enable the output of the +essential shell commands which are executed.

    +

    The trick of this command is that it combines the complex process of rolling a +good tarball into a single command.

    +

    Example:

    +
    +  #   Makefile.in
    +  dist:
    +      ...
    +      V=`shtool version -d short ...'; \
    +      shtool tarball -o foobar-$$V.tar.gz -c 'gzip -9' \
    +                     -u bar -g gnu -e 'CVS,\.cvsignore' .
    +

    +
    subst [-v|--verbose] [-t|--trace] [-n|--nop] [-s|--stealth] [-i|--interactive] [-b|--backup ext] [-e|--exec cmd] [-f|--file cmd-file] [file] [file ...]
    +
    +This command applies one or more sed(1) substitution operations to +stdin or any number of files. The sed(1) operations are either +specified on the command line with option ``-e'' or are contained +in a file cmd-file and are specified with option ``-f''. The +original untouched file is usually overridden. If option ``-b'' +is given and specifies a file extension, the original file is preserved +as ``file.ext''. If option ``-s'' (stealth) is specified, +the timestamp is preserved on file, too. Option ``-i'' enables +interactive mode where the user has to approve each operation. Option +``-n'' (no operation) can be used to disable the actual execution of +the essential shell commands which would be executed. Option ``-t'' +(trace) can be used to enable the output of the essential shell commands +which are executed. Option ``-v'' (verbose) can be used to display +the files which are patched. +

    Example:

    +
    +  #    interactive shell
    +  shtool subst -i -e 's;(c) \([0-9]*\)-2000;(c) \1-2001;' *.[ch]
    +
    +  #    RPM spec-file
    +  %install
    +      shtool subst -v -n \
    +          -e 's;^\(prefix=\).*;\1 $RPM_BUILD_ROOT%{_prefix};g' \
    +          -e 's;^\(sysconfdir=\).*;\1 $RPM_BUILD_ROOT%{_prefix}/etc;g' \
    +          `find . -name Makefile -print`
    +      make install
    +

    +
    guessos
    +
    +This command is a simple operating system and platform architecture guesser +which determines a so-called ``GNU platform-triple'' style identification +string ``arch-hardware-ososversion''. For instance a FreeBSD 3.1 +running on a Pentium II is identified as ``i686-pc-freebsd3.1''. When you +need a more sophisticated platform guesser, use the GNU +config.guess/config.sub scripts, please. +
    + #   configure.in
    + OS=`shtool guessos`
    +

    +
    arx [-t|--trace] [-C|--command cmd] op archive file [file ...]
    +
    +This is a wrapper around the archive (``ar'') tool. It provides the ability +to create archives out of existing archives, i.e. if one of file matches +``*.a'' the archive member files of file are used instead of file +itself. When option ``-t'' (trace) is given arx shows the actually +involved shell commands. Option ``-C'' can be used to set the ``ar'' +command to cmd. +

    The trick of this command is the automatic handling of archive members which +is especially interesting if one wants to construct a (usually top-level) +library archive out of pre-build sub-library archives (usually staying inside +subdirs) in a large source tree.

    +

    Example:

    +
    + #   Makefile
    + AR=ar
    + RANLIB=ranlib
    +   :
    + OBJS=foo.o bar.o
    + LIBS=baz/libbaz.a quux/libquux.a
    +   :
    + libfoo.a: $(OBJS) $(LIBS)
    +     shtool arx -C $(AR) rc libfoo.a $(OBJS) $(LIBS)
    +     $(RANLIB) libfoo.a
    +

    +
    slo [-p|--prefix str] -- -Ldir -llib [ -Ldir -llib ... ]
    +
    +This command separates the linker options ``-L'' and ``-l'' by library +class. It's argument line can actually be an arbitrary command line where those +options are contained. slo parses these two options only and ignores the +remaining contents. The result is a trivial shell script on stdout which +defines six variables containing the ``-L'' and ``-l'' options sorted by +class: +

    ``SLO_DIRS_OBJ'' and ``SLO_LIBS_OBJ'' contains the ``-L'' and +``-l'' options of static libraries, ``SLO_DIRS_PIC'' and +``SLO_LIBS_PIC'' contains the ``-L'' and ``-l'' options of static +libraries containing PIC (``Position Independent Code'') and +``SLO_DIRS_DSO'' and ``SLO_LIBS_DSO'' contains the ``-L'' and +``-l'' options of shared libraries. The -p option can be used to +change the default variable prefix from ``SLO_'' to str.

    +

    The intent of this separation is to provide a way between static and shared +libraries which is important if one wants to link custom DSOs against +libraries, because not all platforms all one to link these DSOs against shared +libraries. So one first has to separate out the shared libraries and link the +DSO only against the static libraries. One can use this command also to just +sort the options.

    +

    Example:

    +
    +  #   configure.in
    +  LINK_STD="$LDFLAGS $LIBS"
    +  eval `shtool slo $LINK_STD`
    +  LINK_DSO="$SLO_DIRS_OBJ $SLO_LIBS_OBJ $SLO_DIRS_PIC $SLO_LIBS_PIC"
    +    :
    +

    +
    scpp [-v|--verbose] [-p|--preserve] [-f|--filter filter] [-o|--output ofile] [-t|--template tfile] [-M|--mark mark] [-D|--define dname] [-C|--class cname] file [file ...]
    +
    +This command is an additional ANSI C source file pre-processor for sharing +cpp(1) code segments, internal variables and internal functions. The intention +for this comes from writing libraries in ANSI C. Here a common shared internal +header file is usually used for sharing information between the library +source files. +

    The operation is to parse special constructs in files, generate a few +things out of these constructs and insert them at position mark in tfile +by writing the output to ofile. Additionally the files are never touched +or modified. Instead the constructs are removed later by the cpp(1) phase of +the build process. The only prerequisite is that every file has a +``#include "ofile"'' at the top.

    +

    This command provides the following features: First it avoids namespace +pollution and reduces prototyping efforts for internal symbols by recognizing +functions and variables which are defined with the storage class identifier +``cname''. For instance if cname is ``intern'', a function ``intern +void *foobar(int quux)'' in one of the files is translated into both a +``#define foobar __foobar'' and a ``extern void *foobar(int quux);'' in +ofile. Additionally a global ``#define cname /**/'' is also +created in ofile to let the compiler silently ignore this additional +storage class identifier.

    +

    Second, the library source files usually want to share typedefs, +#defines, etc. over the source file boundaries. To achieve this one can +either place this stuff manually into tfile or use the second feature of +scpp: All code in files encapsulated with ``#if dname ... +#endif'' is automatically copied to ofile. Additionally a global +``#define dname 0'' is also created in ofile to let the compiler +silently skip this parts (because it was already found in the header).

    +

    Option ``-v'' can be used to enable some processing output. Option +``-p'' can be used to make the decision whether to overwrite ofile +independent of the generated ``#line'' lines. This is useful for +Makefiles if the real contents of ofile will not change, just +line numbers. Option ``-f'' (which can occur multiple times) can +be used to apply one or more pre-processing sed(1) filter commands +(usually of type ``s/.../.../'') to each input file before their +input is parsed.

    +

    Example:

    +
    +  #   Makefile
    +  SRCS=foo_bar.c foo_quux.c
    +  foo_p.h: foo_p.h.in
    +       shtool scpp -o foo_p.h -t foo_p.h.in \
    +                   -M %%MARK%% -D cpp -C intern $(SRCS)
    +
    +  /* foo_p.h.in */
    +  #ifndef FOO_P_H
    +  #define FOO_P_H
    +  %%MARK%%
    +  #endif /* FOO_P_H */
    +
    +  /* foo_bar.c */
    +  #include "foo_p.h"
    +  #if cpp
    +  #define OURS_INIT 4711
    +  #endif
    +  intern int ours;
    +  static int myone = 0815;
    +  intern int bar(void)
    +  {
    +      ours += myone;
    +  }
    +
    +  /* foo_quux.c */
    +  #include "foo_p.h"
    +  int main(int argc, char *argv[])
    +  {
    +      int i;
    +      ours = OURS_INIT
    +      for (i = 0; i < 10; i++) {
    +          bar();
    +          printf("ours now %d\n", ours);
    +      }
    +      return 0;
    +  }
    +

    +
    version [-l|--language lang] [-n|--name name] [-p|--prefix prefix] [-s|--set version] [-e|--edit] [-i|--increase knob] [-d|--display type] file
    +
    +This command generates and maintains a version information +file file for program name name in either textual +(lang=``txt''), ANSI C (lang=``c''), Perl (lang=``perl'') or +Python (lang=``python'') language. The version is always described +with a triple <version,revision,level> and is +represented by a string which always matches the regular expression +``[0-9]+\.[0-9]+[sabp.][0-9]+''. When the option ``-s'' is given, +the contents of file is overridden with the specified version. +

    When option ``-i'' is used, the current version in file is updated +by increasing one element of the version where knob can be one of +the following: ``v'' for increasing the version by 1 (and resetting +revision and level to 0), ``r'' for increasing the revision by 1 (and +resetting level to 0) or ``l'' for increasing the level by 1. Option +``-e'' can be used to interactively enter a new version.

    +

    Unless option ``-e'', ``-i'' or ``-s'' is specified, the performed +action is to display the current version. Option ``-d'' then can be used +to control the display type: ``short'' for a short version display, ``long'' +for a longer version display, ``hex'' for a hexadecimal display of the version +and ``libtool'' for a format suitable for use with GNU libtool.

    +

    The hexadecimal format for a version v.rtl is VVRRTLL where VV +and RR directly correspond to v and r, T encodes the level +type as 9, 2, 1, 0 (representing s, p/., b, a +in this order) and LL is either directly corresponding to l or set +to 99 if level type is s.

    +

    Example:

    +
    + #   shell script
    + shtool version -l c -n FooBar -p foobar -s 1.2b3 version.c
    +
    + #   configure.in
    + V=`shtool version -l c -d long version.c`
    + echo "Configuring FooBar, Version $V"
    +

    +
    path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path path] str [str ...]
    +
    +This command deals with shell $PATH variables. It can find a program +executable in $PATH or path through one or more filenames (given by one or +more str arguments). The result is the absolute filesystem path to the +program displayed on stdout plus an exit code of 0 if it was really +found. +

    The option ``-s'' can be used to suppress the output which is useful to +just test whether a program exists with the help of the return code. The +option ``-m'' enables some magic where currently for the programs +``perl'' and ``cpp'' an advanced magic search is done. The option +``-r'' can be used to transform a forward path to a subdirectory into a +reverse path. Option ``-d'' and ``-b'' just output the directory or base +name of str.

    +

    Examples:

    +
    + #   shell script
    + awk=`shtool path -p "${PATH}:." gawk nawk awk`
    + perl=`shtool path -m perl`
    + cpp=`shtool path -m cpp`
    + revpath=`shtool path -r path/to/subdir`
    +

    +

    +


    +

    SEE ALSO

    +

    sh(1), cp(1), rm(1), mkdir(1), awk(1), sed(1).

    +

    +


    +

    HISTORY

    +

    Some scripts contained in GNU shtool were already written in 1994 by +Ralf S. Engelschall for use inside some private source trees. Then +they evolved into more elaborated versions over the years and were used +in various free software projects like ePerl, WML, iSelect, gFONT, etc. +They were complemented with other scripts from the author which he wrote +in March 1998 for the ``Apache Autoconf-style Interface'' (APACI) for +Apache 1.3. In April 1999 the shtool package was created out of the +accumulated master versions of the scripts and in June 1999 it entered +the status of an official GNU program and this way finally joined the +group of GNU autoconf, GNU automake and GNU libtool.

    +

    +


    +

    AUTHOR

    +
    + Ralf S. Engelschall
    + rse@engelschall.com
    + www.engelschall.com
    + + + + Index: ossp-adm/autotools/treecc.html RCS File: /v/ossp/cvs/ossp-adm/autotools/treecc.html,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-adm/autotools/treecc.html,v' | diff -u /dev/null - -L'ossp-adm/autotools/treecc.html' 2>/dev/null --- ossp-adm/autotools/treecc.html +++ - 2025-04-19 11:54:39.085875070 +0200 @@ -0,0 +1,3265 @@ + + + + +Tree Compiler-Compiler + + +

    Tree Compiler-Compiler

    +

    +


    + + +

    Overview

    +

    + + + + + +

    Introduction

    + +

    +Traditional compiler construction tools such as lex and yacc focus on +the lexical analysis and parsing phases of compilation. But they +provide very little to support semantic analysis and code generation. + + +

    +Yacc allows grammar rules to be tagged with semantic actions and values, +but it doesn't provide any routines that assist in the process of tree +building, semantic analysis, or code generation. Because those processes +are language-specific, yacc leaves the details to the programmer. + + +

    +Support for semantic analysis was also a lot simpler in the languages +that were prevalent when lex and yacc were devised. C and Pascal +require declare before use, which allows the semantic information +about a statement to be determined within the parser at the point of +use.(1) If extensive optimization +is not required, then code generation can also be performed within +the grammar, leading to a simple one-pass compiler structure. + + +

    +Modern languages allow deferred declaration of methods, fields, and +types. For example, Java allows a method to refer to a field that +is declared further down the .java source file. A field can be +declared with a type whose class definition has not yet been parsed. + + +

    +Hence, most of the semantic analysis that used to be performed inline +within a yacc grammar must now be performed after the entire program +has been parsed. Tree building and walking is now more important +than it was in older declare before use languages. + + + + +

    Tree walking: the need for something better

    + +

    +Building parse tree data structures and walking them is not terribly +difficult, but it is extremely time-consuming and error-prone. A +modern programming language may have hundreds of node types, divided +into categories for statements, expressions, types, declarations, etc. +When a new programming language is being devised, new node types may +be added quite frequently. This has ramifications in trying to manage +the code's complexity.(2) + + +

    +For example, consider nodes that correspond to programming language +types in a C-like language. There will be node types for integer +types, floating-point types, pointers, structures, functions, etc. +There will be semantic analysis routines for testing types for +equality, comparing types for coercions and casts, evaluating the +size of a type for memory layout purposes, determining if the type +falls into a general category such as "integer" or "pointer", etc. + + +

    +Let's say we wanted to add a new "128-bit integer" type to this +language. Adding a new node type is fairly straight-forward. +But we also need to track down every place in the code where the +compiler walks a type or deals with integers and add an appropriate +case for the new type. This is very error-prone. Such code is +likely to be split over many files, and good coding practices only +help to a certain extent. + + +

    +This problem gets worse when new kinds of expressions and statements +are added to the language. The change not only affects semantic +analysis, but also optimization and code generation. Some compilers +use multiple passes over the tree to perform optimization, with +different algorithms used in each pass. Code generation may use a +number of different strategies, depending upon how an expression or +statement is used. If even one of these places is missed when the +new node type is added, then there is the potential for a very nasty +bug that may go unnoticed for months or years. + + +

    +Object-oriented languages such as C++ can help a bit in constructing +robust tree structures. The base class can declare abstract methods +for any semantic analysis, optimization, or code generation routine +that needs to be implemented for all members of the node category. +But another code maintainence problem arises. What happens when +we want to add a new optimization pass in the future? We must go +into hundreds of classes and implement the methods. + + +

    +To avoid changing hundreds of classes, texts on Design Patterns +suggest using a Visitor pattern. Then the new optimization pass +can be encapsulated in a visitor. This would work, except for +the following drawback of visitor patterns, as described in Gamma, +et al: + + + +

    +

    +The Visitor pattern makes it hard to add new subclasses of +Element. Each new ConcreteElement gives rise to a new abstract +operation on Visitor and a corresponding implementation in +every ConcreteVisitor class. + + +

    +... The Visitor class hierarchy can be difficult to maintain +when new ConcreteElement classes are added frequently. In such +cases, it's probably easier just to define operations on the +classes that make up the structure. +

    + +

    +That is, if we add a new node type in the future, we have a large +maintainence problem on our hands. The solution is to scatter the +implementation through-out every class, which is the situation we +were trying to avoid by using the Visitor pattern. + + +

    +Because compiler construction deals with a large set of rapidly +changing node types and operations, neither of the usual approaches +work very well. + + +

    +The ideal programming language for designing compilers needs to have +some way to detect when the programmer forgets to implement an operation +for a new node type, and to ensure that a new operation covers all +existing node types adequately. Existing OO languages do not perform +this kind of global error checking. What few checking procedures they +have change the maintainence problem into a different problem of +similar complexity. + + + + +

    Aspect-oriented programming

    + +

    +A new field in language design has emerged in recent years called +"Aspect-Oriented Programming" (AOP). A good review of the field +can be found in the October 2001 issue of the Communications of +the ACM, and on the AspectJ Web site, http://www.aspectj.org/. + + +

    +The following excerpt from the introduction to the AOP section in the +CACM issue describes the essential aspects of AOP, and the difference +between OOP and AOP: + + + +

    +

    +AOP is based on the idea that computer systems are better programmed +by separately specifying the various concerns (properties or areas +of interest) of a system and some description of their relationships, +and then relying on mechanisms in the underlying AOP environment to +weave or compose them together into a coherent program. ... +While the tendancy in OOP's is to find commonality among classes +and push it up the inheritance tree, AOP attempts to realize +scattered concerns as first-class elements, and eject them +horizontally from the object structure. +

    + +

    +Aspect-orientation gives us some hope of solving our compiler +complexity problems. We can view each operation on node types +(semantic analysis, optimization, code generation, etc) as an +"aspect" of the compiler's construction. The AOP language weaves +these aspects with the node types to create the final compiler. + + + + +

    The treecc approach

    + +

    +We don't really want to implement a new programming language +just for compiler construction. Especially since the new language's +implementation would have all of the problems described above and would +therefore also be difficult to debug and maintain. + + +

    +The approach that we take with "treecc" is similar to that used by +"yacc". A simple rule-based language is devised that is used to describe +the intended behaviour declaratively. Embedded code is used to provide +the specific implementation details. A translator then converts the input +into source code that can be compiled in the usual fashion. + + +

    +The translator is responsible for generating the tree building and +walking code, and for checking that all relevant operations have been +implemented on the node types. Functions are provided that make +it easier to build and walk the tree data structures from within +a "yacc" grammar and other parts of the compiler. + + + + +

    A simple example for expressions

    +

    + + + +

    +Consider the following yacc grammar for a simple expression language: + + + +

    +%token INT FLOAT
    +
    +%%
    +
    +expr: INT
    +    | FLOAT
    +    | '(' expr ')'
    +    | expr '+' expr
    +    | expr '-' expr
    +    | expr '*' expr
    +    | expr '/' expr
    +    | '-' expr
    +    ;
    +
    + +

    +(We will ignore the problems of precedence and associativity and +assume that the reader is familiar with how to resolve such issues +in yacc grammars). + + +

    +There are 7 types of nodes for this grammar: `intnum', `floatnum', +`plus', `minus', `multiply', `divide', and `negate'. +They are defined in treecc as follows: + + + +

    +%node expression %abstract %typedef
    +
    +%node binary expression %abstract =
    +{
    +    expression *expr1;
    +    expression *expr2;
    +}
    +
    +%node unary expression %abstract =
    +{
    +    expression *expr;
    +}
    +
    +%node intnum expression =
    +{
    +    int num;
    +}
    +
    +%node floatnum expression =
    +{
    +    float num;
    +}
    +
    +%node plus binary
    +%node minus binary
    +%node multiply binary
    +%node divide binary
    +%node negate unary
    +
    + +

    +We have introduced three extra node types that refer +to any expression, binary expressions, and unary expressions. These +can be seen as superclasses in an OO-style framework. We have +declared these node types as `abstract' because the yacc grammar +will not be permitted to create instances of these classes directly. + + +

    +The `binary', `unary', `intnum', and `floatnum' +node types have field definitions associated with them. These have +a similar syntax to C struct declarations. + + +

    +The yacc grammar is augmented as follows to build the parse tree: + + + +

    +%union {
    +    expression *node;
    +    int         inum;
    +    float       fnum;
    +}
    +
    +%token INT FLOAT
    +
    +%type <node> expr
    +%type <inum> INT
    +%type <fnum> FLOAT
    +
    +%%
    +
    +expr: INT               { $$ = intnum_create($1); }
    +    | FLOAT             { $$ = floatnum_create($1); }
    +    | '(' expr ')'      { $$ = $2; }
    +    | expr '+' expr     { $$ = plus_create($1, $3); }
    +    | expr '-' expr     { $$ = minus_create($1, $3); }
    +    | expr '*' expr     { $$ = multiply_create($1, $3); }
    +    | expr '/' expr     { $$ = divide_create($1, $3); }
    +    | '-' expr          { $$ = negate_create($2); }
    +    ;
    +
    + +

    +The treecc translator generates the `*_create' functions so that +the rest of the compiler can build the necessary data structures +on demand. The parameters to the `*_create' functions +are identical in type and order to the members of the structure for +that node type. + + +

    +Because `expression', `binary', and `unary' are abstract, +there will be no `*_create' functions associated with them. This will +help the programmer catch certain kinds of errors. + + +

    +The type that is returned from a `*_create' function is the first +superclass of the node that has a `%typedef' keyword associated with it; +`expression *' in this case. + + + + +

    Storing extra information

    + +

    +Normally we will want to store extra information with a node beyond +that which is extracted by the yacc grammar. In our expression +example, we probably want to store type information in the nodes +so that we can determine if the whole expression is integer or +floating point during semantic analysis. We can add type information +to the `expression' node type as follows: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type;
    +}
    +
    + +

    +The `%nocreate' flag indicates that the field should not be passed +to the `*_create' functions as a parameter. i.e. it provides semantic +information that isn't present in the grammar. When nodes are created, +any fields that are declared as `%nocreate' will be undefined in value. +A default value can be specified as follows: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type = {int_type};
    +}
    +
    + +

    +Default values must be enclosed in `{' and `}' because they are +pieces of code in the underlying source language (C, C++, etc), instead +of tokens in the treecc syntax. Any legitimate expression in the +underlying source language may be used. + + +

    +We also need to arrange for `type_code' to be declared. One way to +do this is by adding a `%decls' section to the front of the treecc +input file: + + + +

    +%decls %{
    +
    +typedef enum
    +{
    +    int_type,
    +    float_type
    +
    +} type_code;
    +
    +%}
    +
    + +

    +We could have introduced the definition by placing a `#include' +directive into the `%decls' section instead, or by defining a +treecc enumerated type: + + + +

    +%enum type_code =
    +{
    +    int_type,
    +    float_type
    +}
    +
    + +

    +Now that we have these definitions, type-inferencing can be implemented +as follows: + + + +

    +%operation void infer_type(expression *e)
    +
    +infer_type(binary)
    +{
    +    infer_type(e->expr1);
    +    infer_type(e->expr2);
    +
    +    if(e->expr1->type == float_type || e->expr2->type == float_type)
    +    {
    +        e->type = float_type;
    +    }
    +    else
    +    {
    +        e->type = int_type;
    +    }
    +}
    +
    +infer_type(unary)
    +{
    +    infer_type(e->expr);
    +    e->type = e->expr->type;
    +}
    +
    +infer_type(intnum)
    +{
    +    e->type = int_type;
    +}
    +
    + +

    +This example demonstrates using the abstract node types `binary' and +`unary' to define operations on all subclasses. The treecc translator +will generate code for a full C function called `infer_type' that +incorporates all of the cases. + + +

    +But hang on a second! What happened to `floatnum'? Where did it +go? It turns out that treecc will catch this. It will report +an error to the effect that `node type `floatnum' is not handled in +operation `infer_type''. Here is its definition: + + + +

    +infer_type(floatnum)
    +{
    +    e->type = float_type;
    +}
    +
    + +

    +As we can see, treecc has just caught a bug in the language +implementation and reported it to us as soon as we introduced it. + + +

    +Let's now extend the language with a `power' operator: + + + +

    +yacc:
    +
    +expr: expr '^' expr     { $$ = create_power($1, $3); }
    +    ;
    +
    +treecc:
    +
    +%node power binary
    +
    + +

    +That's all there is to it! When treecc re-translates the input +file, it will modify the definition of `infer_type' to include the +extra case for `power' nodes. Because `power' is a subclass of +`binary', treecc already knows how to perform type inferencing for the +new node and it doesn't warn us about a missing declaration. + + +

    +What if we wanted to restrict the second argument of `power' to be +an integer value? We can add the following case to `infer_type': + + + +

    +infer_type(power)
    +{
    +    infer_type(e->expr1);
    +    infer_type(e->expr2);
    +
    +    if(e->expr2->type != int_type)
    +    {
    +        error("second argument to `^' is not an integer");
    +    }
    +
    +    e->type = e->expr1->type;
    +}
    +
    + +

    +The translator now notices that there is a more specific implementation +of `infer_type' for `power', and won't use the `binary' +case for it. + + +

    +The most important thing to realise here is that the translator always +checks that there are sufficient declarations for `infer_type' to cover +all relevant node types. If it detects a lack, it will immediately +raise an error to the user. This allows tree coverage problems to +be found a lot sooner than with the traditional approach. + + +

    +See section Full expression example code, for a complete listing of the above +example files. + + + + +

    Invoking treecc from the command-line

    +

    + + + + +

    +The general form of treecc's command-line syntax is as follows: + + + +

    +treecc [OPTIONS] INPUT ...
    +
    + +

    +Treecc accepts the following command-line options: + + +

    + +
    -o FILE +
    +
    --output FILE +
    +Set the name of the output file to `FILE'. If this option is not +supplied, then the name of the first input file will be used, with its +extension changed to `.c'. If the input is standard input, +the default output file is `yy_tree.c'. + +This option may be overridden using the `%output' keyword in +the input files. + +
    -h FILE +
    +
    --header FILE +
    +Set the name of the header output file to `FILE'. This is only +used for the C and C++ output languages. If this option is not supplied, +then the name of the output file will be used, with its extension +changed to `.h'. If the input is standard input, the default header +output file is `yy_tree.h'. + +This option may be overriden using the `%header' keyword in the +input files. If this option is used with a language that does not require +headers, it will be ignored. + +
    -d DIR +
    +
    --output-dir DIR +
    +Set the name of the Java output directory to `DIR'. This is only +used for the Java language. If this option is not supplied, then the +directory corresponding to the first input file is used. If the input +is standard input, the default is the current directory. + +This option may be overriden using the `%outdir' keyword in the +input files. If this option is used with a language other than Java, +it will be ignored. + +
    -s DIR +
    +
    --skeleton-dir DIR +
    +Set the name of the directory that contains the skeleton files for the +C and C++ node memory managers to `DIR'. + +
    -e EXT +
    +
    --extension EXT +
    +Change the default output file extension to `ext', instead of +`.c'. The value `ext' can have a leading dot, but this is +not required. + +
    -f +
    +
    --force-create +
    +Treecc normally attempts to optimise the creation of output files +so that they are only modified if a non-trivial change has +occurred in the input. This can reduce the number of source +code recompiles when treecc is used in combination with make. + +This option forces the output files to be created, even if they +are the same as existing files with the same name. + +The declaration `%option force' can be used in the input files +to achieve the same effect as this option. + +
    -n +
    +
    --no-output +
    +Suppress the generation of output files. Treecc parses the +input files, checks for errors, and then stops. + +
    --help +
    +Print a usage message for the treecc program. + +
    -v +
    +
    --version +
    +Print the version of the treecc program. + +
    -- +
    +Marks the end of the command-line options, and the beginning of +the input filenames. You may need to use this if your filename +begins with `-'. e.g. `treecc -- -input.tc'. This is +not needed if the input is standard input: `treecc -' +is perfectly valid. +
    + + + +

    Syntax of input files

    +

    + + + +

    +Treecc input files consist of zero or more declarations that define +nodes, operations, options, etc. The following sections describe each +of these elements. + + + + +

    Node declarations

    +

    + + + + + +

    +Node types are defined using the `node' keyword in input files. +The general form of the declaration is: + + + +

    +%node NAME [ PNAME ] [ FLAGS ] [ = FIELDS ]
    +
    + +
    + +
    `NAME' +
    +An identifier that is used to refer to the node type elsewhere +in the treecc definition. It is also the name of the type that will be +visible to the programmer in literal code blocks. + +
    `PNAME' +
    +An identifier that refers to the parent node type that `NAME' inherits +from. If `PNAME' is not supplied, then `NAME' is a top-level +declaration. It is legal to supply a `PNAME' that has not yet +been defined in the input. + +
    `FLAGS' +
    +Any combination of `%abstract' and `%typedef': + +
    + +
    `%abstract' +
    + +The node type cannot be constructed by the programmer. In addition, +the programmer does not need to define operation cases for this node +type if all subtypes have cases associated with them. + +
    `%typedef' +
    + +The node type is used as the common return type for node creation +functions. Top-level declarations must have a `%typedef' keyword. +
    +
    + +

    +The `FIELDS' part of a node declaration defines the fields that +make up the node type. Each field has the following general form: + + + +

    +[ %nocreate ] TYPE FNAME [ = VALUE ] ';'
    +
    + +
    + +
    `%nocreate' +
    + +The field is not used in the node's constructor. When the node is +constructed, the value of this field will be undefined unless +`VALUE' is specified. + +
    `TYPE' +
    +The type that is associated with the field. Types can be declared +using a subset of the C declaration syntax, augmented with some C++ +and Java features. See section Types used in fields and parameters, for more information. + +
    `FNAME' +
    +The name to associate with the field. Treecc verifies that the field +does not currently exist in this node type, or in any of its ancestor +node types. + +
    `VALUE' +
    +The default value to assign to the field in the node's constructor. +This can only be used on fields that are declared with `%nocreate'. +The value must be enclosed in braces. For example `{NULL}' would +be used to initialize a field with `NULL'. + +The braces are required because the default value is expressed in +the underlying source language, and can use any of the usual constant +declaration features present in that language. +
    + +

    +When the output language is C, treecc creates a struct-based type +called `NAME' that contains the fields for `NAME' and +all of its ancestor classes. The type also contains some house-keeping +fields that are used internally by the generated code. The following +is an example: + + + +

    +typedef struct binary__ binary;
    +struct binary__ {
    +    const struct binary_vtable__ *vtable__;
    +    int kind__;
    +    char *filename__;
    +    long linenum__;
    +    type_code type;
    +    expression * expr1;
    +    expression * expr2;
    +};
    +
    + +

    +The programmer should avoid using any identifier that +ends with `__', because it may clash with house-keeping +identifiers that are generated by treecc. + + +

    +When the output language is C++, Java, or C#, treecc creates a class +called `NAME', that inherits from the class `PNAME'. +The field definitions for `NAME' are converted into public members +in the output. + + + + +

    Types used in fields and parameters

    +

    + + + +

    +Types that are used in field and parameter declarations have a +syntax which is subset of features found in C, C++, and Java: + + + +

    +TypeAndName ::= Type [ IDENTIFIER ]
    +
    +Type ::= TypeName
    +       | Type '*'
    +       | Type '&'
    +       | Type '[' ']'
    +
    +TypeName ::= IDENTIFIER { IDENTIFIER }
    +
    + +

    +Types are usually followed by an identifier that names the field or +parameter. The name is required for fields and is optional for parameters. +For example `int' is usually equivalent to `int x' in parameter +declarations. + + +

    +The following are some examples of using types: + + + +

    +int
    +int x
    +const char *str
    +expression *expr
    +Element[][] array
    +Item&
    +unsigned int y
    +const Element
    +
    + +

    +The grammar used by treecc is slightly ambiguous. The last example above +declares a parameter called `Element', that has type `const'. +The programmer probably intended to declare an anonymous parameter with type +`const Element' instead. + + +

    +This ambiguity is unavoidable given that treecc is not fully +aware of the underlying language's type system. When treecc +sees a type that ends in a sequence of identifiers, it will +always interpret the last identifier as the field or parameter +name. Thus, the programmer must write the following instead: + + + +

    +const Element e
    +
    + +

    +Treecc cannot declare types using the full power of C's type system. +The most common forms of declarations are supported, and the rest +can usually be obtained by defining a `typedef' within a +literal code block. See section Literal code declarations, for more information +on literal code blocks. + + +

    +It is the responsibility of the programmer to use type constructs +that are supported by the underlying programming language. Types such +as `const char *' will give an error when the output is compiled +with a Java compiler, for example. + + + + +

    Enumerated type declarations

    +

    + + + + + +

    +Enumerated types are a special kind of node type that can be used +by the programmer for simple values that don't require a full abstract +syntax tree node. The following is an example of defining a list +of the primitive machine types used in a Java virtual machine: + + + +

    +%enum JavaType =
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF
    +}
    +
    + +

    +Enumerations are useful when writing code generators and type +inferencing routines. The general form is: + + + +

    +%enum NAME = { VALUES }
    +
    + +
    + +
    `NAME' +
    +An identifier to be used to name the enumerated type. The name must +not have been previously used as a node type, an enumerated type, or +an enumerated value. + +
    `VALUES' +
    +A comma-separated list of identifiers that name the values within +the enumeration. Each of the names must be unique, and must not have +been used previously as a node type, an enumerated type, or an +enumerated value. +
    + +

    +Logically, each enumerated value is a special node type that inherits from +a parent node type corresponding to the enumerated type `NAME'. + + +

    +When the output language is C or C++, treecc generates an enumerated +typedef for `NAME' that contains the enumerated values in the +same order as was used in the input file. The typedef name can be +used elsewhere in the code as the type of the enumeration. + + +

    +When the output language is Java, treecc generates a class called +`NAME' that contains the enumerated values as integer constants. +Elsewhere in the code, the type `int' must be used to declare +variables of the enumerated type. Enumerated values are referred +to as `NAME.VALUE'. If the enumerated type is used as a trigger +parameter, then `NAME' must be used instead of `int': +treecc will convert the type when the Java code is output. + + +

    +When the output language is C#, treecc generates an enumerated value +type called `NAME' that contains the enumerated values as +members. The C# type `NAME' can be used elsewhere in the code +as the type of the enumeration. Enumerated values are referred to +as `NAME.VALUE'. + + + + +

    Operation declarations

    +

    + + + + + + + +

    +Operations are declared in two parts: the declaration, and the +cases. The declaration part defines the prototype for the +operation and the cases define how to handle specific kinds of +nodes for the operation. + + +

    +Operations are defined over one or more trigger parameters. Each +trigger parameter specifies a node type or an enumerated type that +is selected upon to determine what course of action to take. The +following are some examples of operation declarations: + + + +

    +%operation void infer_type(expression *e)
    +%operation type_code common_type([type_code t1], [type_code t2])
    +
    + +

    +Trigger parameters are specified by enclosing them in square +brackets. If none of the parameters are enclosed in square +brackets, then treecc assumes that the first parameter is the +trigger. + + +

    +The general form of an operation declaration is as follows: + + + +

    +%operation { %virtual | %inline | %split } RTYPE [CLASS::]NAME(PARAMS)
    +
    + +
    + +
    `%virtual' +
    + +Specifies that the operation is associated with a node type as +a virtual method. There must be only one trigger parameter, +and it must be the first parameter. + +Non-virtual operations are written to the output source files +as global functions. + +
    `%inline' +
    + +Optimise the generation of the operation code so that all cases +are inline within the code for the function itself. This can +only be used with non-virtual operations, and may improve +code efficiency if there are lots of operation cases with a +small amount of code in each. + +
    `%split' +
    + +Split the generation of the multi-trigger operation code across +multiple functions, to reduce the size of each individual function. +It is sometimes necessary to split large %inline operations +to avoid compiler limits on function size. + +
    `RTYPE' +
    +The type of the return value for the operation. This should be +`void' if the operation does not have a return value. + +
    `CLASS' +
    +The name of the class to place the operation's definition within. +This can only be used with non-virtual operations, and is +intended for languages such as Java and C# that cannot declare +methods outside of classes. The class name will be ignored if +the output language is C. + +If a class name is required, but the programmer did not supply it, +then `NAME' will be used as the default. The exception to +this is the C# language: `CLASS' must always be supplied and +it must be different from `NAME'. This is due to a "feature" +in some C# compilers that forbid a method with the same name as +its enclosing class. + +
    `NAME' +
    +The name of the operation. + +
    `PARAMS' +
    +The parameters to the operation. Trigger parameters may be +enclosed in square brackets. Trigger parameters must be +either node types or enumerated types. +
    + +

    +Once an operation has been declared, the programmer can specify +its cases anywhere in the input files. It is not necessary that +the cases appear after the operation, or that they be contiguous +within the input files. This permits the programmer to place +operation cases where they are logically required for maintainence +reasons. + + +

    +There must be sufficient operation cases defined to cover every +possible combination of node types and enumerated values that +inherit from the specified trigger types. An operation case +has the following general form: + + + +

    +NAME(TRIGGERS) [, NAME(TRIGGERS2) ...]
    +{
    +    CODE
    +}
    +
    + +
    + +
    `NAME' +
    +The name of the operation for which this case applies. + +
    `TRIGGERS' +
    +A comma-separated list of node types or enumerated values that +define the specific case that is handled by the following code. + +
    `CODE' +
    +Source code in the output source language that implements the +operation case. +
    + +

    +Multiple trigger combinations can be associated with a single +block of code, by listing them all, separated by commas. For +example: + + + +

    +common_type(int_type, int_type)
    +{
    +    return int_type;
    +}
    +
    +common_type(int_type, float_type),
    +common_type(float_type, int_type),
    +common_type(float_type, float_type)
    +{
    +    return float_type;
    +}
    +
    + + + +

    Options that modify treecc's behaviour

    +

    + + + + + +

    +"(*)" is used below to indicate an option that is enabled by default. + + +

    + +
    `%option track_lines' +
    + +Enable the generation of code that can track the current filename and +line number when nodes are created. See section Tracking line numbers in source files, for more +information. (*) + +
    `%option no_track_lines' +
    + +Disable the generation of code that performs line number tracking. + +
    `%option singletons' +
    + +Optimise the creation of singleton node types. These are +node types without any fields. Treecc can optimise the code +so that only one instance of a singleton node type exists in +the system. This can speed up the creation of nodes for +constants within compilers. (*) + +Singleton optimisations will have no effect if `track_lines' +is enabled, because line tracking uses special hidden fields in +every node. + +
    `%option no_singletons' +
    + +Disable the optimisation of singleton node types. + +
    `%option reentrant' +
    + +Enable the generation of reentrant code that does not rely +upon any global variables. Separate copies of the compiler +state can be used safely in separate threads. However, the +same copy of the compiler state cannot be used safely in two or +more threads. + +
    `%option no_reentrant' +
    + +Disable the generation of reentrant code. The interface to +node management functions is simpler, but cannot be used +in a threaded environment. (*) + +
    `%option force' +
    + +Force output source files to be written, even if they are +unchanged. This option can also be set using the `-f' +command-line option. + +
    `%option no_force' +
    + +Don't force output source files to be written if they are the +same as before. (*) + +This option can help smooth integration of treecc with make. +Only those output files that have changed will be modified. +This reduces the number of files that the underlying source +language compiler must process after treecc is executed. + +
    `%option virtual_factory' +
    + +Use virtual methods in the node type factories, so that the +programmer can subclass the factory and provide new +implementations of node creation functions. This option is +ignored for C, which does not use factories. + +
    `%option no_virtual_factory' +
    + +Don't use virtual methods in the node type factories. (*) + +
    `%option abstract_factory' +
    + +Use abstract virtual methods in the node type factories. +The programmer is responsible for subclassing the factory +to provide node creation functionality. + +
    `%option no_abstract_factory' +
    + +Don't use abstract virtual methods in the node type factories. (*) + +
    `%option kind_in_node' +
    + +Put the kind field in the node, for more efficient access at runtime. (*) + +
    `%option kind_in_vtable' +
    + +Put the kind field in the vtable, and not the node. This saves some +memory, at the cost of slower access to the kind value at runtime. +This option only applies when the language is C. The kind field is +always placed in the node in other languages, because it isn't possible +to modify the vtable. + +
    `%option prefix = PREFIX' +
    + +Specify the prefix to be used in output files in place of "yy". + +
    `%option state_type = NAME' +
    + +Specify the name of the state type. The state type is generated +by treecc to perform centralised memory management and reentrancy +support. The default value is `YYNODESTATE'. If the output language +uses factories, then this will also be the name of the factory +base class. + +
    `%option namespace = NAME' +
    + +Specify the namespace to write definitions to in the output +source files. This option is ignored when the output language +is C. + +
    `%option package = NAME' +
    + +Same as `%option namespace = NAME'. Provided because `package' +is more natural for Java programmers. + +
    `%option base = NUM' +
    + +Specify the numeric base to use for allocating numeric values to +node types. By default, node type allocation begins at 1. + +
    `%option lang = LANGUAGE' +
    + +Specify the output language. Must be one of "C", "C++", +"Java", or "C#". The default is "C". + +
    `%option block_size = NUM' +
    + +Specify the size of the memory blocks to use in C and C++ node allocators. + +
    `%option strip_filenames' +
    + +Strip filenames down to their base name in #line directives. +i.e. strip off the directory component. This can be helpful in +combination with the %include %readonly command when +treecc input files may processed from different directories, +causing common output files to change unexpectedly. + +
    `%option no_strip_filenames' +
    + +Don't strip filenames in #line directives. (*) +
    + + + +

    Literal code declarations

    +

    + + + +

    +Sometimes it is necessary to embed literal code within output `.h' +and source files. Usually this is to `#include' definitions +from other files, or to define functions that cannot be easily expressed +as operations. + + +

    +A literal code block is specified by enclosing it in `%{' and +`%}'. The block can also be prefixed with the following flags: + + +

    + +
    `%decls' +
    + +Write the literal code to the currently active declaration header file, +instead of the source file. + +
    `%both' +
    + +Write the literal code to both the currently active declaration header file +and the currently active source file. + +
    `%end' +
    + +Write the literal code to the end of the file, instead of the beginning. +
    + +

    +Another form of literal code block is one which begins with `%%' and +extends to the end of the current input file. This form implicitly has +the `%end' flag. + + + + +

    Changing input and output files

    +

    + + + +

    +Most treecc compiler definitions will be too large to be manageable +in a single input file. They also will be too large to write to a +single output file, because that may overload the source language +compiler. + + +

    +Multiple input files can be specified on the command-line, or +they can be explicitly included by other input files with +the following declarations: + + +

    + +
    `%include [ %readonly ] FILENAME' +
    + + + +Include the contents of the specified file at the current point +within the current input file. `FILENAME' is interpreted +relative to the name of the current input file. + +If the `%readonly' keyword is supplied, then any output +files that are generated by the included file must be read-only. +That is, no changes are expected by performing the inclusion. + +The `%readonly' keyword is useful for building compilers +in layers. The programmer may group a large number of useful +node types and operations together that are independent of the +particulars of a given language. The programmer then defines +language-specific compilers that "inherit" the common definitions. + +Read-only inclusions ensure that any extensions that are added +by the language-specific parts do not "leak" into the common code. +
    + +

    +Output files can be changed using the follow declarations: + + +

    + +
    `%header FILENAME' +
    + + +Change the currently active declaration header file to `FILENAME', +which is interpreted relative to the current input file. This option +has no effect for languages without header files (Java and C#). + +Any node types and operations that are defined after a `%header' +declaration will be declared in `FILENAME'. + +
    `%output FILENAME' +
    + + +Change the currently active source file to `FILENAME', +which is interpreted relative to the current input file. This option +has no effect for languages that require a single class per file (Java). + +Any node types and operations that are defined after a `%header' +declaration will have their implementations placed in `FILENAME'. + +
    `%outdir DIRNAME' +
    + + +Change the output source directory to `DIRNAME'. This is only +used for Java, which requires that a single file be used for each class. +All classes are written to the specified directory. By default, +`DIRNAME' is the current directory where treecc was invoked. +
    + +

    +When treecc generates the output source code, it must insert several +common house-keeping functions and classes into the code. By default, +these are written to the first header and source files. This can +be changed with the `%common' declaration: + + +

    + +
    `%common' +
    + + +Output the common house-keeping code to the currently active +declaration header file and the currently active source file. +This is typically used as follows: + + +
    +%header "common.h"
    +%output "common.c"
    +%common
    +
    + +
    + + + +

    Tracking line numbers in source files

    +

    + + + +

    +When compilers emit error messages to the programmer, it is generally +a good idea to indicate which file and which line gave rise to the +error. Syntax errors can be emitted fairly easily because the parser +usually has access to the current line number. However, semantic +errors are harder to report because the parser may no longer be +active when the error is detected. + + +

    +Treecc can generate code that automatically keeps track of what line +in the source file was active when a node is created. Every node +has two extra private fields that specify the name of the file and the +line number. Semantic analysis routines can query this information +when reporting errors. + + +

    +Because treecc is not aware of how to obtain this information, the +programmer must supply some additional functions. See section API's available in the generated output, +for more information. + + +

    +See section API's available in the generated output, for more information. + + + + +

    API's available in the generated output

    +

    + + + +

    +The source code that is generated by treecc exports a number of +application programmer interfaces (API's) to the programmer. These +can be used elsewhere in the compiler implementation to manipulate +abstract syntax trees. The following sections describe the API's +for each of the output languages. + + + + +

    C Language APIs

    +

    + + + +

    +In the C output language, each node type is converted into a `typedef' +that contains the node's fields, and the fields of its ancestor node +types. The following example demonstrates how treecc node declarations +are converted into C source code: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type;
    +}
    +%node binary expression %abstract =
    +{
    +    expression *expr1;
    +    expression *expr2;
    +}
    +%node plus binary
    +
    + +

    +becomes: + + + +

    +typedef struct expression__ expression;
    +typedef struct binary__ binary;
    +typedef struct plus__ plus;
    +
    +struct expression__ {
    +    const struct expression_vtable__ *vtable__;
    +    int kind__;
    +    char *filename__;
    +    long linenum__;
    +    type_code type;
    +};
    +struct binary__ {
    +    const struct binary_vtable__ *vtable__;
    +    int kind__;
    +    char *filename__;
    +    long linenum__;
    +    type_code type;
    +    expression * expr1;
    +    expression * expr2;
    +};
    +struct plus__ {
    +    const struct plus_vtable__ *vtable__;
    +    int kind__;
    +    char *filename__;
    +    long linenum__;
    +    type_code type;
    +    expression * expr1;
    +    expression * expr2;
    +};
    +
    + +

    +Programmers should avoid using any identifiers that end in +`__'. Such identifiers are reserved for internal use by treecc +and its support routines. + + +

    +For each non-abstract node type called `NAME', treecc generates a +function called `NAME_create' that creates nodes of that type. +The general form of the function's prototype is as follows: + + + +

    +TYPE *NAME_create([YYNODESTATE *state,] PARAMS)
    +
    + +
    + +
    `TYPE' +
    +The return node type, which is the nearest ancestor that has the +`%typedef' flag. + +
    `NAME' +
    +The name of the node type that is being created. + +
    `state' +
    +The system state, if reentrant code is being generated. + +
    `PARAMS' +
    +The create parameters, consisting of every field that does not +have the `%nocreate' flag. The parameters appear in the +same order as the fields in the node types, from the top-most +ancestor down to the node type itself. For example: + + +
    +expression *plus_create(expression * expr1, expression * expr2);
    +
    + +
    + +

    +Enumerated types are converted into a C `typedef' with the +same name and values: + + + +

    +%enum JavaType =
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF
    +}
    +
    + +

    +becomes: + + + +

    +typedef enum
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF
    +
    +} JavaType;
    +
    + +

    +Virtual operations are converted into C macros that invoke the +correct vtable entry on a node type: + + + +

    +%operation %virtual void infer_type(expression *e)
    +
    + +

    +becomes: + + + +

    +#define infer_type(this__) \
    +    ((*(((struct expression_vtable__ *) \
    +        ((this__)->vtable__))->infer_type_v__)) \
    +            ((expression *)(this__)))
    +
    + +

    +Calls to `infer_type' can then be made with `infer_type(node)'. + + +

    +Non-virtual operations are converted into C functions: + + + +

    +%operation void infer_type(expression *e)
    +
    + +

    +becomes: + + + +

    +extern void infer_type(expression *e);
    +
    + +

    +Because virtual and non-virtual operations use a similar call syntax, +it is very easy to convert a virtual operation into a non-virtual +operation when the output language is C. This isn't possible with +the other output languages. + + +

    +Other house-keeping tasks are performed by the following functions +and macros. Some of these must be supplied by the programmer. +The `state' parameter is required only if a reentrant compiler is +being built. + + +

    + +
    int yykind(ANY *node) +
    + +Gets the numeric kind value associated with a particular node. +The kind value for node type `NAME' is called `NAME_kind'. + +
    const char *yykindname(ANY *node) +
    + +Gets the name of the node kind associated with a particular node. +This may be helpful for debugging and logging code. + +
    int yyisa(ANY *node, type) +
    + +Determines if `node' is an instance of the node type `type'. + +
    char *yygetfilename(ANY *node) +
    + +Gets the filename corresponding to where `node' was created +during parsing. This macro is only generated if `%option track_lines' +was specified. + +
    long yygetlinenum(ANY *node) +
    + +Gets the line number corresponding to where `node' was created +during parsing. This macro is only generated if `%option track_lines' +was specified. + +
    void yysetfilename(ANY *node, char *value) +
    + +Sets the filename associated with `node' to `value'. The +string is not copied, so `value' must persist for the lifetime +of the node. This macro will rarely be required, unless a node +corresponds to a different line than the current parse line. This +macro is only generated if `%option track_lines' was specified. + +
    void yysetlinenum(ANY *node, long value) +
    + +Sets the line number associated with `node' to `value'. +This macro will rarely be required, unless a node corresponds to a +different line than the current parse line. This macro is only +generated if `%option track_lines' was specified. + +
    char *yycurrfilename([YYNODESTATE *state]) +
    + +Get the name of the current input file from the parser. The pointer +that is returned from this function is stored as-is: the string is +not copied. Therefore, the value must persist for at least as long +as the node will persist. This function must be supplied by the programmer +if `%option track_lines' was specified. + +
    long yycurrlinenum([YYNODESTATE *state]) +
    + +Get the number of the current input line from the parser. This +function must be supplied by the programmer if `%option track_lines' +was specified. + +
    void yynodeinit([YYNODESTATE *state]) +
    + +Initializes the node memory manager. If the system is reentrant, then +the node memory manager is `state'. Otherwise a global node +memory manager is used. + +
    void *yynodealloc([YYNODESTATE *state,] unsigned int size) +
    + +Allocates a block of memory of `size' bytes in size from the +node memory manager. This function is called automatically from +the node-specific `*_create' functions. The programmer will +not normally need to call this function. + +This function will return NULL if the system is out of +memory, or if `size' is too large to be allocated within +the node memory manager. If the system is out of memory, then +`yynodealloc' will call `yynodefailed' prior to +returning NULL. + +
    int yynodepush([YYNODESTATE *state]) +
    + +Pushes the current node memory manager position. The next time +yynodepop is called, the node memory manager will reset to +the pushed position. This function returns zero if the system +is out of memory. + +
    void yynodepop([YYNODESTATE *state]) +
    + +Pops the current node memory manager position. This function has +no effect if yynodepush was not called previously. + +The yynodepush and yynodepop functions can be used +to perform a simple kind of garbage collection on nodes. When +the parser enters a scope, it pushes the node memory manager +position. After all definitions in the scope have been dealt +with, the parser pops the node memory manager to reclaim all +of the memory used. + +
    void yynodeclear([YYNODESTATE *state]) +
    + +Clears the entire node memory manager and returns it to the +state it had after calling yynodeinit. This is typically +used upon program shutdown to free all remaining node memory. + +
    void yynodefailed([YYNODESTATE *state]) +
    + +Called when yynodealloc or yynodepush detects that +the system is out of memory. This function must be supplied by +the programmer. The programmer may choose to exit to program +when the system is out of memory; in which case yynodealloc +will never return NULL. +
    + + + +

    C++ Language APIs

    +

    + + + +

    +In the C++ output language, each node type is converted into a `class' +that contains the node's fields, virtual operations, and other house-keeping +definitions. The following example demonstrates how treecc node declarations +are converted into C++ source code: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type;
    +}
    +%node binary expression %abstract =
    +{
    +    expression *expr1;
    +    expression *expr2;
    +}
    +%node plus binary
    +
    + +

    +becomes: + + + +

    +class expression
    +{
    +protected:
    +
    +    int kind__;
    +    char *filename__;
    +    long linenum__;
    +
    +public:
    +
    +    int getKind() const { return kind__; }
    +    const char *getFilename() const { return filename__; }
    +    int getLinenum() const { return linenum__; }
    +    void setFilename(char *filename) { filename__ = filename; }
    +    void setLinenum(long linenum) { linenum__ = linenum; }
    +
    +    void *operator new(size_t);
    +    void operator delete(void *, size_t);
    +
    +protected:
    +
    +    expression();
    +
    +public:
    +
    +    type_code type;
    +
    +    virtual int isA(int kind) const;
    +    virtual const char *getKindName() const;
    +
    +protected:
    +
    +    virtual ~expression();
    +
    +};
    +
    +class binary : public expression
    +{
    +protected:
    +
    +    binary(expression * expr1, expression * expr2);
    +
    +public:
    +
    +    expression * expr1;
    +    expression * expr2;
    +
    +    virtual int isA(int kind) const;
    +    virtual const char *getKindName() const;
    +
    +protected:
    +
    +    virtual ~binary();
    +
    +};
    +
    +class plus : public binary
    +{
    +public:
    +
    +    plus(expression * expr1, expression * expr2);
    +
    +public:
    +
    +    virtual int isA(int kind) const;
    +    virtual const char *getKindName() const;
    +
    +protected:
    +
    +    virtual ~plus();
    +
    +};
    +
    + +

    +The following standard methods are available on every node type: + + +

    + +
    int getKind() +
    + +Gets the numeric kind value associated with a particular node. +The kind value for node type `NAME' is called `NAME_kind'. + +
    virtual const char *getKindName() +
    + +Gets the name of the node kind associated with a particular node. +This may be helpful for debugging and logging code. + +
    virtual int isA(int kind) +
    + +Determines if the node is a member of the node type that corresponds +to the numeric kind value `kind'. + +
    const char *getFilename() +
    + +Gets the filename corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    long getLinenum() +
    + +Gets the line number corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    void setFilename(char *value) +
    + +Sets the filename associated with the node to `value'. The +string is not copied, so `value' must persist for the lifetime +of the node. This method will rarely be required, unless a node +corresponds to a different line than the current parse line. This +method is only generated if `%option track_lines' was specified. + +
    void setLinenum(long value) +
    + +Sets the line number associated with the node to `value'. +This method will rarely be required, unless a node corresponds to a +different line than the current parse line. This method is only +generated if `%option track_lines' was specified. +
    + +

    +If the generated code is non-reentrant, then the constructor for the +class can be used to construct nodes of the specified node type. The +constructor parameters are the same as the fields within the node type's +definition, except for `%nocreate' fields. + + +

    +If the generated code is reentrant, then nodes cannot be constructed +using the C++ `new' operator. The `*Create' methods +on the `YYNODESTATE' factory class must be used instead. + + +

    +The `YYNODESTATE' class contains a number of house-keeping methods +that are used to manage nodes: + + +

    + +
    static YYNODESTATE *getState() +
    + +Gets the global `YYNODESTATE' instance that is being used by +non-reentrant code. If an instance has not yet been created, +this method will create one. + +When using non-reentrant code, the programmer will normally subclass +`YYNODESTATE', override some of the methods below, and then +construct an instance of the subclass. This constructed instance +will then be returned by future calls to `getState'. + +
    void *alloc(size_t size) +
    + +Allocates a block of memory of `size' bytes in size from the +node memory manager. This function is called automatically from +the node-specific constructors and `*Create' methods. The programmer +will not normally need to call this function. + +This function will return NULL if the system is out of +memory, or if `size' is too large to be allocated within +the node memory manager. If the system is out of memory, then +`alloc' will call `failed' prior to returning NULL. + +
    int push() +
    + +Pushes the current node memory manager position. The next time +pop is called, the node memory manager will reset to +the pushed position. This function returns zero if the system +is out of memory. + +
    void pop() +
    + +Pops the current node memory manager position. This function has +no effect if push was not called previously. + +The push and pop methods can be used +to perform a simple kind of garbage collection on nodes. When +the parser enters a scope, it pushes the node memory manager +position. After all definitions in the scope have been dealt +with, the parser pops the node memory manager to reclaim all +of the memory used. + +
    void clear() +
    + +Clears the entire node memory manager and returns it to the +state it had after construction. + +
    virtual void failed() +
    + +Called when alloc or push detects that +the system is out of memory. This method is typically +overridden by the programmer in subclasses. The programmer may +choose to exit to program when the system is out of memory; in +which case alloc will never return NULL. + +
    virtual char *currFilename() +
    + +Get the name of the current input file from the parser. The pointer +that is returned from this function is stored as-is: the string is +not copied. Therefore, the value must persist for at least as long +as the node will persist. This method is usually overrriden by +the programmer in subclasses if `%option track_lines' was specified. + +
    virtual long currLinenum() +
    + +Get the number of the current input line from the parser. This +method is usually overridden by the programmer in subclasses +if `%option track_lines' was specified. +
    + +

    +The programmer will typically subclass `YYNODESTATE' to provide +additional functionality, and then create an instance of this class +to act as the node memory manager and node creation factory. + + + + +

    Java Language APIs

    +

    + + + +

    +In the Java output language, each node type is converted into a `class' +that contains the node's fields, virtual operations, and other house-keeping +definitions. The following example demonstrates how treecc node declarations +are converted into Java source code: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type;
    +}
    +%node binary expression %abstract =
    +{
    +    expression expr1;
    +    expression expr2;
    +}
    +%node plus binary
    +
    + +

    +becomes: + + + +

    +public class expression
    +{
    +    protected int kind__;
    +    protected String filename__;
    +    protected long linenum__;
    +
    +    public int getKind() { return kind__; }
    +    public String getFilename() { return filename__; }
    +    public long getLinenum() const { return linenum__; }
    +    public void setFilename(String filename) { filename__ = filename; }
    +    public void setLinenum(long linenum) { linenum__ = linenum; }
    +
    +    public static final int KIND = 1;
    +
    +    public type_code type;
    +
    +    protected expression()
    +    {
    +        this.kind__ = KIND;
    +        this.filename__ = YYNODESTATE.getState().currFilename();
    +        this.linenum__ = YYNODESTATE.getState().currLinenum();
    +    }
    +
    +    public int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return 0;
    +    }
    +
    +    public String getKindName()
    +    {
    +        return "expression";
    +    }
    +}
    +
    +public class binary extends expression
    +{
    +    public static final int KIND = 2;
    +
    +    public expression expr1;
    +    public expression expr2;
    +
    +    protected binary(expression expr1, expression expr2)
    +    {
    +        super();
    +        this.kind__ = KIND;
    +        this.expr1 = expr1;
    +        this.expr2 = expr2;
    +    }
    +
    +    public int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return super.isA(kind);
    +    }
    +
    +    public String getKindName()
    +    {
    +        return "binary";
    +    }
    +}
    +
    +public class plus extends binary
    +{
    +    public static final int KIND = 3;
    +
    +    public plus(expression expr1, expression expr2)
    +    {
    +        super(expr1, expr2);
    +        this.kind__ = KIND;
    +    }
    +
    +    public int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return super.isA(kind);
    +    }
    +
    +    public String getKindName()
    +    {
    +        return "plus";
    +    }
    +}
    +
    + +

    +The following standard members are available on every node type: + + +

    + +
    int KIND +
    + +The kind value for the node type corresponding to this class. + +
    int getKind() +
    + +Gets the numeric kind value associated with a particular node. +The kind value for node type `NAME' is called `NAME.KIND'. + +
    String getKindName() +
    + +Gets the name of the node kind associated with a particular node. +This may be helpful for debugging and logging code. + +
    int isA(int kind) +
    + +Determines if the node is a member of the node type that corresponds +to the numeric kind value `kind'. + +
    String getFilename() +
    + +Gets the filename corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    long getLinenum() +
    + +Gets the line number corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    void setFilename(String value) +
    + +Sets the filename associated with the node to `value'. +This method will rarely be required, unless a node corresponds to +a different line than the current parse line. This method is only +generated if `%option track_lines' was specified. + +
    void setLinenum(long value) +
    + +Sets the line number associated with the node to `value'. +This method will rarely be required, unless a node corresponds to a +different line than the current parse line. This method is only +generated if `%option track_lines' was specified. +
    + +

    +If the generated code is non-reentrant, then the constructor for the +class can be used to construct nodes of the specified node type. The +constructor parameters are the same as the fields within the node type's +definition, except for `%nocreate' fields. + + +

    +If the generated code is reentrant, then nodes cannot be constructed +using the Java `new' operator. The `*Create' methods +on the `YYNODESTATE' factory class must be used instead. + + +

    +Enumerated types are converted into a Java `class': + + + +

    +%enum JavaType =
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF
    +}
    +
    + +

    +becomes: + + + +

    +public class JavaType
    +{
    +    public static final int JT_BYTE = 0;
    +    public static final int JT_SHORT = 1;
    +    public static final int JT_CHAR = 2;
    +    public static final int JT_INT = 3;
    +    public static final int JT_LONG = 4;
    +    public static final int JT_FLOAT = 5;
    +    public static final int JT_DOUBLE = 6;
    +    public static final int JT_OBJECT_REF = 7;
    +}
    +
    + +

    +References to enumerated types in fields and operation parameters +are replaced with the type `int'. + + +

    +Virtual operations are converted into public methods on the Java +node classes. + + +

    +Non-virtual operations are converted into a static method within +a class named for the operation. For example, + + + +

    +%operation void InferType::infer_type(expression e)
    +
    + +

    +becomes: + + + +

    +public class InferType
    +{
    +    public static void infer_type(expression e)
    +    {
    +        ...
    +    }
    +}
    +
    + +

    +If the class name (`InferType' in the above example) is omitted, +then the name of the operation is used as both the class name and the +the method name. + + +

    +The `YYNODESTATE' class contains a number of house-keeping methods +that are used to manage nodes: + + +

    + +
    static YYNODESTATE getState() +
    + +Gets the global `YYNODESTATE' instance that is being used by +non-reentrant code. If an instance has not yet been created, +this method will create one. + +When using non-reentrant code, the programmer will normally subclass +`YYNODESTATE', override some of the methods below, and then +construct an instance of the subclass. This constructed instance +will then be returned by future calls to `getState'. + +This method will not be present if a reentrant system is being +generated. + +
    String currFilename() +
    + +Get the name of the current input file from the parser. This method +is usually overrriden by the programmer in subclasses if +`%option track_lines' was specified. + +
    long currLinenum() +
    + +Get the number of the current input line from the parser. This +method is usually overridden by the programmer in subclasses +if `%option track_lines' was specified. +
    + +

    +The programmer will typically subclass `YYNODESTATE' to provide +additional functionality, and then create an instance of this class +to act as the global state and node creation factory. + + + + +

    C# Language APIs

    +

    + + + +

    +In the C# output language, each node type is converted into a `class' +that contains the node's fields, virtual operations, and other house-keeping +definitions. The following example demonstrates how treecc node declarations +are converted into C# source code: + + + +

    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type;
    +}
    +%node binary expression %abstract =
    +{
    +    expression expr1;
    +    expression expr2;
    +}
    +%node plus binary
    +
    + +

    +becomes: + + + +

    +public class expression
    +{
    +    protected int kind__;
    +    protected String filename__;
    +    protected long linenum__;
    +
    +    public int getKind() { return kind__; }
    +    public String getFilename() { return filename__; }
    +    public long getLinenum() const { return linenum__; }
    +    public void setFilename(String filename) { filename__ = filename; }
    +    public void setLinenum(long linenum) { linenum__ = linenum; }
    +
    +    public const int KIND = 1;
    +
    +    public type_code type;
    +
    +    protected expression()
    +    {
    +        this.kind__ = KIND;
    +        this.filename__ = YYNODESTATE.getState().currFilename();
    +        this.linenum__ = YYNODESTATE.getState().currLinenum();
    +    }
    +
    +    public virtual int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return 0;
    +    }
    +
    +    public virtual String getKindName()
    +    {
    +        return "expression";
    +    }
    +}
    +
    +public class binary : expression
    +{
    +    public const int KIND = 2;
    +
    +    public expression expr1;
    +    public expression expr2;
    +
    +    protected binary(expression expr1, expression expr2)
    +        : expression()
    +    {
    +        this.kind__ = KIND;
    +        this.expr1 = expr1;
    +        this.expr2 = expr2;
    +    }
    +
    +    public override int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return base.isA(kind);
    +    }
    +
    +    public override String getKindName()
    +    {
    +        return "binary";
    +    }
    +}
    +
    +public class plus : binary
    +{
    +    public const int KIND = 5;
    +
    +    public plus(expression expr1, expression expr2)
    +        : binary(expr1, expr2)
    +    {
    +        this.kind__ = KIND;
    +    }
    +
    +    public override int isA(int kind)
    +    {
    +        if(kind == KIND)
    +            return 1;
    +        else
    +            return base.isA(kind);
    +    }
    +
    +    public override String getKindName()
    +    {
    +        return "plus";
    +    }
    +}
    +
    + +

    +The following standard members are available on every node type: + + +

    + +
    const int KIND +
    + +The kind value for the node type corresponding to this class. + +
    int getKind() +
    + +Gets the numeric kind value associated with a particular node. +The kind value for node type `NAME' is called `NAME.KIND'. + +
    virtual String getKindName() +
    + +Gets the name of the node kind associated with a particular node. +This may be helpful for debugging and logging code. + +
    virtual int isA(int kind) +
    + +Determines if the node is a member of the node type that corresponds +to the numeric kind value `kind'. + +
    String getFilename() +
    + +Gets the filename corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    long getLinenum() +
    + +Gets the line number corresponding to where the node was created +during parsing. This method is only generated if `%option track_lines' +was specified. + +
    void setFilename(String value) +
    + +Sets the filename associated with the node to `value'. +This method will rarely be required, unless a node corresponds to +a different line than the current parse line. This method is only +generated if `%option track_lines' was specified. + +
    void setLinenum(long value) +
    + +Sets the line number associated with the node to `value'. +This method will rarely be required, unless a node corresponds to a +different line than the current parse line. This method is only +generated if `%option track_lines' was specified. +
    + +

    +If the generated code is non-reentrant, then the constructor for the +class can be used to construct nodes of the specified node type. The +constructor parameters are the same as the fields within the node type's +definition, except for `%nocreate' fields. + + +

    +If the generated code is reentrant, then nodes cannot be constructed +using the C# `new' operator. The `*Create' methods +on the `YYNODESTATE' factory class must be used instead. + + +

    +Enumerated types are converted into a C# `enum' definition: + + + +

    +%enum JavaType =
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF
    +}
    +
    + +

    +becomes: + + + +

    +public enum JavaType
    +{
    +    JT_BYTE,
    +    JT_SHORT,
    +    JT_CHAR,
    +    JT_INT,
    +    JT_LONG,
    +    JT_FLOAT,
    +    JT_DOUBLE,
    +    JT_OBJECT_REF,
    +}
    +
    + +

    +Virtual operations are converted into public virtual methods on the C# +node classes. + + +

    +Non-virtual operations are converted into a static method within +a class named for the operation. For example, + + + +

    +%operation void InferType::infer_type(expression e)
    +
    + +

    +becomes: + + + +

    +public class InferType
    +{
    +    public static void infer_type(expression e)
    +    {
    +        ...
    +    }
    +}
    +
    + +

    +If the class name (`InferType' in the above example) is omitted, +then the name of the operation is used as both the class name and the +the method name. + + +

    +The `YYNODESTATE' class contains a number of house-keeping methods +that are used to manage nodes: + + +

    + +
    static YYNODESTATE getState() +
    + +Gets the global `YYNODESTATE' instance that is being used by +non-reentrant code. If an instance has not yet been created, +this method will create one. + +When using non-reentrant code, the programmer will normally subclass +`YYNODESTATE', override some of the methods below, and then +construct an instance of the subclass. This constructed instance +will then be returned by future calls to `getState'. + +This method will not be present if a reentrant system is being +generated. + +
    virtual String currFilename() +
    + +Get the name of the current input file from the parser. This method +is usually overrriden by the programmer in subclasses if +`%option track_lines' was specified. + +
    virtual long currLinenum() +
    + +Get the number of the current input line from the parser. This +method is usually overridden by the programmer in subclasses +if `%option track_lines' was specified. +
    + +

    +The programmer will typically subclass `YYNODESTATE' to provide +additional functionality, and then create an instance of this class +to act as the global state and node creation factory. + + + + +

    Full expression example code

    +

    + + + +

    +The full treecc input file for the expression example is as follows: + + + +

    +%enum type_code =
    +{
    +    int_type,
    +    float_type
    +}
    +
    +%node expression %abstract %typedef =
    +{
    +    %nocreate type_code type = {int_type};
    +}
    +
    +%node binary expression %abstract =
    +{
    +    expression *expr1;
    +    expression *expr2;
    +}
    +
    +%node unary expression %abstract =
    +{
    +    expression *expr;
    +}
    +
    +%node intnum expression =
    +{
    +    int num;
    +}
    +
    +%node floatnum expression =
    +{
    +    float num;
    +}
    +
    +%node plus binary
    +%node minus binary
    +%node multiply binary
    +%node divide binary
    +%node power binary
    +%node negate unary
    +
    +%operation void infer_type(expression *e)
    +
    +infer_type(binary)
    +{
    +    infer_type(e->expr1);
    +    infer_type(e->expr2);
    +
    +    if(e->expr1->type == float_type || e->expr2->type == float_type)
    +    {
    +        e->type = float_type;
    +    }
    +    else
    +    {
    +        e->type = int_type;
    +    }
    +}
    +
    +infer_type(unary)
    +{
    +    infer_type(e->expr);
    +    e->type = e->expr->type;
    +}
    +
    +infer_type(intnum)
    +{
    +    e->type = int_type;
    +}
    +
    +infer_type(floatnum)
    +{
    +    e->type = float_type;
    +}
    +
    +infer_type(power)
    +{
    +    infer_type(e->expr1);
    +    infer_type(e->expr2);
    +
    +    if(e->expr2->type != int_type)
    +    {
    +        error("second argument to `^' is not an integer");
    +    }
    +
    +    e->type = e->expr1->type;
    +}
    +
    + +

    +The full yacc grammar is as follows: + + + +

    +%union {
    +    expression *node;
    +    int         inum;
    +    float       fnum;
    +}
    +
    +%token INT FLOAT
    +
    +%type <node> expr
    +%type <inum> INT
    +%type <fnum> FLOAT
    +
    +%%
    +
    +expr: INT               { $$ = intnum_create($1); }
    +    | FLOAT             { $$ = floatnum_create($1); }
    +    | '(' expr ')'      { $$ = $2; }
    +    | expr '+' expr     { $$ = plus_create($1, $3); }
    +    | expr '-' expr     { $$ = minus_create($1, $3); }
    +    | expr '*' expr     { $$ = multiply_create($1, $3); }
    +    | expr '/' expr     { $$ = divide_create($1, $3); }
    +    | expr '^' expr     { $$ = power_create($1, $3); }
    +    | '-' expr          { $$ = negate_create($2); }
    +    ;
    +
    + + + +

    EBNF syntax for treecc input files

    +

    + + + +

    +The EBNF syntax for treecc input files uses the following +lexical tokens: + + + +

    +IDENTIFIER ::= <A-Za-z_> { <A-Za-z0-9_> }
    +
    +STRING ::= '"' <anything that does not include '"'> '"'
    +         | "'" <anything that does not include "'"> "'"
    +
    +LITERAL_DEFNS ::= "%{" <anything except "%}"> "%}"
    +
    +LITERAL_END ::= "%%" <any character sequence until EOF>
    +
    +LITERAL_CODE ::= '{' <anything with matched '{' and '}'> '}'
    +
    + +

    +In addition, anything that begins with "%" in the following syntax +is a lexical keyword. + + +

    +The EBNF syntax is as follows: + + + +

    +File ::= { Declaration }
    +
    +Declaration ::= Node
    +              | Operation
    +              | OperationCase
    +              | Option
    +              | Enum
    +              | Literal
    +              | Header
    +              | Output
    +              | Common
    +              | Include
    +
    +Node ::= %node IDENTIFIER [ IDENTIFIER ] { NodeFlag } [ '=' Fields ]
    +
    +NodeFlag ::= %abstract | %typedef
    +
    +Fields ::= '{' { Field } '}'
    +
    +Field ::= [ %nocreate ] TypeAndName [ '=' LITERAL_CODE ] ';'
    +
    +TypeAndName ::= Type [ IDENTIFIER ]
    +
    +Type ::= TypeName
    +       | Type '*'
    +       | Type '&'
    +       | Type '[' ']'
    +
    +TypeName ::= IDENTIFIER { IDENTIFIER }
    +
    +Operation ::= %operation { OperFlag } Type
    +                   [ ClassName ] IDENTIFIER '(' [ Params ] ')'
    +                   [ '=' LITERAL_CODE ] [ ';' ]
    +
    +OperFlag ::= %virtual | %inline | %split
    +
    +ClassName ::= IDENTIFIER "::"
    +
    +Params ::= Param { ',' Param }
    +
    +Param ::= TypeAndName | '[' TypeAndName ']'
    +
    +OperationCase ::= OperationHead { ',' OperationHead } LITERAL_CODE
    +
    +OperationHead ::= IDENTIFIER '(' [ TypeList ] ')'
    +
    +TypeList ::= IDENTIFIER { ',' IDENTIFIER }
    +
    +Option ::= %option IDENTIFIER [ '=' Value ]
    +
    +Value ::= IDENTIFIER | STRING
    +
    +Enum ::= %enum IDENTIFIER '=' '{' EnumBody [ ',' ] '}'
    +
    +EnumBody ::= IDENTIFIER { ',' IDENTIFIER }
    +
    +Literal ::= { LiteralFlag } (LITERAL_DEFNS | LITERAL_END)
    +
    +LiteralFlag ::= %both | %decls | %end
    +
    +Header ::= %header STRING
    +
    +Output ::= %output STRING
    +
    +Common ::= %common
    +
    +Include ::= %include [ %readonly ] STRING
    +
    +
    + + + +

    Index

    + +

    +Jump to: +% +- +a +- +b +- +c +- +e +- +f +- +g +- +h +- +i +- +j +- +k +- +l +- +n +- +o +- +p +- +r +- +s +- +t +- +v +- +y +

    +

    %

    + +
  • %abstract keyword +
  • %both keyword +
  • %common keyword +
  • %decls keyword +
  • %end keyword +
  • %enum keyword +
  • %header keyword +
  • %include keyword +
  • %inline keyword +
  • %nocreate keyword +
  • %node keyword +
  • %operation keyword +
  • %option keyword +
  • %outdir keyword +
  • %output keyword +
  • %readonly keyword +
  • %split keyword +
  • %typedef keyword +
  • %virtual keyword +
  • +

    a

    + +
  • abstract_factory option +
  • alloc method (C++) +
  • +

    b

    + +
  • base option +
  • block_size option +
  • +

    c

    + +
  • C APIs +
  • C# APIs +
  • C++ APIs +
  • Changing files +
  • clear method (C++) +
  • Command-line options +
  • common declaration +
  • currFilename method (C#) +
  • currFilename method (C++) +
  • currFilename method (Java) +
  • currLinenum method (C#) +
  • currLinenum method (C++) +
  • currLinenum method (Java) +
  • +

    e

    + +
  • EBNF syntax +
  • enum declaration +
  • Enumerations +
  • Expression example +
  • +

    f

    + +
  • failed method (C++) +
  • Fields +
  • force option +
  • Full expression example +
  • +

    g

    + +
  • getFilename method (C#) +
  • getFilename method (C++) +
  • getFilename method (Java) +
  • getKind method (C#) +
  • getKind method (C++) +
  • getKind method (Java) +
  • getKindName method (C#) +
  • getKindName method (C++) +
  • getKindName method (Java) +
  • getLinenum method (C#) +
  • getLinenum method (C++) +
  • getLinenum method (Java) +
  • getState method (C#) +
  • getState method (C++) +
  • getState method (Java) +
  • +

    h

    + +
  • header declaration +
  • +

    i

    + +
  • include declaration +
  • Invoking treecc +
  • isA method (C#) +
  • isA method (C++) +
  • isA method (Java) +
  • +

    j

    + +
  • Java APIs +
  • +

    k

    + +
  • KIND field (C#) +
  • KIND field (Java) +
  • kind_in_node option +
  • kind_in_vtable option +
  • +

    l

    + +
  • lang option +
  • Line tracking +
  • Literal code +
  • +

    n

    + +
  • namespace option +
  • no_abstract_factory option +
  • no_force option +
  • no_reentrant option +
  • no_singletons option +
  • no_strip_filenames option +
  • no_track_lines option +
  • no_virtual_factory option +
  • Nodes +
  • +

    o

    + +
  • operation cases +
  • operation declarations +
  • Operations +
  • option declaration +
  • Options +
  • outdir declaration +
  • Output APIs +
  • output declaration +
  • Overview +
  • +

    p

    + +
  • package option +
  • pop method (C++) +
  • prefix option +
  • push method (C++) +
  • +

    r

    + +
  • reentrant option +
  • +

    s

    + +
  • setFilename method (C#) +
  • setFilename method (C++) +
  • setFilename method (Java) +
  • setLinenum method (C#) +
  • setLinenum method (C++) +
  • setLinenum method (Java) +
  • singletons option +
  • state_type option +
  • strip_filenames option +
  • Syntax +
  • +

    t

    + +
  • track_lines option +
  • trigger parameters +
  • Types +
  • +

    v

    + +
  • virtual_factory option +
  • +

    y

    + +
  • yycurrfilename function +
  • yycurrlinenum function +
  • yygetfilename macro +
  • yygetlinenum macro +
  • yyisa macro +
  • yykind macro +
  • yykindname macro +
  • yynodealloc function +
  • yynodeclear function +
  • yynodefailed function +
  • yynodeinit function +
  • yynodepop function +
  • yynodepush function +
  • yysetfilename macro +
  • yysetlinenum macro +
  • + + +


    +This document was generated on 11 June 2002 using +texi2html 1.56k. + +